rubin-sim 2.6.1.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- batch/compile_prenight_metadata_cache.sh +34 -0
- batch/run_auxtel_prenight_sims.sh +163 -0
- batch/run_prenight_sims.sh +239 -0
- docs/.gitignore +3 -0
- docs/Makefile +32 -0
- docs/api.rst +25 -0
- docs/conf.py +8 -0
- docs/data-api.rst +12 -0
- docs/data-download.rst +70 -0
- docs/developer.rst +14 -0
- docs/documenteer.toml +11 -0
- docs/index.rst +22 -0
- docs/installation.rst +76 -0
- docs/introduction.rst +37 -0
- docs/maf-api-batches.rst +12 -0
- docs/maf-api-db.rst +12 -0
- docs/maf-api-maf-contrib.rst +12 -0
- docs/maf-api-maps.rst +12 -0
- docs/maf-api-metricbundles.rst +12 -0
- docs/maf-api-metrics.rst +12 -0
- docs/maf-api-plots.rst +12 -0
- docs/maf-api-run-comparison.rst +12 -0
- docs/maf-api-slicers.rst +12 -0
- docs/maf-api-stackers.rst +12 -0
- docs/maf-api-utils.rst +12 -0
- docs/maf-api.rst +22 -0
- docs/maf.rst +60 -0
- docs/metric_list.py +49 -0
- docs/moving-objects-api.rst +12 -0
- docs/moving-objects.rst +22 -0
- docs/phot-utils-api.rst +12 -0
- docs/phot-utils.rst +11 -0
- docs/prenight.rst +117 -0
- docs/protoarchive.rst +276 -0
- docs/satellite-constellations-api.rst +12 -0
- docs/satellite-constellations.rst +13 -0
- docs/selfcal-api.rst +12 -0
- docs/selfcal.rst +15 -0
- docs/sim-archive-api.rst +12 -0
- docs/skybrightness-api.rst +12 -0
- docs/skybrightness.rst +23 -0
- docs/user-guide.rst +28 -0
- docs/vseqarchive-architecture.rst +438 -0
- docs/vseqarchive-setup.rst +238 -0
- docs/vseqarchive.rst +225 -0
- rubin_sim/__init__.py +7 -0
- rubin_sim/data/__init__.py +1 -0
- rubin_sim/data/rs_download_data.py +155 -0
- rubin_sim/maf/__init__.py +34 -0
- rubin_sim/maf/batches/__init__.py +18 -0
- rubin_sim/maf/batches/altaz_batch.py +161 -0
- rubin_sim/maf/batches/col_map_dict.py +274 -0
- rubin_sim/maf/batches/common.py +388 -0
- rubin_sim/maf/batches/ddf_batch.py +728 -0
- rubin_sim/maf/batches/filterchange_batch.py +182 -0
- rubin_sim/maf/batches/glance_batch.py +591 -0
- rubin_sim/maf/batches/hourglass_batch.py +79 -0
- rubin_sim/maf/batches/info_batch.py +114 -0
- rubin_sim/maf/batches/metadata_batch.py +558 -0
- rubin_sim/maf/batches/moving_objects_batch.py +1587 -0
- rubin_sim/maf/batches/openshutter_batch.py +100 -0
- rubin_sim/maf/batches/radar_limited.py +1100 -0
- rubin_sim/maf/batches/science_radar_batch.py +1910 -0
- rubin_sim/maf/batches/skycoverage.py +155 -0
- rubin_sim/maf/batches/slew_batch.py +146 -0
- rubin_sim/maf/batches/srd_batch.py +637 -0
- rubin_sim/maf/batches/time_batch.py +757 -0
- rubin_sim/maf/batches/time_sci_batch.py +105 -0
- rubin_sim/maf/batches/visitdepth_batch.py +485 -0
- rubin_sim/maf/db/__init__.py +2 -0
- rubin_sim/maf/db/add_run.py +34 -0
- rubin_sim/maf/db/results_db.py +1074 -0
- rubin_sim/maf/db/tracking_db.py +332 -0
- rubin_sim/maf/ddf_dir.py +53 -0
- rubin_sim/maf/generate_ss.py +218 -0
- rubin_sim/maf/glance_dir.py +58 -0
- rubin_sim/maf/maf_contrib/__init__.py +25 -0
- rubin_sim/maf/maf_contrib/calculate_lsst_field_visibility_astropy.py +170 -0
- rubin_sim/maf/maf_contrib/depth_limited_num_gal_metric.py +109 -0
- rubin_sim/maf/maf_contrib/example_new_metrics.py +40 -0
- rubin_sim/maf/maf_contrib/filter_pair_t_gaps_metric.py +208 -0
- rubin_sim/maf/maf_contrib/grb_transient_metric.py +249 -0
- rubin_sim/maf/maf_contrib/gw170817_det_metric.py +72 -0
- rubin_sim/maf/maf_contrib/intervals_between_obs_metric.py +68 -0
- rubin_sim/maf/maf_contrib/kne_metrics.py +473 -0
- rubin_sim/maf/maf_contrib/lss_metrics.py +45 -0
- rubin_sim/maf/maf_contrib/lss_obs_strategy/__init__.py +3 -0
- rubin_sim/maf/maf_contrib/lss_obs_strategy/constants_for_pipeline.py +73 -0
- rubin_sim/maf/maf_contrib/lss_obs_strategy/galaxy_counts_metric_extended.py +205 -0
- rubin_sim/maf/maf_contrib/lss_obs_strategy/galaxy_counts_with_pixel_calibration.py +171 -0
- rubin_sim/maf/maf_contrib/lv_dwarfs/__init__.py +1 -0
- rubin_sim/maf/maf_contrib/lv_dwarfs/lv_dwarfs_metrics.py +388 -0
- rubin_sim/maf/maf_contrib/microlensing_metric.py +593 -0
- rubin_sim/maf/maf_contrib/num_obs_in_survey_time_overlap_metric.py +43 -0
- rubin_sim/maf/maf_contrib/periodic_metric.py +51 -0
- rubin_sim/maf/maf_contrib/periodic_star_metric.py +186 -0
- rubin_sim/maf/maf_contrib/periodic_star_modulation_metric.py +236 -0
- rubin_sim/maf/maf_contrib/presto_color_kne_pop_metric.py +441 -0
- rubin_sim/maf/maf_contrib/selfcal_uniformity_metric.py +171 -0
- rubin_sim/maf/maf_contrib/star_count_mass_metric.py +64 -0
- rubin_sim/maf/maf_contrib/star_count_metric.py +56 -0
- rubin_sim/maf/maf_contrib/star_counts/__init__.py +8 -0
- rubin_sim/maf/maf_contrib/star_counts/abs_mag.py +324 -0
- rubin_sim/maf/maf_contrib/star_counts/coords.py +99 -0
- rubin_sim/maf/maf_contrib/star_counts/readme.txt +1 -0
- rubin_sim/maf/maf_contrib/star_counts/spec_type.py +91 -0
- rubin_sim/maf/maf_contrib/star_counts/starcount.py +30 -0
- rubin_sim/maf/maf_contrib/star_counts/starcount_bymass.py +93 -0
- rubin_sim/maf/maf_contrib/star_counts/stellardensity.py +59 -0
- rubin_sim/maf/maf_contrib/static_probes_fom_summary_metric.py +386 -0
- rubin_sim/maf/maf_contrib/tdes_pop_metric.py +362 -0
- rubin_sim/maf/maf_contrib/transient_ascii_sed_metric.py +652 -0
- rubin_sim/maf/maf_contrib/triplet_metric.py +156 -0
- rubin_sim/maf/maf_contrib/var_depth_metric.py +157 -0
- rubin_sim/maf/maf_contrib/xrb_metrics.py +523 -0
- rubin_sim/maf/maf_contrib/young_stellar_objects_metric.py +200 -0
- rubin_sim/maf/maf_night_report.py +200 -0
- rubin_sim/maf/make_fbs_tracking_db.py +90 -0
- rubin_sim/maf/maps/__init__.py +8 -0
- rubin_sim/maf/maps/base_map.py +72 -0
- rubin_sim/maf/maps/create_gaia_density_map.py +158 -0
- rubin_sim/maf/maps/dust_map.py +66 -0
- rubin_sim/maf/maps/dust_map_3d.py +190 -0
- rubin_sim/maf/maps/ebv_3d_hp.py +170 -0
- rubin_sim/maf/maps/ebv_hp.py +64 -0
- rubin_sim/maf/maps/gal_coords_map.py +22 -0
- rubin_sim/maf/maps/galactic_plane_priority_maps.py +210 -0
- rubin_sim/maf/maps/stellar_density_map.py +73 -0
- rubin_sim/maf/maps/trilegal_map.py +82 -0
- rubin_sim/maf/metadata_dir.py +90 -0
- rubin_sim/maf/metric_bundles/__init__.py +3 -0
- rubin_sim/maf/metric_bundles/metric_bundle.py +816 -0
- rubin_sim/maf/metric_bundles/metric_bundle_group.py +834 -0
- rubin_sim/maf/metric_bundles/mo_metric_bundle.py +646 -0
- rubin_sim/maf/metrics/__init__.py +52 -0
- rubin_sim/maf/metrics/agn_time_lag_metric.py +118 -0
- rubin_sim/maf/metrics/agnstructure.py +141 -0
- rubin_sim/maf/metrics/area_summary_metrics.py +120 -0
- rubin_sim/maf/metrics/base_metric.py +215 -0
- rubin_sim/maf/metrics/brown_dwarf_metric.py +162 -0
- rubin_sim/maf/metrics/cadence_metrics.py +400 -0
- rubin_sim/maf/metrics/calibration_metrics.py +618 -0
- rubin_sim/maf/metrics/chip_vendor_metric.py +43 -0
- rubin_sim/maf/metrics/color_slope_metrics.py +189 -0
- rubin_sim/maf/metrics/cosmology_summary_metrics.py +1212 -0
- rubin_sim/maf/metrics/coverage_metric.py +48 -0
- rubin_sim/maf/metrics/crowding_metric.py +255 -0
- rubin_sim/maf/metrics/cumulative_metric.py +46 -0
- rubin_sim/maf/metrics/dcr_metric.py +93 -0
- rubin_sim/maf/metrics/exgal_m5.py +57 -0
- rubin_sim/maf/metrics/fft_metric.py +27 -0
- rubin_sim/maf/metrics/galactic_plane_metrics.py +375 -0
- rubin_sim/maf/metrics/galplane_time_sampling_metrics.py +236 -0
- rubin_sim/maf/metrics/hourglass_metric.py +130 -0
- rubin_sim/maf/metrics/incremental_template_metric.py +255 -0
- rubin_sim/maf/metrics/kuiper_metrics.py +26 -0
- rubin_sim/maf/metrics/mo_metrics.py +1496 -0
- rubin_sim/maf/metrics/mo_summary_metrics.py +464 -0
- rubin_sim/maf/metrics/night_pointing_metric.py +70 -0
- rubin_sim/maf/metrics/optimal_m5_metric.py +94 -0
- rubin_sim/maf/metrics/pair_metric.py +69 -0
- rubin_sim/maf/metrics/periodic_detect_metric.py +133 -0
- rubin_sim/maf/metrics/phase_gap_metric.py +172 -0
- rubin_sim/maf/metrics/qso_number_counts_metric.py +138 -0
- rubin_sim/maf/metrics/scaling_metrics.py +148 -0
- rubin_sim/maf/metrics/schedview_metrics.py +39 -0
- rubin_sim/maf/metrics/season_metrics.py +344 -0
- rubin_sim/maf/metrics/simple_metrics.py +546 -0
- rubin_sim/maf/metrics/sky_sat_metric.py +18 -0
- rubin_sim/maf/metrics/sn_cadence_metric.py +104 -0
- rubin_sim/maf/metrics/sn_n_sn_metric.py +1364 -0
- rubin_sim/maf/metrics/sn_sl_metric.py +216 -0
- rubin_sim/maf/metrics/sn_snr_metric.py +715 -0
- rubin_sim/maf/metrics/snr_weight.py +24 -0
- rubin_sim/maf/metrics/star_density.py +77 -0
- rubin_sim/maf/metrics/string_count_metric.py +95 -0
- rubin_sim/maf/metrics/summary_metrics.py +201 -0
- rubin_sim/maf/metrics/surfb_metric.py +175 -0
- rubin_sim/maf/metrics/technical_metrics.py +271 -0
- rubin_sim/maf/metrics/tgaps.py +412 -0
- rubin_sim/maf/metrics/tomography_models.py +2034 -0
- rubin_sim/maf/metrics/transient_metrics.py +268 -0
- rubin_sim/maf/metrics/uniformity_metrics.py +418 -0
- rubin_sim/maf/metrics/use_metrics.py +55 -0
- rubin_sim/maf/metrics/vector_metrics.py +190 -0
- rubin_sim/maf/metrics/visit_groups_metric.py +341 -0
- rubin_sim/maf/metrics/weak_lensing_systematics_metric.py +210 -0
- rubin_sim/maf/plots/__init__.py +14 -0
- rubin_sim/maf/plots/hg_plotters.py +1117 -0
- rubin_sim/maf/plots/hourglass_plotters.py +120 -0
- rubin_sim/maf/plots/mo_plotters.py +358 -0
- rubin_sim/maf/plots/nd_plotters.py +220 -0
- rubin_sim/maf/plots/neo_distance_plotter.py +140 -0
- rubin_sim/maf/plots/night_pointing_plotter.py +96 -0
- rubin_sim/maf/plots/oned_plotters.py +114 -0
- rubin_sim/maf/plots/perceptual_rainbow.py +30 -0
- rubin_sim/maf/plots/plot_handler.py +766 -0
- rubin_sim/maf/plots/skyproj_plotters.py +540 -0
- rubin_sim/maf/plots/spatial_plotters.py +1029 -0
- rubin_sim/maf/plots/special_plotters.py +256 -0
- rubin_sim/maf/plots/two_d_plotters.py +177 -0
- rubin_sim/maf/plots/xyplotter.py +37 -0
- rubin_sim/maf/run_comparison/__init__.py +5 -0
- rubin_sim/maf/run_comparison/archive.py +584 -0
- rubin_sim/maf/run_comparison/gather_summaries.py +125 -0
- rubin_sim/maf/run_comparison/microlensing_compare.py +514 -0
- rubin_sim/maf/run_comparison/radar_plot.py +202 -0
- rubin_sim/maf/run_comparison/summary_plots.py +710 -0
- rubin_sim/maf/run_moving_calc.py +239 -0
- rubin_sim/maf/run_moving_fractions.py +128 -0
- rubin_sim/maf/run_moving_join.py +103 -0
- rubin_sim/maf/run_selfcal_metric.py +92 -0
- rubin_sim/maf/scimaf_dir.py +87 -0
- rubin_sim/maf/show_maf.py +227 -0
- rubin_sim/maf/slicers/__init__.py +13 -0
- rubin_sim/maf/slicers/base_slicer.py +513 -0
- rubin_sim/maf/slicers/base_spatial_slicer.py +202 -0
- rubin_sim/maf/slicers/healpix_sdss_slicer.py +118 -0
- rubin_sim/maf/slicers/healpix_slicer.py +189 -0
- rubin_sim/maf/slicers/healpix_subset_slicer.py +293 -0
- rubin_sim/maf/slicers/hourglass_slicer.py +37 -0
- rubin_sim/maf/slicers/mo_slicer.py +171 -0
- rubin_sim/maf/slicers/movie_slicer.py +288 -0
- rubin_sim/maf/slicers/nd_slicer.py +147 -0
- rubin_sim/maf/slicers/one_d_slicer.py +210 -0
- rubin_sim/maf/slicers/time_interval_slicers.py +283 -0
- rubin_sim/maf/slicers/uni_slicer.py +57 -0
- rubin_sim/maf/slicers/user_points_slicer.py +141 -0
- rubin_sim/maf/stackers/__init__.py +13 -0
- rubin_sim/maf/stackers/base_stacker.py +221 -0
- rubin_sim/maf/stackers/coord_stackers.py +224 -0
- rubin_sim/maf/stackers/date_stackers.py +192 -0
- rubin_sim/maf/stackers/general_stackers.py +683 -0
- rubin_sim/maf/stackers/get_col_info.py +104 -0
- rubin_sim/maf/stackers/label_stackers.py +114 -0
- rubin_sim/maf/stackers/m5_optimal_stacker.py +126 -0
- rubin_sim/maf/stackers/mo_phase.py +265 -0
- rubin_sim/maf/stackers/mo_stackers.py +486 -0
- rubin_sim/maf/stackers/n_follow_stacker.py +187 -0
- rubin_sim/maf/stackers/neo_dist_stacker.py +126 -0
- rubin_sim/maf/stackers/sdss_stackers.py +30 -0
- rubin_sim/maf/stackers/sn_stacker.py +152 -0
- rubin_sim/maf/stackers/teff_stacker.py +154 -0
- rubin_sim/maf/utils/__init__.py +6 -0
- rubin_sim/maf/utils/astrometry_utils.py +93 -0
- rubin_sim/maf/utils/generate_fov_map.py +58 -0
- rubin_sim/maf/utils/get_date_version.py +28 -0
- rubin_sim/maf/utils/maf_utils.py +212 -0
- rubin_sim/maf/utils/opsim_utils.py +259 -0
- rubin_sim/maf/utils/output_utils.py +34 -0
- rubin_sim/maf/utils/sn_n_sn_utils.py +894 -0
- rubin_sim/maf/utils/sn_utils.py +369 -0
- rubin_sim/maf/utils/stellar_mags.py +197 -0
- rubin_sim/maf/web/__init__.py +2 -0
- rubin_sim/maf/web/favicon.ico +0 -0
- rubin_sim/maf/web/maf_run_results.py +645 -0
- rubin_sim/maf/web/maf_tracking.py +139 -0
- rubin_sim/maf/web/sorttable.js +496 -0
- rubin_sim/maf/web/templates/allmetricresults.html +72 -0
- rubin_sim/maf/web/templates/configs.html +28 -0
- rubin_sim/maf/web/templates/macros.html +243 -0
- rubin_sim/maf/web/templates/master.html +294 -0
- rubin_sim/maf/web/templates/metricselect.html +91 -0
- rubin_sim/maf/web/templates/multicolor.html +147 -0
- rubin_sim/maf/web/templates/results.html +82 -0
- rubin_sim/maf/web/templates/runselect.html +58 -0
- rubin_sim/maf/web/templates/stats.html +50 -0
- rubin_sim/moving_objects/__init__.py +8 -0
- rubin_sim/moving_objects/base_obs.py +468 -0
- rubin_sim/moving_objects/cheby_fits.py +689 -0
- rubin_sim/moving_objects/cheby_values.py +231 -0
- rubin_sim/moving_objects/chebyshev_utils.py +365 -0
- rubin_sim/moving_objects/direct_obs.py +376 -0
- rubin_sim/moving_objects/make_lsst_obs.py +282 -0
- rubin_sim/moving_objects/ooephemerides.py +643 -0
- rubin_sim/moving_objects/orbits.py +507 -0
- rubin_sim/moving_objects/pre_generate.py +37 -0
- rubin_sim/moving_objects/utils.py +61 -0
- rubin_sim/phot_utils/__init__.py +7 -0
- rubin_sim/phot_utils/bandpass.py +425 -0
- rubin_sim/phot_utils/photometric_parameters.py +449 -0
- rubin_sim/phot_utils/physical_parameters.py +50 -0
- rubin_sim/phot_utils/predicted_zeropoints.py +245 -0
- rubin_sim/phot_utils/sed.py +1773 -0
- rubin_sim/phot_utils/sed_utils.py +52 -0
- rubin_sim/phot_utils/signaltonoise.py +695 -0
- rubin_sim/phot_utils/spectral_resampling.py +161 -0
- rubin_sim/satellite_constellations/__init__.py +3 -0
- rubin_sim/satellite_constellations/basis_function.py +40 -0
- rubin_sim/satellite_constellations/model_observatory.py +157 -0
- rubin_sim/satellite_constellations/sat_utils.py +488 -0
- rubin_sim/selfcal/__init__.py +4 -0
- rubin_sim/selfcal/generate_catalog.py +188 -0
- rubin_sim/selfcal/offsets.py +119 -0
- rubin_sim/selfcal/solver.py +143 -0
- rubin_sim/selfcal/star_tools.py +42 -0
- rubin_sim/sim_archive/__init__.py +14 -0
- rubin_sim/sim_archive/conda_packages.py +65 -0
- rubin_sim/sim_archive/future_vsarch.py +480 -0
- rubin_sim/sim_archive/make_snapshot.py +255 -0
- rubin_sim/sim_archive/prenight.py +216 -0
- rubin_sim/sim_archive/prenightindex.py +229 -0
- rubin_sim/sim_archive/prototype.py +1029 -0
- rubin_sim/sim_archive/sim_archive.py +680 -0
- rubin_sim/sim_archive/tempdb.py +56 -0
- rubin_sim/sim_archive/util.py +146 -0
- rubin_sim/sim_archive/vseqarchive.py +965 -0
- rubin_sim/sim_archive/vseqmetadata.py +1721 -0
- rubin_sim/skybrightness/__init__.py +5 -0
- rubin_sim/skybrightness/allsky_db.py +93 -0
- rubin_sim/skybrightness/data/ESO_Spectra/eso_tools.py +505 -0
- rubin_sim/skybrightness/data/solarSpec/package.py +22 -0
- rubin_sim/skybrightness/generate_hdf5.py +243 -0
- rubin_sim/skybrightness/interp_components.py +798 -0
- rubin_sim/skybrightness/sky_model.py +771 -0
- rubin_sim/skybrightness/twilight_func.py +83 -0
- rubin_sim/skybrightness/utils.py +91 -0
- rubin_sim-2.6.1.dev2.dist-info/METADATA +95 -0
- rubin_sim-2.6.1.dev2.dist-info/RECORD +387 -0
- rubin_sim-2.6.1.dev2.dist-info/WHEEL +5 -0
- rubin_sim-2.6.1.dev2.dist-info/entry_points.txt +24 -0
- rubin_sim-2.6.1.dev2.dist-info/licenses/LICENSE +674 -0
- rubin_sim-2.6.1.dev2.dist-info/top_level.txt +5 -0
- sql/make_vseqmeta.sql +251 -0
- tests/data/test_data.py +26 -0
- tests/data/test_ddf_grid.py +17 -0
- tests/maf/test_3x2fom.py +68 -0
- tests/maf/test_archive.py +162 -0
- tests/maf/test_basemetrics.py +99 -0
- tests/maf/test_batchcommon.py +36 -0
- tests/maf/test_batches.py +159 -0
- tests/maf/test_cadencemetrics.py +388 -0
- tests/maf/test_calibrationmetrics.py +242 -0
- tests/maf/test_color_slopes.py +71 -0
- tests/maf/test_cosmology_summaries.py +20 -0
- tests/maf/test_gathersummaries.py +48 -0
- tests/maf/test_healpixslicer.py +439 -0
- tests/maf/test_healpixsubsetslicer.py +273 -0
- tests/maf/test_hgplotters.py +145 -0
- tests/maf/test_hourglassmetric.py +33 -0
- tests/maf/test_io.py +187 -0
- tests/maf/test_json.py +169 -0
- tests/maf/test_maps.py +199 -0
- tests/maf/test_metricbundle.py +69 -0
- tests/maf/test_mometrics.py +422 -0
- tests/maf/test_movieslicer.py +216 -0
- tests/maf/test_ndslicer.py +240 -0
- tests/maf/test_neodistanceplotter.py +41 -0
- tests/maf/test_onedslicer.py +245 -0
- tests/maf/test_opsimutils.py +80 -0
- tests/maf/test_plotters.py +134 -0
- tests/maf/test_resultsdb.py +145 -0
- tests/maf/test_schedviewmetrics.py +14 -0
- tests/maf/test_simplemetrics.py +200 -0
- tests/maf/test_snmetrics.py +335 -0
- tests/maf/test_snmetrics_nsn.py +123 -0
- tests/maf/test_stackers.py +423 -0
- tests/maf/test_stellarmags.py +50 -0
- tests/maf/test_stringcount.py +26 -0
- tests/maf/test_summary_plots.py +197 -0
- tests/maf/test_summarymetrics.py +82 -0
- tests/maf/test_technicalmetrics.py +267 -0
- tests/maf/test_templatemetrics.py +86 -0
- tests/maf/test_timeintervalslicers.py +97 -0
- tests/maf/test_trackingdb.py +88 -0
- tests/maf/test_unislicer.py +116 -0
- tests/maf/test_vectormetrics.py +225 -0
- tests/maf/test_visitgroupsmetric.py +181 -0
- tests/moving_objects/test_camera.py +39 -0
- tests/moving_objects/test_chebyfits.py +188 -0
- tests/moving_objects/test_chebyshevutils.py +76 -0
- tests/moving_objects/test_chebyvalues.py +245 -0
- tests/moving_objects/test_ephemerides.py +219 -0
- tests/moving_objects/test_orbits.py +170 -0
- tests/moving_objects/test_sed_data.py +61 -0
- tests/phot_utils/test_approximatebandpasses.py +91 -0
- tests/phot_utils/test_photometricparameters.py +268 -0
- tests/phot_utils/test_photometry.py +61 -0
- tests/phot_utils/test_predicted_zeropoints.py +53 -0
- tests/phot_utils/test_read_bandpasses.py +29 -0
- tests/phot_utils/test_sed.py +368 -0
- tests/phot_utils/test_snr.py +370 -0
- tests/satellite_constellations/test_satellites.py +36 -0
- tests/sim_archive/test_make_snapshot.py +24 -0
- tests/sim_archive/test_prototype_sim_archive.py +204 -0
- tests/sim_archive/test_vseqarchive.py +947 -0
- tests/skybrightness/test_skymodel.py +359 -0
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
__all__ = ("XrbLc", "XRBPopMetric", "generate_xrb_pop_slicer")
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from rubin_scheduler.data import get_data_dir
|
|
5
|
+
from rubin_scheduler.utils import SURVEY_START_MJD
|
|
6
|
+
from scipy.stats import loguniform
|
|
7
|
+
|
|
8
|
+
from rubin_sim.maf.utils import m52snr
|
|
9
|
+
from rubin_sim.phot_utils import DustValues
|
|
10
|
+
|
|
11
|
+
from ..metrics import BaseMetric
|
|
12
|
+
from ..slicers import UserPointsSlicer
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class XrbLc:
|
|
16
|
+
"""Synthesize XRB outburst lightcurves."""
|
|
17
|
+
|
|
18
|
+
def __init__(self, seed=42):
|
|
19
|
+
dust_properties = DustValues()
|
|
20
|
+
self.ax1 = dust_properties.ax1
|
|
21
|
+
|
|
22
|
+
self.rng = np.random.default_rng(seed)
|
|
23
|
+
|
|
24
|
+
def lmxb_abs_mags(self, size=1):
|
|
25
|
+
"""Return LMXB absolute magnitudes per LSST filter.
|
|
26
|
+
|
|
27
|
+
Absolute magnitude relation is taken from Casares 2018
|
|
28
|
+
(2018MNRAS.473.5195C)
|
|
29
|
+
Colors are taken from M. Johnson+ 2019
|
|
30
|
+
(2019MNRAS.484...19J)
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
size : `int`
|
|
35
|
+
Number of samples to generate.
|
|
36
|
+
|
|
37
|
+
Returns
|
|
38
|
+
-------
|
|
39
|
+
abs_mags : `list` [`dict`]
|
|
40
|
+
Absolute magnitudes for each LSST filter.
|
|
41
|
+
Porbs: `array` [`float`]
|
|
42
|
+
Randomized orbital periods in days
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
# Derive random orbital periods from the sample in Casares 18 Table 4
|
|
46
|
+
# Since there are significant outliers from a single Gaussian sample,
|
|
47
|
+
# take random choices with replacement, then perturb them fractionally
|
|
48
|
+
catalog__porb = np.array(
|
|
49
|
+
[
|
|
50
|
+
33.85,
|
|
51
|
+
6.4713,
|
|
52
|
+
2.5445,
|
|
53
|
+
1.7557,
|
|
54
|
+
1.5420,
|
|
55
|
+
0.5213,
|
|
56
|
+
0.4326,
|
|
57
|
+
0.3441,
|
|
58
|
+
0.3230,
|
|
59
|
+
0.3205,
|
|
60
|
+
0.2852,
|
|
61
|
+
0.2740,
|
|
62
|
+
0.2122,
|
|
63
|
+
0.1699,
|
|
64
|
+
0.1352,
|
|
65
|
+
0.117,
|
|
66
|
+
0.1006,
|
|
67
|
+
]
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
sample__porbs = self.rng.choice(catalog__porb, size=size)
|
|
71
|
+
sample__porbs *= self.rng.uniform(low=0.5, high=1.5, size=size)
|
|
72
|
+
|
|
73
|
+
# lmxb_abs_mag_r = 4.6 # johnson+18
|
|
74
|
+
# Casares 18
|
|
75
|
+
lmxb_abs_mags_r = 4.64 - 3.69 * np.log10(sample__porbs)
|
|
76
|
+
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
"u": lmxb_abs_mag_r + 4.14,
|
|
80
|
+
"g": lmxb_abs_mag_r + 3.24,
|
|
81
|
+
"r": lmxb_abs_mag_r,
|
|
82
|
+
"i": lmxb_abs_mag_r + 0.33,
|
|
83
|
+
"z": lmxb_abs_mag_r + 1.05,
|
|
84
|
+
"y": lmxb_abs_mag_r + 2.36,
|
|
85
|
+
}
|
|
86
|
+
for lmxb_abs_mag_r in lmxb_abs_mags_r
|
|
87
|
+
], sample__porbs
|
|
88
|
+
|
|
89
|
+
def outburst_params(self, size=1):
|
|
90
|
+
"""Return a parameters at random characterizing the outburst.
|
|
91
|
+
|
|
92
|
+
Uses distributions from Chen, Shrader, & Livio 1997 (ApJ 491, 312).
|
|
93
|
+
|
|
94
|
+
Returns
|
|
95
|
+
-------
|
|
96
|
+
params : `list` [`dict`]
|
|
97
|
+
Rise, decay, and amplitude parameters.
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
# rise timescale (Fig. 11): 50% 1-2 day lognormal,
|
|
101
|
+
# 50% loguniform 0.5-50 days
|
|
102
|
+
|
|
103
|
+
flip = self.rng.uniform(size=size)
|
|
104
|
+
w = flip > 0.5
|
|
105
|
+
tau_rise = np.zeros(size) * np.nan
|
|
106
|
+
tau_rise[w] = loguniform.rvs(0.5, 50, size=np.sum(w))
|
|
107
|
+
tau_rise[~w] = self.rng.lognormal(0, 0.2, size=np.sum(~w)) + 0.3
|
|
108
|
+
|
|
109
|
+
# amplitude = rng.lognormal(9,1,size=1)[0]
|
|
110
|
+
# delta_mag = -2.5 * np.log10(amplitude)
|
|
111
|
+
# The Chen+ 10**4 X-ray flux amplitudes imply -10 optical delta mags,
|
|
112
|
+
# which are generally larger than observed.
|
|
113
|
+
# We'll use a fixed -6 delta mag for simplicity
|
|
114
|
+
delta_mag = -6
|
|
115
|
+
amplitude = 10 ** (-0.4 * delta_mag) * np.ones(size)
|
|
116
|
+
|
|
117
|
+
tau_decay = self.rng.lognormal(2.9, 0.65, size=size)
|
|
118
|
+
|
|
119
|
+
duration = (tau_rise + tau_decay) + np.log(amplitude)
|
|
120
|
+
|
|
121
|
+
abs_mags, porbs = self.lmxb_abs_mags(size=size)
|
|
122
|
+
|
|
123
|
+
return [
|
|
124
|
+
{
|
|
125
|
+
"tau_rise": tr,
|
|
126
|
+
"tau_decay": td,
|
|
127
|
+
"amplitude": amp,
|
|
128
|
+
"outburst_duration": dur,
|
|
129
|
+
"abs_mag": abs_mag,
|
|
130
|
+
"orbital_period": Porb,
|
|
131
|
+
}
|
|
132
|
+
for (tr, td, amp, dur, abs_mag, Porb) in zip(
|
|
133
|
+
tau_rise, tau_decay, amplitude, duration, abs_mags, porbs
|
|
134
|
+
)
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
def fred(self, t, amplitude, tau_rise, tau_decay):
|
|
138
|
+
"""Fast-rise, exponential decay function.
|
|
139
|
+
|
|
140
|
+
Amplitude is defined at the peak time = sqrt(tau_rise*tau_decay).
|
|
141
|
+
|
|
142
|
+
See e.g., Tarnopolski 2021 for discussion.
|
|
143
|
+
|
|
144
|
+
Parameters
|
|
145
|
+
----------
|
|
146
|
+
t : `array` [`float`]
|
|
147
|
+
The times relative to the start of the outburst
|
|
148
|
+
amplitude : `float`
|
|
149
|
+
Peak amplitude
|
|
150
|
+
tau_rise : `float`
|
|
151
|
+
E-folding time for the rise
|
|
152
|
+
tau_decay : `float`
|
|
153
|
+
E-folding time for the decay
|
|
154
|
+
"""
|
|
155
|
+
return amplitude * np.exp(2 * np.sqrt(tau_rise / tau_decay)) * np.exp(-tau_rise / t - t / tau_decay)
|
|
156
|
+
|
|
157
|
+
def lightcurve(self, t, filtername, params):
|
|
158
|
+
"""Generate an XRB outburst lightcurve for given times
|
|
159
|
+
and a single filter.
|
|
160
|
+
|
|
161
|
+
Uses a simple fast-rise, exponential decay with parameters taken from
|
|
162
|
+
Chen, Shrader, & Livio 1997 (ApJ 491, 312).
|
|
163
|
+
|
|
164
|
+
For now we ignore the late time linear decay (Tetarenko+2018a,b, and
|
|
165
|
+
references therein.)
|
|
166
|
+
|
|
167
|
+
Parameters
|
|
168
|
+
----------
|
|
169
|
+
t : `array` [`float`]
|
|
170
|
+
The times relative to the start of the outburst
|
|
171
|
+
filtername : `str`
|
|
172
|
+
The filter. one of ugrizy
|
|
173
|
+
params : `dict`
|
|
174
|
+
parameters for the FRED lightcurve.
|
|
175
|
+
|
|
176
|
+
Returns
|
|
177
|
+
-------
|
|
178
|
+
lc : `array`
|
|
179
|
+
Magnitudes of the outburst at the specified times in
|
|
180
|
+
the given filter
|
|
181
|
+
"""
|
|
182
|
+
|
|
183
|
+
# fill lightcurve with nondetections
|
|
184
|
+
lc = np.ones(len(t)) * 99
|
|
185
|
+
|
|
186
|
+
# FRED
|
|
187
|
+
woutburst = (t >= 0) & (t <= params["outburst_duration"])
|
|
188
|
+
if np.sum(woutburst):
|
|
189
|
+
lc[woutburst] = params["abs_mag"][filtername] + -2.5 * np.log10(
|
|
190
|
+
self.fred(
|
|
191
|
+
t[woutburst],
|
|
192
|
+
params["amplitude"],
|
|
193
|
+
params["tau_rise"],
|
|
194
|
+
params["tau_decay"],
|
|
195
|
+
)
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
return lc
|
|
199
|
+
|
|
200
|
+
def detectable_duration(self, params, ebv, distance):
|
|
201
|
+
"""Determine time range an outburst is detectable with
|
|
202
|
+
perfect sampling.
|
|
203
|
+
|
|
204
|
+
Does not consider visibility constraints.
|
|
205
|
+
|
|
206
|
+
Parameters
|
|
207
|
+
----------
|
|
208
|
+
params : `dict`
|
|
209
|
+
lightcurve parameters for XrbLc
|
|
210
|
+
ebv : `float`
|
|
211
|
+
E(B-V)
|
|
212
|
+
distance : `float`
|
|
213
|
+
distance in kpc
|
|
214
|
+
|
|
215
|
+
Returns
|
|
216
|
+
----------
|
|
217
|
+
visible_start_time : `float`
|
|
218
|
+
first time relative to outburst start that the outburst
|
|
219
|
+
could be detected
|
|
220
|
+
visible_end_time : `float`
|
|
221
|
+
last time relative to outburst start that the outburst
|
|
222
|
+
could be detected
|
|
223
|
+
"""
|
|
224
|
+
|
|
225
|
+
nmodelt = 10000
|
|
226
|
+
t = np.linspace(0, params["outburst_duration"], nmodelt)
|
|
227
|
+
|
|
228
|
+
lsst_single_epoch_depth = {
|
|
229
|
+
"u": 23.9,
|
|
230
|
+
"g": 25.0,
|
|
231
|
+
"r": 24.7,
|
|
232
|
+
"i": 24.0,
|
|
233
|
+
"z": 23.3,
|
|
234
|
+
"y": 22.1,
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
visible_start_time = np.inf
|
|
238
|
+
visible_end_time = -np.inf
|
|
239
|
+
|
|
240
|
+
for filtername in ["u", "g", "r", "i", "z", "y"]:
|
|
241
|
+
mags = self.lightcurve(t, filtername, params)
|
|
242
|
+
|
|
243
|
+
# Apply dust extinction on the light curve
|
|
244
|
+
a_x = self.ax1[filtername] * ebv
|
|
245
|
+
mags += a_x
|
|
246
|
+
distmod = 5 * np.log10(distance * 1.0e3) - 5.0
|
|
247
|
+
mags += distmod
|
|
248
|
+
|
|
249
|
+
wdetectable = np.where(mags <= lsst_single_epoch_depth[filtername])[0]
|
|
250
|
+
if len(wdetectable) == 0:
|
|
251
|
+
continue
|
|
252
|
+
|
|
253
|
+
if t[wdetectable[0]] < visible_start_time:
|
|
254
|
+
visible_start_time = t[wdetectable[0]]
|
|
255
|
+
|
|
256
|
+
if t[wdetectable[-1]] >= visible_end_time:
|
|
257
|
+
visible_end_time = t[wdetectable[-1]]
|
|
258
|
+
|
|
259
|
+
if np.isinf(visible_start_time):
|
|
260
|
+
return np.nan, np.nan
|
|
261
|
+
|
|
262
|
+
return visible_start_time, visible_end_time
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
class XRBPopMetric(BaseMetric):
|
|
266
|
+
"""Evaluate whether a given XRB would be detectable.
|
|
267
|
+
|
|
268
|
+
Includes a variety of detection criteria options, including if the
|
|
269
|
+
XRB is possible to detect, if it is detected at least pts_needed times,
|
|
270
|
+
or if it is detected pts_early times within t_early days of the start of
|
|
271
|
+
the outburst.
|
|
272
|
+
|
|
273
|
+
Parameters
|
|
274
|
+
----------
|
|
275
|
+
pts_needed : `int`, opt
|
|
276
|
+
Minimum number of detections, for simple `detected` option.
|
|
277
|
+
mjd0 : `float`, opt
|
|
278
|
+
Start of survey.
|
|
279
|
+
output_lc : `bool`, opt
|
|
280
|
+
If True, output lightcurve points.
|
|
281
|
+
If False, just return metric values.
|
|
282
|
+
"""
|
|
283
|
+
|
|
284
|
+
def __init__(
|
|
285
|
+
self,
|
|
286
|
+
metric_name="XRBPopMetric",
|
|
287
|
+
mjd_col="observationStartMJD",
|
|
288
|
+
m5_col="fiveSigmaDepth",
|
|
289
|
+
filter_col="band",
|
|
290
|
+
night_col="night",
|
|
291
|
+
pts_needed=2,
|
|
292
|
+
pts_early=2,
|
|
293
|
+
t_early=7,
|
|
294
|
+
mjd0=SURVEY_START_MJD,
|
|
295
|
+
output_lc=False,
|
|
296
|
+
badval=-666,
|
|
297
|
+
**kwargs,
|
|
298
|
+
):
|
|
299
|
+
# maps = ["DustMap"]
|
|
300
|
+
self.mjd_col = mjd_col
|
|
301
|
+
self.m5_col = m5_col
|
|
302
|
+
self.filter_col = filter_col
|
|
303
|
+
self.night_col = night_col
|
|
304
|
+
self.pts_needed = pts_needed
|
|
305
|
+
self.pts_early = pts_early
|
|
306
|
+
self.t_early = t_early
|
|
307
|
+
# `bool` variable, if True the light curve will be exported
|
|
308
|
+
self.output_lc = output_lc
|
|
309
|
+
|
|
310
|
+
self.lightcurves = XrbLc()
|
|
311
|
+
self.mjd0 = mjd0
|
|
312
|
+
|
|
313
|
+
dust_properties = DustValues()
|
|
314
|
+
self.ax1 = dust_properties.ax1
|
|
315
|
+
|
|
316
|
+
cols = [self.mjd_col, self.m5_col, self.filter_col, self.night_col]
|
|
317
|
+
super(XRBPopMetric, self).__init__(
|
|
318
|
+
col=cols,
|
|
319
|
+
units="Detected, 0 or 1",
|
|
320
|
+
metric_name=metric_name,
|
|
321
|
+
# maps=maps,
|
|
322
|
+
badval=badval,
|
|
323
|
+
**kwargs,
|
|
324
|
+
)
|
|
325
|
+
self.comment = "Number or characterization of XRBs."
|
|
326
|
+
|
|
327
|
+
def _ever_detect(self, where_detected):
|
|
328
|
+
"""Simple detection criteria: detect at least a certain number
|
|
329
|
+
of times.
|
|
330
|
+
"""
|
|
331
|
+
# Detected data points
|
|
332
|
+
return np.size(where_detected) >= self.pts_needed
|
|
333
|
+
|
|
334
|
+
def _number_of_detections(self, where_detected):
|
|
335
|
+
"""Count total number of detections."""
|
|
336
|
+
return len(where_detected)
|
|
337
|
+
|
|
338
|
+
def _early_detect(self, where_detected, time, early_window_days=7.0, n_early_detections=2):
|
|
339
|
+
"""Detection near the start of the outburst.
|
|
340
|
+
|
|
341
|
+
Parameters
|
|
342
|
+
----------
|
|
343
|
+
where_detected : `array`
|
|
344
|
+
indexes corresponding to 5 sigma detections
|
|
345
|
+
mags : `array`
|
|
346
|
+
magnitudes obtained interpolating models on the data_slice
|
|
347
|
+
time : `array`
|
|
348
|
+
relative times
|
|
349
|
+
early_window_days : `float`
|
|
350
|
+
time since start of outburst
|
|
351
|
+
n_early_detections : `int`
|
|
352
|
+
number of required early detections
|
|
353
|
+
"""
|
|
354
|
+
|
|
355
|
+
return np.sum(time[where_detected] <= early_window_days) >= n_early_detections
|
|
356
|
+
|
|
357
|
+
def _mean_time_between_detections(self, t):
|
|
358
|
+
"""Calculate the mean time between detections over the
|
|
359
|
+
visible interval.
|
|
360
|
+
|
|
361
|
+
Parameters
|
|
362
|
+
----------
|
|
363
|
+
t : `array`
|
|
364
|
+
Times of detections, bracketed by the start and
|
|
365
|
+
end visibility times
|
|
366
|
+
|
|
367
|
+
Return
|
|
368
|
+
----------
|
|
369
|
+
med_dt : `float`
|
|
370
|
+
separation between observations.
|
|
371
|
+
"""
|
|
372
|
+
|
|
373
|
+
return np.mean(np.sort(np.diff(t)))
|
|
374
|
+
|
|
375
|
+
def _possible_to_detect(self, visible_duration):
|
|
376
|
+
"""Return True if the outburst is ever bright enough
|
|
377
|
+
for LSST to detect.
|
|
378
|
+
|
|
379
|
+
Parameters
|
|
380
|
+
----------
|
|
381
|
+
visible_duration : `float`
|
|
382
|
+
Length of time the outburst is above LSST's fiducial limiting mag.
|
|
383
|
+
May be nan.
|
|
384
|
+
|
|
385
|
+
Return
|
|
386
|
+
----------
|
|
387
|
+
detectable : `bool`
|
|
388
|
+
Return True if outburst is ever detectable by LSST.
|
|
389
|
+
"""
|
|
390
|
+
|
|
391
|
+
return ~np.isnan(visible_duration)
|
|
392
|
+
|
|
393
|
+
def run(self, data_slice, slice_point=None):
|
|
394
|
+
result = {}
|
|
395
|
+
t = data_slice[self.mjd_col] - self.mjd0 - slice_point["start_time"]
|
|
396
|
+
mags = np.zeros(t.size, dtype=float)
|
|
397
|
+
|
|
398
|
+
for filtername in np.unique(data_slice[self.filter_col]):
|
|
399
|
+
infilt = np.where(data_slice[self.filter_col] == filtername)
|
|
400
|
+
mags[infilt] = self.lightcurves.lightcurve(t[infilt], filtername, slice_point["outburst_params"])
|
|
401
|
+
# Apply dust extinction on the light curve
|
|
402
|
+
a_x = self.ax1[filtername] * slice_point["ebv"]
|
|
403
|
+
mags[infilt] += a_x
|
|
404
|
+
|
|
405
|
+
distmod = 5 * np.log10(slice_point["distance"] * 1.0e3) - 5.0
|
|
406
|
+
mags[infilt] += distmod
|
|
407
|
+
|
|
408
|
+
# Find the detected points
|
|
409
|
+
where_detected = np.where((mags < data_slice[self.m5_col]))[0]
|
|
410
|
+
# Magnitude uncertainties with Gaussian approximation
|
|
411
|
+
snr = m52snr(mags, data_slice[self.m5_col])
|
|
412
|
+
mags_unc = 2.5 * np.log10(1.0 + 1.0 / snr)
|
|
413
|
+
|
|
414
|
+
result["possible_to_detect"] = self._possible_to_detect(slice_point["visible_duration"])
|
|
415
|
+
result["ever_detect"] = self._ever_detect(where_detected)
|
|
416
|
+
result["early_detect"] = self._early_detect(where_detected, t, self.t_early, self.pts_early)
|
|
417
|
+
result["number_of_detections"] = self._number_of_detections(where_detected)
|
|
418
|
+
|
|
419
|
+
if result["number_of_detections"] > 1:
|
|
420
|
+
result["mean_time_between_detections"] = self._mean_time_between_detections(
|
|
421
|
+
[
|
|
422
|
+
slice_point["visible_start_time"],
|
|
423
|
+
*t[where_detected].tolist(),
|
|
424
|
+
slice_point["visible_end_time"],
|
|
425
|
+
]
|
|
426
|
+
)
|
|
427
|
+
else:
|
|
428
|
+
result["mean_time_between_detections"] = -999
|
|
429
|
+
|
|
430
|
+
# Export the light curve
|
|
431
|
+
if self.output_lc is True:
|
|
432
|
+
wdet = mags < data_slice[self.m5_col]
|
|
433
|
+
mags[~wdet] = 99.0
|
|
434
|
+
result["lc"] = [
|
|
435
|
+
data_slice[self.mjd_col],
|
|
436
|
+
mags,
|
|
437
|
+
mags_unc,
|
|
438
|
+
data_slice[self.m5_col],
|
|
439
|
+
data_slice[self.filter_col],
|
|
440
|
+
]
|
|
441
|
+
result["lc_colnames"] = ("t", "mag", "mag_unc", "maglim", "filter")
|
|
442
|
+
|
|
443
|
+
return result
|
|
444
|
+
|
|
445
|
+
def reduce_possible_to_detect(self, metric):
|
|
446
|
+
return metric["possible_to_detect"]
|
|
447
|
+
|
|
448
|
+
def reduce_ever_detect(self, metric):
|
|
449
|
+
return metric["ever_detect"]
|
|
450
|
+
|
|
451
|
+
def reduce_early_detect(self, metric):
|
|
452
|
+
return metric["early_detect"]
|
|
453
|
+
|
|
454
|
+
def reduce_number_of_detections(self, metric):
|
|
455
|
+
return metric["number_of_detections"]
|
|
456
|
+
|
|
457
|
+
def reduce_mean_time_between_detections(self, metric):
|
|
458
|
+
tt = metric["mean_time_between_detections"]
|
|
459
|
+
if tt < 0:
|
|
460
|
+
return self.badval
|
|
461
|
+
else:
|
|
462
|
+
return tt
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
def generate_xrb_pop_slicer(t_start=1, t_end=3652, n_events=10000, seed=42):
|
|
466
|
+
"""Generate a population of XRB events, and put the info about them
|
|
467
|
+
into a UserPointSlicer object.
|
|
468
|
+
|
|
469
|
+
Parameters
|
|
470
|
+
----------
|
|
471
|
+
t_start : `float`
|
|
472
|
+
The night to start an XRB outburst on (days; default 1)
|
|
473
|
+
t_end : `float`
|
|
474
|
+
The final night of XRBs events (days; default 3652)
|
|
475
|
+
n_events : `int`
|
|
476
|
+
The number of XRB outbursts to generate (default 10000)
|
|
477
|
+
seed : `float`
|
|
478
|
+
The seed passed to np.random (default 42)
|
|
479
|
+
"""
|
|
480
|
+
|
|
481
|
+
rng = np.random.default_rng(seed)
|
|
482
|
+
|
|
483
|
+
datadir = get_data_dir()
|
|
484
|
+
xrb_sample = np.genfromtxt(datadir + "/maf/xrb/sample_xrb_positions.csv.gz", delimiter=",")
|
|
485
|
+
|
|
486
|
+
nsamples, nfields = xrb_sample.shape
|
|
487
|
+
|
|
488
|
+
xrb_lc_gen = XrbLc()
|
|
489
|
+
|
|
490
|
+
# select a random subsample
|
|
491
|
+
event_idxs = rng.choice(np.arange(nsamples), size=n_events, replace=True)
|
|
492
|
+
ra = xrb_sample[event_idxs, 0]
|
|
493
|
+
dec = xrb_sample[event_idxs, 1]
|
|
494
|
+
distance_kpc = xrb_sample[event_idxs, 2]
|
|
495
|
+
ebv = xrb_sample[event_idxs, 3]
|
|
496
|
+
|
|
497
|
+
start_times = rng.uniform(low=t_start, high=t_end, size=n_events)
|
|
498
|
+
|
|
499
|
+
# Set up the slicer to evaluate the catalog we just made
|
|
500
|
+
slicer = UserPointsSlicer(ra, dec, lat_lon_deg=True, badval=0)
|
|
501
|
+
# Add any additional information about each object to the slicer
|
|
502
|
+
slicer.slice_points["start_time"] = start_times
|
|
503
|
+
slicer.slice_points["distance"] = distance_kpc
|
|
504
|
+
# use our own 3-d dust map extinctions
|
|
505
|
+
slicer.slice_points["ebv"] = ebv
|
|
506
|
+
# generate random parameters for this event
|
|
507
|
+
slicer.slice_points["outburst_params"] = xrb_lc_gen.outburst_params(size=n_events)
|
|
508
|
+
|
|
509
|
+
# determine detectable durations
|
|
510
|
+
visible_starts = []
|
|
511
|
+
visible_ends = []
|
|
512
|
+
visible_durations = []
|
|
513
|
+
for idx, param in enumerate(slicer.slice_points["outburst_params"]):
|
|
514
|
+
start, end = xrb_lc_gen.detectable_duration(param, ebv[idx], distance_kpc[idx])
|
|
515
|
+
visible_starts.append(start)
|
|
516
|
+
visible_ends.append(end)
|
|
517
|
+
visible_durations.append(end - start)
|
|
518
|
+
|
|
519
|
+
slicer.slice_points["visible_start_time"] = visible_starts
|
|
520
|
+
slicer.slice_points["visible_end_time"] = visible_ends
|
|
521
|
+
slicer.slice_points["visible_duration"] = visible_durations
|
|
522
|
+
|
|
523
|
+
return slicer
|