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
sql/make_vseqmeta.sql
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
CREATE SCHEMA {};
|
|
2
|
+
|
|
3
|
+
SET SEARCH_PATH TO {};
|
|
4
|
+
|
|
5
|
+
CREATE TABLE visitseq (
|
|
6
|
+
visitseq_uuid UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- RFC 4122 Universally Unique IDentifier
|
|
7
|
+
visitseq_sha256 BYTEA NOT NULL, -- hash of the visit table
|
|
8
|
+
visitseq_label TEXT NOT NULL, -- label for plots and table
|
|
9
|
+
visitseq_url TEXT, -- If null, the actual visits are not available
|
|
10
|
+
telescope TEXT NOT NULL, -- (probably) "simonyi" or "auxtel"
|
|
11
|
+
first_day_obs DATE, -- local calendar date of evening of first night in the set
|
|
12
|
+
last_day_obs DATE, -- local calendar date of the eveninig of the last night in the set
|
|
13
|
+
creation_time TIMESTAMP WITH TIME ZONE DEFAULT NOW() -- when the simulation was run
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE TABLE simulations (
|
|
17
|
+
scheduler_version TEXT, -- version of rubin_scheduler
|
|
18
|
+
config_url TEXT, -- URL for the config script, perhaps on github based on hash
|
|
19
|
+
conda_env_sha256 BYTEA, -- SHA256 hash of output of conda list --json
|
|
20
|
+
parent_visitseq_uuid UUID, -- UUID of visitseq loaded into scheduler before running
|
|
21
|
+
sim_runner_kwargs JSONB, -- arguments to sim runner as a json dict
|
|
22
|
+
parent_last_day_obs DATE, -- day_obs of last visit loaded into scheduler before running
|
|
23
|
+
PRIMARY KEY (visitseq_uuid)
|
|
24
|
+
) INHERITS (visitseq);
|
|
25
|
+
|
|
26
|
+
CREATE TABLE completed (
|
|
27
|
+
query TEXT, -- The query to the consdb used
|
|
28
|
+
PRIMARY KEY (visitseq_uuid)
|
|
29
|
+
) INHERITS (visitseq);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE mixedvisitseq (
|
|
32
|
+
last_early_day_obs DATE, -- the last day obs drawn from the early parent
|
|
33
|
+
first_late_day_obs DATE, -- the first day obs drawn from the late parent
|
|
34
|
+
early_parent_uuid UUID, -- the UUID of the early parent
|
|
35
|
+
late_parent_uuid UUID, -- the UUID of the late parent
|
|
36
|
+
PRIMARY KEY (visitseq_uuid)
|
|
37
|
+
) INHERITS (visitseq);
|
|
38
|
+
|
|
39
|
+
-- All of the tables that follow include a visitseq_uuid that refereneces
|
|
40
|
+
-- visitseq or one of its children.
|
|
41
|
+
-- These are not declared as foreign keys, because postgresql cannot enforce
|
|
42
|
+
-- a FK on both a table and its children: we would need to specify which child
|
|
43
|
+
-- the uuid would refer to, when really we need it to be allowed to reference
|
|
44
|
+
-- any of the children.
|
|
45
|
+
-- (In principle, we could do something complicated with triggers.)
|
|
46
|
+
|
|
47
|
+
CREATE TABLE tags (
|
|
48
|
+
visitseq_uuid UUID, -- RFC 4122 Universally Unique IDentifier
|
|
49
|
+
tag TEXT NOT NULL -- The tag
|
|
50
|
+
);
|
|
51
|
+
-- we will most often want to search for all runs with a given tag.
|
|
52
|
+
CREATE INDEX tag_idx ON tags(tag);
|
|
53
|
+
|
|
54
|
+
CREATE TABLE comments (
|
|
55
|
+
visitseq_uuid UUID, -- RFC 4122 Universally Unique IDentifier
|
|
56
|
+
comment_time TIMESTAMP WITH TIME ZONE DEFAULT NOW() , -- The date and time at which the comment was added
|
|
57
|
+
author TEXT, -- The user who added the comment
|
|
58
|
+
comment TEXT NOT NULL -- The comment
|
|
59
|
+
);
|
|
60
|
+
-- we will most often want to search for all comments for a given visitseq
|
|
61
|
+
CREATE INDEX comments_visitseq_idx ON comments(visitseq_uuid);
|
|
62
|
+
|
|
63
|
+
CREATE TABLE files (
|
|
64
|
+
visitseq_uuid UUID, -- RFC 4122 Universally Unique IDentifier
|
|
65
|
+
file_type TEXT NOT NULL, -- Examples include "rewards", "scheduler", and "observatory"
|
|
66
|
+
file_sha256 BYTEA NOT NULL, -- hash of the file
|
|
67
|
+
file_url TEXT, -- URL for the file, may be null if we wish only to store the hash
|
|
68
|
+
PRIMARY KEY (visitseq_uuid, file_type)
|
|
69
|
+
);
|
|
70
|
+
CREATE INDEX files_visitseq_idx ON files(visitseq_uuid);
|
|
71
|
+
|
|
72
|
+
-- A view to make it easy to query simulations and get tags, comments, and files back.
|
|
73
|
+
CREATE VIEW simulations_extra AS
|
|
74
|
+
SELECT
|
|
75
|
+
DATE(s.creation_time - INTERVAL '12 hours') AS sim_creation_day_obs,
|
|
76
|
+
ROW_NUMBER() OVER (PARTITION BY DATE(s.creation_time - INTERVAL '12 hours') ORDER BY s.creation_time - INTERVAL '12 hours') AS daily_id,
|
|
77
|
+
s.visitseq_uuid,
|
|
78
|
+
s.visitseq_label,
|
|
79
|
+
s.visitseq_url,
|
|
80
|
+
s.telescope,
|
|
81
|
+
s.first_day_obs,
|
|
82
|
+
s.last_day_obs,
|
|
83
|
+
s.creation_time,
|
|
84
|
+
s.scheduler_version,
|
|
85
|
+
s.config_url,
|
|
86
|
+
s.sim_runner_kwargs,
|
|
87
|
+
s.conda_env_sha256,
|
|
88
|
+
s.parent_visitseq_uuid,
|
|
89
|
+
s.parent_last_day_obs,
|
|
90
|
+
COALESCE (
|
|
91
|
+
JSONB_AGG(DISTINCT t.tag) FILTER (WHERE t.tag IS NOT NULL),
|
|
92
|
+
'[]'::JSONB
|
|
93
|
+
) AS tags,
|
|
94
|
+
COALESCE (
|
|
95
|
+
JSONB_OBJECT_AGG(c.comment_time, c.comment) FILTER (WHERE c.comment_time IS NOT NULL),
|
|
96
|
+
'{{}}'::JSONB
|
|
97
|
+
) AS comments,
|
|
98
|
+
COALESCE (
|
|
99
|
+
JSONB_OBJECT_AGG(f.file_type, f.file_url) FILTER (WHERE f.file_type IS NOT NULL),
|
|
100
|
+
'{{}}'::JSONB
|
|
101
|
+
) AS files
|
|
102
|
+
FROM simulations AS s
|
|
103
|
+
LEFT JOIN tags AS t ON t.visitseq_uuid=s.visitseq_uuid
|
|
104
|
+
LEFT JOIN comments AS c ON c.visitseq_uuid=s.visitseq_uuid
|
|
105
|
+
LEFT JOIN files AS f ON f.visitseq_uuid=s.visitseq_uuid
|
|
106
|
+
GROUP BY s.visitseq_uuid,
|
|
107
|
+
s.visitseq_label,
|
|
108
|
+
s.visitseq_url,
|
|
109
|
+
s.telescope,
|
|
110
|
+
s.first_day_obs,
|
|
111
|
+
s.last_day_obs,
|
|
112
|
+
s.creation_time,
|
|
113
|
+
s.scheduler_version,
|
|
114
|
+
s.config_url,
|
|
115
|
+
s.sim_runner_kwargs,
|
|
116
|
+
s.conda_env_sha256,
|
|
117
|
+
s.parent_visitseq_uuid,
|
|
118
|
+
s.parent_last_day_obs;
|
|
119
|
+
|
|
120
|
+
CREATE TABLE conda_env (
|
|
121
|
+
conda_env_hash BYTEA PRIMARY KEY, -- SHA256 hash of output of `conda list --json`
|
|
122
|
+
conda_env JSONB NOT NULL -- output of `conda list --json`
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
-- Make a view so we do not need to remember
|
|
126
|
+
-- postgresql syntex for jsonb.
|
|
127
|
+
CREATE VIEW conda_packages AS (
|
|
128
|
+
SELECT
|
|
129
|
+
c.conda_env_hash,
|
|
130
|
+
p.name AS package_name,
|
|
131
|
+
p.channel,
|
|
132
|
+
p.version AS package_version,
|
|
133
|
+
p.base_url,
|
|
134
|
+
p.platform,
|
|
135
|
+
p.dist_name,
|
|
136
|
+
p.build_number,
|
|
137
|
+
p.build_string
|
|
138
|
+
FROM
|
|
139
|
+
conda_env AS c,
|
|
140
|
+
jsonb_to_recordset(conda_env) AS p (
|
|
141
|
+
name TEXT,
|
|
142
|
+
channel TEXT,
|
|
143
|
+
version TEXT,
|
|
144
|
+
base_url TEXT,
|
|
145
|
+
platform TEXT,
|
|
146
|
+
dist_name TEXT,
|
|
147
|
+
build_number TEXT,
|
|
148
|
+
build_string TEXT
|
|
149
|
+
)
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
CREATE VIEW simulation_packages AS (
|
|
153
|
+
SELECT s.visitseq_uuid, p.*
|
|
154
|
+
FROM conda_packages AS p
|
|
155
|
+
JOIN simulations AS s ON p.conda_env_hash = s.conda_env_sha256
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
CREATE TABLE nightly_stats (
|
|
159
|
+
visitseq_uuid UUID NOT NULL, -- RFC 4122 Universally Unique IDentifier
|
|
160
|
+
day_obs DATE NOT NULL, -- The day obs of the visits included
|
|
161
|
+
value_name TEXT NOT NULL, -- metric or column name
|
|
162
|
+
accumulated BOOLEAN NOT NULL, -- Whether the statistics include all data through night day_obs, or only data on night day_obs
|
|
163
|
+
count INTEGER, -- number of values in distribution
|
|
164
|
+
mean DOUBLE PRECISION, -- mean
|
|
165
|
+
std DOUBLE PRECISION, -- standard deviation
|
|
166
|
+
min DOUBLE PRECISION, -- min value
|
|
167
|
+
p05 DOUBLE PRECISION, -- 5% quantile
|
|
168
|
+
q1 DOUBLE PRECISION, -- first quartile
|
|
169
|
+
median DOUBLE PRECISION, -- median
|
|
170
|
+
q3 DOUBLE PRECISION, -- third quartile
|
|
171
|
+
p95 DOUBLE PRECISION, -- 95% quantile
|
|
172
|
+
max DOUBLE PRECISION, -- maximum
|
|
173
|
+
PRIMARY KEY (visitseq_uuid, day_obs, value_name, accumulated)
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
-- Tables to support functionality like that of rubin_sim.maf.run_comparison
|
|
177
|
+
|
|
178
|
+
-- Use tags to mark visit sequences as being runs that are part of a given run family.
|
|
179
|
+
|
|
180
|
+
-- Table to keep track of exactly what metrics were run in maf.
|
|
181
|
+
CREATE TABLE maf_metrics (
|
|
182
|
+
maf_metric_name TEXT PRIMARY KEY, -- name for this maf metric
|
|
183
|
+
rubin_sim_version TEXT, -- the version of rubin_sim used
|
|
184
|
+
maf_constraint TEXT, -- constraint imposed in maf
|
|
185
|
+
metric_class_name TEXT, -- class name of the metric
|
|
186
|
+
metric_args JSONB, -- arguments to the metric constructor
|
|
187
|
+
slicer_class_name TEXT, -- class name of the slicer
|
|
188
|
+
slicer_args JSONB -- arguments to the slicer constructor
|
|
189
|
+
);
|
|
190
|
+
CREATE INDEX maf_metrics_name_idx ON maf_metrics(maf_metric_name);
|
|
191
|
+
|
|
192
|
+
-- Support functionality like that of rubin_sim.maf.run_comparison run summaries,
|
|
193
|
+
-- but sampled at whatever dates are of interest rather than just the end.
|
|
194
|
+
-- To get it into the "wide" format like that in run_comparison, use either
|
|
195
|
+
-- a tablefunc in the postgresql query, or (probably easier) use unstack on
|
|
196
|
+
-- the returned dataframe.
|
|
197
|
+
CREATE TABLE maf_summary_metrics (
|
|
198
|
+
visitseq_uuid UUID, -- RFC 4122 Universally Unique IDentifier
|
|
199
|
+
maf_metric_name TEXT REFERENCES maf_metrics(maf_metric_name), -- The name of the maf metric
|
|
200
|
+
day_obs DATE, -- The day obs of the visits included
|
|
201
|
+
accumulated BOOLEAN, -- Whether the statistics include all data through night day_obs, or only data on night day_obs
|
|
202
|
+
summary_value DOUBLE PRECISION,
|
|
203
|
+
PRIMARY KEY (visitseq_uuid, maf_metric_name)
|
|
204
|
+
);
|
|
205
|
+
CREATE INDEX maf_summary_metrics_name_idx ON maf_summary_metrics(maf_metric_name);
|
|
206
|
+
|
|
207
|
+
-- metric sets for rubin_sim.maf.run_comparison
|
|
208
|
+
CREATE TABLE maf_metric_sets (
|
|
209
|
+
metric_set TEXT, -- name of the metric set
|
|
210
|
+
maf_metric_name TEXT REFERENCES maf_metrics(maf_metric_name), -- name of the maf metric
|
|
211
|
+
short_name TEXT, -- a shorter label to use in plots
|
|
212
|
+
style TEXT, -- matplotlib line style
|
|
213
|
+
invert BOOLEAN, -- negative is lower is better
|
|
214
|
+
mag BOOLEAN, -- value is a magnitude
|
|
215
|
+
PRIMARY KEY (metric_set, maf_metric_name)
|
|
216
|
+
);
|
|
217
|
+
CREATE INDEX maf_metric_sets_metric_name_idx ON maf_metric_sets(maf_metric_name);
|
|
218
|
+
CREATE INDEX maf_metric_sets_set_idx ON maf_metric_sets(metric_set);
|
|
219
|
+
|
|
220
|
+
-- Create a view to make it easy to get everything for the summary metrics for one metric set
|
|
221
|
+
-- applied to runs with specified tags.
|
|
222
|
+
CREATE VIEW maf_summary AS
|
|
223
|
+
SELECT mms.metric_set, mms.maf_metric_name, v.visitseq_label,
|
|
224
|
+
msm.day_obs, msm.accumulated, msm.summary_value,
|
|
225
|
+
mms.short_name, mms.style, mms.invert, mms.mag, t.tag
|
|
226
|
+
FROM maf_metric_sets AS mms
|
|
227
|
+
JOIN maf_summary_metrics AS msm ON msm.maf_metric_name=mms.maf_metric_name
|
|
228
|
+
JOIN tags AS t ON t.visitseq_uuid=msm.visitseq_uuid
|
|
229
|
+
JOIN visitseq AS v ON msm.visitseq_uuid=v.visitseq_uuid
|
|
230
|
+
;
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
CREATE TABLE maf_healpix_stats (
|
|
234
|
+
visitseq_uuid UUID NOT NULL, -- RFC 4122 Universally Unique IDentifier
|
|
235
|
+
maf_metric_name TEXT REFERENCES maf_metrics(maf_metric_name), -- The name of the maf statistic
|
|
236
|
+
day_obs DATE NOT NULL, -- The day obs of the visits included
|
|
237
|
+
accumulated BOOLEAN NOT NULL, -- Whether the statistics include all data through night day_obs, or only data on night day_obs
|
|
238
|
+
nside INTEGER NOT NULL, -- The nside of the healpix array
|
|
239
|
+
count INTEGER NOT NULL, -- The number of unmasked values in the distribution
|
|
240
|
+
mean DOUBLE PRECISION, -- mean
|
|
241
|
+
std DOUBLE PRECISION, -- standard deviation
|
|
242
|
+
min DOUBLE PRECISION, -- min value
|
|
243
|
+
p05 DOUBLE PRECISION, -- 5% quantile
|
|
244
|
+
q1 DOUBLE PRECISION, -- first quartile
|
|
245
|
+
median DOUBLE PRECISION, -- median
|
|
246
|
+
q3 DOUBLE PRECISION, -- third quartile
|
|
247
|
+
p95 DOUBLE PRECISION, -- 95% quantile
|
|
248
|
+
max DOUBLE PRECISION, -- maximum
|
|
249
|
+
url TEXT, -- URL for the array of healpix values, if saved
|
|
250
|
+
PRIMARY KEY (visitseq_uuid, maf_metric_name, day_obs, accumulated, nside)
|
|
251
|
+
);
|
tests/data/test_data.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import unittest
|
|
3
|
+
|
|
4
|
+
from rubin_scheduler.data import data_versions, get_data_dir
|
|
5
|
+
|
|
6
|
+
from rubin_sim.data import get_baseline
|
|
7
|
+
from rubin_sim.data import get_data_dir as gdd
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DataTest(unittest.TestCase):
|
|
11
|
+
def testBaseline(self):
|
|
12
|
+
"""
|
|
13
|
+
Get the baseline sim location
|
|
14
|
+
"""
|
|
15
|
+
data_dir = get_data_dir()
|
|
16
|
+
dd2 = gdd()
|
|
17
|
+
|
|
18
|
+
assert data_dir == dd2
|
|
19
|
+
|
|
20
|
+
if "sim_baseline" in os.listdir(data_dir):
|
|
21
|
+
_ = get_baseline()
|
|
22
|
+
_ = data_versions()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if __name__ == "__main__":
|
|
26
|
+
unittest.main()
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
from rubin_scheduler.scheduler.surveys import generate_ddf_grid
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class GenerateDDFTest(unittest.TestCase):
|
|
7
|
+
def testGenDDF(self):
|
|
8
|
+
"""
|
|
9
|
+
Test the DDF grid generator over in rubin_scheduler
|
|
10
|
+
"""
|
|
11
|
+
# This triggers several RunTimeErrors (intentionally?).
|
|
12
|
+
result = generate_ddf_grid(survey_length=0.01, verbose=False)
|
|
13
|
+
assert result is not None
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
if __name__ == "__main__":
|
|
17
|
+
unittest.main()
|
tests/maf/test_3x2fom.py
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
import tempfile
|
|
4
|
+
import unittest
|
|
5
|
+
|
|
6
|
+
from rubin_scheduler.data import get_data_dir
|
|
7
|
+
from rubin_scheduler.utils.code_utilities import sims_clean_up
|
|
8
|
+
|
|
9
|
+
import rubin_sim.maf as maf
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Test3x2(unittest.TestCase):
|
|
13
|
+
@classmethod
|
|
14
|
+
def tearDownClass(cls):
|
|
15
|
+
sims_clean_up()
|
|
16
|
+
|
|
17
|
+
def setUp(self):
|
|
18
|
+
self.out_dir = tempfile.mkdtemp(prefix="TMB")
|
|
19
|
+
|
|
20
|
+
@unittest.skipUnless(
|
|
21
|
+
os.path.isdir(os.path.join(get_data_dir(), "maps")),
|
|
22
|
+
"Skipping 3x3 metric test because no dust maps.",
|
|
23
|
+
)
|
|
24
|
+
def test_3x2(self):
|
|
25
|
+
# Only testing that the metric successfully runs, not checking that
|
|
26
|
+
# the output values are valid.
|
|
27
|
+
bundle_list = []
|
|
28
|
+
nside = 64
|
|
29
|
+
colmap = maf.batches.col_map_dict("fbs_sim")
|
|
30
|
+
nfilters_needed = 6
|
|
31
|
+
lim_ebv = 0.2
|
|
32
|
+
ptsrc_lim_mag_i_band = 25.9
|
|
33
|
+
m = maf.metrics.ExgalM5WithCuts(
|
|
34
|
+
m5_col=colmap["fiveSigmaDepth"],
|
|
35
|
+
filter_col="band",
|
|
36
|
+
lsst_filter="i",
|
|
37
|
+
n_filters=nfilters_needed,
|
|
38
|
+
extinction_cut=lim_ebv,
|
|
39
|
+
depth_cut=ptsrc_lim_mag_i_band,
|
|
40
|
+
)
|
|
41
|
+
s = maf.slicers.HealpixSlicer(nside=nside, use_cache=False)
|
|
42
|
+
sql = "scheduler_note not like 'DD%' and night < 365"
|
|
43
|
+
threeby_two_summary_simple = maf.metrics.StaticProbesFoMEmulatorMetricSimple(
|
|
44
|
+
metric_name="3x2ptFoM_simple"
|
|
45
|
+
)
|
|
46
|
+
threeby_two_summary = maf.maf_contrib.StaticProbesFoMEmulatorMetric(metric_name="3x2ptFoM")
|
|
47
|
+
bundle_list.append(
|
|
48
|
+
maf.metric_bundles.MetricBundle(
|
|
49
|
+
m,
|
|
50
|
+
s,
|
|
51
|
+
sql,
|
|
52
|
+
summary_metrics=[threeby_two_summary, threeby_two_summary_simple],
|
|
53
|
+
)
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
database = os.path.join(get_data_dir(), "sim_baseline", "baseline.db")
|
|
57
|
+
results_db = maf.db.ResultsDb(out_dir=self.out_dir)
|
|
58
|
+
bd = maf.metric_bundles.make_bundles_dict_from_list(bundle_list)
|
|
59
|
+
bg = maf.metric_bundles.MetricBundleGroup(bd, database, out_dir=self.out_dir, results_db=results_db)
|
|
60
|
+
bg.run_all()
|
|
61
|
+
|
|
62
|
+
def tearDown(self):
|
|
63
|
+
if os.path.isdir(self.out_dir):
|
|
64
|
+
shutil.rmtree(self.out_dir)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
if __name__ == "__main__":
|
|
68
|
+
unittest.main()
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# imports
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
import unittest
|
|
5
|
+
from os import path
|
|
6
|
+
from tempfile import TemporaryDirectory
|
|
7
|
+
from unittest.mock import patch
|
|
8
|
+
|
|
9
|
+
import pandas as pd
|
|
10
|
+
|
|
11
|
+
from rubin_sim import maf
|
|
12
|
+
from rubin_sim.data import get_data_dir
|
|
13
|
+
|
|
14
|
+
# constants
|
|
15
|
+
|
|
16
|
+
URLROOT = "https://raw.githubusercontent.com/lsst-pst/survey_strategy/main/fbs_2.0/"
|
|
17
|
+
FAMILY_SOURCE = URLROOT + "runs_v2.1.json"
|
|
18
|
+
METRIC_SUBSET_SOURCE = os.path.join(get_data_dir(), "maf", "metric_subsets.json")
|
|
19
|
+
SUMMARY_SOURCE = os.path.join(get_data_dir(), "maf", "baseline_summary.h5")
|
|
20
|
+
|
|
21
|
+
# exception classes
|
|
22
|
+
|
|
23
|
+
# interface functions
|
|
24
|
+
|
|
25
|
+
# classes
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TestArchive(unittest.TestCase):
|
|
29
|
+
num_runs = 11
|
|
30
|
+
num_metrics = 7
|
|
31
|
+
|
|
32
|
+
def test_get_family_runs(self):
|
|
33
|
+
runs = maf.get_family_runs(FAMILY_SOURCE)
|
|
34
|
+
|
|
35
|
+
self.assertIsInstance(runs, pd.DataFrame)
|
|
36
|
+
|
|
37
|
+
columns = ("run", "brief", "filepath", "url")
|
|
38
|
+
for column in columns:
|
|
39
|
+
self.assertIn(column, runs.columns)
|
|
40
|
+
|
|
41
|
+
self.assertEqual(runs.index.name, "family")
|
|
42
|
+
|
|
43
|
+
def test_get_runs(self):
|
|
44
|
+
runs = maf.get_runs(FAMILY_SOURCE)
|
|
45
|
+
self.assertEqual(runs.index.name, "run")
|
|
46
|
+
|
|
47
|
+
columns = ("family", "brief", "filepath", "url")
|
|
48
|
+
for column in columns:
|
|
49
|
+
self.assertIn(column, runs.columns)
|
|
50
|
+
|
|
51
|
+
self.assertEqual(runs.index.name, "run")
|
|
52
|
+
|
|
53
|
+
@unittest.skip("skipping long running test.")
|
|
54
|
+
def test_download_runs(self):
|
|
55
|
+
run = maf.get_runs(FAMILY_SOURCE).index.values[0]
|
|
56
|
+
|
|
57
|
+
temp_dir_itself = TemporaryDirectory()
|
|
58
|
+
temp_dir = temp_dir_itself.name
|
|
59
|
+
|
|
60
|
+
dest_fnames = maf.download_runs(run, dest_dir=temp_dir)
|
|
61
|
+
self.assertTrue(path.exists(dest_fnames[0]))
|
|
62
|
+
|
|
63
|
+
temp_dir_itself.cleanup()
|
|
64
|
+
|
|
65
|
+
def test_get_metric_subsets(self):
|
|
66
|
+
metric_subsets = maf.get_metric_subsets(METRIC_SUBSET_SOURCE)
|
|
67
|
+
self.assertIsInstance(metric_subsets, pd.DataFrame)
|
|
68
|
+
self.assertIn("metric subset", metric_subsets.index.names)
|
|
69
|
+
self.assertIn("metric", metric_subsets.index.names)
|
|
70
|
+
|
|
71
|
+
columns = ("style", "invert", "mag")
|
|
72
|
+
for column in columns:
|
|
73
|
+
self.assertIn(column, metric_subsets.columns)
|
|
74
|
+
|
|
75
|
+
def test_get_metric_summaries(self):
|
|
76
|
+
summary = maf.get_metric_summaries(summary_source=SUMMARY_SOURCE)
|
|
77
|
+
self.assertIsInstance(summary, pd.DataFrame)
|
|
78
|
+
self.assertEqual(summary.columns.name, "metric")
|
|
79
|
+
self.assertEqual(summary.index.name, "run")
|
|
80
|
+
|
|
81
|
+
my_summary = maf.get_metric_summaries(
|
|
82
|
+
runs=["baseline_v3.0_10yrs", "baseline_v3.4_10yrs"],
|
|
83
|
+
metrics=[
|
|
84
|
+
"Rms Max normairmass All sky all bands HealpixSlicer",
|
|
85
|
+
"Median Max normairmass All sky all bands HealpixSlicer",
|
|
86
|
+
"Max Max normairmass All sky all bands HealpixSlicer",
|
|
87
|
+
],
|
|
88
|
+
summary_source=summary,
|
|
89
|
+
)
|
|
90
|
+
self.assertEqual(len(my_summary), 2)
|
|
91
|
+
self.assertEqual(len(my_summary.columns), 3)
|
|
92
|
+
|
|
93
|
+
srd_sim = maf.get_metric_summaries(
|
|
94
|
+
metric_subsets="SRD",
|
|
95
|
+
summary_source=summary,
|
|
96
|
+
metric_subset_source=METRIC_SUBSET_SOURCE,
|
|
97
|
+
)
|
|
98
|
+
self.assertGreater(len(srd_sim.columns), 3)
|
|
99
|
+
self.assertLess(len(srd_sim.columns), len(summary.columns))
|
|
100
|
+
|
|
101
|
+
srdnvis_sim = maf.get_metric_summaries(
|
|
102
|
+
metric_subsets=["SRD", "N Visits"],
|
|
103
|
+
summary_source=summary,
|
|
104
|
+
metric_subset_source=METRIC_SUBSET_SOURCE,
|
|
105
|
+
)
|
|
106
|
+
self.assertGreater(len(srdnvis_sim.columns), len(srd_sim.columns))
|
|
107
|
+
self.assertLess(len(srdnvis_sim.columns), len(summary.columns))
|
|
108
|
+
|
|
109
|
+
def test_get_family_descriptions(self):
|
|
110
|
+
families = maf.get_family_descriptions(FAMILY_SOURCE)
|
|
111
|
+
self.assertIsInstance(families, pd.DataFrame)
|
|
112
|
+
self.assertEqual(families.index.name, "family")
|
|
113
|
+
|
|
114
|
+
def test_describe_families(self):
|
|
115
|
+
if "IPython" in sys.modules:
|
|
116
|
+
with (
|
|
117
|
+
patch("IPython.display.display_markdown") as _,
|
|
118
|
+
patch("IPython.display.HTML") as _,
|
|
119
|
+
patch("IPython.display") as _,
|
|
120
|
+
):
|
|
121
|
+
self.perform_describe_families_test()
|
|
122
|
+
else:
|
|
123
|
+
with patch("builtins.print") as _:
|
|
124
|
+
self.perform_describe_families_test()
|
|
125
|
+
|
|
126
|
+
@unittest.skip("Skipping; family descriptions out of sync with summary")
|
|
127
|
+
def perform_describe_families_test(self):
|
|
128
|
+
families = maf.get_family_descriptions(FAMILY_SOURCE)
|
|
129
|
+
disp_families = families[:2]
|
|
130
|
+
|
|
131
|
+
fig, ax = maf.describe_families(families)
|
|
132
|
+
self.assertIsNone(fig)
|
|
133
|
+
self.assertIsNone(ax)
|
|
134
|
+
|
|
135
|
+
all_metric_subsets = maf.get_metric_subsets(METRIC_SUBSET_SOURCE)
|
|
136
|
+
summary = maf.get_metric_summaries(summary_source=SUMMARY_SOURCE)
|
|
137
|
+
|
|
138
|
+
table_metric_subset = all_metric_subsets.loc["SRD"]
|
|
139
|
+
fig, ax = maf.describe_families(
|
|
140
|
+
disp_families, summary=summary, table_metric_subset=table_metric_subset
|
|
141
|
+
)
|
|
142
|
+
self.assertIsNone(fig)
|
|
143
|
+
self.assertIsNone(ax)
|
|
144
|
+
|
|
145
|
+
plot_metric_subset = all_metric_subsets.loc["N Visits"]
|
|
146
|
+
fig, ax = maf.describe_families(disp_families, summary=summary, plot_metric_subset=plot_metric_subset)
|
|
147
|
+
|
|
148
|
+
def test_create_metric_subset(self):
|
|
149
|
+
metrics = ["Urania", "Thalia", "Calliope", "Terpsichore"]
|
|
150
|
+
metric_subset_name = "Muses"
|
|
151
|
+
metric_subset = maf.create_metric_subset(metric_subset_name, metrics)
|
|
152
|
+
self.assertSequenceEqual(metrics, metric_subset.metric.tolist())
|
|
153
|
+
self.assertSequenceEqual(
|
|
154
|
+
metric_subset.columns.tolist(),
|
|
155
|
+
["metric", "short_name", "style", "invert", "mag"],
|
|
156
|
+
)
|
|
157
|
+
self.assertSequenceEqual(metric_subset.index.names, ["metric subset", "metric"])
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
run_tests_now = __name__ == "__main__"
|
|
161
|
+
if run_tests_now:
|
|
162
|
+
unittest.main()
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
import rubin_sim.maf.metrics as metrics
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestBaseMetric(unittest.TestCase):
|
|
7
|
+
def test_reduce_dict(self):
|
|
8
|
+
"""Test that reduce dictionary is created."""
|
|
9
|
+
testmetric = metrics.BaseMetric("testcol")
|
|
10
|
+
self.assertEqual(list(testmetric.reduce_funcs.keys()), [])
|
|
11
|
+
|
|
12
|
+
def test_metric_name(self):
|
|
13
|
+
"""Test that metric name is set appropriately automatically
|
|
14
|
+
and when explicitly passed.
|
|
15
|
+
"""
|
|
16
|
+
# Test automatic setting of metric name
|
|
17
|
+
testmetric = metrics.BaseMetric("testcol")
|
|
18
|
+
self.assertEqual(testmetric.name, "Base testcol")
|
|
19
|
+
testmetric = metrics.BaseMetric(["testcol1", "testcol2"])
|
|
20
|
+
self.assertEqual(testmetric.name, "Base testcol1, testcol2")
|
|
21
|
+
# Test explicit setting of metric name
|
|
22
|
+
testmetric = metrics.BaseMetric("testcol", metric_name="Test")
|
|
23
|
+
self.assertEqual(testmetric.name, "Test")
|
|
24
|
+
|
|
25
|
+
def test_col_registry(self):
|
|
26
|
+
"""Test column registry adds to colRegistry as expected"""
|
|
27
|
+
# Clear the registry to make sure we start clear
|
|
28
|
+
colreg = metrics.ColRegistry()
|
|
29
|
+
colreg.clear_reg()
|
|
30
|
+
|
|
31
|
+
cols = "onecolumn"
|
|
32
|
+
colset = set()
|
|
33
|
+
colset.add(cols)
|
|
34
|
+
testmetric = metrics.BaseMetric(cols)
|
|
35
|
+
# Class registry should have dictionary with values =
|
|
36
|
+
# set of columns for metric class
|
|
37
|
+
for item in colset:
|
|
38
|
+
self.assertIn(item, testmetric.col_registry.col_set)
|
|
39
|
+
cols = ["onecolumn", "twocolumn"]
|
|
40
|
+
colset.add("twocolumn")
|
|
41
|
+
testmetric = metrics.BaseMetric(cols)
|
|
42
|
+
for item in colset:
|
|
43
|
+
self.assertIn(item, testmetric.col_registry.col_set)
|
|
44
|
+
# Test with additional (different) metric
|
|
45
|
+
cols = "twocolumn"
|
|
46
|
+
testmetric2 = metrics.MeanMetric(cols)
|
|
47
|
+
for item in colset:
|
|
48
|
+
self.assertIn(item, testmetric2.col_registry.col_set)
|
|
49
|
+
|
|
50
|
+
# test that the registry can be cleared
|
|
51
|
+
colreg.clear_reg()
|
|
52
|
+
assert len(colreg.col_set) == 0
|
|
53
|
+
assert len(colreg.db_set) == 0
|
|
54
|
+
assert len(colreg.stacker_dict) == 0
|
|
55
|
+
|
|
56
|
+
def test_metric_dtype(self):
|
|
57
|
+
"""Test that base metric data value type set appropriately"""
|
|
58
|
+
cols = "onecolumn"
|
|
59
|
+
testmetric = metrics.BaseMetric(cols)
|
|
60
|
+
self.assertEqual(testmetric.metric_dtype, "float")
|
|
61
|
+
testmetric = metrics.BaseMetric(cols, metric_dtype="object")
|
|
62
|
+
self.assertEqual(testmetric.metric_dtype, "object")
|
|
63
|
+
|
|
64
|
+
def test_units(self):
|
|
65
|
+
"""Test unit setting (including units set by utils.getColInfo)"""
|
|
66
|
+
cols = "onecolumn"
|
|
67
|
+
# Test for column not in colInfo, units not set by hand.
|
|
68
|
+
testmetric = metrics.BaseMetric(cols)
|
|
69
|
+
self.assertEqual(testmetric.units, "")
|
|
70
|
+
# Test for column not in colInfo, units set by hand.
|
|
71
|
+
testmetric = metrics.BaseMetric(cols, units="Test")
|
|
72
|
+
self.assertEqual(testmetric.units, "Test")
|
|
73
|
+
# Test for column in colInfo (looking up units in colInfo)
|
|
74
|
+
cols = "finSeeing"
|
|
75
|
+
testmetric = metrics.BaseMetric(cols)
|
|
76
|
+
self.assertEqual(testmetric.units, "arcsec")
|
|
77
|
+
# Test for column in colInfo but units overriden
|
|
78
|
+
testmetric = metrics.BaseMetric(cols, units="Test")
|
|
79
|
+
self.assertEqual(testmetric.units, "Test")
|
|
80
|
+
# Test for multiple columns not in colInfo
|
|
81
|
+
cols = ["onecol", "twocol"]
|
|
82
|
+
testmetric = metrics.BaseMetric(cols)
|
|
83
|
+
self.assertEqual(testmetric.units, "")
|
|
84
|
+
# Test for multiple columns in colInfo
|
|
85
|
+
cols = ["finSeeing", "filtSkyBrightness"]
|
|
86
|
+
testmetric = metrics.BaseMetric(cols)
|
|
87
|
+
self.assertEqual(testmetric.units, "arcsec mag/sq arcsec")
|
|
88
|
+
# Test for multiple columns, only one in colInfo
|
|
89
|
+
cols = ["finSeeing", "twocol"]
|
|
90
|
+
testmetric = metrics.BaseMetric(cols)
|
|
91
|
+
self.assertEqual(testmetric.units, "arcsec ")
|
|
92
|
+
# Test for multiple columns both in colInfo but repeated
|
|
93
|
+
cols = ["finSeeing", "finSeeing"]
|
|
94
|
+
testmetric = metrics.BaseMetric(cols)
|
|
95
|
+
self.assertEqual(testmetric.units, "arcsec arcsec")
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
if __name__ == "__main__":
|
|
99
|
+
unittest.main()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
import rubin_sim.maf.batches as batches
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestCommon(unittest.TestCase):
|
|
7
|
+
def test_col_map(self):
|
|
8
|
+
colmap = batches.col_map_dict("opsimv4")
|
|
9
|
+
self.assertEqual(colmap["raDecDeg"], True)
|
|
10
|
+
self.assertEqual(colmap["ra"], "fieldRA")
|
|
11
|
+
colmap = batches.col_map_dict("fbs")
|
|
12
|
+
self.assertEqual(colmap["raDecDeg"], True)
|
|
13
|
+
self.assertEqual(colmap["skyBrightness"], "skyBrightness")
|
|
14
|
+
|
|
15
|
+
def test_filter_list(self):
|
|
16
|
+
filterlist, colors, orders, sqls, info_label = batches.common.filter_list(all=False, extra_sql=None)
|
|
17
|
+
self.assertEqual(len(filterlist), 6)
|
|
18
|
+
self.assertEqual(len(colors), 6)
|
|
19
|
+
self.assertEqual(sqls["u"], "band = 'u'")
|
|
20
|
+
filterlist, colors, orders, sqls, info_label = batches.common.filter_list(all=True, extra_sql=None)
|
|
21
|
+
self.assertIn("all", filterlist)
|
|
22
|
+
self.assertEqual(sqls["all"], "")
|
|
23
|
+
filterlist, colors, orders, sqls, info_label = batches.common.filter_list(
|
|
24
|
+
all=True, extra_sql="night=3"
|
|
25
|
+
)
|
|
26
|
+
self.assertEqual(sqls["all"], "night=3")
|
|
27
|
+
self.assertEqual(sqls["u"], "(night=3) and (band = 'u')")
|
|
28
|
+
self.assertEqual(info_label["u"], "night=3 u band")
|
|
29
|
+
filterlist, colors, orders, sqls, info_label = batches.common.filter_list(
|
|
30
|
+
all=True, extra_sql="night=3", extra_info_label="night 3"
|
|
31
|
+
)
|
|
32
|
+
self.assertEqual(info_label["u"], "night 3 u band")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
if __name__ == "__main__":
|
|
36
|
+
unittest.main()
|