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.
Files changed (387) hide show
  1. batch/compile_prenight_metadata_cache.sh +34 -0
  2. batch/run_auxtel_prenight_sims.sh +163 -0
  3. batch/run_prenight_sims.sh +239 -0
  4. docs/.gitignore +3 -0
  5. docs/Makefile +32 -0
  6. docs/api.rst +25 -0
  7. docs/conf.py +8 -0
  8. docs/data-api.rst +12 -0
  9. docs/data-download.rst +70 -0
  10. docs/developer.rst +14 -0
  11. docs/documenteer.toml +11 -0
  12. docs/index.rst +22 -0
  13. docs/installation.rst +76 -0
  14. docs/introduction.rst +37 -0
  15. docs/maf-api-batches.rst +12 -0
  16. docs/maf-api-db.rst +12 -0
  17. docs/maf-api-maf-contrib.rst +12 -0
  18. docs/maf-api-maps.rst +12 -0
  19. docs/maf-api-metricbundles.rst +12 -0
  20. docs/maf-api-metrics.rst +12 -0
  21. docs/maf-api-plots.rst +12 -0
  22. docs/maf-api-run-comparison.rst +12 -0
  23. docs/maf-api-slicers.rst +12 -0
  24. docs/maf-api-stackers.rst +12 -0
  25. docs/maf-api-utils.rst +12 -0
  26. docs/maf-api.rst +22 -0
  27. docs/maf.rst +60 -0
  28. docs/metric_list.py +49 -0
  29. docs/moving-objects-api.rst +12 -0
  30. docs/moving-objects.rst +22 -0
  31. docs/phot-utils-api.rst +12 -0
  32. docs/phot-utils.rst +11 -0
  33. docs/prenight.rst +117 -0
  34. docs/protoarchive.rst +276 -0
  35. docs/satellite-constellations-api.rst +12 -0
  36. docs/satellite-constellations.rst +13 -0
  37. docs/selfcal-api.rst +12 -0
  38. docs/selfcal.rst +15 -0
  39. docs/sim-archive-api.rst +12 -0
  40. docs/skybrightness-api.rst +12 -0
  41. docs/skybrightness.rst +23 -0
  42. docs/user-guide.rst +28 -0
  43. docs/vseqarchive-architecture.rst +438 -0
  44. docs/vseqarchive-setup.rst +238 -0
  45. docs/vseqarchive.rst +225 -0
  46. rubin_sim/__init__.py +7 -0
  47. rubin_sim/data/__init__.py +1 -0
  48. rubin_sim/data/rs_download_data.py +155 -0
  49. rubin_sim/maf/__init__.py +34 -0
  50. rubin_sim/maf/batches/__init__.py +18 -0
  51. rubin_sim/maf/batches/altaz_batch.py +161 -0
  52. rubin_sim/maf/batches/col_map_dict.py +274 -0
  53. rubin_sim/maf/batches/common.py +388 -0
  54. rubin_sim/maf/batches/ddf_batch.py +728 -0
  55. rubin_sim/maf/batches/filterchange_batch.py +182 -0
  56. rubin_sim/maf/batches/glance_batch.py +591 -0
  57. rubin_sim/maf/batches/hourglass_batch.py +79 -0
  58. rubin_sim/maf/batches/info_batch.py +114 -0
  59. rubin_sim/maf/batches/metadata_batch.py +558 -0
  60. rubin_sim/maf/batches/moving_objects_batch.py +1587 -0
  61. rubin_sim/maf/batches/openshutter_batch.py +100 -0
  62. rubin_sim/maf/batches/radar_limited.py +1100 -0
  63. rubin_sim/maf/batches/science_radar_batch.py +1910 -0
  64. rubin_sim/maf/batches/skycoverage.py +155 -0
  65. rubin_sim/maf/batches/slew_batch.py +146 -0
  66. rubin_sim/maf/batches/srd_batch.py +637 -0
  67. rubin_sim/maf/batches/time_batch.py +757 -0
  68. rubin_sim/maf/batches/time_sci_batch.py +105 -0
  69. rubin_sim/maf/batches/visitdepth_batch.py +485 -0
  70. rubin_sim/maf/db/__init__.py +2 -0
  71. rubin_sim/maf/db/add_run.py +34 -0
  72. rubin_sim/maf/db/results_db.py +1074 -0
  73. rubin_sim/maf/db/tracking_db.py +332 -0
  74. rubin_sim/maf/ddf_dir.py +53 -0
  75. rubin_sim/maf/generate_ss.py +218 -0
  76. rubin_sim/maf/glance_dir.py +58 -0
  77. rubin_sim/maf/maf_contrib/__init__.py +25 -0
  78. rubin_sim/maf/maf_contrib/calculate_lsst_field_visibility_astropy.py +170 -0
  79. rubin_sim/maf/maf_contrib/depth_limited_num_gal_metric.py +109 -0
  80. rubin_sim/maf/maf_contrib/example_new_metrics.py +40 -0
  81. rubin_sim/maf/maf_contrib/filter_pair_t_gaps_metric.py +208 -0
  82. rubin_sim/maf/maf_contrib/grb_transient_metric.py +249 -0
  83. rubin_sim/maf/maf_contrib/gw170817_det_metric.py +72 -0
  84. rubin_sim/maf/maf_contrib/intervals_between_obs_metric.py +68 -0
  85. rubin_sim/maf/maf_contrib/kne_metrics.py +473 -0
  86. rubin_sim/maf/maf_contrib/lss_metrics.py +45 -0
  87. rubin_sim/maf/maf_contrib/lss_obs_strategy/__init__.py +3 -0
  88. rubin_sim/maf/maf_contrib/lss_obs_strategy/constants_for_pipeline.py +73 -0
  89. rubin_sim/maf/maf_contrib/lss_obs_strategy/galaxy_counts_metric_extended.py +205 -0
  90. rubin_sim/maf/maf_contrib/lss_obs_strategy/galaxy_counts_with_pixel_calibration.py +171 -0
  91. rubin_sim/maf/maf_contrib/lv_dwarfs/__init__.py +1 -0
  92. rubin_sim/maf/maf_contrib/lv_dwarfs/lv_dwarfs_metrics.py +388 -0
  93. rubin_sim/maf/maf_contrib/microlensing_metric.py +593 -0
  94. rubin_sim/maf/maf_contrib/num_obs_in_survey_time_overlap_metric.py +43 -0
  95. rubin_sim/maf/maf_contrib/periodic_metric.py +51 -0
  96. rubin_sim/maf/maf_contrib/periodic_star_metric.py +186 -0
  97. rubin_sim/maf/maf_contrib/periodic_star_modulation_metric.py +236 -0
  98. rubin_sim/maf/maf_contrib/presto_color_kne_pop_metric.py +441 -0
  99. rubin_sim/maf/maf_contrib/selfcal_uniformity_metric.py +171 -0
  100. rubin_sim/maf/maf_contrib/star_count_mass_metric.py +64 -0
  101. rubin_sim/maf/maf_contrib/star_count_metric.py +56 -0
  102. rubin_sim/maf/maf_contrib/star_counts/__init__.py +8 -0
  103. rubin_sim/maf/maf_contrib/star_counts/abs_mag.py +324 -0
  104. rubin_sim/maf/maf_contrib/star_counts/coords.py +99 -0
  105. rubin_sim/maf/maf_contrib/star_counts/readme.txt +1 -0
  106. rubin_sim/maf/maf_contrib/star_counts/spec_type.py +91 -0
  107. rubin_sim/maf/maf_contrib/star_counts/starcount.py +30 -0
  108. rubin_sim/maf/maf_contrib/star_counts/starcount_bymass.py +93 -0
  109. rubin_sim/maf/maf_contrib/star_counts/stellardensity.py +59 -0
  110. rubin_sim/maf/maf_contrib/static_probes_fom_summary_metric.py +386 -0
  111. rubin_sim/maf/maf_contrib/tdes_pop_metric.py +362 -0
  112. rubin_sim/maf/maf_contrib/transient_ascii_sed_metric.py +652 -0
  113. rubin_sim/maf/maf_contrib/triplet_metric.py +156 -0
  114. rubin_sim/maf/maf_contrib/var_depth_metric.py +157 -0
  115. rubin_sim/maf/maf_contrib/xrb_metrics.py +523 -0
  116. rubin_sim/maf/maf_contrib/young_stellar_objects_metric.py +200 -0
  117. rubin_sim/maf/maf_night_report.py +200 -0
  118. rubin_sim/maf/make_fbs_tracking_db.py +90 -0
  119. rubin_sim/maf/maps/__init__.py +8 -0
  120. rubin_sim/maf/maps/base_map.py +72 -0
  121. rubin_sim/maf/maps/create_gaia_density_map.py +158 -0
  122. rubin_sim/maf/maps/dust_map.py +66 -0
  123. rubin_sim/maf/maps/dust_map_3d.py +190 -0
  124. rubin_sim/maf/maps/ebv_3d_hp.py +170 -0
  125. rubin_sim/maf/maps/ebv_hp.py +64 -0
  126. rubin_sim/maf/maps/gal_coords_map.py +22 -0
  127. rubin_sim/maf/maps/galactic_plane_priority_maps.py +210 -0
  128. rubin_sim/maf/maps/stellar_density_map.py +73 -0
  129. rubin_sim/maf/maps/trilegal_map.py +82 -0
  130. rubin_sim/maf/metadata_dir.py +90 -0
  131. rubin_sim/maf/metric_bundles/__init__.py +3 -0
  132. rubin_sim/maf/metric_bundles/metric_bundle.py +816 -0
  133. rubin_sim/maf/metric_bundles/metric_bundle_group.py +834 -0
  134. rubin_sim/maf/metric_bundles/mo_metric_bundle.py +646 -0
  135. rubin_sim/maf/metrics/__init__.py +52 -0
  136. rubin_sim/maf/metrics/agn_time_lag_metric.py +118 -0
  137. rubin_sim/maf/metrics/agnstructure.py +141 -0
  138. rubin_sim/maf/metrics/area_summary_metrics.py +120 -0
  139. rubin_sim/maf/metrics/base_metric.py +215 -0
  140. rubin_sim/maf/metrics/brown_dwarf_metric.py +162 -0
  141. rubin_sim/maf/metrics/cadence_metrics.py +400 -0
  142. rubin_sim/maf/metrics/calibration_metrics.py +618 -0
  143. rubin_sim/maf/metrics/chip_vendor_metric.py +43 -0
  144. rubin_sim/maf/metrics/color_slope_metrics.py +189 -0
  145. rubin_sim/maf/metrics/cosmology_summary_metrics.py +1212 -0
  146. rubin_sim/maf/metrics/coverage_metric.py +48 -0
  147. rubin_sim/maf/metrics/crowding_metric.py +255 -0
  148. rubin_sim/maf/metrics/cumulative_metric.py +46 -0
  149. rubin_sim/maf/metrics/dcr_metric.py +93 -0
  150. rubin_sim/maf/metrics/exgal_m5.py +57 -0
  151. rubin_sim/maf/metrics/fft_metric.py +27 -0
  152. rubin_sim/maf/metrics/galactic_plane_metrics.py +375 -0
  153. rubin_sim/maf/metrics/galplane_time_sampling_metrics.py +236 -0
  154. rubin_sim/maf/metrics/hourglass_metric.py +130 -0
  155. rubin_sim/maf/metrics/incremental_template_metric.py +255 -0
  156. rubin_sim/maf/metrics/kuiper_metrics.py +26 -0
  157. rubin_sim/maf/metrics/mo_metrics.py +1496 -0
  158. rubin_sim/maf/metrics/mo_summary_metrics.py +464 -0
  159. rubin_sim/maf/metrics/night_pointing_metric.py +70 -0
  160. rubin_sim/maf/metrics/optimal_m5_metric.py +94 -0
  161. rubin_sim/maf/metrics/pair_metric.py +69 -0
  162. rubin_sim/maf/metrics/periodic_detect_metric.py +133 -0
  163. rubin_sim/maf/metrics/phase_gap_metric.py +172 -0
  164. rubin_sim/maf/metrics/qso_number_counts_metric.py +138 -0
  165. rubin_sim/maf/metrics/scaling_metrics.py +148 -0
  166. rubin_sim/maf/metrics/schedview_metrics.py +39 -0
  167. rubin_sim/maf/metrics/season_metrics.py +344 -0
  168. rubin_sim/maf/metrics/simple_metrics.py +546 -0
  169. rubin_sim/maf/metrics/sky_sat_metric.py +18 -0
  170. rubin_sim/maf/metrics/sn_cadence_metric.py +104 -0
  171. rubin_sim/maf/metrics/sn_n_sn_metric.py +1364 -0
  172. rubin_sim/maf/metrics/sn_sl_metric.py +216 -0
  173. rubin_sim/maf/metrics/sn_snr_metric.py +715 -0
  174. rubin_sim/maf/metrics/snr_weight.py +24 -0
  175. rubin_sim/maf/metrics/star_density.py +77 -0
  176. rubin_sim/maf/metrics/string_count_metric.py +95 -0
  177. rubin_sim/maf/metrics/summary_metrics.py +201 -0
  178. rubin_sim/maf/metrics/surfb_metric.py +175 -0
  179. rubin_sim/maf/metrics/technical_metrics.py +271 -0
  180. rubin_sim/maf/metrics/tgaps.py +412 -0
  181. rubin_sim/maf/metrics/tomography_models.py +2034 -0
  182. rubin_sim/maf/metrics/transient_metrics.py +268 -0
  183. rubin_sim/maf/metrics/uniformity_metrics.py +418 -0
  184. rubin_sim/maf/metrics/use_metrics.py +55 -0
  185. rubin_sim/maf/metrics/vector_metrics.py +190 -0
  186. rubin_sim/maf/metrics/visit_groups_metric.py +341 -0
  187. rubin_sim/maf/metrics/weak_lensing_systematics_metric.py +210 -0
  188. rubin_sim/maf/plots/__init__.py +14 -0
  189. rubin_sim/maf/plots/hg_plotters.py +1117 -0
  190. rubin_sim/maf/plots/hourglass_plotters.py +120 -0
  191. rubin_sim/maf/plots/mo_plotters.py +358 -0
  192. rubin_sim/maf/plots/nd_plotters.py +220 -0
  193. rubin_sim/maf/plots/neo_distance_plotter.py +140 -0
  194. rubin_sim/maf/plots/night_pointing_plotter.py +96 -0
  195. rubin_sim/maf/plots/oned_plotters.py +114 -0
  196. rubin_sim/maf/plots/perceptual_rainbow.py +30 -0
  197. rubin_sim/maf/plots/plot_handler.py +766 -0
  198. rubin_sim/maf/plots/skyproj_plotters.py +540 -0
  199. rubin_sim/maf/plots/spatial_plotters.py +1029 -0
  200. rubin_sim/maf/plots/special_plotters.py +256 -0
  201. rubin_sim/maf/plots/two_d_plotters.py +177 -0
  202. rubin_sim/maf/plots/xyplotter.py +37 -0
  203. rubin_sim/maf/run_comparison/__init__.py +5 -0
  204. rubin_sim/maf/run_comparison/archive.py +584 -0
  205. rubin_sim/maf/run_comparison/gather_summaries.py +125 -0
  206. rubin_sim/maf/run_comparison/microlensing_compare.py +514 -0
  207. rubin_sim/maf/run_comparison/radar_plot.py +202 -0
  208. rubin_sim/maf/run_comparison/summary_plots.py +710 -0
  209. rubin_sim/maf/run_moving_calc.py +239 -0
  210. rubin_sim/maf/run_moving_fractions.py +128 -0
  211. rubin_sim/maf/run_moving_join.py +103 -0
  212. rubin_sim/maf/run_selfcal_metric.py +92 -0
  213. rubin_sim/maf/scimaf_dir.py +87 -0
  214. rubin_sim/maf/show_maf.py +227 -0
  215. rubin_sim/maf/slicers/__init__.py +13 -0
  216. rubin_sim/maf/slicers/base_slicer.py +513 -0
  217. rubin_sim/maf/slicers/base_spatial_slicer.py +202 -0
  218. rubin_sim/maf/slicers/healpix_sdss_slicer.py +118 -0
  219. rubin_sim/maf/slicers/healpix_slicer.py +189 -0
  220. rubin_sim/maf/slicers/healpix_subset_slicer.py +293 -0
  221. rubin_sim/maf/slicers/hourglass_slicer.py +37 -0
  222. rubin_sim/maf/slicers/mo_slicer.py +171 -0
  223. rubin_sim/maf/slicers/movie_slicer.py +288 -0
  224. rubin_sim/maf/slicers/nd_slicer.py +147 -0
  225. rubin_sim/maf/slicers/one_d_slicer.py +210 -0
  226. rubin_sim/maf/slicers/time_interval_slicers.py +283 -0
  227. rubin_sim/maf/slicers/uni_slicer.py +57 -0
  228. rubin_sim/maf/slicers/user_points_slicer.py +141 -0
  229. rubin_sim/maf/stackers/__init__.py +13 -0
  230. rubin_sim/maf/stackers/base_stacker.py +221 -0
  231. rubin_sim/maf/stackers/coord_stackers.py +224 -0
  232. rubin_sim/maf/stackers/date_stackers.py +192 -0
  233. rubin_sim/maf/stackers/general_stackers.py +683 -0
  234. rubin_sim/maf/stackers/get_col_info.py +104 -0
  235. rubin_sim/maf/stackers/label_stackers.py +114 -0
  236. rubin_sim/maf/stackers/m5_optimal_stacker.py +126 -0
  237. rubin_sim/maf/stackers/mo_phase.py +265 -0
  238. rubin_sim/maf/stackers/mo_stackers.py +486 -0
  239. rubin_sim/maf/stackers/n_follow_stacker.py +187 -0
  240. rubin_sim/maf/stackers/neo_dist_stacker.py +126 -0
  241. rubin_sim/maf/stackers/sdss_stackers.py +30 -0
  242. rubin_sim/maf/stackers/sn_stacker.py +152 -0
  243. rubin_sim/maf/stackers/teff_stacker.py +154 -0
  244. rubin_sim/maf/utils/__init__.py +6 -0
  245. rubin_sim/maf/utils/astrometry_utils.py +93 -0
  246. rubin_sim/maf/utils/generate_fov_map.py +58 -0
  247. rubin_sim/maf/utils/get_date_version.py +28 -0
  248. rubin_sim/maf/utils/maf_utils.py +212 -0
  249. rubin_sim/maf/utils/opsim_utils.py +259 -0
  250. rubin_sim/maf/utils/output_utils.py +34 -0
  251. rubin_sim/maf/utils/sn_n_sn_utils.py +894 -0
  252. rubin_sim/maf/utils/sn_utils.py +369 -0
  253. rubin_sim/maf/utils/stellar_mags.py +197 -0
  254. rubin_sim/maf/web/__init__.py +2 -0
  255. rubin_sim/maf/web/favicon.ico +0 -0
  256. rubin_sim/maf/web/maf_run_results.py +645 -0
  257. rubin_sim/maf/web/maf_tracking.py +139 -0
  258. rubin_sim/maf/web/sorttable.js +496 -0
  259. rubin_sim/maf/web/templates/allmetricresults.html +72 -0
  260. rubin_sim/maf/web/templates/configs.html +28 -0
  261. rubin_sim/maf/web/templates/macros.html +243 -0
  262. rubin_sim/maf/web/templates/master.html +294 -0
  263. rubin_sim/maf/web/templates/metricselect.html +91 -0
  264. rubin_sim/maf/web/templates/multicolor.html +147 -0
  265. rubin_sim/maf/web/templates/results.html +82 -0
  266. rubin_sim/maf/web/templates/runselect.html +58 -0
  267. rubin_sim/maf/web/templates/stats.html +50 -0
  268. rubin_sim/moving_objects/__init__.py +8 -0
  269. rubin_sim/moving_objects/base_obs.py +468 -0
  270. rubin_sim/moving_objects/cheby_fits.py +689 -0
  271. rubin_sim/moving_objects/cheby_values.py +231 -0
  272. rubin_sim/moving_objects/chebyshev_utils.py +365 -0
  273. rubin_sim/moving_objects/direct_obs.py +376 -0
  274. rubin_sim/moving_objects/make_lsst_obs.py +282 -0
  275. rubin_sim/moving_objects/ooephemerides.py +643 -0
  276. rubin_sim/moving_objects/orbits.py +507 -0
  277. rubin_sim/moving_objects/pre_generate.py +37 -0
  278. rubin_sim/moving_objects/utils.py +61 -0
  279. rubin_sim/phot_utils/__init__.py +7 -0
  280. rubin_sim/phot_utils/bandpass.py +425 -0
  281. rubin_sim/phot_utils/photometric_parameters.py +449 -0
  282. rubin_sim/phot_utils/physical_parameters.py +50 -0
  283. rubin_sim/phot_utils/predicted_zeropoints.py +245 -0
  284. rubin_sim/phot_utils/sed.py +1773 -0
  285. rubin_sim/phot_utils/sed_utils.py +52 -0
  286. rubin_sim/phot_utils/signaltonoise.py +695 -0
  287. rubin_sim/phot_utils/spectral_resampling.py +161 -0
  288. rubin_sim/satellite_constellations/__init__.py +3 -0
  289. rubin_sim/satellite_constellations/basis_function.py +40 -0
  290. rubin_sim/satellite_constellations/model_observatory.py +157 -0
  291. rubin_sim/satellite_constellations/sat_utils.py +488 -0
  292. rubin_sim/selfcal/__init__.py +4 -0
  293. rubin_sim/selfcal/generate_catalog.py +188 -0
  294. rubin_sim/selfcal/offsets.py +119 -0
  295. rubin_sim/selfcal/solver.py +143 -0
  296. rubin_sim/selfcal/star_tools.py +42 -0
  297. rubin_sim/sim_archive/__init__.py +14 -0
  298. rubin_sim/sim_archive/conda_packages.py +65 -0
  299. rubin_sim/sim_archive/future_vsarch.py +480 -0
  300. rubin_sim/sim_archive/make_snapshot.py +255 -0
  301. rubin_sim/sim_archive/prenight.py +216 -0
  302. rubin_sim/sim_archive/prenightindex.py +229 -0
  303. rubin_sim/sim_archive/prototype.py +1029 -0
  304. rubin_sim/sim_archive/sim_archive.py +680 -0
  305. rubin_sim/sim_archive/tempdb.py +56 -0
  306. rubin_sim/sim_archive/util.py +146 -0
  307. rubin_sim/sim_archive/vseqarchive.py +965 -0
  308. rubin_sim/sim_archive/vseqmetadata.py +1721 -0
  309. rubin_sim/skybrightness/__init__.py +5 -0
  310. rubin_sim/skybrightness/allsky_db.py +93 -0
  311. rubin_sim/skybrightness/data/ESO_Spectra/eso_tools.py +505 -0
  312. rubin_sim/skybrightness/data/solarSpec/package.py +22 -0
  313. rubin_sim/skybrightness/generate_hdf5.py +243 -0
  314. rubin_sim/skybrightness/interp_components.py +798 -0
  315. rubin_sim/skybrightness/sky_model.py +771 -0
  316. rubin_sim/skybrightness/twilight_func.py +83 -0
  317. rubin_sim/skybrightness/utils.py +91 -0
  318. rubin_sim-2.6.1.dev2.dist-info/METADATA +95 -0
  319. rubin_sim-2.6.1.dev2.dist-info/RECORD +387 -0
  320. rubin_sim-2.6.1.dev2.dist-info/WHEEL +5 -0
  321. rubin_sim-2.6.1.dev2.dist-info/entry_points.txt +24 -0
  322. rubin_sim-2.6.1.dev2.dist-info/licenses/LICENSE +674 -0
  323. rubin_sim-2.6.1.dev2.dist-info/top_level.txt +5 -0
  324. sql/make_vseqmeta.sql +251 -0
  325. tests/data/test_data.py +26 -0
  326. tests/data/test_ddf_grid.py +17 -0
  327. tests/maf/test_3x2fom.py +68 -0
  328. tests/maf/test_archive.py +162 -0
  329. tests/maf/test_basemetrics.py +99 -0
  330. tests/maf/test_batchcommon.py +36 -0
  331. tests/maf/test_batches.py +159 -0
  332. tests/maf/test_cadencemetrics.py +388 -0
  333. tests/maf/test_calibrationmetrics.py +242 -0
  334. tests/maf/test_color_slopes.py +71 -0
  335. tests/maf/test_cosmology_summaries.py +20 -0
  336. tests/maf/test_gathersummaries.py +48 -0
  337. tests/maf/test_healpixslicer.py +439 -0
  338. tests/maf/test_healpixsubsetslicer.py +273 -0
  339. tests/maf/test_hgplotters.py +145 -0
  340. tests/maf/test_hourglassmetric.py +33 -0
  341. tests/maf/test_io.py +187 -0
  342. tests/maf/test_json.py +169 -0
  343. tests/maf/test_maps.py +199 -0
  344. tests/maf/test_metricbundle.py +69 -0
  345. tests/maf/test_mometrics.py +422 -0
  346. tests/maf/test_movieslicer.py +216 -0
  347. tests/maf/test_ndslicer.py +240 -0
  348. tests/maf/test_neodistanceplotter.py +41 -0
  349. tests/maf/test_onedslicer.py +245 -0
  350. tests/maf/test_opsimutils.py +80 -0
  351. tests/maf/test_plotters.py +134 -0
  352. tests/maf/test_resultsdb.py +145 -0
  353. tests/maf/test_schedviewmetrics.py +14 -0
  354. tests/maf/test_simplemetrics.py +200 -0
  355. tests/maf/test_snmetrics.py +335 -0
  356. tests/maf/test_snmetrics_nsn.py +123 -0
  357. tests/maf/test_stackers.py +423 -0
  358. tests/maf/test_stellarmags.py +50 -0
  359. tests/maf/test_stringcount.py +26 -0
  360. tests/maf/test_summary_plots.py +197 -0
  361. tests/maf/test_summarymetrics.py +82 -0
  362. tests/maf/test_technicalmetrics.py +267 -0
  363. tests/maf/test_templatemetrics.py +86 -0
  364. tests/maf/test_timeintervalslicers.py +97 -0
  365. tests/maf/test_trackingdb.py +88 -0
  366. tests/maf/test_unislicer.py +116 -0
  367. tests/maf/test_vectormetrics.py +225 -0
  368. tests/maf/test_visitgroupsmetric.py +181 -0
  369. tests/moving_objects/test_camera.py +39 -0
  370. tests/moving_objects/test_chebyfits.py +188 -0
  371. tests/moving_objects/test_chebyshevutils.py +76 -0
  372. tests/moving_objects/test_chebyvalues.py +245 -0
  373. tests/moving_objects/test_ephemerides.py +219 -0
  374. tests/moving_objects/test_orbits.py +170 -0
  375. tests/moving_objects/test_sed_data.py +61 -0
  376. tests/phot_utils/test_approximatebandpasses.py +91 -0
  377. tests/phot_utils/test_photometricparameters.py +268 -0
  378. tests/phot_utils/test_photometry.py +61 -0
  379. tests/phot_utils/test_predicted_zeropoints.py +53 -0
  380. tests/phot_utils/test_read_bandpasses.py +29 -0
  381. tests/phot_utils/test_sed.py +368 -0
  382. tests/phot_utils/test_snr.py +370 -0
  383. tests/satellite_constellations/test_satellites.py +36 -0
  384. tests/sim_archive/test_make_snapshot.py +24 -0
  385. tests/sim_archive/test_prototype_sim_archive.py +204 -0
  386. tests/sim_archive/test_vseqarchive.py +947 -0
  387. tests/skybrightness/test_skymodel.py +359 -0
@@ -0,0 +1,114 @@
1
+ __all__ = ("info_bundle_dicts",)
2
+
3
+ import numpy as np
4
+
5
+ import rubin_sim.maf.batches as batches
6
+
7
+
8
+ def info_bundle_dicts(allsky_slicer, wfd_slicer, opsim="opsim", colmap=batches.col_map_dict()):
9
+ # Set up the bundle dicts
10
+ # Some of these metrics are reproduced in other scripts - srd and cadence
11
+ bdict = {}
12
+
13
+ for tag, slicer in zip(["All sky", "WFD"], [allsky_slicer, wfd_slicer]):
14
+ fO = batches.fOBatch(colmap=colmap, run_name=opsim, slicer=slicer, extra_info=tag)
15
+ bdict.update(fO)
16
+ astrometry = batches.astrometryBatch(colmap=colmap, run_name=opsim, slicer=slicer, extra_info=tag)
17
+ bdict.update(astrometry)
18
+ rapidrevisit = batches.rapidRevisitBatch(colmap=colmap, run_name=opsim, slicer=slicer, extra_info=tag)
19
+ bdict.update(rapidrevisit)
20
+
21
+ # Intranight (pairs/time)
22
+ for tag, slicer in zip(["All sky", "WFD"], [allsky_slicer, wfd_slicer]):
23
+ intranight = batches.intraNight(colmap, opsim, slicer=slicer, extraInfoLabel=tag)
24
+ bdict.update(intranight)
25
+
26
+ # Internight (nights between visits)
27
+ for tag, slicer in zip(["All sky", "WFD"], [allsky_slicer, wfd_slicer]):
28
+ internight = batches.interNight(colmap, opsim, slicer=slicer, extraInfoLabel=tag)
29
+ bdict.update(internight)
30
+
31
+ # Intraseason (length of season)
32
+ for tag, slicer in zip(["All sky", "WFD"], [allsky_slicer, wfd_slicer]):
33
+ season = batches.seasons(colmap=colmap, runName=opsim, slicer=slicer, extraInfoLabel=tag)
34
+ bdict.update(season)
35
+
36
+ # Run all metadata metrics, All and just WFD.
37
+ for tag, slicer in zip(["All sky", "WFD"], [allsky_slicer, wfd_slicer]):
38
+ bdict.update(batches.allMetadata(colmap, opsim, slicer=slicer, extraInfoLabel=tag))
39
+
40
+ # And run some metadata for the first year only - all sky
41
+ bdict.update(batches.firstYearMetadata(colmap, opsim, slicer=allsky_slicer))
42
+
43
+ # Nvisits + m5 maps + Teff maps, All and just WFD.
44
+ for tag, slicer in zip(["All sky", "WFD"], [allsky_slicer, wfd_slicer]):
45
+ bdict.update(batches.nvisitsM5Maps(colmap, opsim, slicer=slicer, extraInfoLabel=tag))
46
+ bdict.update(batches.tEffMetrics(colmap, opsim, slicer=slicer, extraInfoLabel=tag))
47
+
48
+ # And number of visits for the first year and halfway through the survey
49
+ bdict.update(
50
+ batches.nvisitsM5Maps(
51
+ colmap,
52
+ opsim,
53
+ slicer=allsky_slicer,
54
+ extraInfoLabel="Yr 1",
55
+ extraSql="night < 365.5",
56
+ runLength=1,
57
+ )
58
+ )
59
+ bdict.update(
60
+ batches.nvisitsM5Maps(
61
+ colmap,
62
+ opsim,
63
+ slicer=allsky_slicer,
64
+ extraSql="night > 365*3.5 and night < 365*4.5 and scheduler_note not like '%DD%'",
65
+ extraInfoLabel="Yr 3-4",
66
+ runLength=1,
67
+ )
68
+ )
69
+
70
+ # NVisits alt/az LambertSkyMap (all filters, per filter)
71
+ bdict.update(batches.altazLambert(colmap, opsim))
72
+
73
+ # Slew metrics.
74
+ bdict.update(batches.slewBasics(colmap, opsim))
75
+
76
+ # Open shutter metrics.
77
+ bdict.update(batches.openshutterFractions(colmap, opsim))
78
+
79
+ # Some basic nvisits per purpose metrics
80
+ wfd_footprint_mask = np.where(wfd_slicer.mask, 0, 1)
81
+ bdict.update(
82
+ batches.nvisitsPerSubset(
83
+ colmap,
84
+ opsim,
85
+ constraint="visitExposureTime > 19",
86
+ footprintConstraint=wfd_footprint_mask,
87
+ extraInfoLabel="WFD",
88
+ )
89
+ )
90
+ dd_constraint = "scheduler_note like '%DD%'"
91
+ bdict.update(
92
+ batches.nvisitsPerSubset(
93
+ colmap,
94
+ opsim,
95
+ constraint=dd_constraint,
96
+ footprintConstraint=None,
97
+ extraInfoLabel="DDF",
98
+ )
99
+ )
100
+ bdict.update(
101
+ batches.nvisitsPerSubset(
102
+ colmap,
103
+ opsim,
104
+ constraint=None,
105
+ footprintConstraint=None,
106
+ extraInfoLabel="All visits",
107
+ )
108
+ )
109
+
110
+ # Per night and whole survey filter changes.
111
+ bdict.update(batches.filtersPerNight(colmap, opsim, nights=1, extraSql=None))
112
+ bdict.update(batches.filtersWholeSurvey(colmap, opsim, extraSql=None))
113
+
114
+ return bdict
@@ -0,0 +1,558 @@
1
+ """Some basic physical quantity metrics."""
2
+
3
+ __all__ = (
4
+ "metadataBasics",
5
+ "metadataBasicsAngle",
6
+ "allMetadata",
7
+ "metadataMaps",
8
+ "firstYearMetadata",
9
+ )
10
+
11
+ import rubin_sim.maf.metric_bundles as mb
12
+ import rubin_sim.maf.metrics as metrics
13
+ import rubin_sim.maf.slicers as slicers
14
+ import rubin_sim.maf.stackers as stackers
15
+
16
+ from .col_map_dict import col_map_dict
17
+ from .common import (
18
+ combine_info_labels,
19
+ extended_metrics,
20
+ filter_list,
21
+ standard_angle_metrics,
22
+ standard_summary,
23
+ )
24
+
25
+
26
+ def metadataBasics(
27
+ value,
28
+ colmap=None,
29
+ runName="opsim",
30
+ valueName=None,
31
+ groupName=None,
32
+ extraSql=None,
33
+ extraInfoLabel=None,
34
+ slicer=None,
35
+ ):
36
+ """Calculate basic metrics on visit metadata 'value'
37
+ (e.g. airmass, normalized airmass, seeing..).
38
+ Calculates this around the sky (HealpixSlicer),
39
+ makes histograms of all visits (OneDSlicer),
40
+ and calculates statistics on all visits (UniSlicer) for the quantity,
41
+ in all visits and per filter.
42
+
43
+ Currently have a hack for HA & normairmass.
44
+
45
+ Parameters
46
+ ----------
47
+ value : `str`
48
+ The column name for the quantity to evaluate.
49
+ (column name in the database or created by a stacker).
50
+ colmap : `dict` or None, optional
51
+ A dictionary with a mapping of column names.
52
+ runName : `str`, optional
53
+ The name of the simulated survey.
54
+ valueName : `str`, optional
55
+ The name of the value to be reported in the results_db and
56
+ added to the metric.
57
+ This is intended to help standardize metric comparison between
58
+ sim versions.
59
+ value = name as it is in the database (seeingFwhmGeom, etc).
60
+ valueName = name to be recorded ('seeingGeom', etc.).
61
+ groupName : `str`, optional
62
+ The group name for this quantity in the display_dict.
63
+ None will default to the same as 'valueName', capitalized.
64
+ extraSql : `str`, optional
65
+ Additional constraint to add to any sql constraints.
66
+ extraInfoLabel : `str`, optional
67
+ Additional info_labels to add before any below (i.e. "WFD").
68
+ slicer : `rubin_sim.maf.slicers.BaseSlicer`, optional
69
+ Optionally use a different slicer than an nside=64 healpix slicer.
70
+
71
+ Returns
72
+ -------
73
+ metric_bundleDict : `dict` of `maf.MetricBundle`
74
+ """
75
+ if colmap is None:
76
+ colmap = col_map_dict()
77
+ bundleList = []
78
+
79
+ if valueName is None:
80
+ valueName = value
81
+
82
+ if groupName is None:
83
+ groupName = valueName.capitalize()
84
+ subgroup = extraInfoLabel
85
+ else:
86
+ groupName = groupName.capitalize()
87
+ subgroup = valueName.capitalize()
88
+
89
+ if subgroup is None:
90
+ subgroup = "All visits"
91
+
92
+ displayDict = {"group": groupName, "subgroup": subgroup}
93
+
94
+ raCol = colmap["ra"]
95
+ decCol = colmap["dec"]
96
+ degrees = colmap["raDecDeg"]
97
+
98
+ # Set up basic all and per filter sql constraints.
99
+ filterlist, colors, orders, sqls, info_label = filter_list(
100
+ all=True, extra_sql=extraSql, extra_info_label=extraInfoLabel
101
+ )
102
+
103
+ if slicer is not None:
104
+ skyslicer = slicer
105
+ else:
106
+ skyslicer = slicers.HealpixSlicer(nside=64, lon_col=raCol, lat_col=decCol, lat_lon_deg=degrees)
107
+
108
+ # Hack to make HA work, but really need to account for any stackers
109
+ if value == "HA":
110
+ stackerList = [stackers.HourAngleStacker(lst_col=colmap["lst"], ra_col=raCol, degrees=degrees)]
111
+ elif value == "normairmass":
112
+ stackerList = [stackers.NormAirmassStacker(degrees=degrees)]
113
+ else:
114
+ stackerList = None
115
+
116
+ # Summarize values over all and per filter
117
+ # (min/mean/median/max/percentiles/outliers/rms).
118
+ slicer = slicers.UniSlicer()
119
+ for f in filterlist:
120
+ for m in extended_metrics(value, replace_colname=valueName):
121
+ displayDict["caption"] = "%s for %s." % (m.name, info_label[f])
122
+ displayDict["order"] = orders[f]
123
+ bundle = mb.MetricBundle(
124
+ m,
125
+ slicer,
126
+ sqls[f],
127
+ stacker_list=stackerList,
128
+ info_label=info_label[f],
129
+ display_dict=displayDict,
130
+ )
131
+ bundleList.append(bundle)
132
+
133
+ # Histogram values over all and per filter.
134
+ for f in filterlist:
135
+ displayDict["caption"] = "Histogram of %s" % (value)
136
+ if valueName != value:
137
+ displayDict["caption"] += " (%s)" % (valueName)
138
+ displayDict["caption"] += " for %s." % (info_label[f])
139
+ displayDict["order"] = orders[f]
140
+ m = metrics.CountMetric(value, metric_name="%s Histogram" % (valueName))
141
+ slicer = slicers.OneDSlicer(slice_col_name=value)
142
+ bundle = mb.MetricBundle(
143
+ m,
144
+ slicer,
145
+ sqls[f],
146
+ stacker_list=stackerList,
147
+ info_label=info_label[f],
148
+ display_dict=displayDict,
149
+ )
150
+ bundleList.append(bundle)
151
+
152
+ # Make maps of min/median/max for all and per filter,
153
+ # per RA/Dec, with standard summary stats.
154
+ plotDict = {"percentile_clip": 98}
155
+ mList = []
156
+ mList.append(metrics.MinMetric(value, metric_name="Min %s" % (valueName)))
157
+ mList.append(metrics.MedianMetric(value, metric_name="Median %s" % (valueName)))
158
+ mList.append(metrics.MaxMetric(value, metric_name="Max %s" % (valueName)))
159
+ slicer = skyslicer
160
+ for f in filterlist:
161
+ for m in mList:
162
+ displayDict["caption"] = "Map of %s" % m.name
163
+ if valueName != value:
164
+ displayDict["caption"] += " (%s)" % value
165
+ displayDict["caption"] += " for %s." % info_label[f]
166
+ displayDict["order"] = orders[f]
167
+ bundle = mb.MetricBundle(
168
+ m,
169
+ slicer,
170
+ sqls[f],
171
+ stacker_list=stackerList,
172
+ info_label=info_label[f],
173
+ plot_dict=plotDict,
174
+ display_dict=displayDict,
175
+ summary_metrics=standard_summary(),
176
+ )
177
+ bundleList.append(bundle)
178
+
179
+ # Set the run_name for all bundles and return the bundleDict.
180
+ for b in bundleList:
181
+ b.set_run_name(runName)
182
+ return mb.make_bundles_dict_from_list(bundleList)
183
+
184
+
185
+ def metadataBasicsAngle(
186
+ value,
187
+ colmap=None,
188
+ runName="opsim",
189
+ valueName=None,
190
+ groupName=None,
191
+ extraSql=None,
192
+ extraInfoLabel=None,
193
+ slicer=None,
194
+ ):
195
+ """Calculate basic metrics on visit metadata 'value',
196
+ where value is a wrap-around angle.
197
+
198
+ Calculates extended standard metrics (with unislicer) on the quantity
199
+ (all visits and per filter),
200
+ makes histogram of the value (all visits and per filter),
201
+
202
+
203
+ Parameters
204
+ ----------
205
+ value : `str`
206
+ The column name for the quantity to evaluate.
207
+ (column name in the database or created by a stacker).
208
+ colmap : `dict` or None, optional
209
+ A dictionary with a mapping of column names.
210
+ runName : `str`, optional
211
+ The name of the simulated survey.
212
+ valueName : `str`, optional
213
+ The name of the value to be reported in the results_db
214
+ and added to the metric.
215
+ This is intended to help standardize metric comparison
216
+ between sim versions.
217
+ value = name as it is in the database (seeingFwhmGeom, etc).
218
+ valueName = name to be recorded ('seeingGeom', etc.).
219
+ groupName : `str`, optional
220
+ The group name for this quantity in the display_dict.
221
+ None will default to the same as 'valueName', capitalized.
222
+ extraSql : `str`, optional
223
+ Additional constraint to add to any sql constraints.
224
+ extraInfoLabel : `str`, optional
225
+ Additional info_label to add before any below (i.e. "WFD").
226
+ slicer : `rubin_sim.maf.slicer.BaseSlicer` or None, optional
227
+
228
+ Returns
229
+ -------
230
+ metric_bundleDict : `dict` of `maf.MetricBundle`
231
+ """
232
+ if colmap is None:
233
+ colmap = col_map_dict()
234
+ bundleList = []
235
+
236
+ if valueName is None:
237
+ valueName = value
238
+
239
+ if groupName is None:
240
+ groupName = valueName.capitalize()
241
+ subgroup = extraInfoLabel
242
+ else:
243
+ groupName = groupName.capitalize()
244
+ subgroup = valueName.capitalize()
245
+
246
+ if subgroup is None:
247
+ subgroup = "All visits"
248
+
249
+ displayDict = {"group": groupName, "subgroup": subgroup}
250
+
251
+ raCol = colmap["ra"]
252
+ decCol = colmap["dec"]
253
+ degrees = colmap["raDecDeg"]
254
+ # Set up basic all and per filter sql constraints.
255
+ filterlist, colors, orders, sqls, info_label = filter_list(
256
+ all=True, extra_sql=extraSql, extra_info_label=extraInfoLabel
257
+ )
258
+
259
+ if slicer is not None:
260
+ skyslicer = slicer
261
+ else:
262
+ skyslicer = slicers.HealpixSlicer(nside=64, lon_col=raCol, lat_col=decCol, lat_lon_deg=degrees)
263
+
264
+ # Summarize values over all and per filter.
265
+ slicer = slicers.UniSlicer()
266
+ for f in filterlist:
267
+ for m in standard_angle_metrics(value, replace_colname=valueName):
268
+ displayDict["caption"] = "%s for %s." % (m.name, info_label[f])
269
+ displayDict["order"] = orders[f]
270
+ bundle = mb.MetricBundle(
271
+ m,
272
+ slicer,
273
+ sqls[f],
274
+ info_label=info_label[f],
275
+ display_dict=displayDict,
276
+ )
277
+ bundleList.append(bundle)
278
+
279
+ # Histogram values over all and per filter.
280
+ for f in filterlist:
281
+ displayDict["caption"] = "Histogram of %s" % (value)
282
+ if valueName != value:
283
+ displayDict["caption"] += " (%s)" % (valueName)
284
+ displayDict["caption"] += " for %s." % (info_label[f])
285
+ displayDict["order"] = orders[f]
286
+ m = metrics.CountMetric(value, metric_name="%s Histogram" % (valueName))
287
+ slicer = slicers.OneDSlicer(slice_col_name=value)
288
+ bundle = mb.MetricBundle(
289
+ m,
290
+ slicer,
291
+ sqls[f],
292
+ info_label=info_label[f],
293
+ display_dict=displayDict,
294
+ )
295
+ bundleList.append(bundle)
296
+
297
+ # Make maps of min/median/max for all and per filter,
298
+ # per RA/Dec, with standard summary stats.
299
+ mList = []
300
+ mList.append(metrics.MeanAngleMetric(value, metric_name="AngleMean %s" % (valueName)))
301
+ mList.append(metrics.FullRangeAngleMetric(value, metric_name="AngleRange %s" % (valueName)))
302
+ mList.append(metrics.RmsAngleMetric(value, metric_name="AngleRms %s" % (valueName)))
303
+ plotDict = {"percentile_clip": 98}
304
+ slicer = skyslicer
305
+ for f in filterlist:
306
+ for m in mList:
307
+ displayDict["caption"] = "Map of %s" % m.name
308
+ if valueName != value:
309
+ displayDict["caption"] += " (%s)" % value
310
+ displayDict["caption"] += " for %s." % info_label[f]
311
+ displayDict["order"] = orders[f]
312
+ bundle = mb.MetricBundle(
313
+ m,
314
+ slicer,
315
+ sqls[f],
316
+ info_label=info_label[f],
317
+ plot_dict=plotDict,
318
+ display_dict=displayDict,
319
+ summary_metrics=standard_summary(),
320
+ )
321
+ bundleList.append(bundle)
322
+
323
+ # Set the run_name for all bundles and return the bundleDict.
324
+ for b in bundleList:
325
+ b.set_run_name(runName)
326
+ return mb.make_bundles_dict_from_list(bundleList)
327
+
328
+
329
+ def allMetadata(colmap=None, runName="opsim", extraSql=None, extraInfoLabel=None, slicer=None):
330
+ """Generate a large set of metrics about the metadata of each visit -
331
+ distributions of airmass, normalized airmass, seeing, sky brightness,
332
+ single visit depth, hour angle, distance to the moon, and solar elongation.
333
+ The exact metadata which is analyzed is set by the colmap['metadataList'].
334
+
335
+ Parameters
336
+ ----------
337
+ colmap : `dict` or None, optional
338
+ A dictionary with a mapping of column names.
339
+ runName : `str`, optional
340
+ The name of the simulated survey.
341
+ extraSql : `str`, optional
342
+ Sql constraint (such as WFD only).
343
+ extraInfoLabel : `str`, optional
344
+ Metadata to identify the sql constraint (such as WFD).
345
+ slicer : `rubin_sim.maf.slicer.BaseSlicer` or None, optional
346
+ Optionally use something other than an nside=64 healpix slicer.
347
+
348
+ Returns
349
+ -------
350
+ metric_bundleDict : `dict` of `maf.MetricBundle`
351
+ """
352
+
353
+ if colmap is None:
354
+ colmap = col_map_dict()
355
+
356
+ bdict = {}
357
+
358
+ for valueName in colmap["metadataList"]:
359
+ if valueName in colmap:
360
+ value = colmap[valueName]
361
+ else:
362
+ value = valueName
363
+ mdict = metadataBasics(
364
+ value,
365
+ colmap=colmap,
366
+ runName=runName,
367
+ valueName=valueName,
368
+ extraSql=extraSql,
369
+ extraInfoLabel=extraInfoLabel,
370
+ slicer=slicer,
371
+ )
372
+ bdict.update(mdict)
373
+ for valueName in colmap["metadataAngleList"]:
374
+ if valueName in colmap:
375
+ value = colmap[valueName]
376
+ else:
377
+ value = valueName
378
+ mdict = metadataBasicsAngle(
379
+ value,
380
+ colmap=colmap,
381
+ runName=runName,
382
+ valueName=valueName,
383
+ extraSql=extraSql,
384
+ extraInfoLabel=extraInfoLabel,
385
+ slicer=slicer,
386
+ )
387
+ bdict.update(mdict)
388
+ return bdict
389
+
390
+
391
+ def metadataMaps(
392
+ value,
393
+ colmap=None,
394
+ runName="opsim",
395
+ valueName=None,
396
+ groupName=None,
397
+ extraSql=None,
398
+ extraInfoLabel=None,
399
+ slicer=None,
400
+ ):
401
+ """Calculate 25/50/75 percentile values on maps across sky
402
+ for a single metadata value.
403
+
404
+ Parameters
405
+ ----------
406
+ value : `str`
407
+ The column name for the quantity to evaluate.
408
+ (column name in the database or created by a stacker).
409
+ colmap : `dict` or None, optional
410
+ A dictionary with a mapping of column names.
411
+ runName : `str`, optional
412
+ The name of the simulated survey.
413
+ valueName : `str`, optional
414
+ The name of the value to be reported in the results_db
415
+ and added to the metric.
416
+ This is intended to help standardize metric comparison
417
+ between sim versions.
418
+ value = name as it is in the database (seeingFwhmGeom, etc).
419
+ valueName = name to be recorded ('seeingGeom', etc.).
420
+ groupName : `str`, optional
421
+ The group name for this quantity in the display_dict.
422
+ extraSql : `str`, optional
423
+ Additional constraint to add to any sql constraints.
424
+ extraInfoLabel : `str`, optional
425
+ Additional info_label to add before any below (i.e. "WFD").
426
+ slicer : `rubin_sim.maf.slicer.BaseSlicer` or None, optional
427
+ Optionally use something other than an nside=64 HealpixSlicer
428
+
429
+ Returns
430
+ -------
431
+ metric_bundleDict : `dict` of `maf.MetricBundle`
432
+ """
433
+ if colmap is None:
434
+ colmap = col_map_dict()
435
+ bundleList = []
436
+
437
+ if valueName is None:
438
+ valueName = value
439
+
440
+ if groupName is None:
441
+ groupName = valueName.capitalize()
442
+ subgroup = extraInfoLabel
443
+ else:
444
+ groupName = groupName.capitalize()
445
+ subgroup = valueName.capitalize()
446
+
447
+ if subgroup is None:
448
+ subgroup = "All visits"
449
+
450
+ displayDict = {"group": groupName, "subgroup": subgroup}
451
+
452
+ ra_col = colmap["ra"]
453
+ dec_col = colmap["dec"]
454
+ degrees = colmap["raDecDeg"]
455
+ # Set up basic all and per filter sql constraints.
456
+ filterlist, colors, orders, sqls, info_label = filter_list(
457
+ all=True, extra_sql=extraSql, extra_info_label=extraInfoLabel
458
+ )
459
+
460
+ # Hack to make HA work, but really need to account for any stackers
461
+ if value == "HA":
462
+ stackerList = [stackers.HourAngleStacker(lst_col=colmap["lst"], ra_col=ra_col, degrees=degrees)]
463
+ elif value == "normairmass":
464
+ stackerList = [stackers.NormAirmassStacker(degrees=degrees)]
465
+ else:
466
+ stackerList = None
467
+
468
+ # Make maps of 25/median/75 for all and per filter,
469
+ # per RA/Dec, with standard summary stats.
470
+ mList = []
471
+ mList.append(
472
+ metrics.PercentileMetric(value, percentile=25, metric_name="25thPercentile %s" % (valueName))
473
+ )
474
+ mList.append(metrics.MedianMetric(value, metric_name="Median %s" % (valueName)))
475
+ mList.append(
476
+ metrics.PercentileMetric(value, percentile=75, metric_name="75thPercentile %s" % (valueName))
477
+ )
478
+ if slicer is None:
479
+ slicer = slicers.HealpixSlicer(nside=64, lat_col=dec_col, lon_col=ra_col, lat_lon_deg=degrees)
480
+
481
+ for f in filterlist:
482
+ for m in mList:
483
+ displayDict["caption"] = "Map of %s" % m.name
484
+ if valueName != value:
485
+ displayDict["caption"] += " (%s)" % value
486
+ displayDict["caption"] += " for %s." % info_label[f]
487
+ displayDict["order"] = orders[f]
488
+ bundle = mb.MetricBundle(
489
+ m,
490
+ slicer,
491
+ sqls[f],
492
+ stacker_list=stackerList,
493
+ info_label=info_label[f],
494
+ display_dict=displayDict,
495
+ summary_metrics=standard_summary(),
496
+ )
497
+ bundleList.append(bundle)
498
+
499
+ # Set the run_name for all bundles and return the bundleDict.
500
+ for b in bundleList:
501
+ b.set_run_name(runName)
502
+
503
+ return mb.make_bundles_dict_from_list(bundleList)
504
+
505
+
506
+ def firstYearMetadata(colmap=None, runName="opsim", extraSql=None, extraInfoLabel=None, slicer=None):
507
+ """Measure the distribution of some basic metadata in the first year
508
+ of operations -
509
+ distributions of airmass, seeing, sky brightness, single visit depth.
510
+
511
+ Parameters
512
+ ----------
513
+ colmap : `dict` or None, optional
514
+ A dictionary with a mapping of column names.
515
+ runName : `str`, optional
516
+ The name of the simulated survey.
517
+ extraSql : `str`, optional
518
+ Sql constraint (such as WFD only).
519
+ extraInfoLabel : `str`, optional
520
+ Metadata to identify the sql constraint (such as WFD).
521
+ slicer : `rubin_sim.maf.slicer.BaseSlicer` or None, optional
522
+ Optionally use something other than an nside=64 healpix slicer.
523
+
524
+ Returns
525
+ -------
526
+ metric_bundleDict : `dict` of `maf.MetricBundle`
527
+ """
528
+
529
+ if colmap is None:
530
+ colmap = col_map_dict()
531
+
532
+ bdict = {}
533
+
534
+ firstYr = "night < 365.5"
535
+ if extraSql is not None:
536
+ extraSql = f"({firstYr}) and ({extraSql})"
537
+ else:
538
+ extraSql = firstYr
539
+ extraInfoLabel = combine_info_labels("Yr 1", extraInfoLabel)
540
+
541
+ subset = ["airmass", "seeingEff", "seeingGeom", "skyBrightness", "fiveSigmaDepth"]
542
+ for valueName in subset:
543
+ if valueName in colmap:
544
+ value = colmap[valueName]
545
+ else:
546
+ value = valueName
547
+ mdict = metadataBasics(
548
+ value,
549
+ colmap=colmap,
550
+ runName=runName,
551
+ valueName=valueName,
552
+ extraSql=extraSql,
553
+ extraInfoLabel=extraInfoLabel,
554
+ slicer=slicer,
555
+ )
556
+ bdict.update(mdict)
557
+
558
+ return bdict