{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# LeR Short Example\n", "\n", "This notebook is created by [Phurailatpam Hemantakumar](https://hemantaph.com)\n", "\n", "[![Documentation](https://img.shields.io/badge/ler-documentation-blue)](https://ler.hemantaph.com) \n", "\n", "`ler` is a comprehensive framework for simulating gravitational wave (GW) events and calculating their detection rates, including gravitational lensing effects. \n", "- The **`LeR`** class is the primary interface for these simulations.\n", "- The **`GWRATES`** class focuses on standard (unlensed) Compact Binary Coalescence (CBC) events. Refer to the **GWRATES complete example** for more details.\n", "\n", "This notebook demonstrates how to simulate both lensed and unlensed CBC populations and compare their detection rates using the `LeR` class.\n", "\n", "## Table of Contents\n", "1. [LeR initialization with default arguments](#1-ler-initialization-with-default-arguments)\n", "2. [Basic GW Event Simulation and Rate Calculation](#2-basic-gw-event-simulation-and-rate-calculation)\n", " - [2.1 Simulate Unlensed GW Population](#2-1-simulate-unlensed-gw-population)\n", " - [2.2 Calculate Unlensed Detection Rates](#2-2-calculate-unlensed-detection-rates)\n", " - [2.3 Inspect Generated Unlensed Parameters](#2-3-inspect-generated-unlensed-parameters)\n", "3. [Lensed GW Population Simulation and Rates](#3-lensed-gw-population-simulation-and-rates)\n", " - [3.1 Simulate Lensed GW Population](#3-1-simulate-lensed-gw-population)\n", " - [3.2 Calculate Lensed Detection Rates](#3-2-calculate-lensed-detection-rates)\n", " - [3.3 Inspect Generated Lensed Parameters](#3-3-inspect-generated-lensed-parameters)\n", "4. [Rate Comparison and Visualization](#4-rate-comparison-and-visualization)\n", " - [4.1 Compare Lensed vs Unlensed Rates](#4-1-compare-lensed-vs-unlensed-rates)\n", " - [4.2 Access Saved Data Files](#4-2-access-saved-data-files)\n", " - [4.3 Load and Examine Saved Parameters](#4-3-load-and-examine-saved-parameters)\n", " - [4.4 Visualize Parameter Distributions](#4-4-visualize-parameter-distributions)\n", "5. [Available Internal Functions and Their Usage](#5-available-internal-functions-and-their-usage)\n", " - [5.1 Explore Functions and Parameters](#5-1-explore-functions-and-parameters)\n", " - [5.2 Short Example on Using Internal Functions](#5-2-short-example-on-using-internal-functions)\n", "6. [Summary](#6-summary)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## 1. LeR initialization with default arguments\n", "\n", "The `LeR` class is the main interface for simulating unlensed and lensed GW events and calculating detection rates. By default, it uses:\n", "\n", "- **Event type:** BBH (Binary Black Hole).\n", "- **Lens galaxy model:** EPL+Shear (Elliptical Power Law galaxy with external shears).\n", "- **Detectors:** H1, L1, V1 (LIGO Hanford, LIGO Livingston, Virgo) with O4 design sensitivity.\n", "\n", "All outputs will be saved in the `./ler_data` directory by default." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Initializing LeR class...\n", "\n", "\n", "Initializing LensGalaxyParameterDistribution class...\n", "\n", "\n", "Initializing OpticalDepth class\n", "\n", "comoving_distance interpolator will be loaded from ./interpolator_json/comoving_distance/comoving_distance_0.json\n", "angular_diameter_distance interpolator will be loaded from ./interpolator_json/angular_diameter_distance/angular_diameter_distance_0.json\n", "angular_diameter_distance interpolator will be loaded from ./interpolator_json/angular_diameter_distance/angular_diameter_distance_0.json\n", "differential_comoving_volume interpolator will be loaded from ./interpolator_json/differential_comoving_volume/differential_comoving_volume_0.json\n", "using ler available velocity dispersion function : velocity_dispersion_ewoud\n", "velocity_dispersion_ewoud interpolator will be loaded from ./interpolator_json/velocity_dispersion/velocity_dispersion_ewoud_0.json\n", "using ler available axis_ratio function : axis_ratio_rayleigh\n", "axis_ratio_rayleigh interpolator will be loaded from ./interpolator_json/axis_ratio/axis_ratio_rayleigh_1.json\n", "using ler available axis_rotation_angle function : axis_rotation_angle_uniform\n", "using ler available density_profile_slope function : density_profile_slope_normal\n", "using ler available external_shear function : external_shear_normal\n", "Cross section interpolation data points loaded from ./interpolator_json/cross_section_function/cross_section_function_0.json\n", "using ler available lens_redshift function : lens_redshift_strongly_lensed_numerical\n", "Numerically solving the lens redshift distribution...\n", "lens_redshift_strongly_lensed_numerical_epl_shear_galaxy interpolator will be loaded from ./interpolator_json/lens_redshift/lens_redshift_strongly_lensed_numerical_epl_shear_galaxy_1.json\n", "lens_redshift_intrinsic interpolator will be loaded from ./interpolator_json/lens_redshift_intrinsic/lens_redshift_intrinsic_1.json\n", "using ler available density_profile_slope_sl function : density_profile_slope_normal\n", "using ler available external_shear_sl function : external_shear_normal\n", "using ler available optical depth function : optical_depth_numerical\n", "optical_depth_numerical interpolator will be loaded from ./interpolator_json/optical_depth/optical_depth_numerical_1.json\n", "\n", "Initializing CBCSourceRedshiftDistribution class...\n", "\n", "luminosity_distance interpolator will be loaded from ./interpolator_json/luminosity_distance/luminosity_distance_0.json\n", "differential_comoving_volume interpolator will be loaded from ./interpolator_json/differential_comoving_volume/differential_comoving_volume_0.json\n", "using ler available merger rate density model: merger_rate_density_madau_dickinson_belczynski_ng\n", "merger_rate_density_madau_dickinson_belczynski_ng interpolator will be loaded from ./interpolator_json/merger_rate_density/merger_rate_density_madau_dickinson_belczynski_ng_0.json\n", "merger_rate_density_detector_frame interpolator will be loaded from ./interpolator_json/merger_rate_density/merger_rate_density_detector_frame_1.json\n", "source_redshift interpolator will be loaded from ./interpolator_json/source_redshift/source_redshift_0.json\n", "\n", "Initializing CBCSourceParameterDistribution class...\n", "\n", "using ler available zs function : source_redshift\n", "using ler available source_frame_masses function : binary_masses_BBH_powerlaw_gaussian\n", "using ler available geocent_time function : sampler_uniform\n", "using ler available ra function : sampler_uniform\n", "using ler available dec function : sampler_cosine\n", "using ler available phase function : sampler_uniform\n", "using ler available psi function : sampler_uniform\n", "using ler available theta_jn function : sampler_sine\n", "using ler available a_1 function : sampler_uniform\n", "using ler available a_2 function : sampler_uniform\n", "Faster, njitted and importance sampling based lens parameter sampler will be used.\n", "\n", "Initializing GWSNR class...\n", "\n", "psds not given. Choosing bilby's default psds\n", "Interpolator will be loaded for L1 detector from ./interpolator_json/L1/partialSNR_dict_0.json\n", "Interpolator will be loaded for H1 detector from ./interpolator_json/H1/partialSNR_dict_0.json\n", "Interpolator will be loaded for V1 detector from ./interpolator_json/V1/partialSNR_dict_0.json\n", "\n", "Chosen GWSNR initialization parameters:\n", "\n", "npool: 4\n", "snr type: interpolation_aligned_spins\n", "waveform approximant: IMRPhenomD\n", "sampling frequency: 2048.0\n", "minimum frequency (fmin): 20.0\n", "reference frequency (f_ref): 20.0\n", "mtot=mass1+mass2\n", "min(mtot): 9.96\n", "max(mtot) (with the given fmin=20.0): 500.0\n", "detectors: ['L1', 'H1', 'V1']\n", "psds: [[array([ 10.21659, 10.23975, 10.26296, ..., 4972.81 ,\n", " 4984.081 , 4995.378 ], shape=(2736,)), array([4.43925574e-41, 4.22777986e-41, 4.02102594e-41, ...,\n", " 6.51153524e-46, 6.43165104e-46, 6.55252996e-46],\n", " shape=(2736,)), ], [array([ 10.21659, 10.23975, 10.26296, ..., 4972.81 ,\n", " 4984.081 , 4995.378 ], shape=(2736,)), array([4.43925574e-41, 4.22777986e-41, 4.02102594e-41, ...,\n", " 6.51153524e-46, 6.43165104e-46, 6.55252996e-46],\n", " shape=(2736,)), ], [array([ 10. , 10.02306 , 10.046173, ...,\n", " 9954.0389 , 9976.993 , 10000. ], shape=(3000,)), array([1.22674387e-42, 1.20400299e-42, 1.18169466e-42, ...,\n", " 1.51304203e-43, 1.52010157e-43, 1.52719372e-43],\n", " shape=(3000,)), ]]\n", "\n", "\n", "#-------------------------------------\n", "# LeR initialization input arguments:\n", "#-------------------------------------\n", "\n", " # LeR set up input arguments:\n", " npool = 4,\n", " z_min = 0.0,\n", " z_max = 10.0,\n", " event_type = 'BBH',\n", " lens_type = 'epl_shear_galaxy',\n", " cosmology = LambdaCDM(H0=70.0 km / (Mpc s), Om0=0.3, Ode0=0.7, Tcmb0=0.0 K, Neff=3.04, m_nu=None, Ob0=0.0),\n", " pdet_finder = >,\n", " json_file_names = dict(\n", " ler_params = 'ler_params.json',\n", " unlensed_param = 'unlensed_param.json',\n", " unlensed_param_detectable = 'unlensed_param_detectable.json',\n", " lensed_param = 'lensed_param.json',\n", " lensed_param_detectable = 'lensed_param_detectable.json',\n", " ),\n", " interpolator_directory = './interpolator_json',\n", " ler_directory = './ler_data',\n", " create_new_interpolator = dict(\n", " merger_rate_density = {'create_new': False, 'resolution': 500},\n", " redshift_distribution = {'create_new': False, 'resolution': 500},\n", " luminosity_distance = {'create_new': False, 'resolution': 500},\n", " differential_comoving_volume = {'create_new': False, 'resolution': 500},\n", " source_frame_masses = {'create_new': False, 'resolution': 500},\n", " geocent_time = {'create_new': False, 'resolution': 500},\n", " ra = {'create_new': False, 'resolution': 500},\n", " dec = {'create_new': False, 'resolution': 500},\n", " phase = {'create_new': False, 'resolution': 500},\n", " psi = {'create_new': False, 'resolution': 500},\n", " theta_jn = {'create_new': False, 'resolution': 500},\n", " a_1 = {'create_new': False, 'resolution': 500},\n", " a_2 = {'create_new': False, 'resolution': 500},\n", " tilt_1 = {'create_new': False, 'resolution': 500},\n", " tilt_2 = {'create_new': False, 'resolution': 500},\n", " phi_12 = {'create_new': False, 'resolution': 500},\n", " phi_jl = {'create_new': False, 'resolution': 500},\n", " velocity_dispersion = {'create_new': False, 'resolution': 500, 'zl_resolution': 48},\n", " axis_ratio = {'create_new': False, 'resolution': 500, 'sigma_resolution': 48},\n", " lens_redshift = {'create_new': False, 'resolution': 48, 'zl_resolution': 48},\n", " lens_redshift_intrinsic = {'create_new': False, 'resolution': 500},\n", " optical_depth = {'create_new': False, 'resolution': 48},\n", " comoving_distance = {'create_new': False, 'resolution': 500},\n", " angular_diameter_distance = {'create_new': False, 'resolution': 500},\n", " angular_diameter_distance_z1z2 = {'create_new': False, 'resolution': 500},\n", " density_profile_slope = {'create_new': False, 'resolution': 100},\n", " lens_parameters_kde_sl = {'create_new': False, 'resolution': 5000},\n", " cross_section = {'create_new': False, 'resolution': [25, 25, 45, 15, 15]},\n", " ),\n", "\n", " # LeR also takes other CBCSourceParameterDistribution class input arguments as kwargs, as follows:\n", " source_priors = dict(\n", " merger_rate_density = 'merger_rate_density_madau_dickinson_belczynski_ng',\n", " zs = 'source_redshift',\n", " source_frame_masses = 'binary_masses_BBH_powerlaw_gaussian',\n", " geocent_time = 'sampler_uniform',\n", " ra = 'sampler_uniform',\n", " dec = 'sampler_cosine',\n", " phase = 'sampler_uniform',\n", " psi = 'sampler_uniform',\n", " theta_jn = 'sampler_sine',\n", " a_1 = 'sampler_uniform',\n", " a_2 = 'sampler_uniform',\n", " ),\n", " source_priors_params = dict(\n", " merger_rate_density = {'R0': 1.9e-08, 'alpha_F': 2.57, 'beta_F': 5.83, 'c_F': 3.36},\n", " zs = None,\n", " source_frame_masses = {'mminbh': 4.98, 'mmaxbh': 112.5, 'alpha': 3.78, 'mu_g': 32.27, 'sigma_g': 3.88, 'lambda_peak': 0.03, 'delta_m': 4.8, 'beta': 0.81},\n", " geocent_time = {'xmin': 1238166018, 'xmax': 1269702018},\n", " ra = {'xmin': 0.0, 'xmax': 6.283185307179586},\n", " dec = None,\n", " phase = {'xmin': 0.0, 'xmax': 6.283185307179586},\n", " psi = {'xmin': 0.0, 'xmax': 3.141592653589793},\n", " theta_jn = None,\n", " a_1 = {'xmin': -0.8, 'xmax': 0.8},\n", " a_2 = {'xmin': -0.8, 'xmax': 0.8},\n", " ),\n", " spin_zero = False,\n", " spin_precession = False,\n", "\n", " # LeR also takes other LensGalaxyParameterDistribution class input arguments as kwargs, as follows:\n", " lens_functions = dict(\n", " param_sampler_type = 'sample_all_routine_epl_shear_sl',\n", " cross_section_based_sampler = 'importance_sampling_with_cross_section',\n", " optical_depth = 'optical_depth_numerical',\n", " cross_section = 'cross_section_epl_shear_interpolation',\n", " ),\n", " lens_functions_params = dict(\n", " param_sampler_type = None,\n", " cross_section_based_sampler = {'n_prop': 200},\n", " optical_depth = None,\n", " cross_section = None,\n", " ),\n", " lens_param_samplers = dict(\n", " source_redshift_sl = 'strongly_lensed_source_redshifts',\n", " lens_redshift = 'lens_redshift_strongly_lensed_numerical',\n", " velocity_dispersion = 'velocity_dispersion_ewoud',\n", " axis_ratio = 'axis_ratio_rayleigh',\n", " axis_rotation_angle = 'axis_rotation_angle_uniform',\n", " external_shear = 'external_shear_normal',\n", " density_profile_slope = 'density_profile_slope_normal',\n", " external_shear_sl = 'external_shear_normal',\n", " density_profile_slope_sl = 'density_profile_slope_normal',\n", " ),\n", " lens_param_samplers_params = dict(\n", " source_redshift_sl = None,\n", " lens_redshift = {'integration_size': 25000, 'use_multiprocessing': False},\n", " velocity_dispersion = {'sigma_min': 100.0, 'sigma_max': 400.0, 'alpha': 0.94, 'beta': 1.85, 'phistar': np.float64(0.02099), 'sigmastar': 113.78, 'name': 'velocity_dispersion_ewoud'},\n", " axis_ratio = {'q_min': 0.2, 'q_max': 1.0, 'name': 'axis_ratio_rayleigh'},\n", " axis_rotation_angle = {'phi_min': 0.0, 'phi_max': 6.283185307179586, 'name': 'axis_rotation_angle_uniform'},\n", " external_shear = {'mean': 0.0, 'std': 0.05, 'name': 'external_shear_normal'},\n", " density_profile_slope = {'mean': 1.99, 'std': 0.149, 'name': 'density_profile_slope_normal'},\n", " external_shear_sl = {'mean': 0.0, 'std': 0.05},\n", " density_profile_slope_sl = {'mean': 2.078, 'std': 0.16},\n", " ),\n", "\n", " # LeR also takes other ImageProperties class input arguments as kwargs, as follows:\n", " n_min_images = 2,\n", " n_max_images = 4,\n", " time_window = 630720000,\n", " lens_model_list = ['EPL_NUMBA', 'SHEAR'],\n", "\n", " # LeR also takes other gwsnr.GWSNR input arguments as kwargs, as follows:\n", " npool = 4,\n", " snr_method = 'interpolation_aligned_spins',\n", " snr_type = 'optimal_snr',\n", " gwsnr_verbose = True,\n", " multiprocessing_verbose = True,\n", " pdet_kwargs = dict(\n", " snr_th = 10.0,\n", " snr_th_net = 10.0,\n", " pdet_type = 'boolean',\n", " distribution_type = 'noncentral_chi2',\n", " include_optimal_snr = False,\n", " include_observed_snr = False,\n", " ),\n", " mtot_min = 9.96,\n", " mtot_max = 500.0,\n", " ratio_min = 0.1,\n", " ratio_max = 1.0,\n", " spin_max = 0.99,\n", " mtot_resolution = 200,\n", " ratio_resolution = 20,\n", " spin_resolution = 10,\n", " batch_size_interpolation = 1000000,\n", " interpolator_dir = './interpolator_json',\n", " create_new_interpolator = False,\n", " sampling_frequency = 2048.0,\n", " waveform_approximant = 'IMRPhenomD',\n", " frequency_domain_source_model = 'lal_binary_black_hole',\n", " minimum_frequency = 20.0,\n", " reference_frequency = None,\n", " duration_max = None,\n", " duration_min = None,\n", " fixed_duration = None,\n", " mtot_cut = False,\n", " psds = None,\n", " ifos = None,\n", " noise_realization = None,\n", " ann_path_dict = None,\n", " snr_recalculation = False,\n", " snr_recalculation_range = [6, 14],\n", " snr_recalculation_waveform_approximant = 'IMRPhenomXPHM',\n", " psds_list = [[array([ 10.21659, 10.23975, 10.26296, ..., 4972.81 ,\n", " 4984.081 , 4995.378 ], shape=(2736,)), array([4.43925574e-41, 4.22777986e-41, 4.02102594e-41, ...,\n", " 6.51153524e-46, 6.43165104e-46, 6.55252996e-46],\n", " shape=(2736,)), ], [array([ 10.21659, 10.23975, 10.26296, ..., 4972.81 ,\n", " 4984.081 , 4995.378 ], shape=(2736,)), array([4.43925574e-41, 4.22777986e-41, 4.02102594e-41, ...,\n", " 6.51153524e-46, 6.43165104e-46, 6.55252996e-46],\n", " shape=(2736,)), ], [array([ 10. , 10.02306 , 10.046173, ...,\n", " 9954.0389 , 9976.993 , 10000. ], shape=(3000,)), array([1.22674387e-42, 1.20400299e-42, 1.18169466e-42, ...,\n", " 1.51304203e-43, 1.52010157e-43, 1.52719372e-43],\n", " shape=(3000,)), ]],\n" ] } ], "source": [ "# Import LeR\n", "from ler import LeR\n", "\n", "# Initialize LeR with default settings\n", "ler = LeR()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", " # To print all initialization input arguments, use:\n", " ler._print_all_init_args()\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## 2. Basic GW Event Simulation and Rate Calculation\n", "\n", "This section demonstrates how to simulate unlensed binary black hole mergers and calculate their detection rates.\n", "\n", "### 2.1 Simulate Unlensed GW Population\n", "\n", "Generate a population of unlensed Compact Binary Coalescence (CBC) events. This step:\n", "- Samples intrinsic (masses and spins) and extrinsic (redshift, sky location, inclination angle, etc.) GW parameters from initialized priors.\n", "- Calculates the probability of detection (Pdet) for each event based on the detector network sensitivity.\n", "- Stores the output in `./ler_data/unlensed_param.json`.\n", "\n", "**Note:** For realistic results, use `size >= 1,000,000` with `batch_size = 100,000`" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "unlensed params will be stored in ./ler_data/unlensed_param.json\n", "removing ./ler_data/unlensed_param.json if it exists\n", "Batch no. 1\n", "sampling gw source params...\n", "calculating pdet...\n", "Batch no. 2\n", "sampling gw source params...\n", "calculating pdet...\n", "saving all unlensed parameters in ./ler_data/unlensed_param.json \n", "\n", "Total unlensed events simulated: 100000\n", "Sampled source redshift values (first 5): [2.38659538 1.87375022 3.05753123 2.03724768 3.06881079]\n" ] } ], "source": [ "# Simulate 100,000 unlensed GW events in batches of 50,000\n", "# use 'print(ler.unlensed_cbc_statistics.__doc__)' to see all the input args\n", "unlensed_param = ler.unlensed_cbc_statistics(size=100000, resume=False)\n", "\n", "print(f\"\\nTotal unlensed events simulated: {len(unlensed_param['zs'])}\")\n", "print(f\"Sampled source redshift values (first 5): {unlensed_param['zs'][:5]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 Calculate Unlensed Detection Rates\n", "\n", "Select detectable events and calculate the detection rate. This function:\n", "- Filters events using a Pdet threshold. By default, Pdet is based on observed detector network SNR > 10 (`gwsnr`'s default), where the SNR follows a non-central chi-squared distribution centered at the optimal SNR (Essick et al. 2023).\n", "- Returns the rate in detectable events per year.\n", "- Saves detectable events to `./ler_data/unlensed_param_detectable.json`." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Getting unlensed_param from json file ./ler_data/unlensed_param.json...\n", "total unlensed rate (yr^-1): 294.89984863034954\n", "number of simulated unlensed detectable events: 322\n", "number of simulated all unlensed events: 100000\n", "storing detectable params in ./ler_data/unlensed_param_detectable.json\n", "\n", "=== Unlensed Detection Rate Summary ===\n", "Detectable event rate: 2.95e+02 events per year\n", "Total event rate: 9.16e+04 events per year\n", "Percentage fraction of the detectable events: 3.22e-01%\n" ] } ], "source": [ "# Calculate the detection rate and extract detectable unlensed events\n", "# use 'print(ler.unlensed_rate.__doc__)' to see all the input args\n", "rate_unlensed, unlensed_param_detectable = ler.unlensed_rate()\n", "\n", "print(f\"\\n=== Unlensed Detection Rate Summary ===\")\n", "print(f\"Detectable event rate: {rate_unlensed:.2e} events per year\")\n", "print(f\"Total event rate: {ler.normalization_pdf_z:.2e} events per year\")\n", "print(f\"Percentage fraction of the detectable events: {rate_unlensed/ler.normalization_pdf_z*100:.2e}%\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3 Inspect Generated Unlensed Parameters\n", "\n", "View the available parameters in the generated event population." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Detectable unlensed event parameters:\n", "['zs', 'geocent_time', 'ra', 'dec', 'phase', 'psi', 'theta_jn', 'a_1', 'a_2', 'luminosity_distance', 'mass_1_source', 'mass_2_source', 'mass_1', 'mass_2', 'pdet_L1', 'pdet_H1', 'pdet_V1', 'pdet_net']\n", "\n", "Example values for mass_1_source (first 5 events):\n", "[13.76440519 36.07826189 29.91132175 36.52243878 77.44086226]\n" ] } ], "source": [ "# List all parameters available in the detectable event population\n", "print(\"Detectable unlensed event parameters:\")\n", "print(list(unlensed_param_detectable.keys()))\n", "\n", "print(\"\\nExample values for mass_1_source (first 5 events):\")\n", "print(unlensed_param_detectable['mass_1_source'][:5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## 3. Lensed GW Population Simulation and Rates\n", "\n", "This part demonstrates the simulation of lensed GW events and rate calculation. Lensing includes additional parameters such as lens galaxy properties (lens redshift, velocity dispersion, etc.) and image characteristics (magnification, time delays, etc.)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1 Simulate Lensed GW Population\n", "\n", "Generate a population of lensed CBC events including lens galaxy properties and image parameters:\n", "- Source parameters (redshift, masses, spins)\n", "- Lens parameters (redshift, Einstein radius, ellipticity, shear components)\n", "- Image parameters (magnifications, time delays)\n", "\n", "This step stores output in `./ler_data/lensed_param.json`\n", "\n", "**Note:** The simulation includes:\n", "- Lens galaxy population sampling\n", "- Selection based on lensing cross-section\n", "- Lens equation solving for multiple image generation\n", "- Pdet calculation for each image" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "lensed params will be stored in ./ler_data/lensed_param.json\n", "removing ./ler_data/lensed_param.json if it exists\n", "Batch no. 1\n", "sampling lensed params...\n", "sampling lens parameters with sample_all_routine_epl_shear_sl...\n", "solving lens equations...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|███████████████████████████████████████████████████████| 50000/50000 [00:11<00:00, 4524.78it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "calculating pdet...\n", "Batch no. 2\n", "sampling lensed params...\n", "sampling lens parameters with sample_all_routine_epl_shear_sl...\n", "solving lens equations...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|███████████████████████████████████████████████████████| 50000/50000 [00:10<00:00, 4563.30it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "calculating pdet...\n", "saving all lensed parameters in ./ler_data/lensed_param.json \n", "\n", "Total lensed events simulated: 100000\n", "Sampled source redshift values (first 5): [2.96150209 3.62643698 2.22925302 6.69295117 3.6017759 ]\n" ] } ], "source": [ "# Simulate 100,000 unlensed GW events in batches of 50,000\n", "# use 'ler.lensed_cbc_statistics.__doc__' to see all the input args\n", "lensed_param = ler.lensed_cbc_statistics(size=100000, resume=False)\n", "\n", "print(f\"\\nTotal lensed events simulated: {len(lensed_param['zs'])}\")\n", "print(f\"Sampled source redshift values (first 5): {lensed_param['zs'][:5]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 Calculate Lensed Detection Rates\n", "\n", "- Calculate the lensed detection rate, with each event requiring at least two detectable images for a valid detection.\n", "- The detection rate is stored in `./ler_data/lensed_param_detectable.json`." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Getting lensed_param from json file ./ler_data/lensed_param.json...\n", "total lensed rate (yr^-1): 0.10082199896856103\n", "number of simulated lensed detectable events: 89\n", "number of simulated all lensed events: 100000\n", "storing detectable params in ./ler_data/lensed_param_detectable.json\n", "\n", "=== Lensed Detection Rate Summary ===\n", "Detectable event rate: 1.01e-01 events per year\n", "Total event rate: 1.13e+02 events per year\n", "Percentage fraction of the detectable events: 8.90e-02%\n" ] } ], "source": [ "# Calculate the detection rate for lensed events\n", "# use 'print(ler.lensed_rate.__doc__)' to see all the input args\n", "rate_lensed, lensed_param_detectable = ler.lensed_rate()\n", "\n", "print(f\"\\n=== Lensed Detection Rate Summary ===\")\n", "print(f\"Detectable event rate: {rate_lensed:.2e} events per year\")\n", "print(f\"Total event rate: {ler.normalization_pdf_z_lensed:.2e} events per year\")\n", "print(f\"Percentage fraction of the detectable events: {rate_lensed/ler.normalization_pdf_z_lensed*100:.2e}%\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3 Inspect Generated Lensed Parameters" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Detectable lensed event parameters:\n", "['zl', 'zs', 'sigma', 'theta_E', 'q', 'phi', 'gamma', 'gamma1', 'gamma2', 'geocent_time', 'ra', 'dec', 'phase', 'psi', 'theta_jn', 'a_1', 'a_2', 'luminosity_distance', 'mass_1_source', 'mass_2_source', 'mass_1', 'mass_2', 'x0_image_positions', 'x1_image_positions', 'magnifications', 'time_delays', 'image_type', 'n_images', 'x_source', 'y_source', 'effective_luminosity_distance', 'effective_geocent_time', 'effective_phase', 'pdet_net', 'L1', 'H1', 'V1']\n", "\n", "Lens-specific parameters include:\n", " zl: [0.54337231 1.87777572 0.64609008]\n", " sigma: [181.65920777 128.87706255 196.8531673 ]\n", " theta_E: [2.03764065e-06 6.01901250e-07 2.62310898e-06]\n", " q: [0.66697535 0.4918578 0.77095448]\n", " phi: [3.25526037 6.01826202 3.75664554]\n", " gamma: [1.88747336 2.18793729 2.0281945 ]\n", " gamma1: [ 0.05469759 -0.06132396 -0.02247388]\n", " gamma2: [-0.1018271 0.0365925 -0.02447439]\n" ] } ], "source": [ "# List all parameters available in the detectable lensed event population\n", "print(\"Detectable lensed event parameters:\")\n", "print(list(lensed_param_detectable.keys()))\n", "\n", "print(\"\\nLens-specific parameters include:\")\n", "lens_params = ['zl', 'sigma', 'theta_E', 'q', 'phi', 'gamma', 'gamma1', 'gamma2']\n", "for param in lens_params:\n", " if param in lensed_param_detectable:\n", " print(f\" {param}: {lensed_param_detectable[param][:3]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## 4. Rate Comparison and Visualization\n", "\n", "Compare the lensed and unlensed detection rates, access saved data files, and visualize parameter distributions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.1 Compare Lensed vs Unlensed Rates" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "unlensed_rate: 294.89984863034954\n", "lensed_rate: 0.10082199896856103\n", "ratio: 2924.9553832225356\n", "\n", "=== Rate Comparison ===\n", "Unlensed detection rate: 2.9490e+02 events/yr\n", "Lensed detection rate: 1.0082e-01 events/yr\n", "Rate ratio (lensed/unlensed): 2924.9554\n" ] } ], "source": [ "# Compare lensed and unlensed rates\n", "rate_ratio = ler.rate_ratio()\n", "\n", "print(f\"\\n=== Rate Comparison ===\")\n", "print(f\"Unlensed detection rate: {rate_unlensed:.4e} events/yr\")\n", "print(f\"Lensed detection rate: {rate_lensed:.4e} events/yr\")\n", "print(f\"Rate ratio (lensed/unlensed): {rate_ratio:.4f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bonus: The following command simultaneously selects detectable events, calculates rates, and compares unlensed and lensed events.\n", "\n", "```python\n", "unlensed_rate, lensed_rate, rate_ratio, unlensed_param_detectable, lensed_param_detectable = ler.rate_comparison_with_rate_calculation()\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 Access Saved Data Files\n", "\n", "All simulation results are saved in JSON files for future reference and analysis. View the saved file locations and load parameters from disk." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Output directory: ./ler_data\n", "\n", "Saved JSON files:\n", " ler_params: ler_params.json\n", " unlensed_param: unlensed_param.json\n", " unlensed_param_detectable: unlensed_param_detectable.json\n", " lensed_param: lensed_param.json\n", " lensed_param_detectable: lensed_param_detectable.json\n" ] } ], "source": [ "# View saved file locations and names\n", "print(f\"Output directory: {ler.ler_directory}\")\n", "print(f\"\\nSaved JSON files:\")\n", "for key, filename in ler.json_file_names.items():\n", " print(f\" {key}: {filename}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 Load and Examine Saved Parameters\n", "\n", "Reload parameters from JSON files for further analysis. This example also hightlights some of the useful functions from `ler.utils` module." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Unlensed parameters loaded: ['zs', 'geocent_time', 'ra', 'dec', 'phase', 'psi', 'theta_jn', 'a_1', 'a_2', 'luminosity_distance', 'mass_1_source', 'mass_2_source', 'mass_1', 'mass_2', 'pdet_L1', 'pdet_H1', 'pdet_V1', 'pdet_net']\n", "Lensed parameters loaded: ['zl', 'zs', 'sigma', 'theta_E', 'q', 'phi', 'gamma', 'gamma1', 'gamma2', 'geocent_time', 'ra', 'dec', 'phase', 'psi', 'theta_jn', 'a_1', 'a_2', 'luminosity_distance', 'mass_1_source', 'mass_2_source', 'mass_1', 'mass_2', 'x0_image_positions', 'x1_image_positions', 'magnifications', 'time_delays', 'image_type', 'n_images', 'x_source', 'y_source', 'effective_luminosity_distance', 'effective_geocent_time', 'effective_phase', 'pdet_net', 'L1', 'H1', 'V1']\n", "\n", "=== Rates from saved file ===\n", "Detectable unlensed rate: 2.9582e+02 events/yr\n", "Detectable lensed rate: 8.4985e-02 events/yr\n", "Rate ratio: 3480.8049\n" ] } ], "source": [ "# Load parameters from saved JSON files\n", "from ler.utils import get_param_from_json, load_json\n", "\n", "# Load detectable parameters from files\n", "unlensed_param_from_file = get_param_from_json(\n", " ler.ler_directory + '/' + ler.json_file_names['unlensed_param_detectable']\n", ")\n", "lensed_param_from_file = get_param_from_json(\n", " ler.ler_directory + '/' + ler.json_file_names['lensed_param_detectable']\n", ")\n", "\n", "print(f\"Unlensed parameters loaded: {list(unlensed_param_from_file.keys())}\")\n", "print(f\"Lensed parameters loaded: {list(lensed_param_from_file.keys())}\")\n", "\n", "# Load initialization parameters and results\n", "ler_params = load_json(ler.ler_directory + '/ler_params.json')\n", "print(f\"\\n=== Rates from saved file ===\")\n", "print(f\"Detectable unlensed rate: {ler_params['detectable_unlensed_rate_per_year']:.4e} events/yr\")\n", "print(f\"Detectable lensed rate: {ler_params['detectable_lensed_rate_per_year']:.4e} events/yr\")\n", "print(f\"Rate ratio: {ler_params['rate_ratio']:.4f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 Visualize Parameter Distributions\n", "\n", "Create KDE (Kernel Density Estimation) plots to compare the distributions of source redshift for lensed and unlensed populations." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "getting gw_params from json file ler_data/unlensed_param_detectable.json...\n", "getting gw_params from json file ler_data/unlensed_param.json...\n", "getting gw_params from json file ler_data/lensed_param_detectable.json...\n", "getting gw_params from json file ler_data/lensed_param.json...\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Visualize parameter distributions\n", "import matplotlib.pyplot as plt\n", "from ler.utils import plots as lerplt\n", "\n", "# Plot source redshift distributions\n", "plt.figure(figsize=(6, 4))\n", "\n", "# Unlensed populations\n", "lerplt.param_plot(\n", " param_name='zs',\n", " param_dict='ler_data/unlensed_param_detectable.json', # can also provide the dict directly\n", " plot_label='unlensed-detectable',\n", " histogram=False,\n", " kde=True,\n", " kde_bandwidth=0.5,\n", ")\n", "lerplt.param_plot(\n", " param_name='zs',\n", " param_dict='ler_data/unlensed_param.json',\n", " plot_label='unlensed-all',\n", " histogram=False,\n", " kde=True,\n", ")\n", "\n", "# Lensed populations\n", "lerplt.param_plot(\n", " param_name='zs',\n", " param_dict='ler_data/lensed_param_detectable.json',\n", " plot_label='lensed-detectable',\n", " histogram=False,\n", " kde=True,\n", " kde_bandwidth=0.5,\n", ")\n", "lerplt.param_plot(\n", " param_name='zs',\n", " param_dict='ler_data/lensed_param.json',\n", " plot_label='lensed-all',\n", " histogram=False,\n", " kde=True,\n", ")\n", "\n", "plt.xlim(0.001, 8)\n", "plt.grid(alpha=0.4)\n", "plt.xlabel('Source redshift (zs)', fontsize=12)\n", "plt.ylabel('Probability Density', fontsize=12)\n", "plt.title('Source Redshift Distribution: Lensed vs Unlensed', fontsize=14, fontweight='bold')\n", "plt.legend(fontsize=10, loc='upper right')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## 5. Available Internal Functions and Their Usage\n", "\n", "### 5.1 Explore Functions and Parameters\n", "\n", "Inspect the internal functions and parameters used for `LeR` initialization." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# ----------------------------------------------------\n", "# GW prior sampler functions and it's input arguments:\n", "# ----------------------------------------------------\n", "\n", "merger_rate_density = dict(\n", " merger_rate_density_bbh_oguri2018 = {'R0': 1.9e-08, 'b2': 1.6, 'b3': 2.1, 'b4': 30},\n", " merger_rate_density_madau_dickinson2014 = {'R0': 1.9e-08, 'a': 0.015, 'b': 2.7, 'c': 2.9, 'd': 5.6},\n", " merger_rate_density_madau_dickinson_belczynski_ng = {'R0': 1.9e-08, 'alpha_F': 2.57, 'beta_F': 5.83, 'c_F': 3.36},\n", " sfr_with_time_delay = {'R0': 1.9e-08, 'a': 0.01, 'b': 2.6, 'c': 3.2, 'd': 6.2, 'td_min': 0.01, 'td_max': 10.0},\n", " merger_rate_density_bbh_popIII_ken2022 = {'R0': 1.92e-08, 'aIII': 0.66, 'bIII': 0.3, 'zIII': 11.6},\n", " merger_rate_density_bbh_primordial_ken2022 = {'R0': 4.4e-11, 't0': 13.786885302009708},\n", ")\n", "zs = dict(\n", " source_redshift = None,\n", ")\n", "source_frame_masses = dict(\n", " binary_masses_BBH_powerlaw_gaussian = {'mminbh': 4.98, 'mmaxbh': 112.5, 'alpha': 3.78, 'mu_g': 32.27, 'sigma_g': 3.88, 'lambda_peak': 0.03, 'delta_m': 4.8, 'beta': 0.81},\n", " binary_masses_BBH_popIII_lognormal = {'m_min': 5.0, 'm_max': 150.0, 'Mc': 30.0, 'sigma': 0.3},\n", " binary_masses_BBH_primordial_lognormal = {'m_min': 1.0, 'm_max': 100.0, 'Mc': 20.0, 'sigma': 0.3},\n", " binary_masses_NSBH_broken_powerlaw = {'mminbh': 26, 'mmaxbh': 125, 'alpha_1': 6.75, 'alpha_2': 6.75, 'b': 0.5, 'delta_m': 5, 'mminns': 1.0, 'mmaxns': 3.0, 'alphans': 0.0},\n", " binary_masses_uniform = {'m_min': 1.0, 'm_max': 3.0},\n", " binary_masses_BNS_bimodal = {'w': 0.643, 'muL': 1.352, 'sigmaL': 0.08, 'muR': 1.88, 'sigmaR': 0.3, 'mmin': 1.0, 'mmax': 2.3},\n", ")\n", "a_1 = dict(\n", " constant_values_n_size = {'value': 0.0},\n", " sampler_uniform = {'xmin': -0.8, 'xmax': 0.8},\n", ")\n", "a_2 = dict(\n", " constant_values_n_size = {'value': 0.0},\n", " sampler_uniform = {'xmin': -0.8, 'xmax': 0.8},\n", ")\n", "tilt_1 = dict(\n", " constant_values_n_size = {'value': 0.0},\n", " sampler_sine = None,\n", ")\n", "tilt_2 = dict(\n", " constant_values_n_size = {'value': 0.0},\n", " sampler_sine = None,\n", ")\n", "phi_12 = dict(\n", " constant_values_n_size = {'value': 0.0},\n", " sampler_uniform = {'xmin': 0.0, 'xmax': 6.283185307179586},\n", ")\n", "phi_jl = dict(\n", " constant_values_n_size = {'value': 0.0},\n", " sampler_uniform = {'xmin': 0.0, 'xmax': 6.283185307179586},\n", ")\n", "geocent_time = dict(\n", " sampler_uniform = {'xmin': 1238166018, 'xmax': 1269723618.0},\n", " constant_values_n_size = {'value': 1238166018},\n", ")\n", "ra = dict(\n", " sampler_uniform = {'xmin': 0.0, 'xmax': 6.283185307179586},\n", " constant_values_n_size = {'value': 0.0},\n", ")\n", "dec = dict(\n", " sampler_cosine = None,\n", " constant_values_n_size = {'value': 0.0},\n", " sampler_uniform = {'xmin': -1.5707963267948966, 'xmax': 1.5707963267948966},\n", ")\n", "phase = dict(\n", " sampler_uniform = {'xmin': 0.0, 'xmax': 6.283185307179586},\n", " constant_values_n_size = {'value': 0.0},\n", ")\n", "psi = dict(\n", " sampler_uniform = {'xmin': 0.0, 'xmax': 3.141592653589793},\n", " constant_values_n_size = {'value': 0.0},\n", ")\n", "theta_jn = dict(\n", " sampler_sine = None,\n", " constant_values_n_size = {'value': 0.0},\n", " sampler_uniform = {'xmin': 0.0, 'xmax': 3.141592653589793},\n", ")\n", "\n", "# ----------------------------------------------------\n", "# Lens prior sampler functions and it's input arguments:\n", "# ----------------------------------------------------\n", "\n", "source_redshift_sl = dict(\n", " strongly_lensed_source_redshifts = None,\n", ")\n", "lens_redshift = dict(\n", " lens_redshift_strongly_lensed_sis_haris = None,\n", " lens_redshift_strongly_lensed_numerical = {'integration_size': 25000, 'use_multiprocessing': False},\n", " lens_redshift_strongly_lensed_hemanta = None,\n", ")\n", "velocity_dispersion = dict(\n", " velocity_dispersion_gengamma = {'sigma_min': 100.0, 'sigma_max': 400.0, 'alpha': 0.94, 'beta': 1.85, 'phistar': np.float64(0.02099), 'sigmastar': 113.78},\n", " velocity_dispersion_choi = {'sigma_min': 100.0, 'sigma_max': 400.0, 'alpha': 2.32, 'beta': 2.67, 'phistar': np.float64(0.0027439999999999995), 'sigmastar': 161.0},\n", " velocity_dispersion_bernardi = {'sigma_min': 100.0, 'sigma_max': 400.0, 'alpha': 0.94, 'beta': 1.85, 'phistar': np.float64(0.02099), 'sigmastar': 113.78},\n", " velocity_dispersion_ewoud = {'sigma_min': 100.0, 'sigma_max': 400.0, 'alpha': 0.94, 'beta': 1.85, 'phistar': np.float64(0.02099), 'sigmastar': 113.78},\n", ")\n", "axis_ratio = dict(\n", " axis_ratio_rayleigh = {'q_min': 0.2, 'q_max': 1.0},\n", " axis_ratio_padilla_strauss = {'q_min': 0.2, 'q_max': 1.0},\n", " axis_ratio_uniform = {'q_min': 0.2, 'q_max': 1.0},\n", ")\n", "axis_rotation_angle = dict(\n", " axis_rotation_angle_uniform = {'phi_min': 0.0, 'phi_max': 6.283185307179586},\n", ")\n", "external_shear = dict(\n", " external_shear_normal = {'mean': 0.0, 'std': 0.05},\n", ")\n", "external_shear_sl = dict(\n", " external_shear_normal = {'mean': 0.0, 'std': 0.05},\n", " external_shear_sl_numerical_hemanta = {'external_shear_normal': {'mean': 0.0, 'std': 0.05}},\n", ")\n", "density_profile_slope = dict(\n", " density_profile_slope_normal = {'mean': 1.99, 'std': 0.149},\n", ")\n", "density_profile_slope_sl = dict(\n", " density_profile_slope_normal = {'mean': 2.091, 'std': 0.133},\n", " density_profile_slope_sl_numerical_hemanta = {'density_profile_slope_normal': {'mean': 1.99, 'std': 0.149}},\n", ")\n", "source_parameters = dict(\n", " sample_gw_parameters = None,\n", ")\n", "\n", "# ----------------------------------------------------\n", "# Other lens related functions and it's input arguments:\n", "# ----------------------------------------------------\n", "\n", "cross_section_based_sampler = dict(\n", " rejection_sampling_with_cross_section = {'safety_factor': 1.2},\n", " importance_sampling_with_cross_section = {'n_prop': 200},\n", ")\n", "optical_depth = dict(\n", " optical_depth_sis_analytic = None,\n", " optical_depth_epl_shear_hemanta = None,\n", " optical_depth_numerical = None,\n", ")\n", "param_sampler_type = dict(\n", " sample_all_routine_epl_shear_sl = None,\n", ")\n", "cross_section = dict(\n", " cross_section_sie_feixu = None,\n", " cross_section_sis = None,\n", " cross_section_epl_shear_numerical = None,\n", " cross_section_epl_shear_interpolation = None,\n", ")\n" ] } ], "source": [ "# List all available GW prior are in ler.available_gw_prior \n", "print(\"# ----------------------------------------------------\")\n", "print(\"# GW prior sampler functions and it's input arguments:\")\n", "print(\"# ----------------------------------------------------\\n\")\n", "for key, value in ler.available_gw_prior.items():\n", " print(f\"{key} = dict(\")\n", " if isinstance(value, dict):\n", " for k, v in value.items():\n", " print(f\" {k} = {v},\")\n", " else:\n", " print(f\" {value},\")\n", " print(\")\")\n", "\n", "# list all available lens prior are in ler.available_lens_samplers\n", "print(\"\\n# ----------------------------------------------------\")\n", "print(\"# Lens prior sampler functions and it's input arguments:\")\n", "print(\"# ----------------------------------------------------\\n\")\n", "for key, value in ler.available_lens_samplers.items():\n", " print(f\"{key} = dict(\")\n", " if isinstance(value, dict):\n", " for k, v in value.items():\n", " print(f\" {k} = {v},\")\n", " else:\n", " print(f\" {value},\")\n", " print(\")\")\n", "\n", "# list all available lens functions are in ler.available_lens_functions\n", "print(\"\\n# ----------------------------------------------------\")\n", "print(\"# Other lens related functions and it's input arguments:\")\n", "print(\"# ----------------------------------------------------\\n\")\n", "for key, value in ler.available_lens_functions.items():\n", " print(f\"{key} = dict(\")\n", " if isinstance(value, dict):\n", " for k, v in value.items():\n", " print(f\" {k} = {v},\")\n", " else:\n", " print(f\" {value},\")\n", " print(\")\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2 Short Example on Using Internal Functions\n", "\n", "Following is a code snippet to initialize `LeR` with internal functions. Refer to the dedicated `LeR with custom functions` example for more details.\n", "\n", "```python\n", "ler = LeR(\n", " source_priors=dict(\n", " merger_rate_density='sfr_madau_fragos2017',\n", " ),\n", " source_priors_params=dict(\n", " merger_rate_density={'R0': 2.39e-08, 'b2': 1.6, 'b3': 2.1, 'b4': 30}\n", " ),\n", " lens_param_samplers=dict(\n", " velocity_dispersion='velocity_dispersion_bernardi',\n", " )\n", " lens_param_samplers_params={'sigma_min': 100.0, 'sigma_max': 400.0, 'alpha': 0.94, 'beta': 1.85, 'phistar': np.float64(0.02099), 'sigmastar': 113.78}\n", ")\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## 6. Summary\n", "\n", "This notebook demonstrates gravitational wave detection rate simulations using the **LeR** framework for both unlensed and strongly lensed compact binary coalescence (CBC) events.\n", "\n", "**Workflow:** Initialize LeR with default BBH sources, EPL+Shear lens model, and O4-sensitivity detectors (H1, L1, V1) → simulate 100,000 unlensed CBC events and compute detection rates → sample lens galaxy properties, solve lens equations, and compute lensed rates (requiring ≥2 detectable images) → compare rates and visualize redshift distributions.\n", "\n", "**Sampled Parameters:**\n", "- *GW source:* redshift, masses, spins, sky location, orientation, luminosity distance, detection probability\n", "- *Lens:* redshift, velocity dispersion, Einstein radius, axis ratio, density slope, shear\n", "- *Images:* magnifications, time delays, image types, effective luminosity distances\n", "\n", "**Output Files** (saved to `./ler_data/`): `unlensed_param.json`, `unlensed_param_detectable.json`, `lensed_param.json`, `lensed_param_detectable.json`, `ler_params.json`\n", "\n", "**Customization:** Access built-in samplers via `ler.available_gw_prior`, `ler.available_lens_samplers`, and `ler.available_lens_functions`. See the **LeR with custom functions** example for advanced configurations." ] } ], "metadata": { "kernelspec": { "display_name": "ler", "language": "python", "name": "ler" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.18" } }, "nbformat": 4, "nbformat_minor": 2 }