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,200 @@
|
|
|
1
|
+
"""Young Stellar Objects metric.
|
|
2
|
+
Converted from notebook 211116_yso_3D_90b.ipynb.
|
|
3
|
+
Formatted with black."""
|
|
4
|
+
|
|
5
|
+
__all__ = ("NYoungStarsMetric",)
|
|
6
|
+
|
|
7
|
+
import healpy as hp
|
|
8
|
+
import numpy as np
|
|
9
|
+
import scipy.integrate as integrate
|
|
10
|
+
|
|
11
|
+
from rubin_sim.maf.maps import DustMap, DustMap3D, StellarDensityMap
|
|
12
|
+
from rubin_sim.maf.metrics.base_metric import BaseMetric
|
|
13
|
+
from rubin_sim.maf.metrics.crowding_metric import CrowdingM5Metric
|
|
14
|
+
from rubin_sim.phot_utils import DustValues
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class StarDensity:
|
|
18
|
+
"""integrate from zero to some max distance, then multiply by angular area
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
l : float
|
|
23
|
+
Galactic longitude, radians
|
|
24
|
+
b : float
|
|
25
|
+
Galactic latitude, radians
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, gall, galb):
|
|
29
|
+
"""Calculate the expected number of stars along a line of site"""
|
|
30
|
+
self.r_thin = 2.6 # scale length of the thin disk, kpc
|
|
31
|
+
self.d_gc = 8.178 # Distance to the galactic center, kpc
|
|
32
|
+
self.h_thin = 0.300 # scale height of the thin disk, kpc
|
|
33
|
+
|
|
34
|
+
self.gall = gall
|
|
35
|
+
self.galb = galb
|
|
36
|
+
|
|
37
|
+
self.A = 0.8e8 / (4.0 * np.pi * self.h_thin * self.r_thin**2)
|
|
38
|
+
|
|
39
|
+
def __call__(self, r):
|
|
40
|
+
"""
|
|
41
|
+
Parameters
|
|
42
|
+
----------
|
|
43
|
+
r : float
|
|
44
|
+
Distance in kpc
|
|
45
|
+
"""
|
|
46
|
+
r_galac = ((self.d_gc - r * np.cos(self.gall)) ** 2 + (r * np.sin(self.gall)) ** 2) ** 0.5
|
|
47
|
+
|
|
48
|
+
exponent = -1.0 * r * np.abs(np.sin(self.galb)) / self.h_thin - r_galac / self.r_thin
|
|
49
|
+
|
|
50
|
+
result = self.A * r**2 * np.exp(exponent)
|
|
51
|
+
return result
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class NYoungStarsMetric(BaseMetric):
|
|
55
|
+
"""Calculate the distance or number of stars with
|
|
56
|
+
color uncertainty defined by mags/snrs.
|
|
57
|
+
|
|
58
|
+
Parameters
|
|
59
|
+
----------
|
|
60
|
+
metric_name : `str`, opt
|
|
61
|
+
Default 'young_stars'.
|
|
62
|
+
m5_col : `str`, opt
|
|
63
|
+
The default column name for m5 information in the input data.
|
|
64
|
+
Default fiveSigmaDepth.
|
|
65
|
+
filter_col : `str`, opt
|
|
66
|
+
The column name for the filter information. Default filter.
|
|
67
|
+
mags : `dict`, opt
|
|
68
|
+
The absolute magnitude of the object in question.
|
|
69
|
+
Keys of filter name, values in mags.
|
|
70
|
+
Default is for a 0.3 solar mass star at age = 100 Myr.
|
|
71
|
+
snrs : `dict`, opt
|
|
72
|
+
The SNR to demand for each filter.
|
|
73
|
+
galb_limit : `float`, opt
|
|
74
|
+
The galactic latitude above which to return zero (degrees).
|
|
75
|
+
Default 90.
|
|
76
|
+
badval : `float`, opt
|
|
77
|
+
The value to return when the metric value cannot be calculated.
|
|
78
|
+
Default 0.
|
|
79
|
+
return_distance : `bool`, opt
|
|
80
|
+
Whether the metric will return the maximum distance that
|
|
81
|
+
can be reached for each slice_point,
|
|
82
|
+
or the total number of stars down to mags/snrs.
|
|
83
|
+
crowding_error : `float`, opt
|
|
84
|
+
Crowding error that gets passed to CrowdingM5Metric. Default 0.25.
|
|
85
|
+
use_2D_extinction : `bool`, opt
|
|
86
|
+
Uses the 2D extinction map instead of the 3D one. Default False.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
def __init__(
|
|
90
|
+
self,
|
|
91
|
+
metric_name="young_stars",
|
|
92
|
+
m5_col="fiveSigmaDepth",
|
|
93
|
+
filter_col="band",
|
|
94
|
+
seeing_col="seeingFwhmGeom",
|
|
95
|
+
mags={"g": 10.32, "r": 9.28, "i": 7.97},
|
|
96
|
+
snrs={"g": 5.0, "r": 5.0, "i": 5.0},
|
|
97
|
+
galb_limit=90.0,
|
|
98
|
+
badval=0,
|
|
99
|
+
return_distance=False,
|
|
100
|
+
crowding_error=0.25,
|
|
101
|
+
use_2D_extinction=False,
|
|
102
|
+
**kwargs,
|
|
103
|
+
):
|
|
104
|
+
cols = [m5_col, filter_col, seeing_col]
|
|
105
|
+
maps = [
|
|
106
|
+
DustMap3D(),
|
|
107
|
+
StellarDensityMap(filtername="g"),
|
|
108
|
+
StellarDensityMap(filtername="r"),
|
|
109
|
+
StellarDensityMap(filtername="i"),
|
|
110
|
+
]
|
|
111
|
+
self.use_2D_extinction = use_2D_extinction
|
|
112
|
+
if self.use_2D_extinction:
|
|
113
|
+
maps[0] = DustMap()
|
|
114
|
+
# This will give us access to the dust map get_distance_at_dmag routine
|
|
115
|
+
# but does not require loading another copy of the map
|
|
116
|
+
self.ebvmap = DustMap3D()
|
|
117
|
+
self.return_distance = return_distance
|
|
118
|
+
units = "kpc" if self.return_distance else "N stars"
|
|
119
|
+
super().__init__(cols, metric_name=metric_name, maps=maps, units=units, badval=badval, **kwargs)
|
|
120
|
+
# Save R_x values for on-the-fly calculation of dust extinction
|
|
121
|
+
self.r_x = DustValues().r_x.copy()
|
|
122
|
+
# set return type
|
|
123
|
+
self.m5_col = m5_col
|
|
124
|
+
self.filter_col = filter_col
|
|
125
|
+
self.galb_limit = np.radians(galb_limit)
|
|
126
|
+
self.mags = mags
|
|
127
|
+
self.filters = list(self.mags.keys())
|
|
128
|
+
self.snrs = snrs
|
|
129
|
+
self.crowding_error = crowding_error
|
|
130
|
+
self.m5crowding = {
|
|
131
|
+
f: CrowdingM5Metric(
|
|
132
|
+
crowding_error=crowding_error,
|
|
133
|
+
filtername=f,
|
|
134
|
+
seeing_col=seeing_col,
|
|
135
|
+
maps=maps,
|
|
136
|
+
)
|
|
137
|
+
for f in self.filters
|
|
138
|
+
}
|
|
139
|
+
dust_properties = DustValues()
|
|
140
|
+
self.ax1 = dust_properties.ax1
|
|
141
|
+
|
|
142
|
+
def run(self, data_slice, slice_point=None):
|
|
143
|
+
# Evaluate area on sky for this slice_point, in radians
|
|
144
|
+
if "nside" in slice_point:
|
|
145
|
+
# Best area /pixel calculation, appropriate for healpix slicers
|
|
146
|
+
sky_area = hp.nside2pixarea(slice_point["nside"], degrees=False)
|
|
147
|
+
else:
|
|
148
|
+
# Assume single, approximate, circular FOV
|
|
149
|
+
sky_area = np.pi * (np.radians(1.75)) ** 2
|
|
150
|
+
|
|
151
|
+
# if we are outside the galb_limit, return nothing
|
|
152
|
+
# Note we could make this a more complicated function that
|
|
153
|
+
# returns an expected density of star forming regions
|
|
154
|
+
if np.abs(slice_point["galb"]) > self.galb_limit:
|
|
155
|
+
return self.badval
|
|
156
|
+
|
|
157
|
+
# Compute depth for each filter
|
|
158
|
+
depths = {}
|
|
159
|
+
# ignore the divide by zero warnings
|
|
160
|
+
with np.errstate(divide="ignore"):
|
|
161
|
+
for filtername in self.filters:
|
|
162
|
+
in_filt = np.where(data_slice[self.filter_col] == filtername)[0]
|
|
163
|
+
# Calculate coadded depth per filter
|
|
164
|
+
depth_m5 = 1.25 * np.log10(np.sum(10.0 ** (0.8 * data_slice[self.m5_col][in_filt])))
|
|
165
|
+
if self.crowding_error > 0:
|
|
166
|
+
depth_crowding = self.m5crowding[filtername].run(data_slice, slice_point)
|
|
167
|
+
depths[filtername] = min(depth_m5, depth_crowding)
|
|
168
|
+
else:
|
|
169
|
+
depths[filtername] = depth_m5
|
|
170
|
+
|
|
171
|
+
# solve for the distances in each filter where we hit the required SNR
|
|
172
|
+
distances = []
|
|
173
|
+
for filtername in self.filters:
|
|
174
|
+
# Apparent magnitude at the SNR requirement
|
|
175
|
+
m_app = -2.5 * np.log10(self.snrs[filtername] / 5.0)
|
|
176
|
+
m_app += depths[filtername]
|
|
177
|
+
if self.use_2D_extinction:
|
|
178
|
+
A_x = self.ax1[filtername] * slice_point["ebv"]
|
|
179
|
+
# Assuming all the dust along the line of sight matters.
|
|
180
|
+
m_app = m_app - A_x
|
|
181
|
+
dist = 10.0 * (100 ** ((m_app - self.mags[filtername]) / 5.0)) ** 0.5
|
|
182
|
+
else:
|
|
183
|
+
dist = self.ebvmap.distance_at_dmag(
|
|
184
|
+
dmag=m_app - self.mags[filtername],
|
|
185
|
+
dists=slice_point["ebv3d_dists"],
|
|
186
|
+
ebvs=slice_point["ebv3d_ebvs"],
|
|
187
|
+
filtername=filtername,
|
|
188
|
+
)
|
|
189
|
+
distances.append(dist)
|
|
190
|
+
# compute the final distance, limited by whichever filter is
|
|
191
|
+
# most shallow
|
|
192
|
+
final_distance = np.min(distances, axis=-1) / 1e3 # to kpc
|
|
193
|
+
if self.return_distance:
|
|
194
|
+
return final_distance
|
|
195
|
+
else:
|
|
196
|
+
# Resorting to numerical integration of ugly function
|
|
197
|
+
sd = StarDensity(slice_point["gall"], slice_point["galb"])
|
|
198
|
+
stars_per_sterr, _err = integrate.quad(sd, 0, final_distance)
|
|
199
|
+
stars_tot = stars_per_sterr * sky_area
|
|
200
|
+
return stars_tot
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
from . import db as db
|
|
2
|
+
from . import metricBundles as metricBundles
|
|
3
|
+
from . import metrics as metrics
|
|
4
|
+
from . import plots as plots
|
|
5
|
+
from . import slicers as slicers
|
|
6
|
+
from .batches import col_map_dict
|
|
7
|
+
|
|
8
|
+
__all__ = ("make_bundle_list", "maf_night_report")
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
|
|
14
|
+
# Set matplotlib backend (to create plots where DISPLAY is not set).
|
|
15
|
+
matplotlib.use("Agg")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def make_bundle_list(
|
|
19
|
+
db_file,
|
|
20
|
+
night=1,
|
|
21
|
+
nside=64,
|
|
22
|
+
latCol="fieldDec",
|
|
23
|
+
lonCol="fieldRA",
|
|
24
|
+
notes=True,
|
|
25
|
+
colmap=None,
|
|
26
|
+
):
|
|
27
|
+
"""
|
|
28
|
+
Make a bundleList of things to run
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
if colmap is None:
|
|
32
|
+
colmap = col_map_dict("opsimV4")
|
|
33
|
+
|
|
34
|
+
mjdCol = "observationStartMJD"
|
|
35
|
+
altCol = "altitude"
|
|
36
|
+
azCol = "azimuth"
|
|
37
|
+
# Construct sql queries for each filter and all filters
|
|
38
|
+
filters = ["u", "g", "r", "i", "z", "y"]
|
|
39
|
+
sqls = ["night=%i and filter='%s'" % (night, f) for f in filters]
|
|
40
|
+
sqls.append("night=%i" % night)
|
|
41
|
+
|
|
42
|
+
bundleList = []
|
|
43
|
+
plotFuncs_lam = [plots.LambertSkyMap()]
|
|
44
|
+
|
|
45
|
+
# Hourglass
|
|
46
|
+
hourslicer = slicers.HourglassSlicer()
|
|
47
|
+
display_dict = {"group": "Hourglass"}
|
|
48
|
+
md = ""
|
|
49
|
+
sql = "night=%i" % night
|
|
50
|
+
metric = metrics.HourglassMetric(
|
|
51
|
+
night_col=colmap["night"], mjd_col=colmap["mjd"], metric_name="Hourglass"
|
|
52
|
+
)
|
|
53
|
+
bundle = metricBundles.MetricBundle(
|
|
54
|
+
metric, hourslicer, constraint=sql, info_label=md, display_dict=display_dict
|
|
55
|
+
)
|
|
56
|
+
bundleList.append(bundle)
|
|
57
|
+
|
|
58
|
+
reg_slicer = slicers.HealpixSlicer(nside=nside, lon_col=lonCol, lat_col=latCol, lat_lon_deg=True)
|
|
59
|
+
altaz_slicer = slicers.HealpixSlicer(
|
|
60
|
+
nside=nside, lat_col=altCol, lat_lon_deg=True, lon_col=azCol, use_cache=False
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
unislicer = slicers.UniSlicer()
|
|
64
|
+
for sql in sqls:
|
|
65
|
+
# Number of exposures
|
|
66
|
+
metric = metrics.CountMetric(mjdCol, metric_name="N visits")
|
|
67
|
+
bundle = metricBundles.MetricBundle(metric, reg_slicer, sql)
|
|
68
|
+
bundleList.append(bundle)
|
|
69
|
+
metric = metrics.CountMetric(mjdCol, metric_name="N visits alt az")
|
|
70
|
+
bundle = metricBundles.MetricBundle(metric, altaz_slicer, sql, plot_funcs=plotFuncs_lam)
|
|
71
|
+
bundleList.append(bundle)
|
|
72
|
+
|
|
73
|
+
metric = metrics.MeanMetric(mjdCol, metric_name="Mean Visit Time")
|
|
74
|
+
bundle = metricBundles.MetricBundle(metric, reg_slicer, sql)
|
|
75
|
+
bundleList.append(bundle)
|
|
76
|
+
metric = metrics.MeanMetric(mjdCol, metric_name="Mean Visit Time alt az")
|
|
77
|
+
bundle = metricBundles.MetricBundle(metric, altaz_slicer, sql, plot_funcs=plotFuncs_lam)
|
|
78
|
+
bundleList.append(bundle)
|
|
79
|
+
|
|
80
|
+
metric = metrics.CountMetric(mjdCol, metric_name="N_visits")
|
|
81
|
+
bundle = metricBundles.MetricBundle(metric, unislicer, sql)
|
|
82
|
+
bundleList.append(bundle)
|
|
83
|
+
|
|
84
|
+
# Need pairs in window to get a map of how well it gathered SS pairs.
|
|
85
|
+
|
|
86
|
+
# Moon phase.
|
|
87
|
+
|
|
88
|
+
metric = metrics.NChangesMetric(col="filter", metric_name="Filter Changes")
|
|
89
|
+
bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
|
|
90
|
+
bundleList.append(bundle)
|
|
91
|
+
|
|
92
|
+
metric = metrics.BruteOSFMetric()
|
|
93
|
+
bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
|
|
94
|
+
bundleList.append(bundle)
|
|
95
|
+
|
|
96
|
+
metric = metrics.MeanMetric("slewTime")
|
|
97
|
+
bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
|
|
98
|
+
bundleList.append(bundle)
|
|
99
|
+
|
|
100
|
+
metric = metrics.MinMetric("slewTime")
|
|
101
|
+
bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
|
|
102
|
+
bundleList.append(bundle)
|
|
103
|
+
|
|
104
|
+
metric = metrics.MaxMetric("slewTime")
|
|
105
|
+
bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
|
|
106
|
+
bundleList.append(bundle)
|
|
107
|
+
|
|
108
|
+
# Make plots of the solar system pairs that were taken in the night
|
|
109
|
+
metric = metrics.PairMetric(mjd_col=mjdCol)
|
|
110
|
+
sql = "night=%i and (filter ='r' or filter='g' or filter='i')" % night
|
|
111
|
+
bundle = metricBundles.MetricBundle(metric, reg_slicer, sql)
|
|
112
|
+
bundleList.append(bundle)
|
|
113
|
+
|
|
114
|
+
metric = metrics.PairMetric(mjd_col=mjdCol, metric_name="z Pairs")
|
|
115
|
+
sql = "night=%i and filter='z'" % night
|
|
116
|
+
bundle = metricBundles.MetricBundle(metric, reg_slicer, sql)
|
|
117
|
+
bundleList.append(bundle)
|
|
118
|
+
|
|
119
|
+
# Plot up each visit
|
|
120
|
+
metric = metrics.NightPointingMetric(mjd_col=mjdCol)
|
|
121
|
+
slicer = slicers.UniSlicer()
|
|
122
|
+
sql = "night=%i" % night
|
|
123
|
+
plot_funcs = [plots.NightPointingPlotter()]
|
|
124
|
+
bundle = metricBundles.MetricBundle(metric, slicer, sql, plot_funcs=plot_funcs)
|
|
125
|
+
bundleList.append(bundle)
|
|
126
|
+
|
|
127
|
+
# stats from the note column
|
|
128
|
+
if notes:
|
|
129
|
+
display_dict = {"group": "Basic Stats", "subgroup": "Percent stats"}
|
|
130
|
+
metric = metrics.StringCountMetric(col="scheduler_note", percent=True, metric_name="Percents")
|
|
131
|
+
bundle = metricBundles.MetricBundle(metric, unislicer, sql, display_dict=display_dict)
|
|
132
|
+
bundleList.append(bundle)
|
|
133
|
+
display_dict["subgroup"] = "Count Stats"
|
|
134
|
+
metric = metrics.StringCountMetric(col="scheduler_note", metric_name="Counts")
|
|
135
|
+
bundle = metricBundles.MetricBundle(metric, unislicer, sql, display_dict=display_dict)
|
|
136
|
+
bundleList.append(bundle)
|
|
137
|
+
|
|
138
|
+
return metricBundles.make_bundles_dict_from_list(bundleList)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def maf_night_report():
|
|
142
|
+
"""Generate a report on a single night."""
|
|
143
|
+
|
|
144
|
+
parser = argparse.ArgumentParser(description="Python script to generate a report on a single night.")
|
|
145
|
+
parser.add_argument(
|
|
146
|
+
"db_file",
|
|
147
|
+
type=str,
|
|
148
|
+
default=None,
|
|
149
|
+
help="full file path to the simulation sqlite file",
|
|
150
|
+
)
|
|
151
|
+
parser.add_argument(
|
|
152
|
+
"--out_dir",
|
|
153
|
+
type=str,
|
|
154
|
+
default="night_report",
|
|
155
|
+
help="Output directory for MAF outputs." + ' Default "Out"',
|
|
156
|
+
)
|
|
157
|
+
parser.add_argument(
|
|
158
|
+
"--nside",
|
|
159
|
+
type=int,
|
|
160
|
+
default=64,
|
|
161
|
+
help="Resolution to run Healpix grid at (must be 2^x). Default 64.",
|
|
162
|
+
)
|
|
163
|
+
parser.add_argument(
|
|
164
|
+
"--lon_col",
|
|
165
|
+
type=str,
|
|
166
|
+
default="fieldRA",
|
|
167
|
+
help="Column to use for RA values (can be a stacker dither column)." + " Default=fieldRA.",
|
|
168
|
+
)
|
|
169
|
+
parser.add_argument(
|
|
170
|
+
"--lat_col",
|
|
171
|
+
type=str,
|
|
172
|
+
default="fieldDec",
|
|
173
|
+
help="Column to use for Dec values (can be a stacker dither column)." + " Default=fieldDec.",
|
|
174
|
+
)
|
|
175
|
+
parser.add_argument("--night", type=int, default=1)
|
|
176
|
+
parser.add_argument("--run_name", type=str, default="run_name")
|
|
177
|
+
|
|
178
|
+
parser.set_defaults()
|
|
179
|
+
args, extras = parser.parse_known_args()
|
|
180
|
+
|
|
181
|
+
bundle_dict = make_bundle_list(
|
|
182
|
+
args.db_file,
|
|
183
|
+
nside=args.nside,
|
|
184
|
+
lonCol=args.lon_col,
|
|
185
|
+
latCol=args.lat_col,
|
|
186
|
+
night=args.night,
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
for key in bundle_dict:
|
|
190
|
+
bundle_dict[key].set_run_name(args.run_name)
|
|
191
|
+
|
|
192
|
+
# Set up / connect to results_db.
|
|
193
|
+
results_db = db.ResultsDb(out_dir=args.out_dir)
|
|
194
|
+
|
|
195
|
+
# Set up metricBundleGroup.
|
|
196
|
+
group = metricBundles.MetricBundleGroup(
|
|
197
|
+
bundle_dict, args.db_file, out_dir=args.out_dir, results_db=results_db
|
|
198
|
+
)
|
|
199
|
+
group.run_all()
|
|
200
|
+
group.plot_all()
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
__all__ = ("make_fbs_tracking_db",)
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import os
|
|
5
|
+
import sqlite3
|
|
6
|
+
|
|
7
|
+
import pandas as pd
|
|
8
|
+
|
|
9
|
+
from rubin_sim.maf.db import ResultsDb, TrackingDb, VersionRow
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def make_fbs_tracking_db():
|
|
13
|
+
"""Make a database to track lots of opsim outputs,
|
|
14
|
+
adding in comments and identifiers based on the metric subsets.
|
|
15
|
+
"""
|
|
16
|
+
parser = argparse.ArgumentParser(
|
|
17
|
+
description="Create a tracking database for many opsim maf outputs,"
|
|
18
|
+
"with comments and dates. "
|
|
19
|
+
"Assumes metrics are in a subdirectory called 'maf'."
|
|
20
|
+
)
|
|
21
|
+
parser.add_argument(
|
|
22
|
+
"--opsim_list",
|
|
23
|
+
type=str,
|
|
24
|
+
default="opsim_list",
|
|
25
|
+
help="File containing a list of all of the opsim runs to add.",
|
|
26
|
+
)
|
|
27
|
+
args = parser.parse_args()
|
|
28
|
+
|
|
29
|
+
batches = {
|
|
30
|
+
"glance": "Quick Look Metrics",
|
|
31
|
+
"meta": "General Info Metrics",
|
|
32
|
+
"sci": "Science Metrics",
|
|
33
|
+
"ss": "Solar System Metrics",
|
|
34
|
+
"ddf": "Deep Drilling Metrics",
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
tracking_db = TrackingDb()
|
|
38
|
+
print(f"Tracking database in directory {tracking_db.tracking_db_dir}")
|
|
39
|
+
|
|
40
|
+
with open(args.opsim_list, "r") as runlist:
|
|
41
|
+
for run in runlist:
|
|
42
|
+
db_file = run.replace("\n", "")
|
|
43
|
+
vals = db_file.split("/")
|
|
44
|
+
family = vals[-2]
|
|
45
|
+
db_name = vals[-1]
|
|
46
|
+
run_name = db_name.replace(".db", "")
|
|
47
|
+
run_version = run_name.split("_10yrs")[0].split("_v")[-1]
|
|
48
|
+
run_group = family
|
|
49
|
+
|
|
50
|
+
# Try to build a comment on the run based on the run_name
|
|
51
|
+
run_comment = run_version + " "
|
|
52
|
+
run_comment += db_name.split("_v")[0].replace("_", " ")
|
|
53
|
+
|
|
54
|
+
print(run_name, db_file)
|
|
55
|
+
conn = sqlite3.connect(db_file)
|
|
56
|
+
query = "select Value from info where Parameter == 'Date, ymd'"
|
|
57
|
+
result = pd.read_sql(query, conn)
|
|
58
|
+
sched_date = result.iloc[0, 0]
|
|
59
|
+
query = "select Value from info where Parameter like 'rubin_%.__version__'"
|
|
60
|
+
result = pd.read_sql(query, conn)
|
|
61
|
+
sched_version = result.iloc[0, 0]
|
|
62
|
+
|
|
63
|
+
# Look for metrics in any of the above sets
|
|
64
|
+
for k in batches:
|
|
65
|
+
maf_dir = os.path.join("maf", run_name + "_" + k)
|
|
66
|
+
maf_comment = batches[k]
|
|
67
|
+
# Get maf run date and version
|
|
68
|
+
if os.path.isfile(os.path.join(maf_dir, "resultsDb_sqlite.db")):
|
|
69
|
+
resdb = ResultsDb(maf_dir)
|
|
70
|
+
resdb.open()
|
|
71
|
+
query = resdb.session.query(VersionRow).all()
|
|
72
|
+
for v in query:
|
|
73
|
+
maf_version = v.version
|
|
74
|
+
maf_date = v.run_date
|
|
75
|
+
resdb.close()
|
|
76
|
+
|
|
77
|
+
maf_dir = os.path.relpath(maf_dir, start=os.path.dirname(tracking_db.tracking_db_dir))
|
|
78
|
+
runId = tracking_db.add_run(
|
|
79
|
+
run_group=run_group,
|
|
80
|
+
run_name=run_name,
|
|
81
|
+
run_comment=run_comment,
|
|
82
|
+
run_version=sched_version,
|
|
83
|
+
run_date=sched_date,
|
|
84
|
+
maf_comment=maf_comment,
|
|
85
|
+
maf_version=maf_version,
|
|
86
|
+
maf_date=maf_date,
|
|
87
|
+
maf_dir=maf_dir,
|
|
88
|
+
db_file=db_file,
|
|
89
|
+
)
|
|
90
|
+
print("Used MAF RunID %d" % (runId))
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
__all__ = ("MapsRegistry", "BaseMap")
|
|
2
|
+
|
|
3
|
+
import inspect
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class MapsRegistry(type):
|
|
7
|
+
"""
|
|
8
|
+
Meta class for Maps, to build a registry of maps classes.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def __init__(cls, name, bases, dict):
|
|
12
|
+
super(MapsRegistry, cls).__init__(name, bases, dict)
|
|
13
|
+
if not hasattr(cls, "registry"):
|
|
14
|
+
cls.registry = {}
|
|
15
|
+
modname = inspect.getmodule(cls).__name__
|
|
16
|
+
if modname.startswith("rubin_sim.maf.maps"):
|
|
17
|
+
modname = ""
|
|
18
|
+
else:
|
|
19
|
+
if len(modname.split(".")) > 1:
|
|
20
|
+
modname = ".".join(modname.split(".")[:-1]) + "."
|
|
21
|
+
else:
|
|
22
|
+
modname = modname + "."
|
|
23
|
+
mapsname = modname + name
|
|
24
|
+
if mapsname in cls.registry:
|
|
25
|
+
raise Exception("Redefining maps %s! (there are >1 maps with the same name)" % (mapsname))
|
|
26
|
+
if mapsname != "BaseMaps":
|
|
27
|
+
cls.registry[mapsname] = cls
|
|
28
|
+
|
|
29
|
+
def get_class(cls, mapsname):
|
|
30
|
+
return cls.registry[mapsname]
|
|
31
|
+
|
|
32
|
+
def help(cls, doc=False):
|
|
33
|
+
for mapsname in sorted(cls.registry):
|
|
34
|
+
if not doc:
|
|
35
|
+
print(mapsname)
|
|
36
|
+
if doc:
|
|
37
|
+
print("---- ", mapsname, " ----")
|
|
38
|
+
print(cls.registry[mapsname].__doc__)
|
|
39
|
+
maps = cls.registry[mapsname]()
|
|
40
|
+
print(" added to slice_point: ", ",".join(maps.keynames))
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class BaseMap(metaclass=MapsRegistry):
|
|
44
|
+
"""Base for maps classes."""
|
|
45
|
+
|
|
46
|
+
def __init__(self, **kwargs):
|
|
47
|
+
self.keynames = ["newkey"]
|
|
48
|
+
|
|
49
|
+
def __eq__(self, othermap):
|
|
50
|
+
return self.keynames == othermap.keynames
|
|
51
|
+
|
|
52
|
+
def __ne__(self, othermap):
|
|
53
|
+
return self.keynames != othermap.keynames
|
|
54
|
+
|
|
55
|
+
def __lt__(self, othermap):
|
|
56
|
+
return self.keynames < othermap.keynames
|
|
57
|
+
|
|
58
|
+
def __gt__(self, othermap):
|
|
59
|
+
return self.keynames > othermap.keynames
|
|
60
|
+
|
|
61
|
+
def __le__(self, othermap):
|
|
62
|
+
return self.keynames <= othermap.keynames
|
|
63
|
+
|
|
64
|
+
def __ge__(self, othermap):
|
|
65
|
+
return self.keynames >= othermap.keynames
|
|
66
|
+
|
|
67
|
+
def run(self, slice_points):
|
|
68
|
+
"""Given slice_points (dict containing metadata about each slice_point,
|
|
69
|
+
including ra/dec), adds additional metadata at each slice_point
|
|
70
|
+
and returns updated dict.
|
|
71
|
+
"""
|
|
72
|
+
raise NotImplementedError("This must be defined in subclass")
|