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,757 @@
|
|
|
1
|
+
"""Sets of metrics to look at time between visits/pairs, etc."""
|
|
2
|
+
|
|
3
|
+
__all__ = ("intraNight", "interNight", "timeGaps", "seasons")
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
import rubin_sim.maf.metric_bundles as mb
|
|
8
|
+
import rubin_sim.maf.metrics as metrics
|
|
9
|
+
import rubin_sim.maf.plots as plots
|
|
10
|
+
import rubin_sim.maf.slicers as slicers
|
|
11
|
+
|
|
12
|
+
from .col_map_dict import col_map_dict
|
|
13
|
+
from .common import filter_list, standard_summary
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def intraNight(
|
|
17
|
+
colmap=None,
|
|
18
|
+
runName="opsim",
|
|
19
|
+
nside=64,
|
|
20
|
+
extraSql=None,
|
|
21
|
+
extraInfoLabel=None,
|
|
22
|
+
slicer=None,
|
|
23
|
+
display_group="IntraNight",
|
|
24
|
+
subgroup="Pairs",
|
|
25
|
+
):
|
|
26
|
+
"""Generate a set of statistics about the pair/triplet/etc. rate
|
|
27
|
+
within a night.
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
colmap : `dict` or None, optional
|
|
32
|
+
A dictionary with a mapping of column names.
|
|
33
|
+
runName : `str`, optional
|
|
34
|
+
The name of the simulated survey.
|
|
35
|
+
nside : `int`, optional
|
|
36
|
+
Nside for the healpix slicer.
|
|
37
|
+
extraSql : `str` or None, optional
|
|
38
|
+
Additional sql constraint to apply to all metrics.
|
|
39
|
+
extraInfoLabel : `str` or None, optional
|
|
40
|
+
Additional info_label to apply to all results.
|
|
41
|
+
slicer : `maf.BaseSlicer` or None
|
|
42
|
+
Optionally use something other than a HealpixSlicer
|
|
43
|
+
|
|
44
|
+
Returns
|
|
45
|
+
-------
|
|
46
|
+
metric_bundleDict : `dict` of `maf.MetricBundle`
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
if colmap is None:
|
|
50
|
+
colmap = col_map_dict()
|
|
51
|
+
|
|
52
|
+
info_label = extraInfoLabel
|
|
53
|
+
if extraSql is not None and len(extraSql) > 0:
|
|
54
|
+
if info_label is None:
|
|
55
|
+
info_label = extraSql
|
|
56
|
+
|
|
57
|
+
raCol = colmap["ra"]
|
|
58
|
+
decCol = colmap["dec"]
|
|
59
|
+
degrees = colmap["raDecDeg"]
|
|
60
|
+
|
|
61
|
+
bundleList = []
|
|
62
|
+
standardStats = standard_summary()
|
|
63
|
+
|
|
64
|
+
if slicer is None:
|
|
65
|
+
slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
|
|
66
|
+
|
|
67
|
+
# Look for the fraction of visits in gri where there are pairs
|
|
68
|
+
# within dtMin/dtMax.
|
|
69
|
+
displayDict = {
|
|
70
|
+
"group": display_group,
|
|
71
|
+
"subgroup": subgroup,
|
|
72
|
+
"caption": None,
|
|
73
|
+
"order": 0,
|
|
74
|
+
}
|
|
75
|
+
if extraSql is not None and len(extraSql) > 0:
|
|
76
|
+
sql = "(%s) and (filter='g' or filter='r' or filter='i')" % extraSql
|
|
77
|
+
else:
|
|
78
|
+
sql = "filter='g' or filter='r' or filter='i'"
|
|
79
|
+
md = "gri"
|
|
80
|
+
if info_label is not None:
|
|
81
|
+
md += " " + info_label
|
|
82
|
+
dtMin = 10.0
|
|
83
|
+
dtMax = 60.0
|
|
84
|
+
metric = metrics.PairFractionMetric(
|
|
85
|
+
mjd_col=colmap["mjd"],
|
|
86
|
+
min_gap=dtMin,
|
|
87
|
+
max_gap=dtMax,
|
|
88
|
+
metric_name="Fraction of visits in pairs (%.0f-%.0f min)" % (dtMin, dtMax),
|
|
89
|
+
)
|
|
90
|
+
displayDict["caption"] = (
|
|
91
|
+
"Fraction of %s visits that have a paired visit"
|
|
92
|
+
"between %.1f and %.1f minutes away. "
|
|
93
|
+
% (
|
|
94
|
+
md,
|
|
95
|
+
dtMin,
|
|
96
|
+
dtMax,
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
displayDict["caption"] += "If all visits were in pairs, this fraction would be 1."
|
|
100
|
+
displayDict["order"] += 1
|
|
101
|
+
bundle = mb.MetricBundle(
|
|
102
|
+
metric,
|
|
103
|
+
slicer,
|
|
104
|
+
sql,
|
|
105
|
+
info_label=md,
|
|
106
|
+
summary_metrics=standardStats,
|
|
107
|
+
display_dict=displayDict,
|
|
108
|
+
)
|
|
109
|
+
bundleList.append(bundle)
|
|
110
|
+
|
|
111
|
+
dtMin = 20.0
|
|
112
|
+
dtMax = 90.0
|
|
113
|
+
metric = metrics.PairFractionMetric(
|
|
114
|
+
mjd_col=colmap["mjd"],
|
|
115
|
+
min_gap=dtMin,
|
|
116
|
+
max_gap=dtMax,
|
|
117
|
+
metric_name="Fraction of visits in pairs (%.0f-%.0f min)" % (dtMin, dtMax),
|
|
118
|
+
)
|
|
119
|
+
displayDict["caption"] = (
|
|
120
|
+
"Fraction of %s visits that have a paired visit"
|
|
121
|
+
"between %.1f and %.1f minutes away. "
|
|
122
|
+
% (
|
|
123
|
+
md,
|
|
124
|
+
dtMin,
|
|
125
|
+
dtMax,
|
|
126
|
+
)
|
|
127
|
+
)
|
|
128
|
+
displayDict["caption"] += "If all visits were in pairs, this fraction would be 1."
|
|
129
|
+
displayDict["order"] += 1
|
|
130
|
+
bundle = mb.MetricBundle(
|
|
131
|
+
metric,
|
|
132
|
+
slicer,
|
|
133
|
+
sql,
|
|
134
|
+
info_label=md,
|
|
135
|
+
summary_metrics=standardStats,
|
|
136
|
+
display_dict=displayDict,
|
|
137
|
+
)
|
|
138
|
+
bundleList.append(bundle)
|
|
139
|
+
|
|
140
|
+
# Look at the fraction of visits which have another visit within dtMax gri.
|
|
141
|
+
dtMax = 60.0
|
|
142
|
+
metric = metrics.NRevisitsMetric(
|
|
143
|
+
mjd_col=colmap["mjd"],
|
|
144
|
+
d_t=dtMax,
|
|
145
|
+
normed=True,
|
|
146
|
+
metric_name="Fraction of visits with a revisit < %.0f min" % dtMax,
|
|
147
|
+
)
|
|
148
|
+
displayDict["caption"] = "Fraction of %s visits that have another visit " "within %.1f min. " % (
|
|
149
|
+
md,
|
|
150
|
+
dtMax,
|
|
151
|
+
)
|
|
152
|
+
displayDict["caption"] += "If all visits were in pairs (only), this fraction would be 0.5."
|
|
153
|
+
displayDict["order"] += 1
|
|
154
|
+
bundle = mb.MetricBundle(
|
|
155
|
+
metric,
|
|
156
|
+
slicer,
|
|
157
|
+
sql,
|
|
158
|
+
info_label=md,
|
|
159
|
+
summary_metrics=standardStats,
|
|
160
|
+
display_dict=displayDict,
|
|
161
|
+
)
|
|
162
|
+
bundleList.append(bundle)
|
|
163
|
+
|
|
164
|
+
# Intranight gap map, all filters. Returns value in hours.
|
|
165
|
+
metric = metrics.IntraNightGapsMetric(
|
|
166
|
+
metric_name="Median Intra-Night Gap",
|
|
167
|
+
mjd_col=colmap["mjd"],
|
|
168
|
+
reduce_func=np.median,
|
|
169
|
+
)
|
|
170
|
+
displayDict["caption"] = "Median gap between consecutive visits within a night, all bands"
|
|
171
|
+
if info_label is None or len(info_label) == 0:
|
|
172
|
+
displayDict["caption"] += ", all visits."
|
|
173
|
+
else:
|
|
174
|
+
displayDict["caption"] += ", %s." % info_label
|
|
175
|
+
displayDict["order"] += 1
|
|
176
|
+
plotDict = {"percentile_clip": 95}
|
|
177
|
+
bundle = mb.MetricBundle(
|
|
178
|
+
metric,
|
|
179
|
+
slicer,
|
|
180
|
+
extraSql,
|
|
181
|
+
info_label=info_label,
|
|
182
|
+
display_dict=displayDict,
|
|
183
|
+
plot_dict=plotDict,
|
|
184
|
+
summary_metrics=standardStats,
|
|
185
|
+
)
|
|
186
|
+
bundleList.append(bundle)
|
|
187
|
+
|
|
188
|
+
# Max Timespans (in each night)
|
|
189
|
+
# Run in all filters, u+g, g+r, r+i, i+z and z+y filters,
|
|
190
|
+
# and individual filters
|
|
191
|
+
|
|
192
|
+
metric = metrics.NightTimespanMetric(percentile=75, night_col=colmap["night"], mjd_col=colmap["mjd"])
|
|
193
|
+
displayDict["caption"] = "75th percentile value of the maximum intra-night timespan, on each night"
|
|
194
|
+
# individual and all filters
|
|
195
|
+
filterlist, colors, orders, sqls, info_labels = filter_list(
|
|
196
|
+
all=True, extra_sql=extraSql, extra_info_label=info_label
|
|
197
|
+
)
|
|
198
|
+
for f in filterlist:
|
|
199
|
+
if info_labels[f] is None or len(info_labels[f]) == 0:
|
|
200
|
+
displayDict["caption"] += ", all visits."
|
|
201
|
+
else:
|
|
202
|
+
displayDict["caption"] += ", %s." % info_labels[f]
|
|
203
|
+
displayDict["order"] = orders[f]
|
|
204
|
+
plotDict = {"percentile_clip": 98}
|
|
205
|
+
bundle = mb.MetricBundle(
|
|
206
|
+
metric,
|
|
207
|
+
slicer,
|
|
208
|
+
sqls[f],
|
|
209
|
+
info_label=info_labels[f],
|
|
210
|
+
display_dict=displayDict,
|
|
211
|
+
plot_dict=plotDict,
|
|
212
|
+
summary_metrics=standardStats,
|
|
213
|
+
)
|
|
214
|
+
bundleList.append(bundle)
|
|
215
|
+
# subsets of adjacent filters
|
|
216
|
+
filtersubsets = {
|
|
217
|
+
"ug": "(filter = 'u' or filter = 'g')",
|
|
218
|
+
"gr": "(filter = 'g' or filter = 'r')",
|
|
219
|
+
"ri": "(filter = 'r' or filter = 'i')",
|
|
220
|
+
"iz": "(filter = 'i' or filter = 'z')",
|
|
221
|
+
"zy": "(filter = 'z' or filter = 'y')",
|
|
222
|
+
}
|
|
223
|
+
sqls = [extraSql]
|
|
224
|
+
if extraSql is not None and len(extraSql) > 0:
|
|
225
|
+
for fi in filtersubsets:
|
|
226
|
+
sqls.append(f"{extraSql} and {filtersubsets[fi]}")
|
|
227
|
+
else:
|
|
228
|
+
for fi in filtersubsets:
|
|
229
|
+
sqls.append(f"{filtersubsets[fi]}")
|
|
230
|
+
md = [info_label]
|
|
231
|
+
if info_label is not None:
|
|
232
|
+
for fi in filtersubsets:
|
|
233
|
+
md.append(f"{info_label} {fi} bands")
|
|
234
|
+
else:
|
|
235
|
+
for fi in filtersubsets:
|
|
236
|
+
md.append(f"{fi} bands")
|
|
237
|
+
|
|
238
|
+
for sql, info in zip(sqls, md):
|
|
239
|
+
if info_label is None or len(info_label) == 0:
|
|
240
|
+
displayDict["caption"] += ", all visits."
|
|
241
|
+
else:
|
|
242
|
+
displayDict["caption"] += ", %s." % info_label
|
|
243
|
+
displayDict["order"] += 1
|
|
244
|
+
plotDict = {"percentile_clip": 98}
|
|
245
|
+
bundle = mb.MetricBundle(
|
|
246
|
+
metric,
|
|
247
|
+
slicer,
|
|
248
|
+
sql,
|
|
249
|
+
info_label=info,
|
|
250
|
+
display_dict=displayDict,
|
|
251
|
+
plot_dict=plotDict,
|
|
252
|
+
summary_metrics=standardStats,
|
|
253
|
+
)
|
|
254
|
+
bundleList.append(bundle)
|
|
255
|
+
|
|
256
|
+
# Histogram the number of visits per night.
|
|
257
|
+
countbins = np.arange(0, 10, 1)
|
|
258
|
+
metric = metrics.NVisitsPerNightMetric(
|
|
259
|
+
night_col=colmap["night"], bins=countbins, metric_name="NVisitsPerNight"
|
|
260
|
+
)
|
|
261
|
+
plotDict = {"bins": countbins, "xlabel": "Number of visits each night"}
|
|
262
|
+
displayDict["caption"] = "Histogram of the number of visits in each night, per point on the sky"
|
|
263
|
+
if info_label is None or len(info_label) == 0:
|
|
264
|
+
displayDict["caption"] += ", all proposals."
|
|
265
|
+
else:
|
|
266
|
+
displayDict["caption"] += ", %s." % info_label
|
|
267
|
+
displayDict["order"] = 0
|
|
268
|
+
plotFunc = plots.SummaryHistogram()
|
|
269
|
+
bundle = mb.MetricBundle(
|
|
270
|
+
metric,
|
|
271
|
+
slicer,
|
|
272
|
+
extraSql,
|
|
273
|
+
plot_dict=plotDict,
|
|
274
|
+
display_dict=displayDict,
|
|
275
|
+
info_label=info_label,
|
|
276
|
+
plot_funcs=[plotFunc],
|
|
277
|
+
)
|
|
278
|
+
bundleList.append(bundle)
|
|
279
|
+
|
|
280
|
+
# Histogram of the time between revisits (all filters) within two hours.
|
|
281
|
+
binMin = 0
|
|
282
|
+
binMax = 120.0
|
|
283
|
+
bin_size = 5.0
|
|
284
|
+
bins_metric = np.arange(binMin / 60.0 / 24.0, (binMax + bin_size) / 60.0 / 24.0, bin_size / 60.0 / 24.0)
|
|
285
|
+
bins_plot = bins_metric * 24.0 * 60.0
|
|
286
|
+
metric = metrics.TgapsMetric(bins=bins_metric, times_col=colmap["mjd"], metric_name="DeltaT Histogram")
|
|
287
|
+
plotDict = {"bins": bins_plot, "xlabel": "dT (minutes)"}
|
|
288
|
+
displayDict["caption"] = (
|
|
289
|
+
"Histogram of the time between consecutive visits to a given point "
|
|
290
|
+
"on the sky, considering visits between %.1f and %.1f minutes" % (binMin, binMax)
|
|
291
|
+
)
|
|
292
|
+
if info_label is None or len(info_label) == 0:
|
|
293
|
+
displayDict["caption"] += ", all proposals."
|
|
294
|
+
else:
|
|
295
|
+
displayDict["caption"] += ", %s." % info_label
|
|
296
|
+
displayDict["order"] += 1
|
|
297
|
+
plotFunc = plots.SummaryHistogram()
|
|
298
|
+
bundle = mb.MetricBundle(
|
|
299
|
+
metric,
|
|
300
|
+
slicer,
|
|
301
|
+
extraSql,
|
|
302
|
+
plot_dict=plotDict,
|
|
303
|
+
display_dict=displayDict,
|
|
304
|
+
info_label=info_label,
|
|
305
|
+
plot_funcs=[plotFunc],
|
|
306
|
+
)
|
|
307
|
+
bundleList.append(bundle)
|
|
308
|
+
|
|
309
|
+
# Set the run_name for all bundles and return the bundleDict.
|
|
310
|
+
for b in bundleList:
|
|
311
|
+
b.set_run_name(runName)
|
|
312
|
+
return mb.make_bundles_dict_from_list(bundleList)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def interNight(
|
|
316
|
+
colmap=None,
|
|
317
|
+
runName="opsim",
|
|
318
|
+
nside=64,
|
|
319
|
+
extraSql=None,
|
|
320
|
+
extraInfoLabel=None,
|
|
321
|
+
slicer=None,
|
|
322
|
+
display_group="InterNight",
|
|
323
|
+
subgroup="Night gaps",
|
|
324
|
+
):
|
|
325
|
+
"""Generate a set of statistics about the spacing between nights
|
|
326
|
+
with observations.
|
|
327
|
+
|
|
328
|
+
Parameters
|
|
329
|
+
----------
|
|
330
|
+
colmap : `dict` or None, optional
|
|
331
|
+
A dictionary with a mapping of column names.
|
|
332
|
+
runName : `str`, optional
|
|
333
|
+
The name of the simulated survey.
|
|
334
|
+
nside : `int`, optional
|
|
335
|
+
Nside for the healpix slicer.
|
|
336
|
+
extraSql : `str` or None, optional
|
|
337
|
+
Additional sql constraint to apply to all metrics.
|
|
338
|
+
extraInfoLabel : `str` or None, optional
|
|
339
|
+
Additional info_label to use for all outputs.
|
|
340
|
+
slicer : `maf.BaseSlicer` or None
|
|
341
|
+
Optionally use something other than a HealpixSlicer
|
|
342
|
+
|
|
343
|
+
Returns
|
|
344
|
+
-------
|
|
345
|
+
metric_bundleDict : `dict` of `maf.MetricBundle`
|
|
346
|
+
"""
|
|
347
|
+
|
|
348
|
+
if colmap is None:
|
|
349
|
+
colmap = col_map_dict()
|
|
350
|
+
|
|
351
|
+
bundleList = []
|
|
352
|
+
|
|
353
|
+
raCol = colmap["ra"]
|
|
354
|
+
decCol = colmap["dec"]
|
|
355
|
+
degrees = colmap["raDecDeg"]
|
|
356
|
+
filterlist, colors, orders, sqls, info_label = filter_list(
|
|
357
|
+
all=True, extra_sql=extraSql, extra_info_label=extraInfoLabel
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
if slicer is None:
|
|
361
|
+
slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
|
|
362
|
+
|
|
363
|
+
displayDict = {
|
|
364
|
+
"group": display_group,
|
|
365
|
+
"subgroup": subgroup,
|
|
366
|
+
"caption": None,
|
|
367
|
+
"order": 0,
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
# Histogram of the number of nights between visits.
|
|
371
|
+
bins = np.arange(1, 20.5, 1)
|
|
372
|
+
metric = metrics.NightgapsMetric(bins=bins, night_col=colmap["night"], metric_name="DeltaNight Histogram")
|
|
373
|
+
plotDict = {"bins": bins, "xlabel": "dT (nights)"}
|
|
374
|
+
displayDict["caption"] = (
|
|
375
|
+
"Histogram of the number of nights between consecutive visits to a "
|
|
376
|
+
"given point on the sky, considering separations between %d and %d" % (bins.min(), bins.max())
|
|
377
|
+
)
|
|
378
|
+
if info_label["all"] is None or len(info_label["all"]) == 0:
|
|
379
|
+
displayDict["caption"] += ", all proposals."
|
|
380
|
+
else:
|
|
381
|
+
displayDict["caption"] += ", %s." % info_label["all"]
|
|
382
|
+
plotFunc = plots.SummaryHistogram()
|
|
383
|
+
bundle = mb.MetricBundle(
|
|
384
|
+
metric,
|
|
385
|
+
slicer,
|
|
386
|
+
sqls["all"],
|
|
387
|
+
plot_dict=plotDict,
|
|
388
|
+
display_dict=displayDict,
|
|
389
|
+
info_label=info_label["all"],
|
|
390
|
+
plot_funcs=[plotFunc],
|
|
391
|
+
)
|
|
392
|
+
bundleList.append(bundle)
|
|
393
|
+
|
|
394
|
+
standardStats = standard_summary()
|
|
395
|
+
|
|
396
|
+
# Look at the total number of unique nights with visits
|
|
397
|
+
metric = metrics.CountUniqueMetric(col=colmap["night"], metric_name="N Unique Nights")
|
|
398
|
+
displayDict["caption"] = "Number of unique nights with visits"
|
|
399
|
+
bundle = mb.MetricBundle(
|
|
400
|
+
metric,
|
|
401
|
+
slicer,
|
|
402
|
+
sqls["all"],
|
|
403
|
+
info_label=info_label["all"],
|
|
404
|
+
display_dict=displayDict,
|
|
405
|
+
plot_dict={"color_min": 0, "color_max": 500},
|
|
406
|
+
summary_metrics=standardStats,
|
|
407
|
+
)
|
|
408
|
+
bundleList.append(bundle)
|
|
409
|
+
|
|
410
|
+
# Median inter-night gap (each and all filters)
|
|
411
|
+
metric = metrics.InterNightGapsMetric(
|
|
412
|
+
metric_name="Median Inter-Night Gap",
|
|
413
|
+
mjd_col=colmap["mjd"],
|
|
414
|
+
reduce_func=np.median,
|
|
415
|
+
)
|
|
416
|
+
for f in filterlist:
|
|
417
|
+
displayDict["caption"] = "Median gap between nights with observations, %s." % info_label[f]
|
|
418
|
+
displayDict["order"] = orders[f]
|
|
419
|
+
plotDict = {"color": colors[f], "percentile_clip": 95.0}
|
|
420
|
+
bundle = mb.MetricBundle(
|
|
421
|
+
metric,
|
|
422
|
+
slicer,
|
|
423
|
+
sqls[f],
|
|
424
|
+
info_label=info_label[f],
|
|
425
|
+
display_dict=displayDict,
|
|
426
|
+
plot_dict=plotDict,
|
|
427
|
+
summary_metrics=standardStats,
|
|
428
|
+
)
|
|
429
|
+
bundleList.append(bundle)
|
|
430
|
+
|
|
431
|
+
# 20th percentile inter-night gap (each and all filters) -
|
|
432
|
+
# aimed at active rolling years
|
|
433
|
+
def rfunc(simdata):
|
|
434
|
+
return np.percentile(simdata, 20)
|
|
435
|
+
|
|
436
|
+
metric = metrics.InterNightGapsMetric(
|
|
437
|
+
metric_name="20thPercentile Inter-Night Gap",
|
|
438
|
+
mjd_col=colmap["mjd"],
|
|
439
|
+
reduce_func=rfunc,
|
|
440
|
+
)
|
|
441
|
+
for f in filterlist:
|
|
442
|
+
displayDict["caption"] = "20th percentile gap between nights with observations, %s." % info_label[f]
|
|
443
|
+
displayDict["order"] = orders[f]
|
|
444
|
+
plotDict = {"color": colors[f], "percentile_clip": 95.0}
|
|
445
|
+
bundle = mb.MetricBundle(
|
|
446
|
+
metric,
|
|
447
|
+
slicer,
|
|
448
|
+
sqls[f],
|
|
449
|
+
info_label=info_label[f],
|
|
450
|
+
display_dict=displayDict,
|
|
451
|
+
plot_dict=plotDict,
|
|
452
|
+
summary_metrics=standardStats,
|
|
453
|
+
)
|
|
454
|
+
bundleList.append(bundle)
|
|
455
|
+
|
|
456
|
+
# Maximum inter-night gap (in each and all filters).
|
|
457
|
+
metric = metrics.InterNightGapsMetric(
|
|
458
|
+
metric_name="Max Inter-Night Gap", mjd_col=colmap["mjd"], reduce_func=np.max
|
|
459
|
+
)
|
|
460
|
+
for f in filterlist:
|
|
461
|
+
displayDict["caption"] = "Maximum gap between nights with observations, %s." % info_label[f]
|
|
462
|
+
displayDict["order"] = orders[f]
|
|
463
|
+
plotDict = {"color": colors[f], "percentile_clip": 95.0, "bin_size": 5}
|
|
464
|
+
bundle = mb.MetricBundle(
|
|
465
|
+
metric,
|
|
466
|
+
slicer,
|
|
467
|
+
sqls[f],
|
|
468
|
+
info_label=info_label[f],
|
|
469
|
+
display_dict=displayDict,
|
|
470
|
+
plot_dict=plotDict,
|
|
471
|
+
summary_metrics=standardStats,
|
|
472
|
+
)
|
|
473
|
+
bundleList.append(bundle)
|
|
474
|
+
|
|
475
|
+
# Set the run_name for all bundles and return the bundleDict.
|
|
476
|
+
for b in bundleList:
|
|
477
|
+
b.set_run_name(runName)
|
|
478
|
+
return mb.make_bundles_dict_from_list(bundleList)
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
def timeGaps(
|
|
482
|
+
colmap=None,
|
|
483
|
+
runName="opsim",
|
|
484
|
+
nside=64,
|
|
485
|
+
extraSql=None,
|
|
486
|
+
extraInfoLabel=None,
|
|
487
|
+
slicer=None,
|
|
488
|
+
display_group="Time Coverage",
|
|
489
|
+
subgroup=None,
|
|
490
|
+
):
|
|
491
|
+
"""Generate a set of statistics about the spacing
|
|
492
|
+
between nights with observations.
|
|
493
|
+
|
|
494
|
+
Parameters
|
|
495
|
+
----------
|
|
496
|
+
colmap : `dict`, optional
|
|
497
|
+
A dictionary with a mapping of column names.
|
|
498
|
+
runName : `str`, optional
|
|
499
|
+
The name of the simulated survey.
|
|
500
|
+
nside : `int`, optional
|
|
501
|
+
Nside for the healpix slicer.
|
|
502
|
+
extraSql : `str`, optional
|
|
503
|
+
Additional sql constraint to apply to all metrics.
|
|
504
|
+
extraInfoLabel : `str`, optional
|
|
505
|
+
Additional info_label to use for all outputs.
|
|
506
|
+
slicer : `rubin_sim.maf.slicer.BaseSlicer`, optional
|
|
507
|
+
Optionally use something other than a HealpixSlicer
|
|
508
|
+
|
|
509
|
+
Returns
|
|
510
|
+
-------
|
|
511
|
+
bundle_dict : `dict` of `rubin_sim.maf.MetricBundle`
|
|
512
|
+
"""
|
|
513
|
+
|
|
514
|
+
if colmap is None:
|
|
515
|
+
colmap = col_map_dict()
|
|
516
|
+
|
|
517
|
+
bundleList = []
|
|
518
|
+
|
|
519
|
+
raCol = colmap["ra"]
|
|
520
|
+
decCol = colmap["dec"]
|
|
521
|
+
degrees = colmap["raDecDeg"]
|
|
522
|
+
filterlist, colors, orders, sqls, info_label = filter_list(
|
|
523
|
+
all=True, extra_sql=extraSql, extra_info_label=extraInfoLabel
|
|
524
|
+
)
|
|
525
|
+
|
|
526
|
+
if slicer is None:
|
|
527
|
+
slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
|
|
528
|
+
|
|
529
|
+
displayDict = {
|
|
530
|
+
"group": display_group,
|
|
531
|
+
"subgroup": subgroup,
|
|
532
|
+
"caption": None,
|
|
533
|
+
"order": 0,
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
# Logarithmically spaced gaps from 30s to 5 years
|
|
537
|
+
tMin = 30 / 60 / 60 / 24.0 # 30s
|
|
538
|
+
tMax = 5 * 365.25 # 5 years
|
|
539
|
+
tgaps = np.logspace(np.log10(tMin), np.log10(tMax), 100)
|
|
540
|
+
|
|
541
|
+
for f in filterlist:
|
|
542
|
+
m1 = metrics.TgapsMetric(bins=tgaps, all_gaps=False)
|
|
543
|
+
plotDict = {
|
|
544
|
+
"bins": tgaps,
|
|
545
|
+
"xscale": "log",
|
|
546
|
+
"y_min": 0,
|
|
547
|
+
"figsize": (8, 6),
|
|
548
|
+
"ylabel": "Number of observation pairs",
|
|
549
|
+
"xlabel": "Time gap between pairs of visits (days)",
|
|
550
|
+
"color": colors[f],
|
|
551
|
+
}
|
|
552
|
+
plotFuncs = [plots.SummaryHistogram()]
|
|
553
|
+
displayDict["caption"] = (
|
|
554
|
+
f"Summed Histogram of time between visits at each point in the sky, " f"in {f} band(s)."
|
|
555
|
+
)
|
|
556
|
+
displayDict["order"] = orders[f]
|
|
557
|
+
bundleList.append(
|
|
558
|
+
mb.MetricBundle(
|
|
559
|
+
m1,
|
|
560
|
+
slicer,
|
|
561
|
+
constraint=sqls[f],
|
|
562
|
+
info_label=info_label[f],
|
|
563
|
+
run_name=runName,
|
|
564
|
+
plot_dict=plotDict,
|
|
565
|
+
plot_funcs=plotFuncs,
|
|
566
|
+
display_dict=displayDict,
|
|
567
|
+
)
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
gaps = [3.0, 7.0, 24.0]
|
|
571
|
+
for gap in gaps:
|
|
572
|
+
summary_stats = []
|
|
573
|
+
summary_stats.append(
|
|
574
|
+
metrics.AreaSummaryMetric(
|
|
575
|
+
area=18000, reduce_func=np.median, decreasing=True, metric_name="Median (top 18k)"
|
|
576
|
+
)
|
|
577
|
+
)
|
|
578
|
+
|
|
579
|
+
summary_stats.append(
|
|
580
|
+
metrics.AreaSummaryMetric(
|
|
581
|
+
area=18000, reduce_func=np.mean, decreasing=True, metric_name="Mean (top 18k)"
|
|
582
|
+
)
|
|
583
|
+
)
|
|
584
|
+
|
|
585
|
+
summary_stats.append(metrics.MeanMetric())
|
|
586
|
+
summary_stats.append(metrics.MedianMetric())
|
|
587
|
+
|
|
588
|
+
m2 = metrics.GapsMetric(time_scale=gap, metric_name=f"Gaps at {gap: .1f} hr")
|
|
589
|
+
plotFuncs = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
|
|
590
|
+
plotDict = {"color_min": 0, "color": colors[f], "percentile_clip": 95}
|
|
591
|
+
displayDict["subgroup"] = "Gaps Sampling"
|
|
592
|
+
displayDict["caption"] = (
|
|
593
|
+
f"Number of times the timescale of ~{gap: .1f} hours is sampled in {f} band(s)."
|
|
594
|
+
)
|
|
595
|
+
displayDict["order"] = orders[f]
|
|
596
|
+
bundleList.append(
|
|
597
|
+
mb.MetricBundle(
|
|
598
|
+
m2,
|
|
599
|
+
slicer,
|
|
600
|
+
constraint=sqls[f],
|
|
601
|
+
info_label=info_label[f],
|
|
602
|
+
run_name=runName,
|
|
603
|
+
summary_metrics=summary_stats,
|
|
604
|
+
plot_dict=plotDict,
|
|
605
|
+
plot_funcs=plotFuncs,
|
|
606
|
+
display_dict=displayDict,
|
|
607
|
+
)
|
|
608
|
+
)
|
|
609
|
+
|
|
610
|
+
return mb.make_bundles_dict_from_list(bundleList)
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
def seasons(
|
|
614
|
+
colmap=None,
|
|
615
|
+
runName="opsim",
|
|
616
|
+
nside=64,
|
|
617
|
+
extraSql=None,
|
|
618
|
+
extraInfoLabel=None,
|
|
619
|
+
slicer=None,
|
|
620
|
+
):
|
|
621
|
+
"""Generate a set of statistics about the length and number of seasons.
|
|
622
|
+
|
|
623
|
+
Parameters
|
|
624
|
+
----------
|
|
625
|
+
colmap : `dict` or None, optional
|
|
626
|
+
A dictionary with a mapping of column names.
|
|
627
|
+
runName : `str`, optional
|
|
628
|
+
The name of the simulated survey.
|
|
629
|
+
nside : `int`, optional
|
|
630
|
+
Nside for the healpix slicer.
|
|
631
|
+
extraSql : `str` or None, optional
|
|
632
|
+
Additional sql constraint to apply to all metrics.
|
|
633
|
+
extraInfoLabel : `str` or None, optional
|
|
634
|
+
Additional info_label to use for all outputs.
|
|
635
|
+
slicer : `maf.BaseSlicer` or None`
|
|
636
|
+
Optionally use something other than a HealpixSlicer
|
|
637
|
+
|
|
638
|
+
Returns
|
|
639
|
+
-------
|
|
640
|
+
metric_bundleDict : `dict` of `maf.MetricBundle`
|
|
641
|
+
"""
|
|
642
|
+
|
|
643
|
+
if colmap is None:
|
|
644
|
+
colmap = col_map_dict()
|
|
645
|
+
|
|
646
|
+
bundleList = []
|
|
647
|
+
|
|
648
|
+
# Set up basic all and per filter sql constraints.
|
|
649
|
+
raCol = colmap["ra"]
|
|
650
|
+
decCol = colmap["dec"]
|
|
651
|
+
degrees = colmap["raDecDeg"]
|
|
652
|
+
filterlist, colors, orders, sqls, info_label = filter_list(
|
|
653
|
+
all=True, extra_sql=extraSql, extra_info_label=extraInfoLabel
|
|
654
|
+
)
|
|
655
|
+
|
|
656
|
+
if slicer is None:
|
|
657
|
+
slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
|
|
658
|
+
|
|
659
|
+
displayDict = {
|
|
660
|
+
"group": "IntraSeason",
|
|
661
|
+
"subgroup": "Season length",
|
|
662
|
+
"caption": None,
|
|
663
|
+
"order": 0,
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
standardStats = standard_summary()
|
|
667
|
+
|
|
668
|
+
metric = metrics.SeasonLengthMetric(
|
|
669
|
+
metric_name="Median Season Length", mjd_col=colmap["mjd"], reduce_func=np.median
|
|
670
|
+
)
|
|
671
|
+
for f in filterlist:
|
|
672
|
+
displayDict["caption"] = "Median season length, %s." % info_label[f]
|
|
673
|
+
displayDict["order"] = orders[f]
|
|
674
|
+
maxS = 250
|
|
675
|
+
if f == "all":
|
|
676
|
+
minS = 90
|
|
677
|
+
else:
|
|
678
|
+
minS = 30
|
|
679
|
+
plotDict = {
|
|
680
|
+
"color": colors[f],
|
|
681
|
+
"color_min": minS,
|
|
682
|
+
"color_max": maxS,
|
|
683
|
+
"x_min": minS,
|
|
684
|
+
"x_max": maxS,
|
|
685
|
+
}
|
|
686
|
+
bundle = mb.MetricBundle(
|
|
687
|
+
metric,
|
|
688
|
+
slicer,
|
|
689
|
+
sqls[f],
|
|
690
|
+
info_label=info_label[f],
|
|
691
|
+
display_dict=displayDict,
|
|
692
|
+
plot_dict=plotDict,
|
|
693
|
+
summary_metrics=standardStats,
|
|
694
|
+
)
|
|
695
|
+
bundleList.append(bundle)
|
|
696
|
+
|
|
697
|
+
# 80th percentile season length -
|
|
698
|
+
# aimed at finding season length during rolling or long years
|
|
699
|
+
def rfunc(simdata):
|
|
700
|
+
return np.percentile(simdata, 80)
|
|
701
|
+
|
|
702
|
+
metric = metrics.SeasonLengthMetric(
|
|
703
|
+
metric_name="80thPercentile Season Length",
|
|
704
|
+
mjd_col=colmap["mjd"],
|
|
705
|
+
reduce_func=rfunc,
|
|
706
|
+
)
|
|
707
|
+
for f in filterlist:
|
|
708
|
+
displayDict["caption"] = "80th percentile season length, %s." % info_label[f]
|
|
709
|
+
displayDict["order"] = orders[f]
|
|
710
|
+
maxS = 350
|
|
711
|
+
if f == "all":
|
|
712
|
+
minS = 90
|
|
713
|
+
else:
|
|
714
|
+
minS = 30
|
|
715
|
+
plotDict = {
|
|
716
|
+
"color": colors[f],
|
|
717
|
+
"color_min": minS,
|
|
718
|
+
"color_max": maxS,
|
|
719
|
+
"x_min": minS,
|
|
720
|
+
"x_max": maxS,
|
|
721
|
+
}
|
|
722
|
+
bundle = mb.MetricBundle(
|
|
723
|
+
metric,
|
|
724
|
+
slicer,
|
|
725
|
+
sqls[f],
|
|
726
|
+
info_label=info_label[f],
|
|
727
|
+
display_dict=displayDict,
|
|
728
|
+
plot_dict=plotDict,
|
|
729
|
+
summary_metrics=standardStats,
|
|
730
|
+
)
|
|
731
|
+
bundleList.append(bundle)
|
|
732
|
+
|
|
733
|
+
# Number of seasons
|
|
734
|
+
metric = metrics.CampaignLengthMetric(
|
|
735
|
+
metric_name="NSeasons",
|
|
736
|
+
mjd_col=colmap["mjd"],
|
|
737
|
+
exp_time_col=colmap["exptime"],
|
|
738
|
+
min_exp_time=15,
|
|
739
|
+
)
|
|
740
|
+
displayDict["caption"] = "Number of seasons, any filter."
|
|
741
|
+
displayDict["order"] = 0
|
|
742
|
+
plotDict = {"color": "k", "color_min": 0, "color_max": 11, "x_min": 0, "x_max": 11}
|
|
743
|
+
bundle = mb.MetricBundle(
|
|
744
|
+
metric,
|
|
745
|
+
slicer,
|
|
746
|
+
sqls["all"],
|
|
747
|
+
info_label=info_label["all"],
|
|
748
|
+
display_dict=displayDict,
|
|
749
|
+
plot_dict=plotDict,
|
|
750
|
+
summary_metrics=standardStats,
|
|
751
|
+
)
|
|
752
|
+
bundleList.append(bundle)
|
|
753
|
+
|
|
754
|
+
# Set the run_name for all bundles and return the bundleDict.
|
|
755
|
+
for b in bundleList:
|
|
756
|
+
b.set_run_name(runName)
|
|
757
|
+
return mb.make_bundles_dict_from_list(bundleList)
|