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,1100 @@
1
+ __all__ = ("radar_limited",)
2
+
3
+ import healpy as hp
4
+ import numpy as np
5
+
6
+ import rubin_sim.maf as maf
7
+ import rubin_sim.maf.maps as maps
8
+ import rubin_sim.maf.metric_bundles as mb
9
+ import rubin_sim.maf.metrics as metrics
10
+ import rubin_sim.maf.plots as plots
11
+ import rubin_sim.maf.slicers as slicers
12
+
13
+ from .common import filter_list, lightcurve_summary, standard_summary
14
+
15
+
16
+ def radar_limited(
17
+ runName="run name",
18
+ nside=64,
19
+ benchmarkArea=18000,
20
+ benchmarkNvisits=825,
21
+ minNvisits=750,
22
+ long_microlensing=True,
23
+ srd_only=False,
24
+ mjd0=None,
25
+ ):
26
+ """A batch of metrics for looking at survey performance
27
+ relative to the SRD and the main science drivers of LSST.
28
+
29
+ Parameters
30
+ ----------
31
+ runName : `str`, optional
32
+ The simulation run name that should appear as plot titles.
33
+ benchmarkArea : `float`, optional
34
+ The area to use for SRD metrics (sq degrees)
35
+ benchmarkNvisits : `int`, optional
36
+ The number of visits to use for SRD metrics.
37
+ minNvisits : `int`, optional
38
+ The minimum number of visits to use for SRD metrics.
39
+ long_microlensing : `bool`, optional
40
+ Add the longer running microlensing metrics to the batch
41
+ (a subset of crossing times only)
42
+ srd_only : `bool`, optional
43
+ Only return the SRD metrics
44
+ mjd0 : float, optional
45
+ The modified Julian date start date of the survey.
46
+
47
+ Returns
48
+ -------
49
+ metric_bundleDict : `dict` of `maf.MetricBundle`
50
+ """
51
+
52
+ bundleList = []
53
+ # Get some standard per-filter coloring and sql constraints
54
+ filterlist, colors, filterorders, filtersqls, filterinfo_label = filter_list(all=False)
55
+ (
56
+ allfilterlist,
57
+ allcolors,
58
+ allfilterorders,
59
+ allfiltersqls,
60
+ allfilterinfo_label,
61
+ ) = filter_list(all=True)
62
+
63
+ standardStats = standard_summary(with_count=False)
64
+
65
+ # This is the default slicer for most purposes in this batch.
66
+ # Note that the cache is on -
67
+ # if the metric requires a dust map, this is not the right slicer to use.
68
+ healpixslicer = slicers.HealpixSlicer(nside=nside, use_cache=True)
69
+ subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
70
+
71
+ #########################
72
+ #########################
73
+ # SRD, DM, etc
74
+ #########################
75
+ #########################
76
+ # fO metric
77
+ displayDict = {"group": "SRD", "subgroup": "FO metrics", "order": 0}
78
+
79
+ # Configure the count metric which is what is used for f0 slicer.
80
+ metric = metrics.CountExplimMetric(col="observationStartMJD", metric_name="fO")
81
+ plotDict = {
82
+ "xlabel": "Number of Visits",
83
+ "asky": benchmarkArea,
84
+ "n_visits": benchmarkNvisits,
85
+ "x_min": 0,
86
+ "x_max": 1500,
87
+ }
88
+ summaryMetrics = [
89
+ metrics.FOArea(
90
+ nside=nside,
91
+ norm=False,
92
+ metric_name="fOArea",
93
+ asky=benchmarkArea,
94
+ n_visit=benchmarkNvisits,
95
+ ),
96
+ metrics.FOArea(
97
+ nside=nside,
98
+ norm=True,
99
+ metric_name="fOArea/benchmark",
100
+ asky=benchmarkArea,
101
+ n_visit=benchmarkNvisits,
102
+ ),
103
+ metrics.FONv(
104
+ nside=nside,
105
+ norm=False,
106
+ metric_name="fONv",
107
+ asky=benchmarkArea,
108
+ n_visit=benchmarkNvisits,
109
+ ),
110
+ metrics.FONv(
111
+ nside=nside,
112
+ norm=True,
113
+ metric_name="fONv/benchmark",
114
+ asky=benchmarkArea,
115
+ n_visit=benchmarkNvisits,
116
+ ),
117
+ metrics.FOArea(
118
+ nside=nside,
119
+ norm=False,
120
+ metric_name=f"fOArea_{minNvisits}",
121
+ asky=benchmarkArea,
122
+ n_visit=minNvisits,
123
+ ),
124
+ ]
125
+ caption = "The FO metric evaluates the overall efficiency of observing. "
126
+ caption += (
127
+ "foNv: out of %.2f sq degrees, the area receives at least X and a median of Y visits "
128
+ "(out of %d, if compared to benchmark). " % (benchmarkArea, benchmarkNvisits)
129
+ )
130
+ caption += (
131
+ "fOArea: this many sq deg (out of %.2f sq deg if compared "
132
+ "to benchmark) receives at least %d visits. " % (benchmarkArea, benchmarkNvisits)
133
+ )
134
+ displayDict["caption"] = caption
135
+ bundle = mb.MetricBundle(
136
+ metric,
137
+ healpixslicer,
138
+ "",
139
+ plot_dict=plotDict,
140
+ display_dict=displayDict,
141
+ summary_metrics=summaryMetrics,
142
+ plot_funcs=[plots.FOPlot()],
143
+ )
144
+ bundleList.append(bundle)
145
+
146
+ # Single visit depth distribution
147
+ displayDict["subgroup"] = "Visit Depths"
148
+ # Histogram values over all and per filter.
149
+
150
+ value = "fiveSigmaDepth"
151
+ for f in filterlist:
152
+ displayDict["caption"] = "Histogram of %s" % (value)
153
+ displayDict["caption"] += " for %s." % (filterinfo_label[f])
154
+ displayDict["order"] = filterorders[f]
155
+ m = metrics.CountMetric(value, metric_name="%s Histogram" % (value))
156
+ slicer = slicers.OneDSlicer(slice_col_name=value)
157
+ bundle = mb.MetricBundle(
158
+ m,
159
+ slicer,
160
+ filtersqls[f],
161
+ display_dict=displayDict,
162
+ )
163
+ bundleList.append(bundle)
164
+
165
+ displayDict["caption"] = ""
166
+ for f in filterlist:
167
+ slicer = maf.UniSlicer()
168
+ metric = maf.MedianMetric(col="fiveSigmaDepth")
169
+ bundle = mb.MetricBundle(
170
+ metric,
171
+ slicer,
172
+ filtersqls[f],
173
+ display_dict=displayDict,
174
+ )
175
+ bundleList.append(bundle)
176
+
177
+ ##############
178
+ # Astrometry
179
+ ###############
180
+
181
+ rmags_para = [22.4, 24.0]
182
+ rmags_pm = [20.5, 24.0]
183
+
184
+ # Set up parallax/dcr stackers.
185
+ parallaxStacker = maf.ParallaxFactorStacker()
186
+ dcrStacker = maf.DcrStacker()
187
+
188
+ # Set up parallax metrics.
189
+ displayDict["subgroup"] = "Parallax"
190
+ displayDict["order"] += 1
191
+ # Expected error on parallax at 10 AU.
192
+ plotmaxVals = (2.0, 15.0)
193
+ good_parallax_limit = 11.5
194
+ summary = [
195
+ metrics.AreaSummaryMetric(
196
+ area=18000,
197
+ reduce_func=np.median,
198
+ decreasing=False,
199
+ metric_name="Median Parallax Uncert (18k)",
200
+ ),
201
+ metrics.AreaThresholdMetric(
202
+ upper_threshold=good_parallax_limit,
203
+ metric_name="Area better than %.1f mas uncertainty" % good_parallax_limit,
204
+ ),
205
+ ]
206
+ summary.append(metrics.PercentileMetric(percentile=95, metric_name="95th Percentile Parallax Uncert"))
207
+ summary.extend(standard_summary())
208
+ for rmag, plotmax in zip(rmags_para, plotmaxVals):
209
+ plotDict = {"x_min": 0, "x_max": plotmax, "color_min": 0, "color_max": plotmax}
210
+ metric = metrics.ParallaxMetric(
211
+ metric_name="Parallax Uncert @ %.1f" % (rmag),
212
+ rmag=rmag,
213
+ normalize=False,
214
+ )
215
+ bundle = mb.MetricBundle(
216
+ metric,
217
+ healpixslicer,
218
+ "",
219
+ stacker_list=[parallaxStacker],
220
+ display_dict=displayDict,
221
+ plot_dict=plotDict,
222
+ summary_metrics=summary,
223
+ plot_funcs=subsetPlots,
224
+ )
225
+ bundleList.append(bundle)
226
+ displayDict["order"] += 1
227
+
228
+ # Parallax normalized to 'best possible'.
229
+ # This separates the effect of cadence from depth.
230
+ for rmag in rmags_para:
231
+ metric = metrics.ParallaxMetric(
232
+ metric_name="Normalized Parallax Uncert @ %.1f" % (rmag),
233
+ rmag=rmag,
234
+ normalize=True,
235
+ )
236
+ bundle = mb.MetricBundle(
237
+ metric,
238
+ healpixslicer,
239
+ "",
240
+ stacker_list=[parallaxStacker],
241
+ display_dict=displayDict,
242
+ summary_metrics=standard_summary(),
243
+ plot_funcs=subsetPlots,
244
+ )
245
+ bundleList.append(bundle)
246
+ displayDict["order"] += 1
247
+ # Parallax factor coverage.
248
+ for rmag in rmags_para:
249
+ metric = metrics.ParallaxCoverageMetric(metric_name="Parallax Coverage @ %.1f" % (rmag), rmag=rmag)
250
+ bundle = mb.MetricBundle(
251
+ metric,
252
+ healpixslicer,
253
+ "",
254
+ stacker_list=[parallaxStacker],
255
+ display_dict=displayDict,
256
+ summary_metrics=standard_summary(),
257
+ plot_funcs=subsetPlots,
258
+ )
259
+ bundleList.append(bundle)
260
+ displayDict["order"] += 1
261
+ # Parallax problems can be caused by HA and DCR degeneracies.
262
+ # Check their correlation.
263
+ for rmag in rmags_para:
264
+ metric = metrics.ParallaxDcrDegenMetric(
265
+ metric_name="Parallax-DCR degeneracy @ %.1f" % (rmag), rmag=rmag
266
+ )
267
+ caption = "Correlation between parallax offset magnitude and hour angle for a r=%.1f star." % (rmag)
268
+ caption += " (0 is good, near -1 or 1 is bad)."
269
+ bundle = mb.MetricBundle(
270
+ metric,
271
+ healpixslicer,
272
+ "",
273
+ stacker_list=[dcrStacker, parallaxStacker],
274
+ display_dict=displayDict,
275
+ summary_metrics=standard_summary(),
276
+ plot_funcs=subsetPlots,
277
+ )
278
+ bundleList.append(bundle)
279
+ displayDict["order"] += 1
280
+
281
+ # Proper Motion metrics.
282
+ displayDict["subgroup"] = "Proper Motion"
283
+ displayDict["order"] = 0
284
+ # Proper motion errors.
285
+ plotmaxVals = (1.0, 5.0)
286
+ summary = [
287
+ metrics.AreaSummaryMetric(
288
+ area=18000,
289
+ reduce_func=np.median,
290
+ decreasing=False,
291
+ metric_name="Median Proper Motion Uncert (18k)",
292
+ )
293
+ ]
294
+ summary.append(metrics.PercentileMetric(metric_name="95th Percentile Proper Motion Uncert"))
295
+ summary.extend(standard_summary())
296
+ for rmag, plotmax in zip(rmags_pm, plotmaxVals):
297
+ plotDict = {"x_min": 0, "x_max": plotmax, "color_min": 0, "color_max": plotmax}
298
+ metric = metrics.ProperMotionMetric(
299
+ metric_name="Proper Motion Uncert @ %.1f" % rmag,
300
+ rmag=rmag,
301
+ normalize=False,
302
+ )
303
+ bundle = mb.MetricBundle(
304
+ metric,
305
+ healpixslicer,
306
+ "",
307
+ display_dict=displayDict,
308
+ plot_dict=plotDict,
309
+ summary_metrics=summary,
310
+ plot_funcs=subsetPlots,
311
+ )
312
+ bundleList.append(bundle)
313
+ displayDict["order"] += 1
314
+ # Normalized proper motion.
315
+ for rmag in rmags_pm:
316
+ metric = metrics.ProperMotionMetric(
317
+ metric_name="Normalized Proper Motion Uncert @ %.1f" % rmag,
318
+ rmag=rmag,
319
+ normalize=True,
320
+ )
321
+ bundle = mb.MetricBundle(
322
+ metric,
323
+ healpixslicer,
324
+ "",
325
+ display_dict=displayDict,
326
+ summary_metrics=standard_summary(),
327
+ plot_funcs=subsetPlots,
328
+ )
329
+ bundleList.append(bundle)
330
+ displayDict["order"] += 1
331
+
332
+ # DCR precision metric
333
+ displayDict["subgroup"] = "DCR"
334
+ displayDict["order"] = 0
335
+ plotDict = {"caption": "Precision of DCR slope.", "percentile_clip": 95}
336
+ metric = metrics.DcrPrecisionMetric()
337
+ bundle = mb.MetricBundle(
338
+ metric,
339
+ healpixslicer,
340
+ "",
341
+ plot_dict=plotDict,
342
+ plot_funcs=subsetPlots,
343
+ display_dict=displayDict,
344
+ summary_metrics=standard_summary(with_count=False),
345
+ )
346
+ bundleList.append(bundle)
347
+
348
+ # Rapid Revisit
349
+ displayDict["subgroup"] = "Rapid Revisits"
350
+ displayDict["order"] = 0
351
+ # Calculate the actual number of revisits within 30 minutes.
352
+ dTmax = 30 # time in minutes
353
+ m2 = metrics.NRevisitsMetric(d_t=dTmax, normed=False, metric_name="NumberOfQuickRevisits")
354
+ plotDict = {"color_min": 400, "color_max": 2000, "x_min": 400, "x_max": 2000}
355
+ caption = "Number of consecutive visits with return times faster than %.1f minutes, " % (dTmax)
356
+ caption += "in any filter. "
357
+ displayDict["caption"] = caption
358
+ bundle = mb.MetricBundle(
359
+ m2,
360
+ healpixslicer,
361
+ "",
362
+ plot_dict=plotDict,
363
+ plot_funcs=subsetPlots,
364
+ display_dict=displayDict,
365
+ summary_metrics=standard_summary(with_count=False),
366
+ )
367
+ bundleList.append(bundle)
368
+ displayDict["order"] += 1
369
+
370
+ # Better version of the rapid revisit requirements:
371
+ # require a minimum number of visits between
372
+ # dtMin and dtMax, but also a minimum number of visits
373
+ # between dtMin and dtPair (the typical pair time).
374
+ # 1 means the healpix met the requirements (0 means did not).
375
+ dTmin = 40.0 / 60.0 # (minutes) 40s minimum for rapid revisit range
376
+ dTpairs = 20.0 # minutes (time when pairs should start kicking in)
377
+ dTmax = 30.0 # 30 minute maximum for rapid revisit range
378
+ nOne = 82 # Number of revisits between 40s-30m required
379
+ nTwo = 28 # Number of revisits between 40s - tPairs required.
380
+ pix_area = float(hp.nside2pixarea(nside, degrees=True))
381
+ scale = pix_area * hp.nside2npix(nside)
382
+ m1 = metrics.RapidRevisitMetric(
383
+ metric_name="RapidRevisits",
384
+ d_tmin=dTmin / 60.0 / 60.0 / 24.0,
385
+ d_tpairs=dTpairs / 60.0 / 24.0,
386
+ d_tmax=dTmax / 60.0 / 24.0,
387
+ min_n1=nOne,
388
+ min_n2=nTwo,
389
+ )
390
+ plotDict = {
391
+ "x_min": 0,
392
+ "x_max": 1,
393
+ "color_min": 0,
394
+ "color_max": 1,
395
+ "log_scale": False,
396
+ }
397
+ cutoff1 = 0.9
398
+ summaryStats = [metrics.FracAboveMetric(cutoff=cutoff1, scale=scale, metric_name="Area (sq deg)")]
399
+ caption = "Rapid Revisit: area that receives at least %d visits between %.3f and %.1f minutes, " % (
400
+ nOne,
401
+ dTmin,
402
+ dTmax,
403
+ )
404
+ caption += "with at least %d of those visits falling between %.3f and %.1f minutes. " % (
405
+ nTwo,
406
+ dTmin,
407
+ dTpairs,
408
+ )
409
+ caption += (
410
+ 'Summary statistic "Area" indicates the area on the sky which meets this requirement.'
411
+ " (SRD design specification is 2000 sq deg)."
412
+ )
413
+ displayDict["caption"] = caption
414
+ displayDict["order"] = 0
415
+ bundle = mb.MetricBundle(
416
+ m1,
417
+ healpixslicer,
418
+ "",
419
+ plot_dict=plotDict,
420
+ plot_funcs=subsetPlots,
421
+ display_dict=displayDict,
422
+ summary_metrics=summaryStats,
423
+ )
424
+ bundleList.append(bundle)
425
+
426
+ # For SRD batch only, return here.
427
+ if srd_only:
428
+ for b in bundleList:
429
+ b.set_run_name(runName)
430
+ bundleDict = mb.make_bundles_dict_from_list(bundleList)
431
+
432
+ return bundleDict
433
+
434
+ # Year Coverage
435
+ displayDict["subgroup"] = "Year Coverage"
436
+ metric = metrics.YearCoverageMetric()
437
+ for f in filterlist:
438
+ plotDict = {"color_min": 7, "color_max": 10, "color": colors[f]}
439
+ displayDict["caption"] = f"Number of years of coverage in {f} band."
440
+ displayDict["order"] = filterorders[f]
441
+ summary = [
442
+ metrics.AreaSummaryMetric(
443
+ area=18000,
444
+ reduce_func=np.mean,
445
+ decreasing=True,
446
+ metric_name="N Years (18k) %s" % f,
447
+ )
448
+ ]
449
+ bundle = mb.MetricBundle(
450
+ metric,
451
+ healpixslicer,
452
+ filtersqls[f],
453
+ plot_dict=plotDict,
454
+ info_label=filterinfo_label[f],
455
+ display_dict=displayDict,
456
+ summary_metrics=summary,
457
+ )
458
+ bundleList.append(bundle)
459
+
460
+ #########################
461
+ #########################
462
+ # Galaxies
463
+ #########################
464
+ #########################
465
+
466
+ # Run this per filter, to look at variations in
467
+ # counts of galaxies in blue bands?
468
+ displayDict = {
469
+ "group": "Galaxies",
470
+ "subgroup": "Galaxy Counts",
471
+ "order": 0,
472
+ "caption": None,
473
+ }
474
+ # make sure slicer has cache off
475
+ slicer = slicers.HealpixSlicer(nside=nside, use_cache=False)
476
+
477
+ displayDict["subgroup"] = "Surface Brightness"
478
+ summary = [metrics.MedianMetric()]
479
+ for filtername in "ugrizy":
480
+ displayDict["caption"] = "Surface brightness limit in %s, no extinction applied." % filtername
481
+ displayDict["order"] = filterorders[f]
482
+ sql = "filter='%s'" % filtername
483
+ metric = metrics.SurfaceBrightLimitMetric()
484
+ bundle = mb.MetricBundle(
485
+ metric,
486
+ healpixslicer,
487
+ sql,
488
+ display_dict=displayDict,
489
+ summary_metrics=summary,
490
+ plot_funcs=subsetPlots,
491
+ )
492
+ bundleList.append(bundle)
493
+
494
+ #########################
495
+ #########################
496
+ # Cosmology
497
+ #########################
498
+ #########################
499
+
500
+ bandpass = "i"
501
+ nfilters_needed = 6
502
+ lim_ebv = 0.2
503
+ offset = 0.1
504
+ mag_cuts = {
505
+ 10: 26.0 - offset,
506
+ }
507
+ yrs = list(mag_cuts.keys())
508
+ maxYr = max(yrs)
509
+
510
+ displayDict = {"group": "Cosmology"}
511
+ subgroupCount = 1
512
+
513
+ displayDict["subgroup"] = f"{subgroupCount}: Static Science"
514
+ # Static Science
515
+ # Calculate the static science metrics - effective survey area,
516
+ # mean/median coadded depth, stdev of
517
+ # coadded depth and the 3x2ptFoM emulator.
518
+
519
+ dustmap = maps.DustMap(nside=nside, interp=False)
520
+ pix_area = hp.nside2pixarea(nside, degrees=True)
521
+ summaryMetrics = [
522
+ metrics.MeanMetric(),
523
+ metrics.MedianMetric(),
524
+ metrics.RmsMetric(),
525
+ metrics.CountRatioMetric(norm_val=1 / pix_area, metric_name="Effective Area (deg)"),
526
+ ]
527
+ displayDict["order"] = 0
528
+ slicer = slicers.HealpixSlicer(nside=nside, use_cache=False)
529
+ for yr_cut in yrs:
530
+ ptsrc_lim_mag_i_band = mag_cuts[yr_cut]
531
+ sqlconstraint = "night <= %s" % (yr_cut * 365.25 + 0.5)
532
+ sqlconstraint += " and scheduler_note not like 'DD%'"
533
+ info_label = f"{bandpass} band non-DD year {yr_cut}"
534
+ ThreebyTwoSummary_simple = metrics.StaticProbesFoMEmulatorMetricSimple(
535
+ nside=nside, year=yr_cut, metric_name="3x2ptFoM_simple"
536
+ )
537
+ ThreebyTwoSummary = maf.StaticProbesFoMEmulatorMetric(nside=nside, metric_name="3x2ptFoM")
538
+
539
+ m = metrics.ExgalM5WithCuts(
540
+ lsst_filter=bandpass,
541
+ n_filters=nfilters_needed,
542
+ extinction_cut=lim_ebv,
543
+ depth_cut=ptsrc_lim_mag_i_band,
544
+ )
545
+ caption = (
546
+ f"Cosmology/Static science metrics are based on evaluating the region "
547
+ f"of the sky that meets the requirements (in year {yr_cut} of coverage"
548
+ f"in all {nfilters_needed} bands, a lower E(B-V) value than {lim_ebv} "
549
+ f"and at least a coadded depth of {ptsrc_lim_mag_i_band} in {bandpass}. "
550
+ f"From there the effective survey area, coadded depth, standard deviation of "
551
+ f"the depth, and a 3x2pt static science figure of merit emulator are "
552
+ f"calculated using the dust-extinction coadded depth map (over that reduced "
553
+ f"footprint)."
554
+ )
555
+ displayDict["caption"] = caption
556
+ bundle = mb.MetricBundle(
557
+ m,
558
+ slicer,
559
+ sqlconstraint,
560
+ maps_list=[dustmap],
561
+ info_label=info_label,
562
+ summary_metrics=summaryMetrics + [ThreebyTwoSummary, ThreebyTwoSummary_simple],
563
+ display_dict=displayDict,
564
+ )
565
+ displayDict["order"] += 1
566
+ bundleList.append(bundle)
567
+
568
+ # LSS Science
569
+ # The only metric we have from LSS is the NGals metric -
570
+ # which is similar to the GalaxyCountsExtended
571
+ # metric, but evaluated only on the depth/dust cuts footprint.
572
+ subgroupCount += 1
573
+ displayDict["subgroup"] = f"{subgroupCount}: LSS"
574
+ displayDict["order"] = 0
575
+ plotDict = {"n_ticks": 5}
576
+
577
+ # WL metrics
578
+ # Calculates the number of visits per pointing, after removing
579
+ # parts of the footprint due to dust/depth
580
+ # Count visits in gri bands.
581
+ subgroupCount += 1
582
+ displayDict["subgroup"] = f"{subgroupCount}: WL"
583
+ displayDict["order"] = 0
584
+ sqlconstraint = "scheduler_note not like 'DD%' and (filter='g' or filter='r' or filter='i')"
585
+ info_label = "gri band non-DD"
586
+ minExpTime = 15
587
+ m = metrics.WeakLensingNvisits(
588
+ lsst_filter=bandpass,
589
+ depth_cut=mag_cuts[maxYr],
590
+ ebvlim=lim_ebv,
591
+ min_exp_time=minExpTime,
592
+ metric_name="WeakLensingNvisits",
593
+ )
594
+ slicer = slicers.HealpixSlicer(nside=nside, use_cache=False)
595
+ displayDict["caption"] = (
596
+ f"The number of visits per pointing, over a similarly reduced footprint as "
597
+ f"described above for the 3x2pt FOM, but allowing areas of sky with "
598
+ f"fewer than {nfilters_needed} filters. "
599
+ f"A cutoff of {minExpTime} removes very short visits."
600
+ )
601
+ bundle = mb.MetricBundle(
602
+ m,
603
+ slicer,
604
+ sqlconstraint,
605
+ maps_list=[dustmap],
606
+ info_label=info_label,
607
+ summary_metrics=standardStats,
608
+ display_dict=displayDict,
609
+ )
610
+ bundleList.append(bundle)
611
+
612
+ # Do the weak lensing per year
613
+ for year in [10]:
614
+ sqlconstraint = (
615
+ "scheduler_note not like 'DD%'"
616
+ + " and (filter='g' or filter='r' or filter='i') and night < %i" % (year * 365.25)
617
+ )
618
+ m = metrics.WeakLensingNvisits(
619
+ lsst_filter=bandpass,
620
+ depth_cut=mag_cuts[year],
621
+ ebvlim=lim_ebv,
622
+ min_exp_time=minExpTime,
623
+ metric_name="WeakLensingNvisits_gri_year%i" % year,
624
+ )
625
+ bundle = mb.MetricBundle(
626
+ m,
627
+ slicer,
628
+ sqlconstraint,
629
+ maps_list=[dustmap],
630
+ info_label=info_label,
631
+ summary_metrics=standardStats,
632
+ display_dict=displayDict,
633
+ )
634
+ bundleList.append(bundle)
635
+
636
+ m = metrics.RIZDetectionCoaddExposureTime(
637
+ det_bands=["g", "r", "i"], metric_name="gri_exposure_time_year%i" % year
638
+ )
639
+ bundle = mb.MetricBundle(
640
+ m,
641
+ slicer,
642
+ sqlconstraint,
643
+ maps_list=[dustmap],
644
+ info_label=info_label,
645
+ summary_metrics=standardStats,
646
+ display_dict=displayDict,
647
+ )
648
+ bundleList.append(bundle)
649
+
650
+ sqlconstraint = (
651
+ "scheduler_note not like 'DD%'"
652
+ + " and (filter='r' or filter='i' or filter='z') and night < %i" % (year * 365.25)
653
+ )
654
+ m = metrics.WeakLensingNvisits(
655
+ lsst_filter=bandpass,
656
+ depth_cut=mag_cuts[year],
657
+ ebvlim=lim_ebv,
658
+ min_exp_time=minExpTime,
659
+ metric_name="WeakLensingNvisits_riz_year%i" % year,
660
+ )
661
+ bundle = mb.MetricBundle(
662
+ m,
663
+ slicer,
664
+ sqlconstraint,
665
+ maps_list=[dustmap],
666
+ info_label=info_label,
667
+ summary_metrics=standardStats,
668
+ display_dict=displayDict,
669
+ )
670
+ bundleList.append(bundle)
671
+
672
+ m = metrics.RIZDetectionCoaddExposureTime(
673
+ det_bands=["g", "r", "i"], metric_name="riz_exposure_time_year%i" % year
674
+ )
675
+ bundle = mb.MetricBundle(
676
+ m,
677
+ slicer,
678
+ sqlconstraint,
679
+ maps_list=[dustmap],
680
+ info_label=info_label,
681
+ summary_metrics=standardStats,
682
+ display_dict=displayDict,
683
+ )
684
+ bundleList.append(bundle)
685
+
686
+ subgroupCount += 1
687
+ displayDict["subgroup"] = f"{subgroupCount}: Camera Rotator"
688
+ metric1 = metrics.KuiperMetric("rotSkyPos")
689
+ metric2 = metrics.KuiperMetric("rotTelPos")
690
+ caption_root = "Kuiper statistic (0 is uniform, 1 is delta function) of the "
691
+ for f in filterlist:
692
+ for m in [metric1, metric2]:
693
+ plotDict = {"color": colors[f]}
694
+ displayDict["order"] = filterorders[f]
695
+ displayDict["caption"] = caption_root + f"{m.colname} for visits in {f} band."
696
+ bundleList.append(
697
+ mb.MetricBundle(
698
+ m,
699
+ healpixslicer,
700
+ filtersqls[f],
701
+ plot_dict=plotDict,
702
+ display_dict=displayDict,
703
+ summary_metrics=standardStats,
704
+ plot_funcs=subsetPlots,
705
+ )
706
+ )
707
+
708
+ ##############
709
+ # SNe Ia
710
+ ##############
711
+ displayDict = {
712
+ "group": "Cosmology",
713
+ "subgroup": "5: SNe Ia",
714
+ "order": 0,
715
+ "caption": "Expected discoveries of SNeIa, using the SNNSNMetric.",
716
+ }
717
+ sne_nside = 16
718
+ sn_summary = [
719
+ metrics.MedianMetric(),
720
+ metrics.MeanMetric(),
721
+ metrics.SumMetric(metric_name="Total detected"),
722
+ metrics.CountMetric(metric_name="Total on sky", mask_val=0),
723
+ ]
724
+ snslicer = slicers.HealpixSlicer(nside=sne_nside, use_cache=False)
725
+ metric = metrics.SNNSNMetric(
726
+ n_bef=3,
727
+ n_aft=8,
728
+ coadd_night=True,
729
+ add_dust=False,
730
+ hard_dust_cut=0.25,
731
+ zmin=0.2,
732
+ zmax=0.5,
733
+ z_step=0.03,
734
+ daymax_step=3.0,
735
+ zlim_coeff=0.95,
736
+ gamma_name="gamma_WFD.hdf5",
737
+ verbose=False,
738
+ )
739
+ plotDict = {"percentile_clip": 95, "n_ticks": 5}
740
+ # Run without DDF observations
741
+ bundle = mb.MetricBundle(
742
+ metric,
743
+ snslicer,
744
+ "scheduler_note not like '%DD%'",
745
+ plot_dict=plotDict,
746
+ display_dict=displayDict,
747
+ info_label="DDF excluded",
748
+ summary_metrics=sn_summary,
749
+ plot_funcs=subsetPlots,
750
+ )
751
+
752
+ bundleList.append(bundle)
753
+
754
+ #########################
755
+ #########################
756
+ # Variables and Transients
757
+ #########################
758
+ #########################
759
+
760
+ # Periodic Stars
761
+ displayDict = {"group": "Variables/Transients", "order": 0}
762
+
763
+ # Tidal Disruption Events
764
+ displayDict["subgroup"] = "TDE"
765
+ displayDict["caption"] = "TDE lightcurves that could be identified"
766
+ displayDict["order"] = 0
767
+ metric = maf.TdePopMetric(mjd0=mjd0)
768
+ tdeslicer = maf.generate_tde_pop_slicer()
769
+ bundle = mb.MetricBundle(
770
+ metric,
771
+ tdeslicer,
772
+ "",
773
+ run_name=runName,
774
+ summary_metrics=lightcurve_summary(),
775
+ display_dict=displayDict,
776
+ )
777
+ bundleList.append(bundle)
778
+
779
+ displayDict["caption"] = "TDE lightcurves quality"
780
+ metric = maf.TdePopMetricQuality(metric_name="TDE_Quality")
781
+ bundle = mb.MetricBundle(
782
+ metric,
783
+ tdeslicer,
784
+ "",
785
+ run_name=runName,
786
+ summary_metrics=lightcurve_summary(),
787
+ display_dict=displayDict,
788
+ )
789
+ bundleList.append(bundle)
790
+
791
+ # Microlensing events
792
+
793
+ displayDict["subgroup"] = "Microlensing"
794
+ plotDict = {"nside": 128}
795
+
796
+ n_events = 10000
797
+ # Let's evaluate a variety of crossing times
798
+ crossing_times = [
799
+ [1, 5],
800
+ [5, 10],
801
+ [10, 20],
802
+ [20, 30],
803
+ [30, 60],
804
+ [60, 90],
805
+ [100, 200],
806
+ [200, 500],
807
+ [500, 1000],
808
+ ]
809
+ metric = maf.MicrolensingMetric()
810
+ summaryMetrics = maf.batches.lightcurve_summary()
811
+ order = 0
812
+ for crossing in crossing_times:
813
+ displayDict["caption"] = "Microlensing events with crossing times between %i to %i days." % (
814
+ crossing[0],
815
+ crossing[1],
816
+ )
817
+ displayDict["order"] = order
818
+ order += 1
819
+ slicer = maf.generate_microlensing_slicer(
820
+ min_crossing_time=crossing[0],
821
+ max_crossing_time=crossing[1],
822
+ n_events=n_events,
823
+ )
824
+ bundleList.append(
825
+ maf.MetricBundle(
826
+ metric,
827
+ slicer,
828
+ None,
829
+ run_name=runName,
830
+ summary_metrics=summaryMetrics,
831
+ info_label=f"tE {crossing[0]}_{crossing[1]} days",
832
+ display_dict=displayDict,
833
+ plot_dict=plotDict,
834
+ plot_funcs=[plots.HealpixSkyMap()],
835
+ )
836
+ )
837
+
838
+ if long_microlensing:
839
+ n_events = 10000
840
+ # Let's evaluate a subset of the crossing times for these
841
+ crossing_times = [
842
+ [10, 20],
843
+ [20, 30],
844
+ [30, 60],
845
+ [200, 500],
846
+ ]
847
+ metric_Npts = maf.MicrolensingMetric(metric_calc="Npts")
848
+ summaryMetrics = maf.batches.microlensing_summary(metric_type="Npts")
849
+ order = 0
850
+ for crossing in crossing_times:
851
+ slicer = maf.generate_microlensing_slicer(
852
+ min_crossing_time=crossing[0],
853
+ max_crossing_time=crossing[1],
854
+ n_events=n_events,
855
+ )
856
+ displayDict["caption"] = "Microlensing events with crossing times between %i to %i days." % (
857
+ crossing[0],
858
+ crossing[1],
859
+ )
860
+ displayDict["order"] = order
861
+ order += 1
862
+ bundleList.append(
863
+ maf.MetricBundle(
864
+ metric_Npts,
865
+ slicer,
866
+ None,
867
+ run_name=runName,
868
+ summary_metrics=summaryMetrics,
869
+ info_label=f"tE {crossing[0]}_{crossing[1]} days",
870
+ display_dict=displayDict,
871
+ plot_dict=plotDict,
872
+ plot_funcs=[],
873
+ )
874
+ )
875
+
876
+ metric_Fisher = maf.MicrolensingMetric(metric_calc="Fisher")
877
+ summaryMetrics = maf.batches.microlensing_summary(metric_type="Fisher")
878
+ order = 0
879
+ for crossing in crossing_times:
880
+ displayDict["caption"] = "Microlensing events with crossing times between %i to %i days." % (
881
+ crossing[0],
882
+ crossing[1],
883
+ )
884
+ displayDict["order"] = order
885
+ order += 1
886
+ slicer = maf.generate_microlensing_slicer(
887
+ min_crossing_time=crossing[0],
888
+ max_crossing_time=crossing[1],
889
+ n_events=n_events,
890
+ )
891
+ bundleList.append(
892
+ maf.MetricBundle(
893
+ metric_Fisher,
894
+ slicer,
895
+ None,
896
+ run_name=runName,
897
+ summary_metrics=summaryMetrics,
898
+ info_label=f"tE {crossing[0]}_{crossing[1]} days",
899
+ display_dict=displayDict,
900
+ plot_dict=plotDict,
901
+ plot_funcs=[],
902
+ )
903
+ )
904
+
905
+ # Kilonovae metric
906
+ displayDict["group"] = "Variables/Transients"
907
+ displayDict["subgroup"] = "KNe"
908
+ n_events = 10000
909
+ caption = f"KNe metric, injecting {n_events} lightcurves over the entire sky, GW170817-like only."
910
+ caption += " Ignoring DDF observations."
911
+ displayDict["caption"] = caption
912
+ displayDict["order"] = 0
913
+ # Kilonova parameters
914
+ inj_params_list = [
915
+ {"mej_dyn": 0.005, "mej_wind": 0.050, "phi": 30, "theta": 25.8},
916
+ ]
917
+ filename = maf.get_kne_filename(inj_params_list)
918
+ kneslicer = maf.generate_kn_pop_slicer(n_events=n_events, n_files=len(filename), d_min=10, d_max=600)
919
+ metric = maf.KNePopMetric(
920
+ output_lc=False,
921
+ file_list=filename,
922
+ metric_name="KNePopMetric_single",
923
+ mjd0=mjd0,
924
+ )
925
+ bundle = mb.MetricBundle(
926
+ metric,
927
+ kneslicer,
928
+ "scheduler_note not like 'DD%'",
929
+ run_name=runName,
930
+ info_label="single model",
931
+ summary_metrics=lightcurve_summary(),
932
+ display_dict=displayDict,
933
+ )
934
+ bundleList.append(bundle)
935
+
936
+ n_events = 10000
937
+ caption = f"KNe metric, injecting {n_events} lightcurves over the entire sky, entire model population."
938
+ caption += " Ignoring DDF observations."
939
+ displayDict["caption"] = caption
940
+ displayDict["order"] = 1
941
+ # Kilonova parameters
942
+ filename = maf.get_kne_filename(None)
943
+ kneslicer_allkne = maf.generate_kn_pop_slicer(
944
+ n_events=n_events, n_files=len(filename), d_min=10, d_max=600
945
+ )
946
+ metric_allkne = maf.KNePopMetric(output_lc=False, file_list=filename, metric_name="KNePopMetric_all")
947
+ bundle = mb.MetricBundle(
948
+ metric_allkne,
949
+ kneslicer_allkne,
950
+ "scheduler_note not like 'DD%'",
951
+ run_name=runName,
952
+ info_label="all models",
953
+ summary_metrics=lightcurve_summary(),
954
+ display_dict=displayDict,
955
+ )
956
+ bundleList.append(bundle)
957
+
958
+ # General time intervals
959
+ displayDict = {
960
+ "group": "TimeGaps",
961
+ "subgroup": "Time",
962
+ "caption": None,
963
+ "order": 0,
964
+ }
965
+
966
+ for f in filterlist:
967
+ gaps = [3.0, 7.0, 24.0]
968
+ for gap in gaps:
969
+ summary_stats = []
970
+ summary_stats.append(
971
+ metrics.AreaSummaryMetric(
972
+ area=18000,
973
+ reduce_func=np.median,
974
+ decreasing=True,
975
+ metric_name="Median N gaps in %s at %ihr in top 18k" % (f, gap),
976
+ )
977
+ )
978
+
979
+ summary_stats.append(
980
+ metrics.AreaSummaryMetric(
981
+ area=18000,
982
+ reduce_func=np.mean,
983
+ decreasing=True,
984
+ metric_name="Mean N gaps in %s at %ihr in top 18k" % (f, gap),
985
+ )
986
+ )
987
+
988
+ summary_stats.append(metrics.MeanMetric())
989
+ summary_stats.append(metrics.MedianMetric())
990
+
991
+ m2 = metrics.GapsMetric(
992
+ time_scale=gap,
993
+ metric_name="Gaps_%ihr" % gap,
994
+ )
995
+ plotFuncs = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
996
+ plotDict = {"color_min": 0, "color": colors[f], "percentile_clip": 95}
997
+ displayDict["caption"] = (
998
+ "Number of times the timescale of ~%i hours is sampled in %s band(s)." % (gap, f)
999
+ )
1000
+ displayDict["order"] = filterorders[f]
1001
+ bundleList.append(
1002
+ mb.MetricBundle(
1003
+ m2,
1004
+ healpixslicer,
1005
+ constraint=filtersqls[f],
1006
+ info_label=filterinfo_label[f],
1007
+ run_name=runName,
1008
+ summary_metrics=summary_stats,
1009
+ plot_dict=plotDict,
1010
+ plot_funcs=plotFuncs,
1011
+ display_dict=displayDict,
1012
+ )
1013
+ )
1014
+
1015
+ # XRB metric
1016
+ displayDict["subgroup"] = "XRB"
1017
+ displayDict["order"] = 0
1018
+ displayDict["caption"] = "Number or characterization of XRBs."
1019
+ n_events = 10000
1020
+ xrbslicer = maf.generate_xrb_pop_slicer(n_events=n_events)
1021
+ metric = maf.XRBPopMetric(output_lc=False, mjd0=mjd0)
1022
+ xrb_summaryMetrics = [
1023
+ maf.SumMetric(metric_name="Total detected"),
1024
+ maf.CountMetric(metric_name="Total lightcurves in footprint"),
1025
+ maf.CountMetric(metric_name="Total lightcurves on sky", mask_val=0),
1026
+ maf.MeanMetric(metric_name="Fraction detected in footprint"),
1027
+ maf.MeanMetric(mask_val=0, metric_name="Fraction detected of total"),
1028
+ maf.MedianMetric(metric_name="Median"),
1029
+ maf.MeanMetric(metric_name="Mean"),
1030
+ ]
1031
+
1032
+ bundleList.append(
1033
+ maf.MetricBundle(
1034
+ metric,
1035
+ xrbslicer,
1036
+ "",
1037
+ run_name=runName,
1038
+ summary_metrics=xrb_summaryMetrics,
1039
+ display_dict=displayDict,
1040
+ )
1041
+ )
1042
+
1043
+ #########################
1044
+ #########################
1045
+ # Milky Way
1046
+ #########################
1047
+ #########################
1048
+
1049
+ displayDict = {"group": "Milky Way", "subgroup": ""}
1050
+
1051
+ # Brown Dwarf Volume
1052
+ displayDict["subgroup"] = "Brown Dwarf"
1053
+ displayDict["order"] = 0
1054
+ l7_bd_mags = {"i": 20.09, "z": 18.18, "y": 17.13}
1055
+ displayDict["caption"] = (
1056
+ f"The expected maximum distance at which an L7 brown dwarf with magnitude {l7_bd_mags} "
1057
+ f"would have a parallax SNR of 10.0. The summary statistic represents the volume enclosed by "
1058
+ f"the result of this metric (BDParallaxMetric)."
1059
+ )
1060
+ sum_stats = [metrics.VolumeSumMetric(nside=nside)]
1061
+ metric = metrics.BDParallaxMetric(mags=l7_bd_mags, metric_name="Brown Dwarf, L7")
1062
+ sql = ""
1063
+ plotDict = {}
1064
+ bundleList.append(
1065
+ mb.MetricBundle(
1066
+ metric,
1067
+ healpixslicer,
1068
+ sql,
1069
+ plot_dict=plotDict,
1070
+ summary_metrics=sum_stats,
1071
+ display_dict=displayDict,
1072
+ run_name=runName,
1073
+ )
1074
+ )
1075
+
1076
+ l4_bd_mags = {"i": 18.35, "z": 16.68, "y": 15.66}
1077
+ displayDict["caption"] = (
1078
+ f"The expected maximum distance at which an L4 brown dwarf with magnitude {l4_bd_mags} "
1079
+ f"would have a parallax SNR of 10.0. The summary statistic represents the total volume enclosed "
1080
+ f"by the result of this metric (BDParallaxMetric)."
1081
+ )
1082
+ metric = metrics.BDParallaxMetric(mags=l4_bd_mags, metric_name="Brown Dwarf, L4")
1083
+ bundleList.append(
1084
+ mb.MetricBundle(
1085
+ metric,
1086
+ healpixslicer,
1087
+ sql,
1088
+ plot_dict=plotDict,
1089
+ summary_metrics=sum_stats,
1090
+ display_dict=displayDict,
1091
+ run_name=runName,
1092
+ )
1093
+ )
1094
+
1095
+ # Set the run_name for all bundles and return the bundleDict.
1096
+ for b in bundleList:
1097
+ b.set_run_name(runName)
1098
+ bundleDict = mb.make_bundles_dict_from_list(bundleList)
1099
+
1100
+ return bundleDict