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,728 @@
1
+ __all__ = ("ddfBatch",)
2
+
3
+ import healpy as hp
4
+ import numpy as np
5
+ from rubin_scheduler.utils import (
6
+ angular_separation,
7
+ ddf_locations,
8
+ ddf_locations_pre3_5,
9
+ hpid2_ra_dec,
10
+ sample_patch_on_sphere,
11
+ )
12
+
13
+ import rubin_sim.maf as maf
14
+
15
+ from .col_map_dict import col_map_dict
16
+ from .common import lightcurve_summary
17
+
18
+
19
+ def ddfBatch(
20
+ run_name="run_name",
21
+ nside=512,
22
+ radius=2.1,
23
+ nside_sne=128,
24
+ extra_sql=None,
25
+ extra_info_label=None,
26
+ old_coords=False,
27
+ colmap=col_map_dict(),
28
+ ):
29
+ """
30
+ A set of metrics to evaluate DDF fields.
31
+
32
+ Parameters
33
+ ----------
34
+ run_name : `str`, optional
35
+ The name of the simulation (for plot titles and file outputs).
36
+ nside : `int`, optional
37
+ The HEALpix nside to run most of the metrics on.
38
+ radius : `float`
39
+ The radius to select around each ddf (degrees).
40
+ The default value of 2.1 degrees has been chosen to balance
41
+ selecting a large enough area to ensure gathering all of the double
42
+ Euclid field or a run with large dithers,
43
+ while not including too much background area (which can
44
+ skew metrics of the median number of visits, etc.).
45
+ nside_sne : `int`, optional
46
+ The HEALpix nside to use with the SNe metric. The default is lower
47
+ than the default nside for other metrics, as the SNe metric is
48
+ more computationally expensive.
49
+ extra_sql : `str`, optional
50
+ Additional sql constraint (such as night<=365) to add to the
51
+ necessary sql constraints for each metric.
52
+ extra_info_label : `str`, optional
53
+ Additional description information to add (alongside the extra_sql)
54
+ old_coords : `bool`
55
+ Use the default locations for the DDFs from pre-July 2024.
56
+ Default False.
57
+
58
+ Returns
59
+ -------
60
+ metric_bundleDict : `dict` of `maf.MetricBundle`
61
+ """
62
+
63
+ bundle_list = []
64
+
65
+ # Define the slicer to use for each DDF
66
+ # Get standard DDF locations and reformat information as a dictionary
67
+ ddfs = {}
68
+ if old_coords:
69
+ ddfs_rough = ddf_locations_pre3_5()
70
+ else:
71
+ ddfs_rough = ddf_locations()
72
+ for ddf in ddfs_rough:
73
+ ddfs[ddf] = {"ra": ddfs_rough[ddf][0], "dec": ddfs_rough[ddf][1]}
74
+ # Combine the Euclid double-field into one - but with two ra/dec values
75
+ ddfs["EDFS"] = {
76
+ "ra": [ddfs["EDFS_a"]["ra"], ddfs["EDFS_b"]["ra"]],
77
+ "dec": [ddfs["EDFS_a"]["dec"], ddfs["EDFS_b"]["dec"]],
78
+ }
79
+ del ddfs["EDFS_a"]
80
+ del ddfs["EDFS_b"]
81
+ # Let's include an arbitrary point that should be in the WFD for comparison
82
+ ddfs["WFD"] = {"ra": 0, "dec": -20.0}
83
+
84
+ ra, dec = hpid2_ra_dec(nside, np.arange(hp.nside2npix(nside)))
85
+ ra_sne, dec_sne = hpid2_ra_dec(nside_sne, np.arange(hp.nside2npix(nside_sne)))
86
+
87
+ ddf_slicers = {}
88
+ ddf_slicers_sne = {}
89
+ for ddf in ddfs:
90
+ # Define the healpixels to use for this DDF
91
+ if np.size(ddfs[ddf]["ra"]) > 1:
92
+ goods = []
93
+ goods_sne = []
94
+ for ddf_ra, ddf_dec in zip(ddfs[ddf]["ra"], ddfs[ddf]["dec"]):
95
+ dist = angular_separation(ra, dec, ddf_ra, ddf_dec)
96
+ goods.append(np.where(dist <= radius)[0])
97
+ dist = angular_separation(ra_sne, dec_sne, ddf_ra, ddf_dec)
98
+ goods_sne.append(np.where(dist <= radius)[0])
99
+ good = np.unique(np.concatenate(goods))
100
+ good_sne = np.unique(np.concatenate(goods_sne))
101
+ else:
102
+ dist = angular_separation(ra, dec, np.mean(ddfs[ddf]["ra"]), np.mean(ddfs[ddf]["dec"]))
103
+ good = np.where(dist <= radius)[0]
104
+ dist = angular_separation(ra_sne, dec_sne, np.mean(ddfs[ddf]["ra"]), np.mean(ddfs[ddf]["dec"]))
105
+ good_sne = np.where(dist <= radius)[0]
106
+ ddf_slicers_sne[ddf] = maf.HealpixSubsetSlicer(nside_sne, good_sne, use_cache=False)
107
+ ddf_slicers[ddf] = maf.HealpixSubsetSlicer(nside, good, use_cache=False)
108
+
109
+ # Now define metrics
110
+
111
+ # Set up basic all and per filter sql constraints.
112
+ band_col = colmap["filter"]
113
+ filterlist, colors, orders, sqls, info_labels = maf.filter_list(
114
+ all=True,
115
+ extra_sql=extra_sql,
116
+ extra_info_label=extra_info_label,
117
+ band_col=band_col,
118
+ )
119
+
120
+ summary_stats = [maf.MeanMetric(), maf.MedianMetric(), maf.SumMetric()]
121
+ depth_stats = [maf.MedianMetric()]
122
+
123
+ plotFuncs = [maf.HealpixSkyMap()]
124
+
125
+ displayDict = {"group": "", "subgroup": "", "order": 0}
126
+
127
+ order = 0
128
+ for ddf in ddfs:
129
+ fieldname = ddf
130
+ if not (fieldname.startswith("DD")):
131
+ fieldname = f"DD:{fieldname}"
132
+
133
+ plotDict = {
134
+ "visufunc": hp.gnomview,
135
+ "rot": (np.mean(ddfs[ddf]["ra"]), np.mean(ddfs[ddf]["dec"]), 0),
136
+ "xsize": 500,
137
+ }
138
+ order += 1
139
+
140
+ # Number of SNe
141
+ displayDict["group"] = "SNe"
142
+ displayDict["subgroup"] = "N SNe"
143
+ displayDict["caption"] = f"SNIa in the {fieldname} DDF."
144
+ displayDict["order"] = order
145
+
146
+ metric = maf.metrics.SNNSNMetric(
147
+ verbose=False,
148
+ n_bef=4,
149
+ n_aft=10,
150
+ zmin=0.1,
151
+ zmax=1.1,
152
+ z_step=0.03,
153
+ daymax_step=3,
154
+ coadd_night=True,
155
+ gamma_name="gamma_DDF.hdf5",
156
+ # have to add field name here, to avoid reduceDict key collissions
157
+ metric_name=f"SNNSNMetric {fieldname}",
158
+ )
159
+ bundle_list.append(
160
+ maf.MetricBundle(
161
+ metric,
162
+ ddf_slicers_sne[ddf],
163
+ constraint="",
164
+ info_label=" ".join([fieldname, "all bands, only DDF observations"]),
165
+ plot_dict=plotDict,
166
+ plot_funcs=plotFuncs,
167
+ summary_metrics=summary_stats,
168
+ display_dict=displayDict,
169
+ )
170
+ )
171
+ # Strong lensed SNe
172
+ displayDict["group"] = "SNe"
173
+ displayDict["subgroup"] = "SL SNe"
174
+ displayDict["caption"] = f"Strongly Lensed SN metric in the {fieldname} DDF."
175
+ displayDict["order"] = order
176
+ metric = maf.SNSLMetric(filter_col=band_col)
177
+ bundle_list.append(
178
+ maf.MetricBundle(
179
+ metric,
180
+ ddf_slicers[ddf],
181
+ constraint=sqls["all"],
182
+ info_label=" ".join([fieldname, info_labels["all"]]),
183
+ plot_dict=plotDict,
184
+ plot_funcs=plotFuncs,
185
+ summary_metrics=summary_stats,
186
+ display_dict=displayDict,
187
+ )
188
+ )
189
+
190
+ # KNe
191
+
192
+ delta = 5.0 # degrees
193
+ n_kne = 5000
194
+ displayDict["group"] = "KNe"
195
+ displayDict["subgroup"] = ""
196
+ displayDict["caption"] = f"Number of KNe in the {fieldname} DDF from %i injected." % n_kne
197
+
198
+ ra, dec = sample_patch_on_sphere(
199
+ np.mean(ddfs[ddf]["ra"]), np.mean(ddfs[ddf]["dec"]), delta, n_kne, seed=1
200
+ )
201
+
202
+ metric = maf.KNePopMetric(metric_name="KNePopMetric_%s" % fieldname, filter_col=band_col)
203
+ slicer = maf.generate_kn_pop_slicer(n_events=n_kne, ra=ra, dec=dec)
204
+
205
+ bundle_list.append(
206
+ maf.MetricBundle(
207
+ metric,
208
+ slicer,
209
+ "",
210
+ info_label=" ".join([fieldname]),
211
+ summary_metrics=lightcurve_summary(),
212
+ display_dict=displayDict,
213
+ plot_funcs=[],
214
+ )
215
+ )
216
+
217
+ # kuiper metric
218
+ displayDict["group"] = "Kuiper"
219
+ displayDict["subgroup"] = ""
220
+ displayDict["caption"] = f"Kuiper metric in the {fieldname} DDF."
221
+
222
+ sqls_gri = {
223
+ "gri": f"{band_col}='g' or {band_col}='r' or {band_col}='i'",
224
+ "riz": f"{band_col}='r' or {band_col}='i' or {band_col}='z'",
225
+ }
226
+
227
+ for sql in sqls_gri:
228
+ metrics = [
229
+ maf.KuiperMetric(
230
+ "rotSkyPos",
231
+ metric_name=f"Kuiper statistic (0 is uniform, 1 is delta function),rotSkyPos,{fieldname},"
232
+ + sql,
233
+ ),
234
+ maf.KuiperMetric(
235
+ "rotTelPos",
236
+ metric_name=f"Kuiper statistic (0 is uniform, 1 is delta function),rotTelPos,{fieldname},"
237
+ + sql,
238
+ ),
239
+ ]
240
+ for metric in metrics:
241
+ bundle_list.append(
242
+ maf.MetricBundle(
243
+ metric,
244
+ ddf_slicers[ddf],
245
+ sqls_gri[sql],
246
+ info_label=" ".join([fieldname]),
247
+ plot_dict=plotDict,
248
+ plot_funcs=plotFuncs,
249
+ summary_metrics=summary_stats,
250
+ display_dict=displayDict,
251
+ )
252
+ )
253
+
254
+ # Weak lensing visits
255
+ lim_ebv = 0.2
256
+ mag_cuts = 26.0
257
+ displayDict["group"] = "Weak Lensing"
258
+ displayDict["subgroup"] = ""
259
+ displayDict["caption"] = f"Weak lensing metric in the {fieldname} DDF."
260
+
261
+ sqls_gri = {
262
+ "gri": f"{band_col}='g' or {band_col}='r' or {band_col}='i'",
263
+ "riz": f"{band_col}='r' or {band_col}='i' or {band_col}='z'",
264
+ }
265
+
266
+ for sql in sqls_gri:
267
+ metric = maf.WeakLensingNvisits(
268
+ lsst_filter="i",
269
+ depth_cut=mag_cuts,
270
+ ebvlim=lim_ebv,
271
+ min_exp_time=20.0,
272
+ filter_col=band_col,
273
+ metric_name="WeakLensingNvisits_" + sql,
274
+ )
275
+ bundle_list.append(
276
+ maf.MetricBundle(
277
+ metric,
278
+ ddf_slicers[ddf],
279
+ sqls_gri[sql],
280
+ info_label=" ".join([fieldname, sql]),
281
+ plot_dict=plotDict,
282
+ plot_funcs=plotFuncs,
283
+ summary_metrics=summary_stats,
284
+ display_dict=displayDict,
285
+ )
286
+ )
287
+
288
+ # Number of QSOs in each band
289
+ displayDict["group"] = "QSO"
290
+ displayDict["subgroup"] = "Number"
291
+ displayDict["caption"] = f"Number of QSO in the {fieldname} DDF."
292
+ zmin = 0.3
293
+ extinction_cut = 1.0
294
+ for f in "ugrizy":
295
+ displayDict["order"] = orders[f]
296
+ summaryMetrics = [maf.SumMetric(metric_name="Total QSO")]
297
+ metric = maf.QSONumberCountsMetric(
298
+ f,
299
+ units="mag",
300
+ extinction_cut=extinction_cut,
301
+ qlf_module="Shen20",
302
+ qlf_model="A",
303
+ sed_model="Richards06",
304
+ zmin=zmin,
305
+ zmax=None,
306
+ filter_col=band_col,
307
+ )
308
+ stacker_list = [maf.SaturationStacker(filter_col=band_col)]
309
+ bundle_list.append(
310
+ maf.MetricBundle(
311
+ metric,
312
+ ddf_slicers[ddf],
313
+ sqls[f],
314
+ stacker_list=stacker_list,
315
+ info_label=" ".join([fieldname, info_labels[f]]),
316
+ plot_dict=plotDict,
317
+ plot_funcs=plotFuncs,
318
+ summary_metrics=summaryMetrics,
319
+ display_dict=displayDict,
320
+ )
321
+ )
322
+
323
+ # Run the TimeLag for each filter *and* all filters
324
+ displayDict["group"] = "QSO"
325
+ displayDict["subgroup"] = "TimeLags"
326
+ nquist_threshold = 2.2
327
+ lag = 100
328
+ summaryMetrics = [maf.MeanMetric(), maf.MedianMetric(), maf.RmsMetric()]
329
+ m = maf.AgnTimeLagMetric(threshold=nquist_threshold, lag=lag, filter_col=band_col)
330
+ for f in filterlist:
331
+ displayDict["order"] = orders[f]
332
+ displayDict["caption"] = (
333
+ f"Comparion of the time between visits compared to a defined sampling gap ({lag} days) in "
334
+ f"{f} band."
335
+ )
336
+ bundle_list.append(
337
+ maf.MetricBundle(
338
+ m,
339
+ ddf_slicers[ddf],
340
+ constraint=sqls[f],
341
+ info_label=" ".join([fieldname, info_labels[f]]),
342
+ run_name=run_name,
343
+ plot_dict=plotDict,
344
+ plot_funcs=plotFuncs,
345
+ summary_metrics=summaryMetrics,
346
+ display_dict=displayDict,
347
+ )
348
+ )
349
+
350
+ # Run the TimeLag for each filter *and* all filters
351
+ displayDict["group"] = "QSO"
352
+ displayDict["subgroup"] = "TimeLags"
353
+ nquist_threshold = 2.2
354
+ lag = 5
355
+ summaryMetrics = [maf.MeanMetric(), maf.MedianMetric(), maf.RmsMetric()]
356
+ m = maf.AgnTimeLagMetric(threshold=nquist_threshold, lag=lag, filter_col=band_col)
357
+ for f in filterlist:
358
+ displayDict["order"] = orders[f]
359
+ displayDict["caption"] = (
360
+ f"Comparion of the time between visits compared to a defined sampling gap ({lag} days) in "
361
+ f"{f} band."
362
+ )
363
+ bundle_list.append(
364
+ maf.MetricBundle(
365
+ m,
366
+ ddf_slicers[ddf],
367
+ constraint=sqls[f],
368
+ info_label=" ".join([fieldname, info_labels[f]]),
369
+ run_name=run_name,
370
+ plot_dict=plotDict,
371
+ plot_funcs=plotFuncs,
372
+ summary_metrics=summaryMetrics,
373
+ display_dict=displayDict,
374
+ )
375
+ )
376
+
377
+ # AGN structure function
378
+ displayDict["group"] = "QSO"
379
+ displayDict["subgroup"] = "Structure Function"
380
+ agn_mags = {"u": 22.0, "g": 24, "r": 24, "i": 24, "z": 22, "y": 22}
381
+ for f in "ugrizy":
382
+ displayDict["order"] = orders[f]
383
+ displayDict["caption"] = f"AGN Structure Function Error in {f} band in the {fieldname} DDF."
384
+ summaryMetrics = [maf.MedianMetric(), maf.RmsMetric()]
385
+ metric = maf.SFUncertMetric(
386
+ mag=agn_mags[f],
387
+ bins=np.logspace(0, np.log10(3650), 21),
388
+ filter_col=band_col,
389
+ )
390
+ bundle_list.append(
391
+ maf.MetricBundle(
392
+ metric,
393
+ ddf_slicers[ddf],
394
+ sqls[f],
395
+ info_label=" ".join([fieldname, info_labels[f]]),
396
+ plot_dict=plotDict,
397
+ plot_funcs=plotFuncs,
398
+ summary_metrics=summaryMetrics,
399
+ display_dict=displayDict,
400
+ )
401
+ )
402
+ #######
403
+ # Coadded depth per filter, and count per filter
404
+ displayDict["group"] = "Basics"
405
+ for f in "ugrizy":
406
+ displayDict["subgroup"] = "Coadd M5"
407
+ displayDict["order"] = orders[f]
408
+ displayDict["caption"] = f"Coadded m5 in {f} band in the {fieldname} DDF."
409
+ metric = maf.Coaddm5Metric(metric_name=f"{fieldname} CoaddM5", filter_col=band_col)
410
+ bundle_list.append(
411
+ maf.MetricBundle(
412
+ metric,
413
+ ddf_slicers[ddf],
414
+ sqls[f],
415
+ info_label=info_labels[f],
416
+ plot_dict=plotDict,
417
+ run_name=run_name,
418
+ plot_funcs=plotFuncs,
419
+ summary_metrics=depth_stats,
420
+ display_dict=displayDict,
421
+ )
422
+ )
423
+ displayDict["subgroup"] = "N Visits"
424
+ displayDict["caption"] = f"Number of visits in the {f} band in the {fieldname} DDF."
425
+ metric = maf.CountMetric(col="observationStartMJD", units="#", metric_name=f"{fieldname} NVisits")
426
+ bundle_list.append(
427
+ maf.MetricBundle(
428
+ metric,
429
+ ddf_slicers[ddf],
430
+ sqls[f],
431
+ info_label=info_labels[f],
432
+ plot_dict=plotDict,
433
+ run_name=run_name,
434
+ plot_funcs=plotFuncs,
435
+ summary_metrics=depth_stats,
436
+ display_dict=displayDict,
437
+ )
438
+ )
439
+ # Count over all filter
440
+ displayDict["subgroup"] = "N Visits"
441
+ displayDict["order"] = orders["all"]
442
+ displayDict["caption"] = f"Number of visits in all bands in the {fieldname} DDF."
443
+ metric = maf.CountMetric(col="observationStartMJD", units="#", metric_name=f"{fieldname} NVisits")
444
+ bundle_list.append(
445
+ maf.MetricBundle(
446
+ metric,
447
+ ddf_slicers[ddf],
448
+ constraint=sqls["all"],
449
+ info_label=info_labels["all"],
450
+ plot_dict=plotDict,
451
+ run_name=run_name,
452
+ plot_funcs=plotFuncs,
453
+ summary_metrics=depth_stats,
454
+ display_dict=displayDict,
455
+ )
456
+ )
457
+ # Count number of unique nights with visits
458
+ displayDict["group"] = "Cadence"
459
+ displayDict["subgroup"] = "N Nights"
460
+ displayDict["order"] = orders["all"]
461
+ displayDict["caption"] = f"Number of nights with visits in the {fieldname} DDF."
462
+ metric = maf.CountUniqueMetric(col="night", units="#", metric_name=f"{fieldname} N Unique Nights")
463
+ bundle_list.append(
464
+ maf.MetricBundle(
465
+ metric,
466
+ ddf_slicers[ddf],
467
+ constraint=sqls["all"],
468
+ info_label=info_labels["all"],
469
+ plot_dict=plotDict,
470
+ run_name=run_name,
471
+ plot_funcs=plotFuncs,
472
+ summary_metrics=depth_stats,
473
+ display_dict=displayDict,
474
+ )
475
+ )
476
+
477
+ # Now to compute some things ~~at just the center of the DDF~~ NOPE
478
+ # (will compute these "per DDF" not just at the center, since
479
+ # the dithering pattern is not yet set and that will influence the
480
+ # result -- once dithering is better determined, could add ptslicer).
481
+ # For these metrics, add a requirement that the 'note' label
482
+ # match the DDF, to avoid WFD visits skewing the results
483
+ # (we want to exclude non-DD visits),
484
+
485
+ if fieldname == "WFD":
486
+ ptslicer = maf.UserPointsSlicer(np.mean(ddfs[ddf]["ra"]), np.mean(ddfs[ddf]["dec"]))
487
+ else:
488
+ ptslicer = maf.UniSlicer() # rely on query to remove non-DD visits
489
+ # Add RA and Dec to slice_point data (for season calculations)
490
+ # slice_points store ra/dec internally in radians.
491
+ ptslicer.slice_points["ra"] = np.radians(np.mean(ddfs[ddf]["ra"]))
492
+ ptslicer.slice_points["dec"] = np.radians(np.mean(ddfs[ddf]["dec"]))
493
+
494
+ displayDict["group"] = "Cadence"
495
+ displayDict["order"] = order
496
+
497
+ fieldsqls = {}
498
+ if ddf == "WFD":
499
+ for f in filterlist:
500
+ fieldsqls[f] = sqls[f]
501
+ else:
502
+ fieldsql = f"scheduler_note like '%{fieldname}%'"
503
+ for f in filterlist:
504
+ if len(sqls[f]) > 0:
505
+ fieldsqls[f] = fieldsql + " and " + sqls[f]
506
+ else:
507
+ fieldsqls[f] = fieldsql
508
+
509
+ displayDict["subgroup"] = "Sequence length"
510
+
511
+ # Number of observations per night, any filter (sequence length)
512
+ # Histogram the number of visits per night
513
+ countbins = np.arange(0, 200, 5)
514
+ metric = maf.NVisitsPerNightMetric(
515
+ night_col="night",
516
+ bins=countbins,
517
+ metric_name=f"{fieldname} NVisitsPerNight",
518
+ )
519
+ plotDict = {"bins": countbins, "xlabel": "Number of visits per night"}
520
+ displayDict["caption"] = "Histogram of the number of visits in each night per DDF."
521
+ plotFunc = maf.SummaryHistogram()
522
+ bundle = maf.MetricBundle(
523
+ metric,
524
+ ptslicer,
525
+ fieldsqls["all"],
526
+ info_label=info_labels["all"],
527
+ plot_dict=plotDict,
528
+ display_dict=displayDict,
529
+ plot_funcs=[plotFunc],
530
+ )
531
+ bundle_list.append(bundle)
532
+
533
+ # Coadded depth of observations per night, each filter
534
+ # "magic numbers" to fill plot come from baseline v3.4
535
+ min_coadds = {"u": 22.3, "g": 22.3, "r": 22.9, "i": 23.1, "z": 21.7, "y": 21.5}
536
+ max_coadds = {"u": 26, "g": 27.2, "r": 27, "i": 26.5, "z": 26.5, "y": 25.1}
537
+ # Histogram the coadded depth per night, per filter
538
+ for f in "ugrizy":
539
+ magbins = np.arange(min_coadds[f], max_coadds[f], 0.05)
540
+ metric = maf.CoaddM5PerNightMetric(
541
+ night_col="night",
542
+ m5_col="fiveSigmaDepth",
543
+ bins=magbins,
544
+ metric_name=f"{fieldname} CoaddM5PerNight",
545
+ )
546
+ plotDict = {"bins": magbins, "xlabel": "Coadded Depth Per Night"}
547
+ displayDict["caption"] = f"Histogram of the coadded depth in {f} in each night per DDF."
548
+ displayDict["order"] = orders[f]
549
+ plotFunc = maf.SummaryHistogram()
550
+ bundle = maf.MetricBundle(
551
+ metric,
552
+ ptslicer,
553
+ fieldsqls[f],
554
+ info_label=info_labels[f],
555
+ plot_dict=plotDict,
556
+ display_dict=displayDict,
557
+ plot_funcs=[plotFunc],
558
+ )
559
+ bundle_list.append(bundle)
560
+
561
+ # Plot of number of visits per night over time
562
+ if fieldname.endswith("WFD"):
563
+ pass
564
+ else:
565
+ displayDict["caption"] = f"Number of visits per night for {fieldname}."
566
+ displayDict["order"] = orders[f]
567
+ metric = maf.CountMetric("observationStartMJD", metric_name=f"{fieldname} Nvisits Per Night")
568
+ slicer = maf.OneDSlicer(slice_col_name="night", bin_size=1, badval=0)
569
+ plot_dict = {"filled_data": True}
570
+ bundle = maf.MetricBundle(
571
+ metric,
572
+ slicer,
573
+ fieldsqls["all"],
574
+ info_label=info_labels["all"],
575
+ plot_dict=plot_dict,
576
+ display_dict=displayDict,
577
+ summary_metrics=[
578
+ maf.MedianMetric(),
579
+ maf.PercentileMetric(percentile=80, metric_name="80thPercentile"),
580
+ maf.MinMetric(),
581
+ maf.MaxMetric(),
582
+ ],
583
+ )
584
+ bundle_list.append(bundle)
585
+
586
+ # Likewise, but coadded depth per filter
587
+ if fieldname.endswith("WFD"):
588
+ pass
589
+ else:
590
+ for f in "ugrizy":
591
+ displayDict["caption"] = f"Coadded depth per night for {fieldname} in band {f}."
592
+ displayDict["order"] = orders[f]
593
+ metric = maf.Coaddm5Metric(metric_name=f"{fieldname} CoaddedM5 Per Night")
594
+ slicer = maf.OneDSlicer(slice_col_name="night", bin_size=1, badval=min_coadds[f])
595
+ plot_dict = {"filled_data": True}
596
+ bundle = maf.MetricBundle(
597
+ metric,
598
+ slicer,
599
+ fieldsqls[f],
600
+ info_label=info_labels[f],
601
+ plot_dict=plot_dict,
602
+ display_dict=displayDict,
603
+ summary_metrics=[
604
+ maf.MedianMetric(),
605
+ maf.PercentileMetric(percentile=80, metric_name="80thPercentile"),
606
+ maf.MinMetric(),
607
+ maf.MaxMetric(),
608
+ ],
609
+ )
610
+ bundle_list.append(bundle)
611
+
612
+ displayDict["subgroup"] = "Sequence gaps"
613
+
614
+ # Histogram of the number of nights between visits, all filters
615
+ bins = np.arange(1, 40, 1)
616
+ metric = maf.NightgapsMetric(
617
+ bins=bins,
618
+ night_col="night",
619
+ metric_name=f"{fieldname} Delta Nights Histogram",
620
+ )
621
+ displayDict["caption"] = f"Histogram of intervals between nights with visits, in the {fieldname} DDF."
622
+ plotDict = {"bins": bins, "xlabel": "dT (nights)"}
623
+ plotFunc = maf.SummaryHistogram()
624
+ bundle = maf.MetricBundle(
625
+ metric,
626
+ ptslicer,
627
+ constraint=fieldsqls["all"],
628
+ info_label=info_labels["all"],
629
+ plot_dict=plotDict,
630
+ display_dict=displayDict,
631
+ plot_funcs=[plotFunc],
632
+ )
633
+ bundle_list.append(bundle)
634
+
635
+ # Median inter-night gap in each and all filters
636
+ for f in filterlist:
637
+ metric = maf.InterNightGapsMetric(
638
+ metric_name=f"{fieldname} Median Inter-Night Gap", reduce_func=np.median
639
+ )
640
+ displayDict["order"] = orders[f]
641
+ displayDict["caption"] = f"Median internight gap in {f} band in the {fieldname} DDF."
642
+ bundle_list.append(
643
+ maf.MetricBundle(
644
+ metric,
645
+ ptslicer,
646
+ fieldsqls[f],
647
+ info_label=info_labels[f],
648
+ run_name=run_name,
649
+ summary_metrics=[maf.MeanMetric()],
650
+ plot_funcs=[],
651
+ display_dict=displayDict,
652
+ )
653
+ )
654
+
655
+ displayDict["subgroup"] = "Season length"
656
+
657
+ # Histogram of the season lengths, all filters
658
+ def rfunc(simdata):
659
+ # Sometimes number of seasons is 10, sometimes 11
660
+ # (depending on where survey starts/end)
661
+ # so normalize it so there's always 11 values
662
+ # by adding 0 at the end.
663
+ if len(simdata) < 11:
664
+ simdata = np.concatenate([simdata, np.array([0], float)])
665
+ return simdata
666
+
667
+ metric = maf.SeasonLengthMetric(reduce_func=rfunc, metric_dtype="object")
668
+ plotDict = {"bins": np.arange(0, 12), "ylabel": "Season length (days)", "xlabel": "Season"}
669
+ plotFunc = maf.SummaryHistogram()
670
+ displayDict["caption"] = f"Plot of the season length per season in the {fieldname} DDF."
671
+ displayDict["order"] = order
672
+ bundle = maf.MetricBundle(
673
+ metric,
674
+ ptslicer,
675
+ fieldsqls["all"],
676
+ info_label=" ".join([fieldname, info_labels["all"]]),
677
+ plot_dict=plotDict,
678
+ display_dict=displayDict,
679
+ plot_funcs=[plotFunc],
680
+ )
681
+ bundle_list.append(bundle)
682
+
683
+ # Median season Length
684
+ metric = maf.SeasonLengthMetric(
685
+ metric_name=f"{fieldname} Median Season Length", reduce_func=np.median
686
+ )
687
+ displayDict["caption"] = f"Median season length in the {fieldname} DDF."
688
+ bundle_list.append(
689
+ maf.MetricBundle(
690
+ metric,
691
+ ptslicer,
692
+ fieldsqls[f],
693
+ info_label=info_labels["all"],
694
+ run_name=run_name,
695
+ summary_metrics=[maf.MeanMetric()],
696
+ plot_funcs=[],
697
+ display_dict=displayDict,
698
+ )
699
+ )
700
+
701
+ # Cumulative distribution - only for DDF fields
702
+ if fieldname.endswith("WFD"):
703
+ pass
704
+ else:
705
+ displayDict["group"] = "Progress"
706
+ displayDict["subgroup"] = ""
707
+ displayDict["caption"] = (
708
+ f"Cumulative number of visits for the {fieldname.replace('DD:', '')} field."
709
+ )
710
+ slicer = maf.UniSlicer()
711
+ metric = maf.CumulativeMetric(metric_name=f"{fieldname} Cumulative NVisits")
712
+ metricb = maf.MetricBundle(
713
+ metric,
714
+ slicer,
715
+ fieldsqls["all"],
716
+ info_label=info_labels["all"],
717
+ plot_funcs=[maf.XyPlotter()],
718
+ run_name=run_name,
719
+ display_dict=displayDict,
720
+ )
721
+ metricb.summary_metrics = []
722
+ bundle_list.append(metricb)
723
+
724
+ for b in bundle_list:
725
+ b.set_run_name(run_name)
726
+ bundleDict = maf.make_bundles_dict_from_list(bundle_list)
727
+
728
+ return bundleDict