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,591 @@
1
+ __all__ = ("glanceBatch",)
2
+
3
+ import warnings
4
+
5
+ from rubin_scheduler.scheduler.utils import EuclidOverlapFootprint
6
+ from rubin_scheduler.utils import ddf_locations
7
+
8
+ import rubin_sim.maf.metric_bundles as metric_bundles
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
+ import rubin_sim.maf.stackers as stackers
13
+
14
+ from .col_map_dict import col_map_dict
15
+ from .common import standard_summary
16
+ from .hourglass_batch import hourglassPlots
17
+ from .slew_batch import slewBasics
18
+
19
+
20
+ def glanceBatch(
21
+ colmap=None,
22
+ run_name="run_name",
23
+ nside=64,
24
+ filternames=("u", "g", "r", "i", "z", "y"),
25
+ nyears=10,
26
+ pairnside=32,
27
+ sql_constraint=None,
28
+ slicer_camera="LSST",
29
+ ):
30
+ """Generate a handy set of metrics that give a quick overview
31
+ of how well a survey performed.
32
+ This is a meta-set of other batches, to some extent.
33
+
34
+ Parameters
35
+ ----------
36
+ colmap : `dict`, optional
37
+ A dictionary with a mapping of column names.
38
+ run_name : `str`, optional
39
+ The name of the simulated survey.
40
+ nside : `int`, optional
41
+ The nside for the healpix slicers.
42
+ filternames : `list` of `str`, optional
43
+ The list of individual filters to use when running metrics.
44
+ There is always an all-visits version of the metrics run as well.
45
+ nyears : `int`, optional
46
+ How many years to attempt to make hourglass plots for
47
+ pairnside : `int`, optional
48
+ nside to use for the pair fraction metric
49
+ (it's slow, so nice to use lower resolution)
50
+ sql_constraint : `str` or None, optional
51
+ Additional SQL constraint to apply to all metrics.
52
+ slicer_camera : `str`
53
+ Sets which spatial slicer to use. options are 'LSST' and 'ComCam'
54
+
55
+ Returns
56
+ -------
57
+ metric_bundleDict : `dict` of `maf.MetricBundle`
58
+ """
59
+ if isinstance(colmap, str):
60
+ raise ValueError("colmap must be a dictionary, not a string")
61
+
62
+ if colmap is None:
63
+ colmap = col_map_dict()
64
+
65
+ bundle_list = []
66
+
67
+ if sql_constraint is None:
68
+ sqlC = ""
69
+ else:
70
+ sqlC = "(%s) and" % sql_constraint
71
+
72
+ if slicer_camera == "LSST":
73
+ spatial_slicer = slicers.HealpixSlicer
74
+ elif slicer_camera == "ComCam":
75
+ spatial_slicer = slicers.HealpixComCamSlicer
76
+ else:
77
+ raise ValueError("Camera must be LSST or Comcam")
78
+
79
+ sql_per_filt = ["%s %s='%s'" % (sqlC, colmap["filter"], filtername) for filtername in filternames]
80
+ sql_per_and_all_filters = [sql_constraint] + sql_per_filt
81
+
82
+ standardStats = standard_summary()
83
+ subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
84
+
85
+ # Super basic things
86
+ displayDict = {"group": "Basic Stats", "order": 1}
87
+ sql = sql_constraint
88
+ slicer = slicers.UniSlicer()
89
+ # Length of Survey
90
+ metric = metrics.FullRangeMetric(col=colmap["mjd"], metric_name="Length of Survey (days)")
91
+ bundle = metric_bundles.MetricBundle(metric, slicer, sql, display_dict=displayDict)
92
+ bundle_list.append(bundle)
93
+
94
+ # Total number of filter changes
95
+ metric = metrics.NChangesMetric(col=colmap["filter"], order_by=colmap["mjd"])
96
+ bundle = metric_bundles.MetricBundle(metric, slicer, sql, display_dict=displayDict)
97
+ bundle_list.append(bundle)
98
+
99
+ # Total open shutter fraction
100
+ metric = metrics.OpenShutterFractionMetric(
101
+ slew_time_col=colmap["slewtime"],
102
+ exp_time_col=colmap["exptime"],
103
+ visit_time_col=colmap["visittime"],
104
+ )
105
+ bundle = metric_bundles.MetricBundle(metric, slicer, sql, display_dict=displayDict)
106
+ bundle_list.append(bundle)
107
+
108
+ # Total effective exposure time
109
+ metric = metrics.MeanMetric(col="t_eff")
110
+ teff_stacker = stackers.TeffStacker(normed=True)
111
+ for sql in sql_per_and_all_filters:
112
+ bundle = metric_bundles.MetricBundle(
113
+ metric, slicer, sql, stacker_list=[teff_stacker], display_dict=displayDict
114
+ )
115
+ bundle_list.append(bundle)
116
+
117
+ # Number of observations, all and each filter
118
+ metric = metrics.CountMetric(col=colmap["mjd"], metric_name="Number of Exposures")
119
+ for sql in sql_per_and_all_filters:
120
+ bundle = metric_bundles.MetricBundle(metric, slicer, sql, display_dict=displayDict)
121
+ bundle_list.append(bundle)
122
+
123
+ # The alt/az plots of all the pointings
124
+ slicer = spatial_slicer(
125
+ nside=nside,
126
+ lat_col=colmap["alt"],
127
+ lon_col=colmap["az"],
128
+ lat_lon_deg=colmap["raDecDeg"],
129
+ use_cache=False,
130
+ )
131
+ metric = metrics.CountMetric(colmap["mjd"], metric_name="Nvisits as function of Alt/Az")
132
+ plotFuncs = [plots.LambertSkyMap()]
133
+
134
+ plotDict = {"norm": "log"}
135
+ for sql in sql_per_and_all_filters:
136
+ bundle = metric_bundles.MetricBundle(
137
+ metric,
138
+ slicer,
139
+ sql,
140
+ plot_funcs=plotFuncs,
141
+ display_dict=displayDict,
142
+ plot_dict=plotDict,
143
+ )
144
+ bundle_list.append(bundle)
145
+
146
+ # alt az of long gaps
147
+ sql = "scheduler_note = 'long'"
148
+ metric = metrics.CountMetric(colmap["mjd"], metric_name="Nvisits long")
149
+ bundle = metric_bundles.MetricBundle(
150
+ metric,
151
+ slicer,
152
+ sql,
153
+ plot_funcs=plotFuncs,
154
+ display_dict=displayDict,
155
+ plot_dict=plotDict,
156
+ )
157
+ bundle_list.append(bundle)
158
+
159
+ sql = "scheduler_note like 'blob_long%'"
160
+ metric = metrics.CountMetric(colmap["mjd"], metric_name="Nvisits blob long")
161
+ bundle = metric_bundles.MetricBundle(
162
+ metric,
163
+ slicer,
164
+ sql,
165
+ plot_funcs=plotFuncs,
166
+ display_dict=displayDict,
167
+ plot_dict=plotDict,
168
+ )
169
+ bundle_list.append(bundle)
170
+
171
+ sql = "scheduler_note like '%neo%' or scheduler_note like '%near_sun%'"
172
+ metric = metrics.CountMetric(colmap["mjd"], metric_name="Nvisits twilight near sun")
173
+ bundle = metric_bundles.MetricBundle(
174
+ metric,
175
+ slicer,
176
+ sql,
177
+ plot_funcs=plotFuncs,
178
+ display_dict=displayDict,
179
+ plot_dict=plotDict,
180
+ )
181
+ bundle_list.append(bundle)
182
+
183
+ # alt,az pf ToO
184
+
185
+ sql = "scheduler_note like 'ToO%'"
186
+ metric = metrics.CountMetric(colmap["mjd"], metric_name="Nvisits long")
187
+ bundle = metric_bundles.MetricBundle(
188
+ metric,
189
+ slicer,
190
+ sql,
191
+ plot_funcs=plotFuncs,
192
+ display_dict=displayDict,
193
+ plot_dict=plotDict,
194
+ )
195
+ bundle_list.append(bundle)
196
+
197
+ # Things to check per night
198
+ # Open Shutter per night
199
+ displayDict = {"group": "Pointing Efficency", "order": 2}
200
+ slicer = slicers.OneDSlicer(slice_col_name=colmap["night"], bin_size=1, bin_min=-0.5)
201
+ metric = metrics.OpenShutterFractionMetric(
202
+ slew_time_col=colmap["slewtime"],
203
+ exp_time_col=colmap["exptime"],
204
+ visit_time_col=colmap["visittime"],
205
+ )
206
+ sql = sql_constraint
207
+ bundle = metric_bundles.MetricBundle(
208
+ metric, slicer, sql, summary_metrics=standardStats, display_dict=displayDict
209
+ )
210
+ bundle_list.append(bundle)
211
+
212
+ # Number of filter changes per night
213
+ slicer = slicers.OneDSlicer(slice_col_name=colmap["night"], bin_size=1, bin_min=-0.5)
214
+ metric = metrics.NChangesMetric(
215
+ col=colmap["filter"], order_by=colmap["mjd"], metric_name="Filter Changes"
216
+ )
217
+ bundle = metric_bundles.MetricBundle(
218
+ metric, slicer, sql, summary_metrics=standardStats, display_dict=displayDict
219
+ )
220
+ bundle_list.append(bundle)
221
+
222
+ # A few basic maps
223
+ # Number of observations, coadded depths
224
+ extended_stats = standardStats.copy()
225
+ extended_stats.append(metrics.AreaSummaryMetric(decreasing=True, metric_name="top18k"))
226
+ extended_stats.append(metrics.PercentileMetric(col="metricdata", percentile=10))
227
+ displayDict = {"group": "Basic Maps", "order": 3}
228
+ slicer = spatial_slicer(
229
+ nside=nside,
230
+ lat_col=colmap["dec"],
231
+ lon_col=colmap["ra"],
232
+ lat_lon_deg=colmap["raDecDeg"],
233
+ )
234
+ metric = metrics.CountMetric(col=colmap["mjd"])
235
+ plotDict = {"percentile_clip": 95.0}
236
+ for sql in sql_per_and_all_filters:
237
+ bundle = metric_bundles.MetricBundle(
238
+ metric,
239
+ slicer,
240
+ sql,
241
+ summary_metrics=extended_stats,
242
+ display_dict=displayDict,
243
+ plot_dict=plotDict,
244
+ )
245
+ bundle_list.append(bundle)
246
+
247
+ metric = metrics.Coaddm5Metric(m5_col=colmap["fiveSigmaDepth"])
248
+ for sql in sql_per_and_all_filters:
249
+ bundle = metric_bundles.MetricBundle(
250
+ metric,
251
+ slicer,
252
+ sql,
253
+ summary_metrics=extended_stats,
254
+ display_dict=displayDict,
255
+ )
256
+ bundle_list.append(bundle)
257
+
258
+ # Let's look at two years
259
+ displayDict = {"group": "Roll Check", "order": 1}
260
+ rolling_metrics = []
261
+ rolling_metrics.append(metrics.CountMetric(col=colmap["mjd"], metric_name="Year1.0Count"))
262
+ rolling_metrics.append(metrics.CountMetric(col=colmap["mjd"], metric_name="Year2.5Count"))
263
+ rolling_metrics.append(metrics.CountMetric(col=colmap["mjd"], metric_name="Year3.5Count"))
264
+ rolling_sqls = []
265
+ rolling_sqls.append("night < 365.25")
266
+ rolling_sqls.append("night > %f and night < %f" % (365.25 * 2.5, 365.25 * 3.5))
267
+ rolling_sqls.append("night > %f and night < %f" % (365.25 * 3.5, 365.25 * 4.5))
268
+ for metric, sql in zip(rolling_metrics, rolling_sqls):
269
+ bundle = metric_bundles.MetricBundle(
270
+ metric,
271
+ slicer,
272
+ sql,
273
+ summary_metrics=extended_stats,
274
+ plot_dict=plotDict,
275
+ display_dict=displayDict,
276
+ )
277
+ bundle_list.append(bundle)
278
+
279
+ # Make a cumulative plot of a WFD spot
280
+ sql = "scheduler_note not like '%NEO%' and scheduler_note not like '%near_sun%'"
281
+ uslicer = slicers.UserPointsSlicer(ra=0, dec=-20)
282
+ metric = metrics.CumulativeMetric()
283
+ metricb = metric_bundles.MetricBundle(
284
+ metric,
285
+ uslicer,
286
+ sql,
287
+ plot_funcs=[plots.XyPlotter()],
288
+ run_name=run_name,
289
+ display_dict=displayDict,
290
+ )
291
+ metricb.summary_metrics = []
292
+ bundle_list.append(metricb)
293
+
294
+ # Checking a few basic science things
295
+ # Maybe check astrometry, observation pairs, SN
296
+ plotDict = {"percentile_clip": 95.0}
297
+ displayDict = {"group": "Science", "subgroup": "Astrometry", "order": 4}
298
+
299
+ stackerList = []
300
+ stacker = stackers.ParallaxFactorStacker(
301
+ ra_col=colmap["ra"],
302
+ dec_col=colmap["dec"],
303
+ degrees=colmap["raDecDeg"],
304
+ date_col=colmap["mjd"],
305
+ )
306
+ stackerList.append(stacker)
307
+
308
+ astrom_stats = [
309
+ metrics.AreaSummaryMetric(decreasing=False, metric_name="best18k"),
310
+ metrics.PercentileMetric(col="metricdata", percentile=90),
311
+ ]
312
+ displayDict["caption"] = r"Parallax precision of an $r=20$ flat SED star"
313
+ metric = metrics.ParallaxMetric(
314
+ m5_col=colmap["fiveSigmaDepth"],
315
+ filter_col=colmap["filter"],
316
+ seeing_col=colmap["seeingGeom"],
317
+ )
318
+ sql = sql_constraint
319
+ bundle = metric_bundles.MetricBundle(
320
+ metric,
321
+ slicer,
322
+ sql,
323
+ plot_funcs=subsetPlots,
324
+ display_dict=displayDict,
325
+ stacker_list=stackerList,
326
+ plot_dict=plotDict,
327
+ summary_metrics=astrom_stats,
328
+ )
329
+ bundle_list.append(bundle)
330
+ displayDict["caption"] = r"Proper motion precision of an $r=20$ flat SED star"
331
+ metric = metrics.ProperMotionMetric(
332
+ m5_col=colmap["fiveSigmaDepth"],
333
+ mjd_col=colmap["mjd"],
334
+ filter_col=colmap["filter"],
335
+ seeing_col=colmap["seeingGeom"],
336
+ )
337
+ bundle = metric_bundles.MetricBundle(
338
+ metric,
339
+ slicer,
340
+ sql,
341
+ plot_funcs=subsetPlots,
342
+ display_dict=displayDict,
343
+ plot_dict=plotDict,
344
+ summary_metrics=astrom_stats,
345
+ )
346
+ bundle_list.append(bundle)
347
+
348
+ # Solar system stuff
349
+ displayDict["caption"] = "Fraction of observations that are in pairs"
350
+ displayDict["subgroup"] = "Solar System"
351
+
352
+ sql = "%s (filter='g' or filter='r' or filter='i')" % sqlC
353
+ pairSlicer = slicers.HealpixSlicer(
354
+ nside=pairnside,
355
+ lat_col=colmap["dec"],
356
+ lon_col=colmap["ra"],
357
+ lat_lon_deg=colmap["raDecDeg"],
358
+ )
359
+ metric = metrics.PairFractionMetric(mjd_col=colmap["mjd"])
360
+ bundle = metric_bundles.MetricBundle(
361
+ metric, pairSlicer, sql, plot_funcs=subsetPlots, display_dict=displayDict
362
+ )
363
+ bundle_list.append(bundle)
364
+
365
+ # stats from the scheduler_note column
366
+ if "scheduler_note" in colmap.keys():
367
+ displayDict = {"group": "Basic Stats", "subgroup": "Percent root stats"}
368
+ metric = metrics.StringCountMetric(
369
+ col=colmap["scheduler_note_root"], percent=True, metric_name="Percents", clip_end=False
370
+ )
371
+ sql = ""
372
+ slicer = slicers.UniSlicer()
373
+ bundle = metric_bundles.MetricBundle(metric, slicer, sql, display_dict=displayDict)
374
+ bundle_list.append(bundle)
375
+ displayDict["subgroup"] = "Count root Stats"
376
+ metric = metrics.StringCountMetric(
377
+ col=colmap["scheduler_note_root"], metric_name="Counts", clip_end=False
378
+ )
379
+ bundle = metric_bundles.MetricBundle(metric, slicer, sql, display_dict=displayDict)
380
+ bundle_list.append(bundle)
381
+
382
+ # For pairs and twilights
383
+ if "scheduler_note" in colmap.keys():
384
+ displayDict = {"group": "Basic Stats", "subgroup": "Percent stats"}
385
+ metric = metrics.StringCountMetric(
386
+ col=colmap["scheduler_note"], percent=True, metric_name="Percents", clip_end=False
387
+ )
388
+ sql = (
389
+ "scheduler_note like 'pair%%' or scheduler_note like 'twilight%%' or scheduler_note like 'blob%%'"
390
+ )
391
+ slicer = slicers.UniSlicer()
392
+ bundle = metric_bundles.MetricBundle(metric, slicer, sql, display_dict=displayDict)
393
+ bundle_list.append(bundle)
394
+ displayDict["subgroup"] = "Count Stats"
395
+ metric = metrics.StringCountMetric(col=colmap["scheduler_note"], metric_name="Counts", clip_end=False)
396
+ bundle = metric_bundles.MetricBundle(metric, slicer, sql, display_dict=displayDict)
397
+ bundle_list.append(bundle)
398
+
399
+ # DDF progress
400
+ ddf_surveys = ddf_locations()
401
+ displayDict["group"] = "DDF"
402
+ displayDict["subgroup"] = ""
403
+ for ddf in ddf_surveys:
404
+ label = ddf.replace("DD:", "")
405
+ sql = f"scheduler_note like 'DD:{label}%'"
406
+ slicer = slicers.UniSlicer()
407
+ metric = metrics.CumulativeMetric()
408
+ metricb = metric_bundles.MetricBundle(
409
+ metric,
410
+ slicer,
411
+ sql,
412
+ plot_funcs=[plots.XyPlotter()],
413
+ run_name=run_name,
414
+ display_dict=displayDict,
415
+ )
416
+ metricb.summary_metrics = []
417
+ bundle_list.append(metricb)
418
+
419
+ # Add a sky saturation check
420
+ displayDict = {}
421
+ displayDict["group"] = "Basic Stats"
422
+ displayDict["subgroup"] = "Saturation"
423
+ sql = ""
424
+ metric = metrics.SkySaturationMetric()
425
+ summary = metrics.SumMetric()
426
+ slicer = slicers.UniSlicer()
427
+ bundle_list.append(
428
+ metric_bundles.MetricBundle(metric, slicer, sql, summary_metrics=summary, display_dict=displayDict)
429
+ )
430
+
431
+ benchmarkArea = 18000
432
+ benchmarkNvisits = 825
433
+ minNvisits = 750
434
+ displayDict = {"group": "SRD", "subgroup": "FO metrics", "order": 0}
435
+
436
+ # Configure the count metric which is what is used for f0 slicer.
437
+ metric = metrics.CountExplimMetric(metric_name="fO")
438
+ plotDict = {
439
+ "xlabel": "Number of Visits",
440
+ "asky": benchmarkArea,
441
+ "n_visits": minNvisits,
442
+ "x_min": 0,
443
+ "x_max": 1500,
444
+ }
445
+ summaryMetrics = [
446
+ metrics.FOArea(
447
+ nside=nside,
448
+ norm=False,
449
+ metric_name="fOArea",
450
+ asky=benchmarkArea,
451
+ n_visit=benchmarkNvisits,
452
+ ),
453
+ metrics.FOArea(
454
+ nside=nside,
455
+ norm=True,
456
+ metric_name="fOArea/benchmark",
457
+ asky=benchmarkArea,
458
+ n_visit=benchmarkNvisits,
459
+ ),
460
+ metrics.FONv(
461
+ nside=nside,
462
+ norm=False,
463
+ metric_name="fONv",
464
+ asky=benchmarkArea,
465
+ n_visit=benchmarkNvisits,
466
+ ),
467
+ metrics.FONv(
468
+ nside=nside,
469
+ norm=True,
470
+ metric_name="fONv/benchmark",
471
+ asky=benchmarkArea,
472
+ n_visit=benchmarkNvisits,
473
+ ),
474
+ metrics.FOArea(
475
+ nside=nside,
476
+ norm=False,
477
+ metric_name=f"fOArea_{minNvisits}",
478
+ asky=benchmarkArea,
479
+ n_visit=minNvisits,
480
+ ),
481
+ ]
482
+ caption = "The FO metric evaluates the overall efficiency of observing. "
483
+ caption += (
484
+ "foNv: out of %.2f sq degrees, the area receives at least X and a median of Y visits "
485
+ "(out of %d, if compared to benchmark). " % (benchmarkArea, benchmarkNvisits)
486
+ )
487
+ caption += (
488
+ "fOArea: this many sq deg (out of %.2f sq deg if compared "
489
+ "to benchmark) receives at least %d visits. " % (benchmarkArea, benchmarkNvisits)
490
+ )
491
+ displayDict["caption"] = caption
492
+ slicer = slicers.HealpixSlicer(nside=nside)
493
+ bundle = metric_bundles.MetricBundle(
494
+ metric,
495
+ slicer,
496
+ "",
497
+ plot_dict=plotDict,
498
+ display_dict=displayDict,
499
+ summary_metrics=summaryMetrics,
500
+ plot_funcs=[plots.FOPlot()],
501
+ )
502
+ bundle_list.append(bundle)
503
+
504
+ # check that we have coverage for the first year
505
+ displayDict = {}
506
+ displayDict["group"] = "Year 1"
507
+ displayDict["subgroup"] = "Coverage"
508
+ nside_foot = 32
509
+ slicer = slicers.HealpixSlicer(nside=nside_foot, badval=0)
510
+ sky = EuclidOverlapFootprint(nside=nside_foot, smc_radius=4, lmc_radius=6)
511
+ footprints_hp_array, labels = sky.return_maps()
512
+ for filtername in filternames:
513
+ sql = "filter='%s' and night < 365" % filtername
514
+ metric = metrics.CountMetric(col="night", metric_name="N year 1")
515
+ summary_stat = metrics.FootprintFractionMetric(
516
+ footprint=footprints_hp_array[filtername],
517
+ n_min=3,
518
+ )
519
+ bundle = metric_bundles.MetricBundle(
520
+ metric,
521
+ slicer,
522
+ sql,
523
+ display_dict=displayDict,
524
+ summary_metrics=summary_stat,
525
+ plot_funcs=subsetPlots,
526
+ plot_dict={"color_max": 10},
527
+ )
528
+ bundle_list.append(bundle)
529
+
530
+ # Some ToO stats
531
+ displayDict = {"group": "ToO", "order": 1}
532
+ slicer = spatial_slicer(
533
+ nside=nside,
534
+ lat_col=colmap["dec"],
535
+ lon_col=colmap["ra"],
536
+ lat_lon_deg=colmap["raDecDeg"],
537
+ )
538
+ for filtername in filternames:
539
+ sql = "filter='%s' and scheduler_note like 'ToO%%'" % filtername
540
+ metric = metrics.CountMetric(col=colmap["mjd"], metric_name="N ToO")
541
+ bundle = metric_bundles.MetricBundle(
542
+ metric,
543
+ slicer,
544
+ sql,
545
+ display_dict=displayDict,
546
+ summary_metrics=extended_stats,
547
+ plot_funcs=subsetPlots,
548
+ plot_dict={},
549
+ )
550
+ bundle_list.append(bundle)
551
+
552
+ too_sqls = ["scheduler_note like 'ToO, %" + "t%i'" % hour for hour in [0, 1, 2, 4, 24, 48]] + [
553
+ "scheduler_note like 'ToO, %'"
554
+ ]
555
+ slicer = slicers.UniSlicer()
556
+ for sql in too_sqls:
557
+ metric = metrics.CountMetric(col="night")
558
+ bundle = metric_bundles.MetricBundle(
559
+ metric,
560
+ slicer,
561
+ sql,
562
+ display_dict=displayDict,
563
+ )
564
+ bundle_list.append(bundle)
565
+
566
+ metric = metrics.CountUniqueMetric(col="night")
567
+ bundle = metric_bundles.MetricBundle(
568
+ metric,
569
+ slicer,
570
+ sql,
571
+ display_dict=displayDict,
572
+ )
573
+ bundle_list.append(bundle)
574
+
575
+ for b in bundle_list:
576
+ b.set_run_name(run_name)
577
+
578
+ bd = metric_bundles.make_bundles_dict_from_list(bundle_list)
579
+
580
+ # Add hourglass plots.
581
+ hrDict = hourglassPlots(colmap=colmap, runName=run_name, nyears=nyears, extraSql=sql_constraint)
582
+ bd.update(hrDict)
583
+
584
+ # Add basic slew stats.
585
+ try:
586
+ slewDict = slewBasics(colmap=colmap, run_name=run_name)
587
+ bd.update(slewDict)
588
+ except KeyError as e:
589
+ warnings.warn("Could not add slew stats: missing required key %s from colmap" % (e))
590
+
591
+ return bd
@@ -0,0 +1,79 @@
1
+ """Run the hourglass metric."""
2
+
3
+ __all__ = ("hourglassPlots",)
4
+
5
+ import rubin_sim.maf.metric_bundles as mb
6
+ import rubin_sim.maf.metrics as metrics
7
+ import rubin_sim.maf.slicers as slicers
8
+
9
+ from .col_map_dict import col_map_dict
10
+
11
+
12
+ def hourglassPlots(colmap=None, runName="opsim", nyears=10, extraSql=None, extraInfoLabel=None):
13
+ """Run the hourglass metric, for each individual year.
14
+
15
+ Parameters
16
+ ----------
17
+ colmap : `dict`, optional
18
+ A dictionary with a mapping of column names.
19
+ run_name : `str`, optional
20
+ The name of the simulated survey.
21
+ nyears : `int`, optional
22
+ How many years to attempt to make hourglass plots for.
23
+ extraSql : `str`, optional
24
+ Add an extra sql constraint before running metrics.
25
+ extraInfoLabel : `str`, optional
26
+ Add an extra piece of info_label before running metrics.
27
+
28
+ Returns
29
+ -------
30
+ metric_bundleDict : `dict` of `maf.MetricBundle`
31
+ """
32
+ if colmap is None:
33
+ colmap = col_map_dict()
34
+ bundleList = []
35
+
36
+ sql = ""
37
+ info_label = ""
38
+ # Add additional sql constraint (such as wfdWhere) and info_label
39
+ if (extraSql is not None) and (len(extraSql) > 0):
40
+ sql = extraSql
41
+ if extraInfoLabel is None:
42
+ info_label = extraSql.replace("filter =", "").replace("filter=", "")
43
+ info_label = info_label.replace('"', "").replace("'", "")
44
+ if extraInfoLabel is not None:
45
+ info_label = extraInfoLabel
46
+
47
+ years = list(range(nyears + 1))
48
+ displayDict = {"group": "Hourglass"}
49
+ for year in years[1:]:
50
+ displayDict["subgroup"] = "Year %d" % year
51
+ displayDict["caption"] = (
52
+ "Visualization of the filter usage of the telescope. "
53
+ "The black wavy line indicates lunar phase; the red and blue "
54
+ "solid lines indicate nautical and civil twilight."
55
+ )
56
+ sqlconstraint = "night > %i and night <= %i" % (
57
+ 365.25 * (year - 1),
58
+ 365.25 * year,
59
+ )
60
+ if len(sql) > 0:
61
+ sqlconstraint = "(%s) and (%s)" % (sqlconstraint, sql)
62
+ md = info_label + " year %i-%i" % (year - 1, year)
63
+ slicer = slicers.HourglassSlicer()
64
+ metric = metrics.HourglassMetric(
65
+ night_col=colmap["night"], mjd_col=colmap["mjd"], metric_name="Hourglass"
66
+ )
67
+ bundle = mb.MetricBundle(
68
+ metric,
69
+ slicer,
70
+ constraint=sqlconstraint,
71
+ info_label=md,
72
+ display_dict=displayDict,
73
+ )
74
+ bundleList.append(bundle)
75
+
76
+ # Set the run_name for all bundles and return the bundleDict.
77
+ for b in bundleList:
78
+ b.set_run_name(runName)
79
+ return mb.make_bundles_dict_from_list(bundleList)