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,375 @@
|
|
|
1
|
+
__all__ = (
|
|
2
|
+
"galplane_nvisits_thresholds",
|
|
3
|
+
"galplane_priority_map_thresholds",
|
|
4
|
+
"GalPlaneFootprintMetric",
|
|
5
|
+
"GalPlaneTimePerFilterMetric",
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
from types import MethodType
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
from rubin_sim.maf.maps.galactic_plane_priority_maps import gp_priority_map_components_to_keys
|
|
13
|
+
|
|
14
|
+
from .base_metric import BaseMetric
|
|
15
|
+
|
|
16
|
+
# These are a suite of metrics aimed at evaluating high-level
|
|
17
|
+
# quantities regarding galactic plane coverage.
|
|
18
|
+
# The metrics here evaluate the coverage
|
|
19
|
+
# (just number of visits and exposure time per filter)
|
|
20
|
+
# in relation to the desired coverage from the galactic plane priority map.
|
|
21
|
+
# There is a related metric in transientTimeSampling which
|
|
22
|
+
# evaluates the cadence weighted by this same map.
|
|
23
|
+
|
|
24
|
+
TAU_OBS = np.array([2.0, 5.0, 11.0, 20.0, 46.5, 73.0])
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def galplane_nvisits_thresholds(tau_obs, nyears=10):
|
|
28
|
+
"""Return estimated nvisits required to well-sample lightcurves
|
|
29
|
+
that need sampling every tau_obs (days).
|
|
30
|
+
|
|
31
|
+
This does a very basic estimate, just counting how many visits you
|
|
32
|
+
would have if you distributed them at tau_obs intervals for a period
|
|
33
|
+
of nyears, assuming a season length of 6.5 years and that visits in
|
|
34
|
+
each night are in pairs.
|
|
35
|
+
|
|
36
|
+
Parameters
|
|
37
|
+
----------
|
|
38
|
+
tau_obs : `np.ndarray` or `list` of `float`
|
|
39
|
+
Timescale that variability must be sampled at, in days.
|
|
40
|
+
nyears : `float`, opt
|
|
41
|
+
Number of years in the survey (as sampled). Default 10.
|
|
42
|
+
|
|
43
|
+
Returns
|
|
44
|
+
-------
|
|
45
|
+
n_visits_thresholds : `np.ndarray`
|
|
46
|
+
Estimated number of visits required to well sample lightcurves
|
|
47
|
+
which require sampling on tau_obs
|
|
48
|
+
"""
|
|
49
|
+
# How many nights in the survey
|
|
50
|
+
nnights_total = 365.25 * nyears
|
|
51
|
+
# Estimate that the observing season is 6.5 months long, not a full year
|
|
52
|
+
# And account for the fact that each 'night' will (currently) need 2 visits
|
|
53
|
+
nnights = nnights_total * (6.5 / 12) * 2
|
|
54
|
+
n_visits_thresholds = nnights / tau_obs
|
|
55
|
+
return n_visits_thresholds
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def galplane_priority_map_thresholds(science_map):
|
|
59
|
+
"""Return minimum threshold for priority maps,
|
|
60
|
+
when considering filter balance.
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
science_map : `str`
|
|
65
|
+
The name of the science map in the galactic plane priority map.
|
|
66
|
+
|
|
67
|
+
Returns
|
|
68
|
+
-------
|
|
69
|
+
priority_threshold : `float`
|
|
70
|
+
The minimum threshold to consider from the priority map
|
|
71
|
+
"""
|
|
72
|
+
if science_map == "galactic_plane":
|
|
73
|
+
priority_threshold = 0.4
|
|
74
|
+
elif science_map == "combined_map":
|
|
75
|
+
priority_threshold = 0.001
|
|
76
|
+
else:
|
|
77
|
+
priority_threshold = 0.0
|
|
78
|
+
return priority_threshold
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# this is a bit of a hack .. it helps us use a variety of tau_obs values,
|
|
82
|
+
# and dynamically set up reduce functions
|
|
83
|
+
def help_set_reduce_func(obj, metricval, nvisits_thresh):
|
|
84
|
+
def _nvisits_cut(obj, metricval):
|
|
85
|
+
if metricval["n_observations"] >= nvisits_thresh:
|
|
86
|
+
return metricval["map_priority"]
|
|
87
|
+
else:
|
|
88
|
+
return 0
|
|
89
|
+
|
|
90
|
+
return _nvisits_cut
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class GalPlaneFootprintMetric(BaseMetric):
|
|
94
|
+
"""Evaluate the survey overlap with desired regions in the
|
|
95
|
+
Galactic Plane and Magellanic Clouds, by referencing the
|
|
96
|
+
pre-computed priority maps provided.
|
|
97
|
+
These priority maps are keyed by science area (science_map) and per filter.
|
|
98
|
+
The returned metric values are summed over all filters.
|
|
99
|
+
|
|
100
|
+
Parameters
|
|
101
|
+
----------
|
|
102
|
+
science_map : `str`
|
|
103
|
+
Name of the priority footprint map key to use from the column
|
|
104
|
+
headers contained in the priority_GalPlane_footprint_map_data tables.
|
|
105
|
+
tau_obs : `np.ndarray` or `list` of `float`, opt
|
|
106
|
+
Timescales of minimum-required observations intervals for
|
|
107
|
+
various classes of time variability.
|
|
108
|
+
Default (None), uses TAU_OBS. In general, this should be left as
|
|
109
|
+
the default and consistent across all galactic-plane oriented metrics.
|
|
110
|
+
mag_cuts : `dict` of `float`, opt
|
|
111
|
+
Magnitudes to use as cutoffs for individual image depths.
|
|
112
|
+
Default None uses a default set of values which correspond
|
|
113
|
+
roughly to the 50th percentile.
|
|
114
|
+
filter_col : `str`, opt
|
|
115
|
+
Name of the filter column. Default 'filter'.
|
|
116
|
+
m5_col : `str`, opt
|
|
117
|
+
Name of the five-sigma depth column. Default 'fiveSigmaDepth'.
|
|
118
|
+
filterlist : `list` of `str`, opt
|
|
119
|
+
The filters to consider from the priority map and observations.
|
|
120
|
+
Default None uses u, g, r, i, z, and y.
|
|
121
|
+
metricName : `str`, opt
|
|
122
|
+
Name for the metric. Default 'GalPlaneFootprintMetric_{scienceMap}
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
def __init__(
|
|
126
|
+
self,
|
|
127
|
+
science_map,
|
|
128
|
+
tau_obs=None,
|
|
129
|
+
mag_cuts=None,
|
|
130
|
+
filter_col="band",
|
|
131
|
+
m5_col="fiveSigmaDepth",
|
|
132
|
+
filterlist=None,
|
|
133
|
+
**kwargs,
|
|
134
|
+
):
|
|
135
|
+
self.science_map = science_map
|
|
136
|
+
self.priority_map_threshold = galplane_priority_map_thresholds(self.science_map)
|
|
137
|
+
# tau_obs is an array of minimum-required observation intervals for
|
|
138
|
+
# four categories of time variability
|
|
139
|
+
if tau_obs is not None:
|
|
140
|
+
self.tau_obs = tau_obs
|
|
141
|
+
else:
|
|
142
|
+
self.tau_obs = TAU_OBS
|
|
143
|
+
self.nvisits_threshold = galplane_nvisits_thresholds(self.tau_obs)
|
|
144
|
+
self.filter_col = filter_col
|
|
145
|
+
self.m5_col = m5_col
|
|
146
|
+
if filterlist is not None:
|
|
147
|
+
self.filterlist = filterlist
|
|
148
|
+
else:
|
|
149
|
+
self.filterlist = ["u", "g", "r", "i", "z", "y"]
|
|
150
|
+
if mag_cuts is not None:
|
|
151
|
+
self.mag_cuts = mag_cuts
|
|
152
|
+
else:
|
|
153
|
+
self.mag_cuts = {
|
|
154
|
+
"u": 22.7,
|
|
155
|
+
"g": 24.1,
|
|
156
|
+
"r": 23.7,
|
|
157
|
+
"i": 23.1,
|
|
158
|
+
"z": 22.2,
|
|
159
|
+
"y": 21.4,
|
|
160
|
+
}
|
|
161
|
+
maps = ["GalacticPlanePriorityMap"]
|
|
162
|
+
if "metric_name" not in kwargs:
|
|
163
|
+
metric_name = f"GalplaneFootprintMetric_{self.science_map}"
|
|
164
|
+
else:
|
|
165
|
+
metric_name = kwargs["metric_name"]
|
|
166
|
+
del kwargs["metric_name"]
|
|
167
|
+
for tau, nvisits in zip(self.tau_obs, self.nvisits_threshold):
|
|
168
|
+
tau_reduce_name = f"reduce_Tau_{tau:.1f}".replace(".", "_")
|
|
169
|
+
rfunc = help_set_reduce_func(self, None, nvisits)
|
|
170
|
+
# MethodType(newmethod, self) is how this next line SHOULD go
|
|
171
|
+
# but that doesn't work .. the scope isn't correct somehow.
|
|
172
|
+
# Using this alternate string of tau_reduce_name *does* work.
|
|
173
|
+
setattr(self, tau_reduce_name, MethodType(rfunc, tau_reduce_name))
|
|
174
|
+
super().__init__(
|
|
175
|
+
col=[self.filter_col, self.m5_col],
|
|
176
|
+
metric_name=metric_name,
|
|
177
|
+
maps=maps,
|
|
178
|
+
**kwargs,
|
|
179
|
+
)
|
|
180
|
+
self.reduce_order = {"n_obs": 0, "n_obs_priority": 1}
|
|
181
|
+
for i, tau in enumerate(self.tau_obs):
|
|
182
|
+
r_name = f"Tau_{tau:.1f}".replace(".", "_")
|
|
183
|
+
self.reduce_order[r_name] = i + 2
|
|
184
|
+
|
|
185
|
+
def run(self, data_slice, slice_point):
|
|
186
|
+
"""Calculate the number of observations that meet the mag_cut values
|
|
187
|
+
at each slice_point.
|
|
188
|
+
|
|
189
|
+
Also calculate the number of observations * the priority map summed
|
|
190
|
+
over all filter. Return both of these values as a dictionary.
|
|
191
|
+
"""
|
|
192
|
+
# Check if we want to evaluate this part of the sky,
|
|
193
|
+
# or if the weight is below threshold.
|
|
194
|
+
mapkey = gp_priority_map_components_to_keys("sum", self.science_map)
|
|
195
|
+
priority = slice_point[mapkey]
|
|
196
|
+
if priority <= self.priority_map_threshold:
|
|
197
|
+
return self.badval
|
|
198
|
+
# Count the number of observations per filter, above the mag cuts
|
|
199
|
+
n_obs = 0
|
|
200
|
+
n_obs_priority = 0
|
|
201
|
+
for f in self.filterlist:
|
|
202
|
+
obs_in_filter = np.where(data_slice[self.filter_col] == f)
|
|
203
|
+
above_cut = np.where(data_slice[obs_in_filter][self.m5_col] >= self.mag_cuts[f])
|
|
204
|
+
n_obs += len(above_cut[0])
|
|
205
|
+
mapkey = gp_priority_map_components_to_keys(f, self.science_map)
|
|
206
|
+
n_obs_priority += len(above_cut[0]) * slice_point[mapkey]
|
|
207
|
+
|
|
208
|
+
return {
|
|
209
|
+
"n_observations": n_obs,
|
|
210
|
+
"n_obs_priority": n_obs_priority,
|
|
211
|
+
"map_priority": priority,
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
def reduce_n_obs(self, metricval):
|
|
215
|
+
return metricval["n_observations"]
|
|
216
|
+
|
|
217
|
+
def reduce_n_obs_priority(self, metricval):
|
|
218
|
+
return metricval["n_obs_priority"]
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class GalPlaneTimePerFilterMetric(BaseMetric):
|
|
222
|
+
"""Evaluate the fraction of exposure time spent in each filter as a
|
|
223
|
+
fraction of the total exposure time dedicated to that healpix in the
|
|
224
|
+
weighted galactic plane priority maps.
|
|
225
|
+
|
|
226
|
+
Parameters
|
|
227
|
+
----------
|
|
228
|
+
scienceMap : `str`
|
|
229
|
+
Name of the priority footprint map key to use from the column
|
|
230
|
+
headers contained in the
|
|
231
|
+
priority_GalPlane_footprint_map_data tables.
|
|
232
|
+
magCuts : `dict` of `float`, opt
|
|
233
|
+
Magnitudes to use as cutoffs for individual image depths.
|
|
234
|
+
Default None uses a default set of values which correspond
|
|
235
|
+
roughly to the 50th percentile.
|
|
236
|
+
mjd_col : `str`, opt
|
|
237
|
+
Name of the observation start MJD column.
|
|
238
|
+
Default 'observationStartMJD'.
|
|
239
|
+
exp_time_col : `str`, opt
|
|
240
|
+
Name of the exposure time column. Default 'visitExposureTime'.
|
|
241
|
+
filter_col : `str`, opt
|
|
242
|
+
Name of the filter column. Default 'filter'.
|
|
243
|
+
m5_col : `str`, opt
|
|
244
|
+
Name of the five-sigma depth column. Default 'fiveSigmaDepth'.
|
|
245
|
+
filterlist : `list` of `str`, opt
|
|
246
|
+
The filters to consider from the priority map and observations.
|
|
247
|
+
Default None uses u, g, r, i, z, and y.
|
|
248
|
+
metricName : `str`, opt
|
|
249
|
+
Name for the metric. Default 'GalPlaneFootprintMetric_{scienceMap}
|
|
250
|
+
"""
|
|
251
|
+
|
|
252
|
+
def __init__(
|
|
253
|
+
self,
|
|
254
|
+
science_map,
|
|
255
|
+
mag_cuts=None,
|
|
256
|
+
mjd_col="observationStartMJD",
|
|
257
|
+
exp_time_col="visitExposureTime",
|
|
258
|
+
filter_col="band",
|
|
259
|
+
m5_col="fiveSigmaDepth",
|
|
260
|
+
filterlist=None,
|
|
261
|
+
**kwargs,
|
|
262
|
+
):
|
|
263
|
+
self.science_map = science_map
|
|
264
|
+
self.priority_map_threshold = galplane_priority_map_thresholds(self.science_map)
|
|
265
|
+
self.filter_col = filter_col
|
|
266
|
+
self.m5_col = m5_col
|
|
267
|
+
self.mjd_col = mjd_col
|
|
268
|
+
self.exp_time_col = exp_time_col
|
|
269
|
+
if filterlist is not None:
|
|
270
|
+
self.filterlist = filterlist
|
|
271
|
+
else:
|
|
272
|
+
self.filterlist = ["u", "g", "r", "i", "z", "y"]
|
|
273
|
+
if mag_cuts is not None:
|
|
274
|
+
self.mag_cuts = mag_cuts
|
|
275
|
+
else:
|
|
276
|
+
self.mag_cuts = {
|
|
277
|
+
"u": 22.7,
|
|
278
|
+
"g": 24.1,
|
|
279
|
+
"r": 23.7,
|
|
280
|
+
"i": 23.1,
|
|
281
|
+
"z": 22.2,
|
|
282
|
+
"y": 21.4,
|
|
283
|
+
}
|
|
284
|
+
maps = ["GalacticPlanePriorityMap"]
|
|
285
|
+
if "metric_name" not in kwargs:
|
|
286
|
+
metric_name = f"GalplaneTimePerFilter_{self.science_map}"
|
|
287
|
+
else:
|
|
288
|
+
metric_name = kwargs["metric_name"]
|
|
289
|
+
del kwargs["metric_name"]
|
|
290
|
+
super().__init__(
|
|
291
|
+
col=[self.filter_col, self.m5_col, self.mjd_col, self.exp_time_col],
|
|
292
|
+
maps=maps,
|
|
293
|
+
metric_name=metric_name,
|
|
294
|
+
**kwargs,
|
|
295
|
+
)
|
|
296
|
+
# Put the reduce functions into filter order
|
|
297
|
+
for i, f in enumerate(self.filterlist):
|
|
298
|
+
self.reduce_order[f"{f}"] = i
|
|
299
|
+
|
|
300
|
+
def run(self, data_slice, slice_point):
|
|
301
|
+
"""Calculate the ratio of the actual on-sky exposure time per filter
|
|
302
|
+
compared to the ideal on-sky exposure time per filter at this point
|
|
303
|
+
on the sky across all filters.
|
|
304
|
+
"""
|
|
305
|
+
# Check if we want to evaluate this part of the sky,
|
|
306
|
+
# or if the weight is below threshold.
|
|
307
|
+
weight_all_filters = slice_point[gp_priority_map_components_to_keys("sum", self.science_map)]
|
|
308
|
+
if weight_all_filters <= self.priority_map_threshold:
|
|
309
|
+
return self.badval
|
|
310
|
+
|
|
311
|
+
# Calculate the ideal weighting per filter compared to all
|
|
312
|
+
# filters at this point in the sky
|
|
313
|
+
relative_filter_weight = {}
|
|
314
|
+
for f in self.filterlist:
|
|
315
|
+
mapkey = gp_priority_map_components_to_keys(f, self.science_map)
|
|
316
|
+
relative_filter_weight[f] = slice_point[mapkey] / weight_all_filters
|
|
317
|
+
|
|
318
|
+
exp_time_per_filter = {}
|
|
319
|
+
for f in self.filterlist:
|
|
320
|
+
# Select observations within the OpSim for the current filter
|
|
321
|
+
# which match the S/N requirement, and extract the exposure times
|
|
322
|
+
# for those observations
|
|
323
|
+
idx1 = np.where(data_slice[self.filter_col] == f)[0]
|
|
324
|
+
idx2 = np.where(data_slice[self.m5_col] >= self.mag_cuts[f])[0]
|
|
325
|
+
match = list(set(idx1).intersection(set(idx2)))
|
|
326
|
+
|
|
327
|
+
# Now calculate the actual fraction of exposure time spent
|
|
328
|
+
# in this filter for the current slice_point, relative to the total
|
|
329
|
+
# exposure time spent on this slice_point.
|
|
330
|
+
# Note that this includes dithered observations.
|
|
331
|
+
# If no exposures are expected in this filter, this returns 1
|
|
332
|
+
# on the principle that 100% of the expected observations are
|
|
333
|
+
# provided, and additional data in other filters is usually welcome
|
|
334
|
+
exp_time_per_filter[f] = data_slice[self.exp_time_col][match].sum()
|
|
335
|
+
|
|
336
|
+
# Calculate the time on-sky in each filter that overlaps this point,
|
|
337
|
+
# and meets mag_cuts
|
|
338
|
+
total_expt_mag_cut = 0
|
|
339
|
+
for f in self.filterlist:
|
|
340
|
+
total_expt_mag_cut += exp_time_per_filter[f].sum()
|
|
341
|
+
|
|
342
|
+
# normalize by the relative filter weight.
|
|
343
|
+
# Ideally metric results are close to 1.
|
|
344
|
+
normalized_exp_time = {}
|
|
345
|
+
for f in self.filterlist:
|
|
346
|
+
if total_expt_mag_cut == 0:
|
|
347
|
+
normalized_exp_time[f] = 0
|
|
348
|
+
else:
|
|
349
|
+
# If no exposures are expected in this filter for this
|
|
350
|
+
# location, metric returns the mask val for this filter only.
|
|
351
|
+
if relative_filter_weight[f] > 0:
|
|
352
|
+
normalized_exp_time[f] = (
|
|
353
|
+
exp_time_per_filter[f] / total_expt_mag_cut / relative_filter_weight[f]
|
|
354
|
+
)
|
|
355
|
+
else:
|
|
356
|
+
normalized_exp_time[f] = self.badval
|
|
357
|
+
return normalized_exp_time
|
|
358
|
+
|
|
359
|
+
def reduce_u(self, metricval):
|
|
360
|
+
return metricval["u"]
|
|
361
|
+
|
|
362
|
+
def reduce_g(self, metricval):
|
|
363
|
+
return metricval["g"]
|
|
364
|
+
|
|
365
|
+
def reduce_r(self, metricval):
|
|
366
|
+
return metricval["r"]
|
|
367
|
+
|
|
368
|
+
def reduce_i(self, metricval):
|
|
369
|
+
return metricval["i"]
|
|
370
|
+
|
|
371
|
+
def reduce_z(self, metricval):
|
|
372
|
+
return metricval["z"]
|
|
373
|
+
|
|
374
|
+
def reduce_y(self, metricval):
|
|
375
|
+
return metricval["y"]
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
###################################################################
|
|
2
|
+
# Metric to evaluate the transientTimeSamplingMetric
|
|
3
|
+
#
|
|
4
|
+
# Author - Rachel Street: rstreet@lco.global
|
|
5
|
+
###################################################################
|
|
6
|
+
__all__ = (
|
|
7
|
+
"calc_interval_decay",
|
|
8
|
+
"GalPlaneVisitIntervalsTimescaleMetric",
|
|
9
|
+
"GalPlaneSeasonGapsTimescaleMetric",
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
from types import MethodType
|
|
13
|
+
|
|
14
|
+
import numpy as np
|
|
15
|
+
from rubin_scheduler.utils import calc_season
|
|
16
|
+
|
|
17
|
+
from rubin_sim.maf.maps.galactic_plane_priority_maps import gp_priority_map_components_to_keys
|
|
18
|
+
|
|
19
|
+
from .base_metric import BaseMetric
|
|
20
|
+
from .galactic_plane_metrics import galplane_priority_map_thresholds
|
|
21
|
+
from .season_metrics import find_season_edges
|
|
22
|
+
|
|
23
|
+
TAU_OBS = np.array([2.0, 5.0, 11.0, 20.0, 46.5, 73.0])
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def calc_interval_decay(delta_tobs, tau):
|
|
27
|
+
# Decay constant for metric value relationship as function of obs interval
|
|
28
|
+
K = 1.0 / tau
|
|
29
|
+
m = np.exp(-K * (delta_tobs - tau))
|
|
30
|
+
# But where observation interval is <= tau, replace with 1
|
|
31
|
+
m[np.where(delta_tobs <= tau)] = 1.0
|
|
32
|
+
return m
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# this is a bit of a hack .. it helps us use a variety of tau_obs values,
|
|
36
|
+
# and dynamically set up reduce functions
|
|
37
|
+
def help_set_reduce_func(obj, metricval, tau):
|
|
38
|
+
def _reduce_tau(obj, metricval):
|
|
39
|
+
return metricval[tau]
|
|
40
|
+
|
|
41
|
+
return _reduce_tau
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class GalPlaneVisitIntervalsTimescaleMetric(BaseMetric):
|
|
45
|
+
"""Evaluate the intervals between sequential observations in a
|
|
46
|
+
lightcurve relative to the scientifically desired sampling interval.
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
science_map : `str`
|
|
51
|
+
Name of the priority footprint map key to use from the column
|
|
52
|
+
headers contained in the priority_GalPlane_footprint_map_data tables.
|
|
53
|
+
tau_obs : `np.ndarray` or `list` of `float`, opt
|
|
54
|
+
Timescales of minimum-required observations intervals for various
|
|
55
|
+
classes of time variability.
|
|
56
|
+
Default (None), uses TAU_OBS. In general, this should be left as the
|
|
57
|
+
default and consistent across all galactic-plane oriented metrics.
|
|
58
|
+
mag_limit : `float`, opt
|
|
59
|
+
Magnitude limit to use as a cutoff for various observations.
|
|
60
|
+
Default 22.0.
|
|
61
|
+
mjd_col : `str`, opt
|
|
62
|
+
The name of the observation start MJD column.
|
|
63
|
+
Default 'observationStartMJD'.
|
|
64
|
+
m5_col : `str', opt
|
|
65
|
+
The name of the five sigma depth column. Default 'fiveSigmaDepth'.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
def __init__(
|
|
69
|
+
self,
|
|
70
|
+
science_map,
|
|
71
|
+
tau_obs=None,
|
|
72
|
+
mag_limit=22.0,
|
|
73
|
+
mjd_col="observationStartMJD",
|
|
74
|
+
m5_col="fiveSigmaDepth",
|
|
75
|
+
**kwargs,
|
|
76
|
+
):
|
|
77
|
+
self.science_map = science_map
|
|
78
|
+
self.priority_map_threshold = galplane_priority_map_thresholds(self.science_map)
|
|
79
|
+
# tau_obs is an array of minimum-required observation intervals for
|
|
80
|
+
# four categories of time variability
|
|
81
|
+
if tau_obs is not None:
|
|
82
|
+
self.tau_obs = tau_obs
|
|
83
|
+
else:
|
|
84
|
+
self.tau_obs = TAU_OBS
|
|
85
|
+
# Create reduce functions for the class that are return the metric
|
|
86
|
+
# for each value in tau_obs
|
|
87
|
+
|
|
88
|
+
self.mag_limit = mag_limit
|
|
89
|
+
self.mjd_col = mjd_col
|
|
90
|
+
self.m5_col = m5_col
|
|
91
|
+
maps = ["GalacticPlanePriorityMap"]
|
|
92
|
+
if "metric_name" not in kwargs:
|
|
93
|
+
metric_name = f"GalPlaneVisitIntervalsTimescales_{self.science_map}"
|
|
94
|
+
else:
|
|
95
|
+
metric_name = kwargs["metric_name"]
|
|
96
|
+
del kwargs["metric_name"]
|
|
97
|
+
for tau in self.tau_obs:
|
|
98
|
+
tau_reduce_name = f"reduce_Tau_{tau:.1f}".replace(".", "_")
|
|
99
|
+
newmethod = help_set_reduce_func(self, None, tau)
|
|
100
|
+
setattr(self, tau_reduce_name, MethodType(newmethod, tau_reduce_name))
|
|
101
|
+
super().__init__(
|
|
102
|
+
col=[self.mjd_col, self.m5_col],
|
|
103
|
+
metric_name=metric_name,
|
|
104
|
+
maps=maps,
|
|
105
|
+
**kwargs,
|
|
106
|
+
)
|
|
107
|
+
for i, tau in enumerate(self.tau_obs):
|
|
108
|
+
self.reduce_order[f"reduceTau_{tau:.1f}".replace(".", "_").replace("reduce", "")] = i
|
|
109
|
+
|
|
110
|
+
def run(self, data_slice, slice_point=None):
|
|
111
|
+
# Check if we want to evaluate this part of the sky,
|
|
112
|
+
# or if the weight is below threshold.
|
|
113
|
+
if (
|
|
114
|
+
slice_point[gp_priority_map_components_to_keys("sum", self.science_map)]
|
|
115
|
+
<= self.priority_map_threshold
|
|
116
|
+
):
|
|
117
|
+
return self.badval
|
|
118
|
+
# Select observations in the time sequence that fulfill the
|
|
119
|
+
# S/N requirements:
|
|
120
|
+
match = np.where(data_slice[self.m5_col] >= self.mag_limit)[0]
|
|
121
|
+
# We need at least two visits which match these requirements
|
|
122
|
+
# to calculate visit gaps
|
|
123
|
+
if len(match) < 2:
|
|
124
|
+
return self.badval
|
|
125
|
+
# Find the time gaps between visits (in any filter)
|
|
126
|
+
times = data_slice[self.mjd_col][match]
|
|
127
|
+
times.sort()
|
|
128
|
+
delta_tobs = np.diff(times)
|
|
129
|
+
# Compare the time gap distribution to the time gap required
|
|
130
|
+
# to characterize variability
|
|
131
|
+
metric_data = {}
|
|
132
|
+
for tau in self.tau_obs:
|
|
133
|
+
# Normalize
|
|
134
|
+
metric_data[tau] = calc_interval_decay(delta_tobs, tau).sum() / len(delta_tobs)
|
|
135
|
+
return metric_data
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class GalPlaneSeasonGapsTimescaleMetric(BaseMetric):
|
|
139
|
+
"""Evaluate the gap between sequential seasonal gaps in
|
|
140
|
+
observations in a lightcurve relative to the scientifically desired
|
|
141
|
+
sampling interval.
|
|
142
|
+
|
|
143
|
+
Parameters
|
|
144
|
+
----------
|
|
145
|
+
science_map : `str`
|
|
146
|
+
Name of the priority footprint map key to use from the column
|
|
147
|
+
headers contained in the
|
|
148
|
+
priority_GalPlane_footprint_map_data tables.
|
|
149
|
+
tau_var : `np.ndarray` or `list` of `float`, opt
|
|
150
|
+
Timescales of variability for various classes of time variability.
|
|
151
|
+
Default (None), uses TAU_OBS * 5. In general, this should be left
|
|
152
|
+
as the default and consistent
|
|
153
|
+
across all galactic-plane oriented metrics.
|
|
154
|
+
mag_limit : `float`, opt
|
|
155
|
+
Magnitude limit to use as a cutoff for various observations.
|
|
156
|
+
Default 22.0.
|
|
157
|
+
expected_season_gap : `float`, opt
|
|
158
|
+
The typical season gap expected for a galactic plane field in days.
|
|
159
|
+
The default, 145 days, is typical for a bulge field.
|
|
160
|
+
mjd_col : `str`, opt
|
|
161
|
+
The name of the observation start MJD column.
|
|
162
|
+
Default 'observationStartMJD'.
|
|
163
|
+
m5_col : `str', opt
|
|
164
|
+
The name of the five sigma depth column. Default 'fiveSigmaDepth'.
|
|
165
|
+
"""
|
|
166
|
+
|
|
167
|
+
def __init__(
|
|
168
|
+
self,
|
|
169
|
+
science_map,
|
|
170
|
+
tau_var=None,
|
|
171
|
+
mag_limit=22.0,
|
|
172
|
+
expected_season_gap=145,
|
|
173
|
+
mjd_col="observationStartMJD",
|
|
174
|
+
m5_col="fiveSigmaDepth",
|
|
175
|
+
**kwargs,
|
|
176
|
+
):
|
|
177
|
+
self.science_map = science_map
|
|
178
|
+
self.priority_map_threshold = galplane_priority_map_thresholds(self.science_map)
|
|
179
|
+
# tau_obs is an array of minimum-required observation intervals for
|
|
180
|
+
# four categories of time variability; tau_var is the related timescale
|
|
181
|
+
# for the variability (tau_var is approximately 5*tau_obs, in general)
|
|
182
|
+
if tau_var is not None:
|
|
183
|
+
self.tau_var = tau_var
|
|
184
|
+
else:
|
|
185
|
+
self.tau_var = TAU_OBS * 5
|
|
186
|
+
# NOTE: I would recommend dropping tau_var 10 and 25 from this
|
|
187
|
+
# analysis unless the metric is changed
|
|
188
|
+
# these intervals are so short they will *always* be dropped
|
|
189
|
+
# during the season gap
|
|
190
|
+
self.mag_limit = mag_limit
|
|
191
|
+
self.expected_season_gap = expected_season_gap
|
|
192
|
+
self.mjd_col = mjd_col
|
|
193
|
+
self.m5_col = m5_col
|
|
194
|
+
if "metric_name" not in kwargs:
|
|
195
|
+
metric_name = f"GalPlaneSeasonGapsTimescales_{self.science_map}"
|
|
196
|
+
else:
|
|
197
|
+
metric_name = kwargs["metric_name"]
|
|
198
|
+
del kwargs["metric_name"]
|
|
199
|
+
for tau in self.tau_var:
|
|
200
|
+
tau_reduce_name = f"reduce_Tau_{tau:.1f}".replace(".", "_")
|
|
201
|
+
newmethod = help_set_reduce_func(self, None, tau)
|
|
202
|
+
setattr(self, tau_reduce_name, MethodType(newmethod, tau_reduce_name))
|
|
203
|
+
super().__init__(col=[self.mjd_col, self.m5_col], metric_name=metric_name, **kwargs)
|
|
204
|
+
for i, tau in enumerate(self.tau_var):
|
|
205
|
+
self.reduce_order[f"reduce_Tau_{tau:.1f}".replace(".", "_").replace("reduce", "")] = i
|
|
206
|
+
|
|
207
|
+
def run(self, data_slice, slice_point):
|
|
208
|
+
# Check if we want to evaluate this part of the sky,
|
|
209
|
+
# or if the weight is below threshold.
|
|
210
|
+
if (
|
|
211
|
+
slice_point[gp_priority_map_components_to_keys("sum", self.science_map)]
|
|
212
|
+
<= self.priority_map_threshold
|
|
213
|
+
):
|
|
214
|
+
return self.badval
|
|
215
|
+
# Find the length of the gaps between each season
|
|
216
|
+
times = data_slice[self.mjd_col]
|
|
217
|
+
times.sort()
|
|
218
|
+
# data = np.sort(data_slice[self.mjd_col], order=self.mjd_col)
|
|
219
|
+
# SlicePoints ra/dec are always in radians -
|
|
220
|
+
# convert to degrees to calculate season
|
|
221
|
+
seasons = calc_season(np.degrees(slice_point["ra"]), times)
|
|
222
|
+
first_of_season, last_of_season = find_season_edges(seasons)
|
|
223
|
+
# season_lengths = times[last_of_season] - times[first_of_season]
|
|
224
|
+
# would this match interval calc better?
|
|
225
|
+
season_gaps = times[first_of_season][1:] - times[last_of_season][:-1]
|
|
226
|
+
if len(season_gaps) == 0:
|
|
227
|
+
return self.badval
|
|
228
|
+
metric_data = {}
|
|
229
|
+
for i, tau in enumerate(self.tau_var):
|
|
230
|
+
metric_data[tau] = calc_interval_decay(season_gaps, tau)
|
|
231
|
+
# if the season gap is shorter than the expected season gap,
|
|
232
|
+
# count this as 'good'
|
|
233
|
+
good_season_gaps = np.where(season_gaps <= self.expected_season_gap)
|
|
234
|
+
metric_data[tau][good_season_gaps] = 1
|
|
235
|
+
metric_data[tau] = metric_data[tau].sum() / len(season_gaps)
|
|
236
|
+
return metric_data
|