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,646 @@
|
|
|
1
|
+
__all__ = (
|
|
2
|
+
"MoMetricBundle",
|
|
3
|
+
"MoMetricBundleGroup",
|
|
4
|
+
"create_empty_mo_metric_bundle",
|
|
5
|
+
"make_completeness_bundle",
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
import warnings
|
|
10
|
+
|
|
11
|
+
import matplotlib.pyplot as plt
|
|
12
|
+
import numpy as np
|
|
13
|
+
import numpy.ma as ma
|
|
14
|
+
|
|
15
|
+
from rubin_sim.maf.metrics import BaseMoMetric, ValueAtHMetric
|
|
16
|
+
from rubin_sim.maf.plots import PlotHandler
|
|
17
|
+
from rubin_sim.maf.slicers import MoObjSlicer
|
|
18
|
+
from rubin_sim.maf.stackers import BaseMoStacker, MoMagStacker
|
|
19
|
+
|
|
20
|
+
from .metric_bundle import MetricBundle
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def create_empty_mo_metric_bundle():
|
|
24
|
+
"""Create an empty metric bundle.
|
|
25
|
+
|
|
26
|
+
Returns
|
|
27
|
+
-------
|
|
28
|
+
MoMetricBundle : `~rubin_sim.maf.metricBundles.MoMetricBundle`
|
|
29
|
+
An empty metric bundle, configured with just
|
|
30
|
+
the :class:`BaseMetric` and :class:`BaseSlicer`.
|
|
31
|
+
"""
|
|
32
|
+
return MoMetricBundle(BaseMoMetric(), MoObjSlicer(), None)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def make_completeness_bundle(bundle, completeness_metric, h_mark=None, results_db=None):
|
|
36
|
+
"""Evaluate a MoMetricBundle with a completeness-style metric, and
|
|
37
|
+
downsample into a new MoMetricBundle marginalized over the population.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
bundle : `~rubin_sim.maf.metricBundles.MoMetricBundle`
|
|
42
|
+
The metric bundle with a completeness summary statistic.
|
|
43
|
+
completeness_metric : `~rubin_sim.maf.metric`
|
|
44
|
+
The summary (completeness) metric to run on the bundle.
|
|
45
|
+
h_mark : `float`, optional
|
|
46
|
+
The Hmark value to add to the plotting dictionary of the new
|
|
47
|
+
mock bundle. Default None.
|
|
48
|
+
results_db : `~rubin_sim.maf.db.ResultsDb`, optional
|
|
49
|
+
The results_db in which to record the summary statistic value at
|
|
50
|
+
Hmark. Default None.
|
|
51
|
+
|
|
52
|
+
Returns
|
|
53
|
+
-------
|
|
54
|
+
mo_metric_bundle : `~rubin_sim.maf.metricBundles.MoMetricBundle`
|
|
55
|
+
|
|
56
|
+
Notes
|
|
57
|
+
-----
|
|
58
|
+
This utility turns a metric bundle which could evaluate a metric over
|
|
59
|
+
the population, into a secondary or mock metric bundle, using either
|
|
60
|
+
MoCompleteness or MoCumulativeCompleteness summary
|
|
61
|
+
metrics to marginalize over the population of moving objects.
|
|
62
|
+
This lets us use the plotHandler + plots.MetricVsH
|
|
63
|
+
to generate plots across the population, using the completeness
|
|
64
|
+
information.
|
|
65
|
+
This utility will also work with completeness metric run in order
|
|
66
|
+
to calculate fraction of the population,
|
|
67
|
+
or with MoCompletenessAtTime metric.
|
|
68
|
+
"""
|
|
69
|
+
bundle.set_summary_metrics(completeness_metric)
|
|
70
|
+
# This step adds summary values at each point to the original metric -
|
|
71
|
+
# we use this to populate the completeness values in the next step.
|
|
72
|
+
# However, we may not want them to go into the results_db.
|
|
73
|
+
bundle.compute_summary_stats(results_db)
|
|
74
|
+
summary_name = completeness_metric.name
|
|
75
|
+
# Make up the bundle, including the metric values.
|
|
76
|
+
completeness = ma.MaskedArray(
|
|
77
|
+
data=bundle.summary_values[summary_name]["value"],
|
|
78
|
+
mask=np.zeros(len(bundle.summary_values[summary_name]["value"])),
|
|
79
|
+
fill_value=0,
|
|
80
|
+
)
|
|
81
|
+
mb = MoMetricBundle(
|
|
82
|
+
completeness_metric,
|
|
83
|
+
bundle.slicer,
|
|
84
|
+
constraint=bundle.constraint,
|
|
85
|
+
run_name=bundle.run_name,
|
|
86
|
+
info_label=bundle.info_label,
|
|
87
|
+
display_dict=bundle.display_dict,
|
|
88
|
+
)
|
|
89
|
+
plot_dict = {}
|
|
90
|
+
plot_dict.update(bundle.plot_dict)
|
|
91
|
+
plot_dict["label"] = bundle.info_label
|
|
92
|
+
if "Completeness" not in summary_name:
|
|
93
|
+
plot_dict["label"] += " " + summary_name.replace("FractionPop_", "")
|
|
94
|
+
mb.metric_values = completeness.reshape(1, len(completeness))
|
|
95
|
+
if h_mark is not None:
|
|
96
|
+
metric = ValueAtHMetric(h_mark=h_mark)
|
|
97
|
+
mb.set_summary_metrics(metric)
|
|
98
|
+
mb.compute_summary_stats(results_db)
|
|
99
|
+
val = mb.summary_values["Value At H=%.1f" % h_mark]
|
|
100
|
+
if val is None:
|
|
101
|
+
val = 0
|
|
102
|
+
if summary_name.startswith("Cumulative"):
|
|
103
|
+
plot_dict["label"] += ": @ H(<=%.1f) = %.1f%s" % (h_mark, val * 100, "%")
|
|
104
|
+
else:
|
|
105
|
+
plot_dict["label"] += ": @ H(=%.1f) = %.1f%s" % (h_mark, val * 100, "%")
|
|
106
|
+
mb.set_plot_dict(plot_dict)
|
|
107
|
+
return mb
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class MoMetricBundle(MetricBundle):
|
|
111
|
+
"""Define a moving object metric bundle combination of
|
|
112
|
+
moving-object metric, moving-object slicer, and constraint.
|
|
113
|
+
|
|
114
|
+
Parameters
|
|
115
|
+
----------
|
|
116
|
+
metric : `~rubin_sim.maf.metric`
|
|
117
|
+
The Metric class to run per slice_point
|
|
118
|
+
slicer : `~rubin_sim.maf.slicer`
|
|
119
|
+
The Slicer to apply to the incoming visit data (the observations).
|
|
120
|
+
constraint : `str` or None, opt
|
|
121
|
+
A (sql-style) constraint to apply to the visit data, to apply a
|
|
122
|
+
broad sub-selection.
|
|
123
|
+
stacker_list : `list` [`~rubin_sim.maf.stacker`], opt
|
|
124
|
+
A list of pre-configured stackers to use to generate additional
|
|
125
|
+
columns per visit.
|
|
126
|
+
These will be generated automatically if needed, but pre-configured
|
|
127
|
+
versions will override these.
|
|
128
|
+
run_name : `str`, opt
|
|
129
|
+
The name of the simulation being run.
|
|
130
|
+
This will be added to output files and plots.
|
|
131
|
+
Setting it prevents file conflicts when running the same
|
|
132
|
+
metric on multiple simulations, and
|
|
133
|
+
provides a way to identify which simulation is being analyzed.
|
|
134
|
+
info_label : `str` or None, opt
|
|
135
|
+
Information to add to the output metric data file name and plot labels.
|
|
136
|
+
If this is not provided, it will be auto-generated from the
|
|
137
|
+
constraint (if any).
|
|
138
|
+
Setting this provides an easy way to specify different
|
|
139
|
+
configurations of a metric, a slicer,
|
|
140
|
+
or just to rewrite your constraint into friendlier terms.
|
|
141
|
+
(i.e. a constraint like 'scheduler_note not like "%DD%"' can become
|
|
142
|
+
"non-DD" in the file name and plot labels
|
|
143
|
+
by specifying info_label).
|
|
144
|
+
plot_dict : `dict` of plotting parameters, opt
|
|
145
|
+
Specify general plotting parameters, such as x/y/color limits.
|
|
146
|
+
display_dict : `dict` of display parameters, opt
|
|
147
|
+
Specify parameters for show_maf web pages, such as the
|
|
148
|
+
side bar labels and figure captions.
|
|
149
|
+
Keys: 'group', 'subgroup', 'caption', and 'order'
|
|
150
|
+
(such as to set metrics in filter order, etc)
|
|
151
|
+
child_metrics : `list` of `~rubin_sim.maf.metrics`
|
|
152
|
+
A list of child metrics to run to summarize the
|
|
153
|
+
primary metric, such as Discovery_At_Time, etc.
|
|
154
|
+
summary_metrics : `list` of `~rubin_sim.maf.metrics`
|
|
155
|
+
A list of summary metrics to run to summarize the
|
|
156
|
+
primary or child metric, such as CompletenessAtH, etc.
|
|
157
|
+
|
|
158
|
+
Notes
|
|
159
|
+
-----
|
|
160
|
+
Define the "thing" you are measuring, with a combination of
|
|
161
|
+
* metric (calculated per object)
|
|
162
|
+
* slicer (contains information on the moving objects
|
|
163
|
+
and their observations)
|
|
164
|
+
* constraint (an optional definition of a large subset of data)
|
|
165
|
+
|
|
166
|
+
The MoMetricBundle also saves the child metrics to be used
|
|
167
|
+
to generate summary statistics over those metric values,
|
|
168
|
+
as well as the resulting summary statistic values.
|
|
169
|
+
|
|
170
|
+
Plotting parameters and display parameters (for show_maf) are saved
|
|
171
|
+
in the MoMetricBundle, as well as additional info_label such as the
|
|
172
|
+
opsim run name, and relevant stackers and maps
|
|
173
|
+
to apply when calculating the metric values.
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
def __init__(
|
|
177
|
+
self,
|
|
178
|
+
metric,
|
|
179
|
+
slicer,
|
|
180
|
+
constraint=None,
|
|
181
|
+
stacker_list=None,
|
|
182
|
+
run_name="run name",
|
|
183
|
+
info_label=None,
|
|
184
|
+
file_root=None,
|
|
185
|
+
plot_dict=None,
|
|
186
|
+
plot_funcs=None,
|
|
187
|
+
display_dict=None,
|
|
188
|
+
child_metrics=None,
|
|
189
|
+
summary_metrics=None,
|
|
190
|
+
):
|
|
191
|
+
self.metric = metric
|
|
192
|
+
self.slicer = slicer
|
|
193
|
+
if constraint == "":
|
|
194
|
+
constraint = None
|
|
195
|
+
self.constraint = constraint
|
|
196
|
+
# Set the stackerlist.
|
|
197
|
+
if stacker_list is not None:
|
|
198
|
+
if isinstance(stacker_list, BaseMoStacker):
|
|
199
|
+
self.stacker_list = [
|
|
200
|
+
stacker_list,
|
|
201
|
+
]
|
|
202
|
+
else:
|
|
203
|
+
self.stacker_list = []
|
|
204
|
+
for s in stacker_list:
|
|
205
|
+
if not isinstance(s, BaseMoStacker):
|
|
206
|
+
raise ValueError(
|
|
207
|
+
"stackerList must only contain " "rubin_sim.maf.stackers.BaseMoStacker type objs"
|
|
208
|
+
)
|
|
209
|
+
self.stacker_list.append(s)
|
|
210
|
+
else:
|
|
211
|
+
self.stacker_list = []
|
|
212
|
+
# Add the basic 'visibility/mag' stacker if not present.
|
|
213
|
+
mag_stacker_found = False
|
|
214
|
+
for s in self.stacker_list:
|
|
215
|
+
if s.__class__.__name__ == "MoMagStacker":
|
|
216
|
+
mag_stacker_found = True
|
|
217
|
+
break
|
|
218
|
+
if not mag_stacker_found:
|
|
219
|
+
self.stacker_list.append(MoMagStacker())
|
|
220
|
+
# Set a mapsList just for compatibility with generic MetricBundle.
|
|
221
|
+
self.maps_list = []
|
|
222
|
+
# Add the summary stats, if applicable.
|
|
223
|
+
self.set_summary_metrics(summary_metrics)
|
|
224
|
+
# Set the provenance/info_label.
|
|
225
|
+
self.run_name = run_name
|
|
226
|
+
self._build_metadata(info_label)
|
|
227
|
+
# Build the output filename root if not provided.
|
|
228
|
+
if file_root is not None:
|
|
229
|
+
self.file_root = file_root
|
|
230
|
+
else:
|
|
231
|
+
self._build_file_root()
|
|
232
|
+
# Set the plotting classes/functions.
|
|
233
|
+
self.set_plot_funcs(plot_funcs)
|
|
234
|
+
# Set the plot_dict and displayDicts.
|
|
235
|
+
self.plot_dict = {"units": "@H"}
|
|
236
|
+
self.set_plot_dict(plot_dict)
|
|
237
|
+
# Update/set display_dict.
|
|
238
|
+
self.display_dict = {}
|
|
239
|
+
self.set_display_dict(display_dict)
|
|
240
|
+
# Set the list of child metrics.
|
|
241
|
+
self.set_child_bundles(child_metrics)
|
|
242
|
+
# This is where we store the metric values and summary stats.
|
|
243
|
+
self.metric_values = None
|
|
244
|
+
self.summary_values = None
|
|
245
|
+
|
|
246
|
+
def _reset_metric_bundle(self):
|
|
247
|
+
"""Reset all properties of MetricBundle."""
|
|
248
|
+
self.metric = None
|
|
249
|
+
self.slicer = None
|
|
250
|
+
self.constraint = None
|
|
251
|
+
self.stacker_list = [MoMagStacker()]
|
|
252
|
+
self.maps_list = []
|
|
253
|
+
self.summary_metrics = []
|
|
254
|
+
self.plot_funcs = []
|
|
255
|
+
self.run_name = "opsim"
|
|
256
|
+
self.info_label = ""
|
|
257
|
+
self.db_cols = None
|
|
258
|
+
self.file_root = None
|
|
259
|
+
self.plot_dict = {}
|
|
260
|
+
self.display_dict = {}
|
|
261
|
+
self.child_metrics = None
|
|
262
|
+
self.metric_values = None
|
|
263
|
+
self.summary_values = None
|
|
264
|
+
|
|
265
|
+
def _build_metadata(self, info_label):
|
|
266
|
+
"""If no info_label is provided, auto-generate it from the
|
|
267
|
+
obs_file + constraint."""
|
|
268
|
+
if info_label is None:
|
|
269
|
+
try:
|
|
270
|
+
self.info_label = self.slicer.obsfile.replace(".txt", "").replace(".dat", "")
|
|
271
|
+
self.info_label = self.info_label.replace("_obs", "").replace("_allObs", "")
|
|
272
|
+
except AttributeError:
|
|
273
|
+
self.info_label = "noObs"
|
|
274
|
+
# And modify by constraint.
|
|
275
|
+
if self.constraint is not None:
|
|
276
|
+
self.info_label += " " + self.constraint
|
|
277
|
+
else:
|
|
278
|
+
self.info_label = info_label
|
|
279
|
+
|
|
280
|
+
def _find_req_cols(self):
|
|
281
|
+
# Doesn't quite work the same way yet. No stacker list, for example.
|
|
282
|
+
raise NotImplementedError
|
|
283
|
+
|
|
284
|
+
def set_child_bundles(self, child_metrics=None):
|
|
285
|
+
"""Identify any child metrics to be run on this (parent) bundle.
|
|
286
|
+
and create the new metric bundles that will hold the child values,
|
|
287
|
+
linking to this bundle.
|
|
288
|
+
Remove the summaryMetrics from self afterwards.
|
|
289
|
+
|
|
290
|
+
Parameters
|
|
291
|
+
----------
|
|
292
|
+
child_metrics : `~maf.MoMetric`
|
|
293
|
+
Child metrics work like reduce functions for non-moving objects.
|
|
294
|
+
They pull out subsets of the original metric values, typically
|
|
295
|
+
do more processing on those values, and then save them in
|
|
296
|
+
new metric bundles.
|
|
297
|
+
"""
|
|
298
|
+
self.child_bundles = {}
|
|
299
|
+
if child_metrics is None:
|
|
300
|
+
child_metrics = self.metric.child_metrics
|
|
301
|
+
for c_name, cMetric in child_metrics.items():
|
|
302
|
+
c_bundle = MoMetricBundle(
|
|
303
|
+
metric=cMetric,
|
|
304
|
+
slicer=self.slicer,
|
|
305
|
+
constraint=self.constraint,
|
|
306
|
+
stacker_list=self.stacker_list,
|
|
307
|
+
run_name=self.run_name,
|
|
308
|
+
info_label=self.info_label,
|
|
309
|
+
plot_dict=self.plot_dict,
|
|
310
|
+
plot_funcs=self.plot_funcs,
|
|
311
|
+
display_dict=self.display_dict,
|
|
312
|
+
summary_metrics=self.summary_metrics,
|
|
313
|
+
)
|
|
314
|
+
self.child_bundles[c_name] = c_bundle
|
|
315
|
+
if len(child_metrics) > 0:
|
|
316
|
+
self.summary_metrics = []
|
|
317
|
+
|
|
318
|
+
def compute_summary_stats(self, results_db=None):
|
|
319
|
+
"""Compute summary statistics on metric_values, using summaryMetrics,
|
|
320
|
+
for self and child bundles.
|
|
321
|
+
|
|
322
|
+
Parameters
|
|
323
|
+
----------
|
|
324
|
+
results_db : `~maf.ResultsDb`
|
|
325
|
+
Database which holds the summary statistic information.
|
|
326
|
+
"""
|
|
327
|
+
if self.summary_values is None:
|
|
328
|
+
self.summary_values = {}
|
|
329
|
+
if self.summary_metrics is not None:
|
|
330
|
+
# Build array of metric values, to use for summary statistics.
|
|
331
|
+
for m in self.summary_metrics:
|
|
332
|
+
summary_name = m.name
|
|
333
|
+
summary_val = m.run(self.metric_values, self.slicer.slice_points["H"])
|
|
334
|
+
self.summary_values[summary_name] = summary_val
|
|
335
|
+
# Add summary metric info to results database, if applicable.
|
|
336
|
+
if results_db:
|
|
337
|
+
metric_id = results_db.update_metric(
|
|
338
|
+
self.metric.name,
|
|
339
|
+
self.slicer.slicer_name,
|
|
340
|
+
self.run_name,
|
|
341
|
+
self.constraint,
|
|
342
|
+
self.info_label,
|
|
343
|
+
None,
|
|
344
|
+
)
|
|
345
|
+
results_db.update_summary_stat(
|
|
346
|
+
metric_id, summary_name=summary_name, summary_value=summary_val
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
def reduce_metric(self, reduce_func, reduce_plot_dict=None, reduce_display_dict=None):
|
|
350
|
+
raise NotImplementedError
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
class MoMetricBundleGroup:
|
|
354
|
+
"""Run groups of MoMetricBundles.
|
|
355
|
+
|
|
356
|
+
Parameters
|
|
357
|
+
----------
|
|
358
|
+
bundle_dict : `dict` or `list` [`MoMetricBundles`]
|
|
359
|
+
Individual MoMetricBundles should be placed into a dictionary,
|
|
360
|
+
and then passed to the MoMetricBundleGroup.
|
|
361
|
+
The dictionary keys can then be used to identify MoMetricBundles
|
|
362
|
+
if needed -- and to identify new MetricBundles which could be
|
|
363
|
+
created if 'reduce' functions are run on a particular MoMetricBundle.
|
|
364
|
+
MoMetricBundles must all have the same Slicer (same set of moving
|
|
365
|
+
object observations).
|
|
366
|
+
out_dir : `str`, opt
|
|
367
|
+
Directory to save the metric results.
|
|
368
|
+
Default is the current directory.
|
|
369
|
+
results_db : `ResultsDb`, opt
|
|
370
|
+
A results database to store summary stat information.
|
|
371
|
+
If not specified, one will be created in the out_dir.
|
|
372
|
+
This database saves information about the metrics calculated,
|
|
373
|
+
including their summary statistics.
|
|
374
|
+
verbose : `bool`, opt
|
|
375
|
+
Flag to turn on/off verbose feedback.
|
|
376
|
+
"""
|
|
377
|
+
|
|
378
|
+
def __init__(self, bundle_dict, out_dir=".", results_db=None, verbose=True):
|
|
379
|
+
self.verbose = verbose
|
|
380
|
+
self.bundle_dict = bundle_dict
|
|
381
|
+
self.out_dir = out_dir
|
|
382
|
+
if not os.path.isdir(self.out_dir):
|
|
383
|
+
os.makedirs(self.out_dir)
|
|
384
|
+
self.results_db = results_db
|
|
385
|
+
|
|
386
|
+
self.slicer = list(self.bundle_dict.values())[0].slicer
|
|
387
|
+
for b in self.bundle_dict.values():
|
|
388
|
+
if b.slicer != self.slicer:
|
|
389
|
+
raise ValueError(
|
|
390
|
+
"Currently, the slicers for the MoMetricBundleGroup must be equal,"
|
|
391
|
+
" using the same observations and Hvals."
|
|
392
|
+
)
|
|
393
|
+
self.constraints = list(set([b.constraint for b in bundle_dict.values()]))
|
|
394
|
+
|
|
395
|
+
def _check_compatible(self, metric_bundle1, metric_bundle2):
|
|
396
|
+
"""Check if two MetricBundles are "compatible".
|
|
397
|
+
Compatible indicates that the constraints, the slicers,
|
|
398
|
+
and the maps are the same, and
|
|
399
|
+
that the stackers do not interfere with each other
|
|
400
|
+
(i.e. are not trying to set the same column in different ways).
|
|
401
|
+
Returns True if the MetricBundles are compatible, False if not.
|
|
402
|
+
|
|
403
|
+
Parameters
|
|
404
|
+
----------
|
|
405
|
+
metric_bundle1 : `MetricBundle`
|
|
406
|
+
metric_bundle2 : `MetricBundle`
|
|
407
|
+
|
|
408
|
+
Returns
|
|
409
|
+
-------
|
|
410
|
+
match : `bool`
|
|
411
|
+
"""
|
|
412
|
+
if metric_bundle1.constraint != metric_bundle2.constraint:
|
|
413
|
+
return False
|
|
414
|
+
if metric_bundle1.slicer != metric_bundle2.slicer:
|
|
415
|
+
return False
|
|
416
|
+
if metric_bundle1.maps_list.sort() != metric_bundle2.maps_list.sort():
|
|
417
|
+
return False
|
|
418
|
+
for stacker in metric_bundle1.stacker_list:
|
|
419
|
+
for stacker2 in metric_bundle2.stacker_list:
|
|
420
|
+
# If the stackers have different names, that's OK,
|
|
421
|
+
# and if they are identical, that's ok.
|
|
422
|
+
if (stacker.__class__.__name__ == stacker2.__class__.__name__) & (stacker != stacker2):
|
|
423
|
+
return False
|
|
424
|
+
# But if we got this far, everything matches.
|
|
425
|
+
return True
|
|
426
|
+
|
|
427
|
+
def _find_compatible(self, test_keys):
|
|
428
|
+
"""Private utility to find which metricBundles with keys in the
|
|
429
|
+
list 'test_keys' can be calculated
|
|
430
|
+
at the same time -- having the same slicer, constraint, maps,
|
|
431
|
+
and compatible stackers.
|
|
432
|
+
|
|
433
|
+
Parameters
|
|
434
|
+
-----------
|
|
435
|
+
test_keys : `list`
|
|
436
|
+
List of the dictionary keys (of self.bundle_dict) to
|
|
437
|
+
test for compatibility.
|
|
438
|
+
|
|
439
|
+
Returns
|
|
440
|
+
--------
|
|
441
|
+
compatible_lists : `list` [`lists`]
|
|
442
|
+
Returns test_keys, split into separate lists of
|
|
443
|
+
compatible metricBundles.
|
|
444
|
+
"""
|
|
445
|
+
compatible_lists = []
|
|
446
|
+
for k in test_keys:
|
|
447
|
+
try:
|
|
448
|
+
b = self.bundle_dict[k]
|
|
449
|
+
except KeyError:
|
|
450
|
+
warnings.warn(
|
|
451
|
+
"Received %s in testkeys, but this is not present in self.bundle_dict."
|
|
452
|
+
"Will continue, but this is not expected."
|
|
453
|
+
)
|
|
454
|
+
continue
|
|
455
|
+
found_compatible = False
|
|
456
|
+
checked_all = False
|
|
457
|
+
while not (found_compatible) and not (checked_all):
|
|
458
|
+
# Go through the existing lists in compatible_lists, to see
|
|
459
|
+
# if this metricBundle matches.
|
|
460
|
+
for compatible_list in compatible_lists:
|
|
461
|
+
# Compare to all the metricBundles in this subset,
|
|
462
|
+
# to check all stackers are compatible.
|
|
463
|
+
found_compatible = True
|
|
464
|
+
for comparison_key in compatible_list:
|
|
465
|
+
compatible = self._check_compatible(self.bundle_dict[comparison_key], b)
|
|
466
|
+
if not compatible:
|
|
467
|
+
# Found a metricBundle which is not compatible,
|
|
468
|
+
# so stop and go onto the next subset.
|
|
469
|
+
found_compatible = False
|
|
470
|
+
break
|
|
471
|
+
checked_all = True
|
|
472
|
+
if found_compatible:
|
|
473
|
+
compatible_list.append(k)
|
|
474
|
+
else:
|
|
475
|
+
compatible_lists.append(
|
|
476
|
+
[
|
|
477
|
+
k,
|
|
478
|
+
]
|
|
479
|
+
)
|
|
480
|
+
return compatible_lists
|
|
481
|
+
|
|
482
|
+
def run_constraint(self, constraint):
|
|
483
|
+
"""Calculate the metric values for all the metricBundles which
|
|
484
|
+
match this constraint in the metricBundleGroup.
|
|
485
|
+
Also calculates child metrics and summary statistics,
|
|
486
|
+
and writes all to disk.
|
|
487
|
+
|
|
488
|
+
Parameters
|
|
489
|
+
----------
|
|
490
|
+
constraint : `str`
|
|
491
|
+
SQL-where or pandas constraint for the metricBundles.
|
|
492
|
+
"""
|
|
493
|
+
# Find the dict keys of the bundles which match this constraint.
|
|
494
|
+
keys_matching_constraint = []
|
|
495
|
+
for k, b in self.bundle_dict.items():
|
|
496
|
+
if b.constraint == constraint:
|
|
497
|
+
keys_matching_constraint.append(k)
|
|
498
|
+
if len(keys_matching_constraint) == 0:
|
|
499
|
+
return
|
|
500
|
+
# Identify the observations which are relevant for this constraint.
|
|
501
|
+
# This sets slicer.obs (valid for all H values).
|
|
502
|
+
self.slicer.subset_obs(constraint)
|
|
503
|
+
# Identify the sets of these metricBundles can be run at the same time
|
|
504
|
+
# (also have the same stackers).
|
|
505
|
+
compatible_lists = self._find_compatible(keys_matching_constraint)
|
|
506
|
+
|
|
507
|
+
# And now run each of those subsets of compatible metricBundles.
|
|
508
|
+
for compatible_list in compatible_lists:
|
|
509
|
+
self._run_compatible(compatible_list)
|
|
510
|
+
|
|
511
|
+
def _run_compatible(self, compatible_list):
|
|
512
|
+
"""Calculate the metric values for set of (parent and child) bundles,
|
|
513
|
+
as well as the summary stats, and write to disk.
|
|
514
|
+
|
|
515
|
+
Parameters
|
|
516
|
+
-----------
|
|
517
|
+
compatible_list : `list`
|
|
518
|
+
List of dictionary keys, of the metricBundles which can be
|
|
519
|
+
calculated together. This means they are 'compatible' and have
|
|
520
|
+
the same slicer, constraint, and non-conflicting mappers and
|
|
521
|
+
stackers.
|
|
522
|
+
"""
|
|
523
|
+
if self.verbose:
|
|
524
|
+
print("Running metrics %s" % compatible_list)
|
|
525
|
+
|
|
526
|
+
b_dict = self.bundle_dict
|
|
527
|
+
|
|
528
|
+
# Find the unique stackers and maps.
|
|
529
|
+
# These are already "compatible" (as id'd by compatible_list).
|
|
530
|
+
uniq_stackers = []
|
|
531
|
+
all_stackers = []
|
|
532
|
+
uniq_maps = []
|
|
533
|
+
all_maps = []
|
|
534
|
+
for b in b_dict.values():
|
|
535
|
+
all_stackers += b.stacker_list
|
|
536
|
+
all_maps += b.maps_list
|
|
537
|
+
for s in all_stackers:
|
|
538
|
+
if s not in uniq_stackers:
|
|
539
|
+
uniq_stackers.append(s)
|
|
540
|
+
for m in all_maps:
|
|
541
|
+
if m not in uniq_maps:
|
|
542
|
+
uniq_maps.append(m)
|
|
543
|
+
|
|
544
|
+
if len(uniq_maps) > 0:
|
|
545
|
+
print("Got some maps .. that was unexpected at the moment. Can't use them here yet.")
|
|
546
|
+
|
|
547
|
+
# Set up all of the metric values, including for the child bundles.
|
|
548
|
+
for k in compatible_list:
|
|
549
|
+
b = self.bundle_dict[k]
|
|
550
|
+
b._setup_metric_values()
|
|
551
|
+
for cb in b.child_bundles.values():
|
|
552
|
+
cb._setup_metric_values()
|
|
553
|
+
# Calculate the metric values.
|
|
554
|
+
for i, slice_point in enumerate(self.slicer):
|
|
555
|
+
sso_obs = slice_point["obs"]
|
|
556
|
+
for j, Hval in enumerate(slice_point["Hvals"]):
|
|
557
|
+
# Run stackers to add extra columns (that depend on h_val)
|
|
558
|
+
with warnings.catch_warnings():
|
|
559
|
+
warnings.simplefilter("ignore")
|
|
560
|
+
for s in uniq_stackers:
|
|
561
|
+
sso_obs = s.run(sso_obs, slice_point["orbit"]["H"], Hval)
|
|
562
|
+
# Run all the parent metrics.
|
|
563
|
+
for k in compatible_list:
|
|
564
|
+
b = self.bundle_dict[k]
|
|
565
|
+
# Mask the parent metric (and then child metrics)
|
|
566
|
+
# if there was no data.
|
|
567
|
+
if len(sso_obs) == 0:
|
|
568
|
+
b.metric_values.mask[i][j] = True
|
|
569
|
+
for cb in list(b.child_bundles.values()):
|
|
570
|
+
cb.metric_values.mask[i][j] = True
|
|
571
|
+
# Otherwise, calculate the metric value for the parent,
|
|
572
|
+
# and then child.
|
|
573
|
+
else:
|
|
574
|
+
# Calculate for the parent.
|
|
575
|
+
m_val = b.metric.run(sso_obs, slice_point["orbit"], Hval)
|
|
576
|
+
# Mask if the parent metric returned a bad value.
|
|
577
|
+
if m_val == b.metric.badval:
|
|
578
|
+
b.metric_values.mask[i][j] = True
|
|
579
|
+
for cb in b.child_bundles.values():
|
|
580
|
+
cb.metric_values.mask[i][j] = True
|
|
581
|
+
# Otherwise, set the parent value and calculate
|
|
582
|
+
# the child metric values as well.
|
|
583
|
+
else:
|
|
584
|
+
b.metric_values.data[i][j] = m_val
|
|
585
|
+
for cb in b.child_bundles.values():
|
|
586
|
+
child_val = cb.metric.run(sso_obs, slice_point["orbit"], Hval, m_val)
|
|
587
|
+
if child_val == cb.metric.badval:
|
|
588
|
+
cb.metric_values.mask[i][j] = True
|
|
589
|
+
else:
|
|
590
|
+
cb.metric_values.data[i][j] = child_val
|
|
591
|
+
for k in compatible_list:
|
|
592
|
+
b = self.bundle_dict[k]
|
|
593
|
+
b.compute_summary_stats(self.results_db)
|
|
594
|
+
for c_b in b.child_bundles.values():
|
|
595
|
+
c_b.compute_summary_stats(self.results_db)
|
|
596
|
+
# Write to disk.
|
|
597
|
+
c_b.write(out_dir=self.out_dir, results_db=self.results_db)
|
|
598
|
+
# Write to disk.
|
|
599
|
+
b.write(out_dir=self.out_dir, results_db=self.results_db)
|
|
600
|
+
|
|
601
|
+
def run_all(self):
|
|
602
|
+
"""Run all constraints and metrics for these moMetricBundles."""
|
|
603
|
+
for constraint in self.constraints:
|
|
604
|
+
self.run_constraint(constraint)
|
|
605
|
+
if self.verbose:
|
|
606
|
+
print("Calculated and saved all metrics.")
|
|
607
|
+
|
|
608
|
+
def plot_all(
|
|
609
|
+
self,
|
|
610
|
+
savefig=True,
|
|
611
|
+
outfile_suffix=None,
|
|
612
|
+
fig_format="pdf",
|
|
613
|
+
dpi=600,
|
|
614
|
+
thumbnail=True,
|
|
615
|
+
closefigs=True,
|
|
616
|
+
):
|
|
617
|
+
"""
|
|
618
|
+
Make a few generically desired plots.
|
|
619
|
+
Given the nature of the outputs for much of the moving object
|
|
620
|
+
metrics, a good deal of the plotting for the moving object batch
|
|
621
|
+
is handled in a custom manner joining together multiple
|
|
622
|
+
metricsbundles.
|
|
623
|
+
"""
|
|
624
|
+
plot_handler = PlotHandler(
|
|
625
|
+
out_dir=self.out_dir,
|
|
626
|
+
results_db=self.results_db,
|
|
627
|
+
savefig=savefig,
|
|
628
|
+
fig_format=fig_format,
|
|
629
|
+
dpi=dpi,
|
|
630
|
+
thumbnail=thumbnail,
|
|
631
|
+
)
|
|
632
|
+
for b in self.bundle_dict.values():
|
|
633
|
+
try:
|
|
634
|
+
b.plot(
|
|
635
|
+
plot_handler=plot_handler,
|
|
636
|
+
outfile_suffix=outfile_suffix,
|
|
637
|
+
savefig=savefig,
|
|
638
|
+
)
|
|
639
|
+
except ValueError as ve:
|
|
640
|
+
message = "Plotting failed for metricBundle %s." % (b.file_root)
|
|
641
|
+
message += " Error message: %s" % (ve.message)
|
|
642
|
+
warnings.warn(message)
|
|
643
|
+
if closefigs:
|
|
644
|
+
plt.close("all")
|
|
645
|
+
if self.verbose:
|
|
646
|
+
print("Plotting all metrics.")
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from .agn_time_lag_metric import *
|
|
2
|
+
from .agnstructure import *
|
|
3
|
+
from .area_summary_metrics import *
|
|
4
|
+
from .base_metric import *
|
|
5
|
+
from .brown_dwarf_metric import *
|
|
6
|
+
from .cadence_metrics import *
|
|
7
|
+
from .calibration_metrics import *
|
|
8
|
+
from .chip_vendor_metric import *
|
|
9
|
+
from .color_slope_metrics import *
|
|
10
|
+
from .cosmology_summary_metrics import *
|
|
11
|
+
from .coverage_metric import *
|
|
12
|
+
from .crowding_metric import *
|
|
13
|
+
from .cumulative_metric import *
|
|
14
|
+
from .dcr_metric import *
|
|
15
|
+
from .exgal_m5 import *
|
|
16
|
+
from .fft_metric import *
|
|
17
|
+
from .galactic_plane_metrics import *
|
|
18
|
+
from .galplane_time_sampling_metrics import *
|
|
19
|
+
from .hourglass_metric import *
|
|
20
|
+
from .incremental_template_metric import *
|
|
21
|
+
from .kuiper_metrics import *
|
|
22
|
+
from .mo_metrics import *
|
|
23
|
+
from .mo_summary_metrics import *
|
|
24
|
+
from .night_pointing_metric import *
|
|
25
|
+
from .optimal_m5_metric import *
|
|
26
|
+
from .pair_metric import *
|
|
27
|
+
from .periodic_detect_metric import *
|
|
28
|
+
from .phase_gap_metric import *
|
|
29
|
+
from .qso_number_counts_metric import *
|
|
30
|
+
from .scaling_metrics import *
|
|
31
|
+
from .schedview_metrics import *
|
|
32
|
+
from .season_metrics import *
|
|
33
|
+
from .simple_metrics import *
|
|
34
|
+
from .sky_sat_metric import *
|
|
35
|
+
from .sn_cadence_metric import *
|
|
36
|
+
from .sn_n_sn_metric import *
|
|
37
|
+
from .sn_sl_metric import *
|
|
38
|
+
from .sn_snr_metric import *
|
|
39
|
+
from .snr_weight import *
|
|
40
|
+
from .star_density import *
|
|
41
|
+
from .string_count_metric import *
|
|
42
|
+
from .summary_metrics import *
|
|
43
|
+
from .surfb_metric import *
|
|
44
|
+
from .technical_metrics import *
|
|
45
|
+
from .tgaps import *
|
|
46
|
+
from .tomography_models import *
|
|
47
|
+
from .transient_metrics import *
|
|
48
|
+
from .uniformity_metrics import *
|
|
49
|
+
from .use_metrics import *
|
|
50
|
+
from .vector_metrics import *
|
|
51
|
+
from .visit_groups_metric import *
|
|
52
|
+
from .weak_lensing_systematics_metric import *
|