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,637 @@
1
+ """Metrics to investigate quantities related to SRD.
2
+ Potentially could diverge from versions in scienceRadar.
3
+ """
4
+
5
+ __all__ = ("fOBatch", "astrometryBatch", "rapidRevisitBatch")
6
+
7
+ import warnings
8
+
9
+ import healpy as hp
10
+ import numpy as np
11
+
12
+ import rubin_sim.maf.metric_bundles as mb
13
+ import rubin_sim.maf.metrics as metrics
14
+ import rubin_sim.maf.plots as plots
15
+ import rubin_sim.maf.slicers as slicers
16
+ import rubin_sim.maf.stackers as stackers
17
+
18
+ from .col_map_dict import col_map_dict
19
+ from .common import standard_summary
20
+
21
+
22
+ def fOBatch(
23
+ colmap=None,
24
+ run_name="run_name",
25
+ extra_sql=None,
26
+ extra_info=None,
27
+ slicer=None,
28
+ benchmark_area=18000,
29
+ benchmark_n_visits=825,
30
+ min_n_visits=750,
31
+ ):
32
+ """Metrics for calculating fO.
33
+
34
+ Parameters
35
+ ----------
36
+ colmap : `dict` or None, opt
37
+ A dictionary with a mapping of column names.
38
+ run_name : `str`, opt
39
+ The name of the simulated survey.
40
+ extra_sql : `str` or None, opt
41
+ Additional sql constraint to apply to all metrics.
42
+ extra_Info : `str` or None, opt
43
+ Additional info_label to apply to all results.
44
+ slicer : `rubin_sim.maf.slicer.HealpixSlicer` or None, opt
45
+ This must be a HealpixSlicer or some kind,
46
+ although could be a HealpixSubsetSlicer.
47
+ None will default to HealpixSlicer with nside=64.
48
+ benchmark_area : `float`, opt
49
+ Area to use when calculating fO_Nvis, for design.
50
+ benchmark_n_visits : `float`, opt
51
+ Nvisits minimum to use when calculating fO_Area, for design.
52
+ min_n_visits : `float`, opt
53
+ Nvisits minimum to use when calculating fO_Area, for minimum.
54
+
55
+ Returns
56
+ -------
57
+ metric_bundleDict : `dict` of `maf.MetricBundle`
58
+ """
59
+ if colmap is None:
60
+ colmap = col_map_dict()
61
+ band_col = colmap["filter"]
62
+
63
+ bundleList = []
64
+
65
+ sql = ""
66
+ info_label = "All visits"
67
+ # Add additional sql constraint (such as wfdWhere) and info_label
68
+ if (extra_sql is not None) and (len(extra_sql) > 0):
69
+ sql = extra_sql
70
+ if extra_info is None:
71
+ info_label = extra_sql.replace(f"{band_col} =", "").replace(f"{band_col}=", "")
72
+ info_label = info_label.replace('"', "").replace("'", "")
73
+ if extra_info is not None:
74
+ info_label = extra_info
75
+
76
+ subgroup = info_label
77
+
78
+ raCol = colmap["ra"]
79
+ decCol = colmap["dec"]
80
+ degrees = colmap["raDecDeg"]
81
+ # Set up fO metric.
82
+ if slicer is None:
83
+ nside = 64
84
+ slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
85
+ else:
86
+ try:
87
+ nside = slicer.nside
88
+ except AttributeError:
89
+ warnings.warn("Must use a healpix slicer. Swapping to the default.")
90
+ nside = 64
91
+ slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
92
+
93
+ displayDict = {"group": "SRD FO metrics", "subgroup": subgroup, "order": 0}
94
+
95
+ # Configure the count metric which is what is used for f0 slicer.
96
+ metric = metrics.CountExplimMetric(metric_name="fO", exp_col=colmap["exptime"])
97
+ plotDict = {
98
+ "xlabel": "Number of Visits",
99
+ "asky": benchmark_area,
100
+ "n_visits": min_n_visits,
101
+ "x_min": 0,
102
+ "x_max": 1500,
103
+ }
104
+ summaryMetrics = [
105
+ metrics.FOArea(
106
+ nside=nside,
107
+ norm=False,
108
+ metric_name="fOArea",
109
+ asky=benchmark_area,
110
+ n_visit=benchmark_n_visits,
111
+ ),
112
+ metrics.FOArea(
113
+ nside=nside,
114
+ norm=True,
115
+ metric_name="fOArea/benchmark",
116
+ asky=benchmark_area,
117
+ n_visit=benchmark_n_visits,
118
+ ),
119
+ metrics.FONv(
120
+ nside=nside,
121
+ norm=False,
122
+ metric_name="fONv",
123
+ asky=benchmark_area,
124
+ n_visit=benchmark_n_visits,
125
+ ),
126
+ metrics.FONv(
127
+ nside=nside,
128
+ norm=True,
129
+ metric_name="fONv/benchmark",
130
+ asky=benchmark_area,
131
+ n_visit=benchmark_n_visits,
132
+ ),
133
+ metrics.FOArea(
134
+ nside=nside,
135
+ norm=False,
136
+ metric_name=f"fOArea_{min_n_visits}",
137
+ asky=benchmark_area,
138
+ n_visit=min_n_visits,
139
+ ),
140
+ ]
141
+ caption = "The FO metric evaluates the overall efficiency of observing. "
142
+ caption += (
143
+ "foNv: out of %.2f sq degrees, the area receives at least X and a median of Y visits "
144
+ "(out of %d, if compared to benchmark). " % (benchmark_area, benchmark_n_visits)
145
+ )
146
+ caption += (
147
+ "fOArea: this many sq deg (out of %.2f sq deg if compared "
148
+ "to benchmark) receives at least %d visits. " % (benchmark_area, benchmark_n_visits)
149
+ )
150
+ displayDict["caption"] = caption
151
+ bundle = mb.MetricBundle(
152
+ metric,
153
+ slicer,
154
+ sql,
155
+ plot_dict=plotDict,
156
+ display_dict=displayDict,
157
+ summary_metrics=summaryMetrics,
158
+ plot_funcs=[plots.FOPlot()],
159
+ info_label=info_label,
160
+ )
161
+ bundleList.append(bundle)
162
+ # Set the run_name for all bundles and return the bundleDict.
163
+ for b in bundleList:
164
+ b.set_run_name(run_name)
165
+ return mb.make_bundles_dict_from_list(bundleList)
166
+
167
+
168
+ def astrometryBatch(
169
+ colmap=None,
170
+ run_name="opsim",
171
+ extra_sql=None,
172
+ extra_info=None,
173
+ slicer=None,
174
+ ):
175
+ """Metrics for evaluating proper motion and parallax.
176
+
177
+ Parameters
178
+ ----------
179
+ colmap : `dict` or None, optional
180
+ A dictionary with a mapping of column names.
181
+ run_name : `str`, optional
182
+ The name of the simulated survey.
183
+ extra_sql : `str` or None, optional
184
+ Additional sql constraint to apply to all metrics.
185
+ extra_info : `str` or None, optional
186
+ Additional info_label to apply to all results.
187
+ slicer : `rubin_sim.maf.slicer` or None, optional
188
+ Optionally, specify something other than an nside=64 healpix slicer.
189
+
190
+ Returns
191
+ -------
192
+ metric_bundleDict : `dict` of `maf.MetricBundle`
193
+ """
194
+ if colmap is None:
195
+ colmap = col_map_dict()
196
+ band_col = colmap["filter"]
197
+
198
+ bundleList = []
199
+
200
+ sql = ""
201
+ info_label = "All visits"
202
+ # Add additional sql constraint (such as wfdWhere) and info_label
203
+ if (extra_sql is not None) and (len(extra_sql) > 0):
204
+ sql = extra_sql
205
+ if extra_info is None:
206
+ info_label = extra_sql.replace(f"{band_col} =", "").replace(f"{band_col}=", "")
207
+ info_label = info_label.replace('"', "").replace("'", "")
208
+ if extra_info is not None:
209
+ info_label = extra_info
210
+
211
+ subgroup = info_label
212
+
213
+ raCol = colmap["ra"]
214
+ decCol = colmap["dec"]
215
+ degrees = colmap["raDecDeg"]
216
+
217
+ rmags_para = [22.4, 24.0]
218
+ rmags_pm = [20.5, 24.0]
219
+
220
+ # Set up parallax/dcr stackers.
221
+ parallaxStacker = stackers.ParallaxFactorStacker(
222
+ ra_col=raCol, dec_col=decCol, date_col=colmap["mjd"], degrees=degrees
223
+ )
224
+ dcrStacker = stackers.DcrStacker(
225
+ filter_col=band_col,
226
+ alt_col=colmap["alt"],
227
+ degrees=degrees,
228
+ ra_col=raCol,
229
+ dec_col=decCol,
230
+ lst_col=colmap["lst"],
231
+ site="LSST",
232
+ mjd_col=colmap["mjd"],
233
+ )
234
+
235
+ # Set up parallax metrics.
236
+ if slicer is None:
237
+ slicer = slicers.HealpixSlicer(nside=64, lon_col=raCol, lat_col=decCol, lat_lon_deg=degrees)
238
+ subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
239
+
240
+ displayDict = {
241
+ "group": "SRD Parallax",
242
+ "subgroup": subgroup,
243
+ "order": 0,
244
+ "caption": None,
245
+ }
246
+ # Expected error on parallax at 10 AU.
247
+ plotmaxVals = (5.0, 18.0)
248
+ good_parallax_limit = 11.5
249
+ summary = [
250
+ metrics.AreaSummaryMetric(
251
+ area=18000,
252
+ reduce_func=np.median,
253
+ decreasing=False,
254
+ metric_name="Median Parallax Uncert (18k)",
255
+ ),
256
+ metrics.AreaThresholdMetric(
257
+ upper_threshold=good_parallax_limit,
258
+ metric_name="Area better than %.1f mas uncertainty" % good_parallax_limit,
259
+ ),
260
+ ]
261
+ summary.append(metrics.PercentileMetric(percentile=95, metric_name="95th Percentile Parallax Uncert"))
262
+ summary.extend(standard_summary())
263
+ for rmag, plotmax in zip(rmags_para, plotmaxVals):
264
+ plotDict = {"x_min": 0, "x_max": plotmax, "color_min": 0, "color_max": plotmax}
265
+ metric = metrics.ParallaxMetric(
266
+ metric_name="Parallax Uncert @ %.1f" % (rmag),
267
+ rmag=rmag,
268
+ seeing_col=colmap["seeingGeom"],
269
+ filter_col=band_col,
270
+ m5_col=colmap["fiveSigmaDepth"],
271
+ normalize=False,
272
+ )
273
+ bundle = mb.MetricBundle(
274
+ metric,
275
+ slicer,
276
+ sql,
277
+ info_label=info_label,
278
+ stacker_list=[parallaxStacker],
279
+ display_dict=displayDict,
280
+ plot_dict=plotDict,
281
+ summary_metrics=summary,
282
+ plot_funcs=subsetPlots,
283
+ )
284
+ bundleList.append(bundle)
285
+ displayDict["order"] += 1
286
+
287
+ # Parallax normalized to 'best possible'
288
+ # This separates the effect of cadence from depth.
289
+ for rmag in rmags_para:
290
+ metric = metrics.ParallaxMetric(
291
+ metric_name="Normalized Parallax Uncert @ %.1f" % (rmag),
292
+ rmag=rmag,
293
+ seeing_col=colmap["seeingGeom"],
294
+ filter_col=band_col,
295
+ m5_col=colmap["fiveSigmaDepth"],
296
+ normalize=True,
297
+ )
298
+ bundle = mb.MetricBundle(
299
+ metric,
300
+ slicer,
301
+ sql,
302
+ info_label=info_label,
303
+ stacker_list=[parallaxStacker],
304
+ display_dict=displayDict,
305
+ summary_metrics=standard_summary(),
306
+ plot_funcs=subsetPlots,
307
+ )
308
+ bundleList.append(bundle)
309
+ displayDict["order"] += 1
310
+ # Parallax factor coverage.
311
+ for rmag in rmags_para:
312
+ metric = metrics.ParallaxCoverageMetric(
313
+ metric_name="Parallax Coverage @ %.1f" % (rmag),
314
+ rmag=rmag,
315
+ m5_col=colmap["fiveSigmaDepth"],
316
+ mjd_col=colmap["mjd"],
317
+ filter_col=band_col,
318
+ seeing_col=colmap["seeingGeom"],
319
+ )
320
+ bundle = mb.MetricBundle(
321
+ metric,
322
+ slicer,
323
+ sql,
324
+ info_label=info_label,
325
+ stacker_list=[parallaxStacker],
326
+ display_dict=displayDict,
327
+ summary_metrics=standard_summary(),
328
+ plot_funcs=subsetPlots,
329
+ )
330
+ bundleList.append(bundle)
331
+ displayDict["order"] += 1
332
+ # Parallax problems can be caused by HA and DCR degeneracies.
333
+ # Check their correlation.
334
+ for rmag in rmags_para:
335
+ metric = metrics.ParallaxDcrDegenMetric(
336
+ metric_name="Parallax-DCR degeneracy @ %.1f" % (rmag),
337
+ rmag=rmag,
338
+ seeing_col=colmap["seeingEff"],
339
+ filter_col=band_col,
340
+ m5_col=colmap["fiveSigmaDepth"],
341
+ )
342
+ caption = "Correlation between parallax offset magnitude and hour angle for a r=%.1f star." % (rmag)
343
+ caption += " (0 is good, near -1 or 1 is bad)."
344
+ bundle = mb.MetricBundle(
345
+ metric,
346
+ slicer,
347
+ sql,
348
+ info_label=info_label,
349
+ stacker_list=[dcrStacker, parallaxStacker],
350
+ display_dict=displayDict,
351
+ summary_metrics=standard_summary(),
352
+ plot_funcs=subsetPlots,
353
+ )
354
+ bundleList.append(bundle)
355
+ displayDict["order"] += 1
356
+
357
+ # Evaluate y-band-only parallax uncertainty
358
+ # Approximate "10sigma sources" as y=21.33
359
+ ymag = 21.33
360
+ if info_label == "All visits":
361
+ yinfo = "y band visits"
362
+ else:
363
+ yinfo = f"{info_label} y band only"
364
+ if len(sql) == 0:
365
+ ysql = "filter == 'y'"
366
+ else:
367
+ ysql = f"{sql} and filter == 'y'"
368
+ plotDict = {"x_min": 0, "x_max": 15, "color_min": 0, "color_max": 15}
369
+ metric = metrics.ParallaxMetric(
370
+ metric_name="Parallax Uncert @ %.1f" % (ymag),
371
+ rmag=ymag,
372
+ seeing_col=colmap["seeingGeom"],
373
+ filter_col=band_col,
374
+ m5_col=colmap["fiveSigmaDepth"],
375
+ normalize=False,
376
+ )
377
+ bundle = mb.MetricBundle(
378
+ metric,
379
+ slicer,
380
+ ysql,
381
+ info_label=yinfo,
382
+ stacker_list=[parallaxStacker],
383
+ display_dict=displayDict,
384
+ plot_dict=plotDict,
385
+ summary_metrics=summary,
386
+ plot_funcs=subsetPlots,
387
+ )
388
+ bundleList.append(bundle)
389
+ displayDict["order"] += 1
390
+ metric = metrics.ParallaxMetric(
391
+ metric_name="Normalized Parallax Uncert @ %.1f" % (ymag),
392
+ rmag=ymag,
393
+ seeing_col=colmap["seeingGeom"],
394
+ filter_col=band_col,
395
+ m5_col=colmap["fiveSigmaDepth"],
396
+ normalize=True,
397
+ )
398
+ bundle = mb.MetricBundle(
399
+ metric,
400
+ slicer,
401
+ ysql,
402
+ info_label=yinfo,
403
+ stacker_list=[parallaxStacker],
404
+ display_dict=displayDict,
405
+ summary_metrics=summary,
406
+ plot_funcs=subsetPlots,
407
+ )
408
+ bundleList.append(bundle)
409
+ displayDict["order"] += 1
410
+
411
+ # Proper Motion metrics.
412
+ displayDict = {
413
+ "group": "SRD Proper Motion",
414
+ "subgroup": subgroup,
415
+ "order": 0,
416
+ "caption": None,
417
+ }
418
+ # Proper motion errors.
419
+ plotmaxVals = (1.0, 5.0)
420
+ summary = [
421
+ metrics.AreaSummaryMetric(
422
+ area=18000,
423
+ reduce_func=np.median,
424
+ decreasing=False,
425
+ metric_name="Median Proper Motion Uncert (18k)",
426
+ )
427
+ ]
428
+ summary.append(metrics.PercentileMetric(metric_name="95th Percentile Proper Motion Uncert"))
429
+ summary.extend(standard_summary())
430
+ for rmag, plotmax in zip(rmags_pm, plotmaxVals):
431
+ plotDict = {"x_min": 0, "x_max": plotmax, "color_min": 0, "color_max": plotmax}
432
+ metric = metrics.ProperMotionMetric(
433
+ metric_name="Proper Motion Uncert @ %.1f" % rmag,
434
+ rmag=rmag,
435
+ m5_col=colmap["fiveSigmaDepth"],
436
+ mjd_col=colmap["mjd"],
437
+ filter_col=band_col,
438
+ seeing_col=colmap["seeingGeom"],
439
+ normalize=False,
440
+ )
441
+ bundle = mb.MetricBundle(
442
+ metric,
443
+ slicer,
444
+ sql,
445
+ info_label=info_label,
446
+ display_dict=displayDict,
447
+ plot_dict=plotDict,
448
+ summary_metrics=summary,
449
+ plot_funcs=subsetPlots,
450
+ )
451
+ bundleList.append(bundle)
452
+ displayDict["order"] += 1
453
+ # Normalized proper motion.
454
+ for rmag in rmags_pm:
455
+ metric = metrics.ProperMotionMetric(
456
+ metric_name="Normalized Proper Motion Uncert @ %.1f" % rmag,
457
+ rmag=rmag,
458
+ m5_col=colmap["fiveSigmaDepth"],
459
+ mjd_col=colmap["mjd"],
460
+ filter_col=band_col,
461
+ seeing_col=colmap["seeingGeom"],
462
+ normalize=True,
463
+ )
464
+ bundle = mb.MetricBundle(
465
+ metric,
466
+ slicer,
467
+ sql,
468
+ info_label=info_label,
469
+ display_dict=displayDict,
470
+ summary_metrics=standard_summary(),
471
+ plot_funcs=subsetPlots,
472
+ )
473
+ bundleList.append(bundle)
474
+ displayDict["order"] += 1
475
+
476
+ # Set the run_name for all bundles and return the bundleDict.
477
+ for b in bundleList:
478
+ b.set_run_name(run_name)
479
+ return mb.make_bundles_dict_from_list(bundleList)
480
+
481
+
482
+ def rapidRevisitBatch(
483
+ colmap=None,
484
+ run_name="opsim",
485
+ extra_sql=None,
486
+ extra_info=None,
487
+ slicer=None,
488
+ ):
489
+ """Metrics for evaluating proper motion and parallax.
490
+
491
+ Parameters
492
+ ----------
493
+ colmap : `dict` or None, optional
494
+ A dictionary with a mapping of column names.
495
+ run_name : `str`, optional
496
+ The name of the simulated survey.
497
+ extra_sql : `str` or None, optional
498
+ Additional sql constraint to apply to all metrics.
499
+ extra_info : `str` or None, optional
500
+ Additional info_label to apply to all results.
501
+ slicer : `rubin_sim_maf.slicers.HealpixSlicer` or None, optional
502
+ Optionally, specify something other than an nside=64 healpix slicer.
503
+ (must be a healpix slicer)
504
+
505
+ Returns
506
+ -------
507
+ metric_bundleDict : `dict` of `maf.MetricBundle`
508
+ """
509
+ if colmap is None:
510
+ colmap = col_map_dict()
511
+ band_col = colmap["filter"]
512
+ bundleList = []
513
+
514
+ sql = ""
515
+ info_label = "All visits"
516
+ # Add additional sql constraint (such as wfdWhere) and info_label.
517
+ if (extra_sql is not None) and (len(extra_sql) > 0):
518
+ sql = extra_sql
519
+ if extra_info is None:
520
+ info_label = extra_sql.replace(f"{band_col} =", "").replace(f"{band_col}=", "")
521
+ info_label = info_label.replace('"', "").replace("'", "")
522
+ if extra_info is not None:
523
+ info_label = extra_info
524
+
525
+ subgroup = info_label
526
+
527
+ raCol = colmap["ra"]
528
+ decCol = colmap["dec"]
529
+ degrees = colmap["raDecDeg"]
530
+
531
+ if slicer is None:
532
+ nside = 64
533
+ slicer = slicers.HealpixSlicer(nside=nside, lon_col=raCol, lat_col=decCol, lat_lon_deg=degrees)
534
+ else:
535
+ try:
536
+ nside = slicer.nside
537
+ except AttributeError:
538
+ warnings.warn("Must use a healpix slicer. Swapping to the default.")
539
+ nside = 64
540
+ slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
541
+
542
+ subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
543
+
544
+ displayDict = {
545
+ "group": "SRD Rapid Revisits",
546
+ "subgroup": subgroup,
547
+ "order": 0,
548
+ "caption": None,
549
+ }
550
+
551
+ # Calculate the actual number of revisits within 30 minutes.
552
+ dTmax = 30 # time in minutes
553
+ m2 = metrics.NRevisitsMetric(
554
+ d_t=dTmax,
555
+ mjd_col=colmap["mjd"],
556
+ normed=False,
557
+ metric_name="NumberOfQuickRevisits",
558
+ )
559
+ plotDict = {"color_min": 400, "color_max": 2000, "x_min": 400, "x_max": 2000}
560
+ caption = "Number of consecutive visits with return times faster than %.1f minutes, " % (dTmax)
561
+ caption += "in any filter, all proposals. "
562
+ displayDict["caption"] = caption
563
+ bundle = mb.MetricBundle(
564
+ m2,
565
+ slicer,
566
+ sql,
567
+ plot_dict=plotDict,
568
+ plot_funcs=subsetPlots,
569
+ info_label=info_label,
570
+ display_dict=displayDict,
571
+ summary_metrics=standard_summary(with_count=False),
572
+ )
573
+ bundleList.append(bundle)
574
+ displayDict["order"] += 1
575
+
576
+ # Better version of the rapid revisit requirements:
577
+ # require a minimum number of visits between
578
+ # dtMin and dtMax, but also a minimum number of visits
579
+ # between dtMin and dtPair (the typical pair time).
580
+ # 1 means the healpix met the requirements (0 means did not).
581
+ dTmin = 40.0 / 60.0 # (minutes) 40s minimum for rapid revisit range
582
+ dTpairs = 20.0 # minutes (time when pairs should start kicking in)
583
+ dTmax = 30.0 # 30 minute maximum for rapid revisit range
584
+ nOne = 82 # Number of revisits between 40s-30m required
585
+ nTwo = 28 # Number of revisits between 40s - tPairs required.
586
+ pix_area = float(hp.nside2pixarea(nside, degrees=True))
587
+ scale = pix_area * hp.nside2npix(nside)
588
+ m1 = metrics.RapidRevisitMetric(
589
+ metric_name="RapidRevisits",
590
+ mjd_col=colmap["mjd"],
591
+ d_tmin=dTmin / 60.0 / 60.0 / 24.0,
592
+ d_tpairs=dTpairs / 60.0 / 24.0,
593
+ d_tmax=dTmax / 60.0 / 24.0,
594
+ min_n1=nOne,
595
+ min_n2=nTwo,
596
+ )
597
+ plotDict = {
598
+ "x_min": 0,
599
+ "x_max": 1,
600
+ "color_min": 0,
601
+ "color_max": 1,
602
+ "log_scale": False,
603
+ }
604
+ cutoff1 = 0.9
605
+ summaryStats = [metrics.FracAboveMetric(cutoff=cutoff1, scale=scale, metric_name="Area (sq deg)")]
606
+ caption = "Rapid Revisit: area that receives at least %d visits between %.3f and %.1f minutes, " % (
607
+ nOne,
608
+ dTmin,
609
+ dTmax,
610
+ )
611
+ caption += "with at least %d of those visits falling between %.3f and %.1f minutes. " % (
612
+ nTwo,
613
+ dTmin,
614
+ dTpairs,
615
+ )
616
+ caption += (
617
+ 'Summary statistic "Area" indicates the area on the sky which meets this requirement.'
618
+ " (SRD design specification is 2000 sq deg)."
619
+ )
620
+ displayDict["caption"] = caption
621
+ bundle = mb.MetricBundle(
622
+ m1,
623
+ slicer,
624
+ sql,
625
+ plot_dict=plotDict,
626
+ plot_funcs=subsetPlots,
627
+ info_label=info_label,
628
+ display_dict=displayDict,
629
+ summary_metrics=summaryStats,
630
+ )
631
+ bundleList.append(bundle)
632
+ displayDict["order"] += 1
633
+
634
+ # Set the run_name for all bundles and return the bundleDict.
635
+ for b in bundleList:
636
+ b.set_run_name(run_name)
637
+ return mb.make_bundles_dict_from_list(bundleList)