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,757 @@
1
+ """Sets of metrics to look at time between visits/pairs, etc."""
2
+
3
+ __all__ = ("intraNight", "interNight", "timeGaps", "seasons")
4
+
5
+ import numpy as np
6
+
7
+ import rubin_sim.maf.metric_bundles as mb
8
+ import rubin_sim.maf.metrics as metrics
9
+ import rubin_sim.maf.plots as plots
10
+ import rubin_sim.maf.slicers as slicers
11
+
12
+ from .col_map_dict import col_map_dict
13
+ from .common import filter_list, standard_summary
14
+
15
+
16
+ def intraNight(
17
+ colmap=None,
18
+ runName="opsim",
19
+ nside=64,
20
+ extraSql=None,
21
+ extraInfoLabel=None,
22
+ slicer=None,
23
+ display_group="IntraNight",
24
+ subgroup="Pairs",
25
+ ):
26
+ """Generate a set of statistics about the pair/triplet/etc. rate
27
+ within a night.
28
+
29
+ Parameters
30
+ ----------
31
+ colmap : `dict` or None, optional
32
+ A dictionary with a mapping of column names.
33
+ runName : `str`, optional
34
+ The name of the simulated survey.
35
+ nside : `int`, optional
36
+ Nside for the healpix slicer.
37
+ extraSql : `str` or None, optional
38
+ Additional sql constraint to apply to all metrics.
39
+ extraInfoLabel : `str` or None, optional
40
+ Additional info_label to apply to all results.
41
+ slicer : `maf.BaseSlicer` or None
42
+ Optionally use something other than a HealpixSlicer
43
+
44
+ Returns
45
+ -------
46
+ metric_bundleDict : `dict` of `maf.MetricBundle`
47
+ """
48
+
49
+ if colmap is None:
50
+ colmap = col_map_dict()
51
+
52
+ info_label = extraInfoLabel
53
+ if extraSql is not None and len(extraSql) > 0:
54
+ if info_label is None:
55
+ info_label = extraSql
56
+
57
+ raCol = colmap["ra"]
58
+ decCol = colmap["dec"]
59
+ degrees = colmap["raDecDeg"]
60
+
61
+ bundleList = []
62
+ standardStats = standard_summary()
63
+
64
+ if slicer is None:
65
+ slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
66
+
67
+ # Look for the fraction of visits in gri where there are pairs
68
+ # within dtMin/dtMax.
69
+ displayDict = {
70
+ "group": display_group,
71
+ "subgroup": subgroup,
72
+ "caption": None,
73
+ "order": 0,
74
+ }
75
+ if extraSql is not None and len(extraSql) > 0:
76
+ sql = "(%s) and (filter='g' or filter='r' or filter='i')" % extraSql
77
+ else:
78
+ sql = "filter='g' or filter='r' or filter='i'"
79
+ md = "gri"
80
+ if info_label is not None:
81
+ md += " " + info_label
82
+ dtMin = 10.0
83
+ dtMax = 60.0
84
+ metric = metrics.PairFractionMetric(
85
+ mjd_col=colmap["mjd"],
86
+ min_gap=dtMin,
87
+ max_gap=dtMax,
88
+ metric_name="Fraction of visits in pairs (%.0f-%.0f min)" % (dtMin, dtMax),
89
+ )
90
+ displayDict["caption"] = (
91
+ "Fraction of %s visits that have a paired visit"
92
+ "between %.1f and %.1f minutes away. "
93
+ % (
94
+ md,
95
+ dtMin,
96
+ dtMax,
97
+ )
98
+ )
99
+ displayDict["caption"] += "If all visits were in pairs, this fraction would be 1."
100
+ displayDict["order"] += 1
101
+ bundle = mb.MetricBundle(
102
+ metric,
103
+ slicer,
104
+ sql,
105
+ info_label=md,
106
+ summary_metrics=standardStats,
107
+ display_dict=displayDict,
108
+ )
109
+ bundleList.append(bundle)
110
+
111
+ dtMin = 20.0
112
+ dtMax = 90.0
113
+ metric = metrics.PairFractionMetric(
114
+ mjd_col=colmap["mjd"],
115
+ min_gap=dtMin,
116
+ max_gap=dtMax,
117
+ metric_name="Fraction of visits in pairs (%.0f-%.0f min)" % (dtMin, dtMax),
118
+ )
119
+ displayDict["caption"] = (
120
+ "Fraction of %s visits that have a paired visit"
121
+ "between %.1f and %.1f minutes away. "
122
+ % (
123
+ md,
124
+ dtMin,
125
+ dtMax,
126
+ )
127
+ )
128
+ displayDict["caption"] += "If all visits were in pairs, this fraction would be 1."
129
+ displayDict["order"] += 1
130
+ bundle = mb.MetricBundle(
131
+ metric,
132
+ slicer,
133
+ sql,
134
+ info_label=md,
135
+ summary_metrics=standardStats,
136
+ display_dict=displayDict,
137
+ )
138
+ bundleList.append(bundle)
139
+
140
+ # Look at the fraction of visits which have another visit within dtMax gri.
141
+ dtMax = 60.0
142
+ metric = metrics.NRevisitsMetric(
143
+ mjd_col=colmap["mjd"],
144
+ d_t=dtMax,
145
+ normed=True,
146
+ metric_name="Fraction of visits with a revisit < %.0f min" % dtMax,
147
+ )
148
+ displayDict["caption"] = "Fraction of %s visits that have another visit " "within %.1f min. " % (
149
+ md,
150
+ dtMax,
151
+ )
152
+ displayDict["caption"] += "If all visits were in pairs (only), this fraction would be 0.5."
153
+ displayDict["order"] += 1
154
+ bundle = mb.MetricBundle(
155
+ metric,
156
+ slicer,
157
+ sql,
158
+ info_label=md,
159
+ summary_metrics=standardStats,
160
+ display_dict=displayDict,
161
+ )
162
+ bundleList.append(bundle)
163
+
164
+ # Intranight gap map, all filters. Returns value in hours.
165
+ metric = metrics.IntraNightGapsMetric(
166
+ metric_name="Median Intra-Night Gap",
167
+ mjd_col=colmap["mjd"],
168
+ reduce_func=np.median,
169
+ )
170
+ displayDict["caption"] = "Median gap between consecutive visits within a night, all bands"
171
+ if info_label is None or len(info_label) == 0:
172
+ displayDict["caption"] += ", all visits."
173
+ else:
174
+ displayDict["caption"] += ", %s." % info_label
175
+ displayDict["order"] += 1
176
+ plotDict = {"percentile_clip": 95}
177
+ bundle = mb.MetricBundle(
178
+ metric,
179
+ slicer,
180
+ extraSql,
181
+ info_label=info_label,
182
+ display_dict=displayDict,
183
+ plot_dict=plotDict,
184
+ summary_metrics=standardStats,
185
+ )
186
+ bundleList.append(bundle)
187
+
188
+ # Max Timespans (in each night)
189
+ # Run in all filters, u+g, g+r, r+i, i+z and z+y filters,
190
+ # and individual filters
191
+
192
+ metric = metrics.NightTimespanMetric(percentile=75, night_col=colmap["night"], mjd_col=colmap["mjd"])
193
+ displayDict["caption"] = "75th percentile value of the maximum intra-night timespan, on each night"
194
+ # individual and all filters
195
+ filterlist, colors, orders, sqls, info_labels = filter_list(
196
+ all=True, extra_sql=extraSql, extra_info_label=info_label
197
+ )
198
+ for f in filterlist:
199
+ if info_labels[f] is None or len(info_labels[f]) == 0:
200
+ displayDict["caption"] += ", all visits."
201
+ else:
202
+ displayDict["caption"] += ", %s." % info_labels[f]
203
+ displayDict["order"] = orders[f]
204
+ plotDict = {"percentile_clip": 98}
205
+ bundle = mb.MetricBundle(
206
+ metric,
207
+ slicer,
208
+ sqls[f],
209
+ info_label=info_labels[f],
210
+ display_dict=displayDict,
211
+ plot_dict=plotDict,
212
+ summary_metrics=standardStats,
213
+ )
214
+ bundleList.append(bundle)
215
+ # subsets of adjacent filters
216
+ filtersubsets = {
217
+ "ug": "(filter = 'u' or filter = 'g')",
218
+ "gr": "(filter = 'g' or filter = 'r')",
219
+ "ri": "(filter = 'r' or filter = 'i')",
220
+ "iz": "(filter = 'i' or filter = 'z')",
221
+ "zy": "(filter = 'z' or filter = 'y')",
222
+ }
223
+ sqls = [extraSql]
224
+ if extraSql is not None and len(extraSql) > 0:
225
+ for fi in filtersubsets:
226
+ sqls.append(f"{extraSql} and {filtersubsets[fi]}")
227
+ else:
228
+ for fi in filtersubsets:
229
+ sqls.append(f"{filtersubsets[fi]}")
230
+ md = [info_label]
231
+ if info_label is not None:
232
+ for fi in filtersubsets:
233
+ md.append(f"{info_label} {fi} bands")
234
+ else:
235
+ for fi in filtersubsets:
236
+ md.append(f"{fi} bands")
237
+
238
+ for sql, info in zip(sqls, md):
239
+ if info_label is None or len(info_label) == 0:
240
+ displayDict["caption"] += ", all visits."
241
+ else:
242
+ displayDict["caption"] += ", %s." % info_label
243
+ displayDict["order"] += 1
244
+ plotDict = {"percentile_clip": 98}
245
+ bundle = mb.MetricBundle(
246
+ metric,
247
+ slicer,
248
+ sql,
249
+ info_label=info,
250
+ display_dict=displayDict,
251
+ plot_dict=plotDict,
252
+ summary_metrics=standardStats,
253
+ )
254
+ bundleList.append(bundle)
255
+
256
+ # Histogram the number of visits per night.
257
+ countbins = np.arange(0, 10, 1)
258
+ metric = metrics.NVisitsPerNightMetric(
259
+ night_col=colmap["night"], bins=countbins, metric_name="NVisitsPerNight"
260
+ )
261
+ plotDict = {"bins": countbins, "xlabel": "Number of visits each night"}
262
+ displayDict["caption"] = "Histogram of the number of visits in each night, per point on the sky"
263
+ if info_label is None or len(info_label) == 0:
264
+ displayDict["caption"] += ", all proposals."
265
+ else:
266
+ displayDict["caption"] += ", %s." % info_label
267
+ displayDict["order"] = 0
268
+ plotFunc = plots.SummaryHistogram()
269
+ bundle = mb.MetricBundle(
270
+ metric,
271
+ slicer,
272
+ extraSql,
273
+ plot_dict=plotDict,
274
+ display_dict=displayDict,
275
+ info_label=info_label,
276
+ plot_funcs=[plotFunc],
277
+ )
278
+ bundleList.append(bundle)
279
+
280
+ # Histogram of the time between revisits (all filters) within two hours.
281
+ binMin = 0
282
+ binMax = 120.0
283
+ bin_size = 5.0
284
+ bins_metric = np.arange(binMin / 60.0 / 24.0, (binMax + bin_size) / 60.0 / 24.0, bin_size / 60.0 / 24.0)
285
+ bins_plot = bins_metric * 24.0 * 60.0
286
+ metric = metrics.TgapsMetric(bins=bins_metric, times_col=colmap["mjd"], metric_name="DeltaT Histogram")
287
+ plotDict = {"bins": bins_plot, "xlabel": "dT (minutes)"}
288
+ displayDict["caption"] = (
289
+ "Histogram of the time between consecutive visits to a given point "
290
+ "on the sky, considering visits between %.1f and %.1f minutes" % (binMin, binMax)
291
+ )
292
+ if info_label is None or len(info_label) == 0:
293
+ displayDict["caption"] += ", all proposals."
294
+ else:
295
+ displayDict["caption"] += ", %s." % info_label
296
+ displayDict["order"] += 1
297
+ plotFunc = plots.SummaryHistogram()
298
+ bundle = mb.MetricBundle(
299
+ metric,
300
+ slicer,
301
+ extraSql,
302
+ plot_dict=plotDict,
303
+ display_dict=displayDict,
304
+ info_label=info_label,
305
+ plot_funcs=[plotFunc],
306
+ )
307
+ bundleList.append(bundle)
308
+
309
+ # Set the run_name for all bundles and return the bundleDict.
310
+ for b in bundleList:
311
+ b.set_run_name(runName)
312
+ return mb.make_bundles_dict_from_list(bundleList)
313
+
314
+
315
+ def interNight(
316
+ colmap=None,
317
+ runName="opsim",
318
+ nside=64,
319
+ extraSql=None,
320
+ extraInfoLabel=None,
321
+ slicer=None,
322
+ display_group="InterNight",
323
+ subgroup="Night gaps",
324
+ ):
325
+ """Generate a set of statistics about the spacing between nights
326
+ with observations.
327
+
328
+ Parameters
329
+ ----------
330
+ colmap : `dict` or None, optional
331
+ A dictionary with a mapping of column names.
332
+ runName : `str`, optional
333
+ The name of the simulated survey.
334
+ nside : `int`, optional
335
+ Nside for the healpix slicer.
336
+ extraSql : `str` or None, optional
337
+ Additional sql constraint to apply to all metrics.
338
+ extraInfoLabel : `str` or None, optional
339
+ Additional info_label to use for all outputs.
340
+ slicer : `maf.BaseSlicer` or None
341
+ Optionally use something other than a HealpixSlicer
342
+
343
+ Returns
344
+ -------
345
+ metric_bundleDict : `dict` of `maf.MetricBundle`
346
+ """
347
+
348
+ if colmap is None:
349
+ colmap = col_map_dict()
350
+
351
+ bundleList = []
352
+
353
+ raCol = colmap["ra"]
354
+ decCol = colmap["dec"]
355
+ degrees = colmap["raDecDeg"]
356
+ filterlist, colors, orders, sqls, info_label = filter_list(
357
+ all=True, extra_sql=extraSql, extra_info_label=extraInfoLabel
358
+ )
359
+
360
+ if slicer is None:
361
+ slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
362
+
363
+ displayDict = {
364
+ "group": display_group,
365
+ "subgroup": subgroup,
366
+ "caption": None,
367
+ "order": 0,
368
+ }
369
+
370
+ # Histogram of the number of nights between visits.
371
+ bins = np.arange(1, 20.5, 1)
372
+ metric = metrics.NightgapsMetric(bins=bins, night_col=colmap["night"], metric_name="DeltaNight Histogram")
373
+ plotDict = {"bins": bins, "xlabel": "dT (nights)"}
374
+ displayDict["caption"] = (
375
+ "Histogram of the number of nights between consecutive visits to a "
376
+ "given point on the sky, considering separations between %d and %d" % (bins.min(), bins.max())
377
+ )
378
+ if info_label["all"] is None or len(info_label["all"]) == 0:
379
+ displayDict["caption"] += ", all proposals."
380
+ else:
381
+ displayDict["caption"] += ", %s." % info_label["all"]
382
+ plotFunc = plots.SummaryHistogram()
383
+ bundle = mb.MetricBundle(
384
+ metric,
385
+ slicer,
386
+ sqls["all"],
387
+ plot_dict=plotDict,
388
+ display_dict=displayDict,
389
+ info_label=info_label["all"],
390
+ plot_funcs=[plotFunc],
391
+ )
392
+ bundleList.append(bundle)
393
+
394
+ standardStats = standard_summary()
395
+
396
+ # Look at the total number of unique nights with visits
397
+ metric = metrics.CountUniqueMetric(col=colmap["night"], metric_name="N Unique Nights")
398
+ displayDict["caption"] = "Number of unique nights with visits"
399
+ bundle = mb.MetricBundle(
400
+ metric,
401
+ slicer,
402
+ sqls["all"],
403
+ info_label=info_label["all"],
404
+ display_dict=displayDict,
405
+ plot_dict={"color_min": 0, "color_max": 500},
406
+ summary_metrics=standardStats,
407
+ )
408
+ bundleList.append(bundle)
409
+
410
+ # Median inter-night gap (each and all filters)
411
+ metric = metrics.InterNightGapsMetric(
412
+ metric_name="Median Inter-Night Gap",
413
+ mjd_col=colmap["mjd"],
414
+ reduce_func=np.median,
415
+ )
416
+ for f in filterlist:
417
+ displayDict["caption"] = "Median gap between nights with observations, %s." % info_label[f]
418
+ displayDict["order"] = orders[f]
419
+ plotDict = {"color": colors[f], "percentile_clip": 95.0}
420
+ bundle = mb.MetricBundle(
421
+ metric,
422
+ slicer,
423
+ sqls[f],
424
+ info_label=info_label[f],
425
+ display_dict=displayDict,
426
+ plot_dict=plotDict,
427
+ summary_metrics=standardStats,
428
+ )
429
+ bundleList.append(bundle)
430
+
431
+ # 20th percentile inter-night gap (each and all filters) -
432
+ # aimed at active rolling years
433
+ def rfunc(simdata):
434
+ return np.percentile(simdata, 20)
435
+
436
+ metric = metrics.InterNightGapsMetric(
437
+ metric_name="20thPercentile Inter-Night Gap",
438
+ mjd_col=colmap["mjd"],
439
+ reduce_func=rfunc,
440
+ )
441
+ for f in filterlist:
442
+ displayDict["caption"] = "20th percentile gap between nights with observations, %s." % info_label[f]
443
+ displayDict["order"] = orders[f]
444
+ plotDict = {"color": colors[f], "percentile_clip": 95.0}
445
+ bundle = mb.MetricBundle(
446
+ metric,
447
+ slicer,
448
+ sqls[f],
449
+ info_label=info_label[f],
450
+ display_dict=displayDict,
451
+ plot_dict=plotDict,
452
+ summary_metrics=standardStats,
453
+ )
454
+ bundleList.append(bundle)
455
+
456
+ # Maximum inter-night gap (in each and all filters).
457
+ metric = metrics.InterNightGapsMetric(
458
+ metric_name="Max Inter-Night Gap", mjd_col=colmap["mjd"], reduce_func=np.max
459
+ )
460
+ for f in filterlist:
461
+ displayDict["caption"] = "Maximum gap between nights with observations, %s." % info_label[f]
462
+ displayDict["order"] = orders[f]
463
+ plotDict = {"color": colors[f], "percentile_clip": 95.0, "bin_size": 5}
464
+ bundle = mb.MetricBundle(
465
+ metric,
466
+ slicer,
467
+ sqls[f],
468
+ info_label=info_label[f],
469
+ display_dict=displayDict,
470
+ plot_dict=plotDict,
471
+ summary_metrics=standardStats,
472
+ )
473
+ bundleList.append(bundle)
474
+
475
+ # Set the run_name for all bundles and return the bundleDict.
476
+ for b in bundleList:
477
+ b.set_run_name(runName)
478
+ return mb.make_bundles_dict_from_list(bundleList)
479
+
480
+
481
+ def timeGaps(
482
+ colmap=None,
483
+ runName="opsim",
484
+ nside=64,
485
+ extraSql=None,
486
+ extraInfoLabel=None,
487
+ slicer=None,
488
+ display_group="Time Coverage",
489
+ subgroup=None,
490
+ ):
491
+ """Generate a set of statistics about the spacing
492
+ between nights with observations.
493
+
494
+ Parameters
495
+ ----------
496
+ colmap : `dict`, optional
497
+ A dictionary with a mapping of column names.
498
+ runName : `str`, optional
499
+ The name of the simulated survey.
500
+ nside : `int`, optional
501
+ Nside for the healpix slicer.
502
+ extraSql : `str`, optional
503
+ Additional sql constraint to apply to all metrics.
504
+ extraInfoLabel : `str`, optional
505
+ Additional info_label to use for all outputs.
506
+ slicer : `rubin_sim.maf.slicer.BaseSlicer`, optional
507
+ Optionally use something other than a HealpixSlicer
508
+
509
+ Returns
510
+ -------
511
+ bundle_dict : `dict` of `rubin_sim.maf.MetricBundle`
512
+ """
513
+
514
+ if colmap is None:
515
+ colmap = col_map_dict()
516
+
517
+ bundleList = []
518
+
519
+ raCol = colmap["ra"]
520
+ decCol = colmap["dec"]
521
+ degrees = colmap["raDecDeg"]
522
+ filterlist, colors, orders, sqls, info_label = filter_list(
523
+ all=True, extra_sql=extraSql, extra_info_label=extraInfoLabel
524
+ )
525
+
526
+ if slicer is None:
527
+ slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
528
+
529
+ displayDict = {
530
+ "group": display_group,
531
+ "subgroup": subgroup,
532
+ "caption": None,
533
+ "order": 0,
534
+ }
535
+
536
+ # Logarithmically spaced gaps from 30s to 5 years
537
+ tMin = 30 / 60 / 60 / 24.0 # 30s
538
+ tMax = 5 * 365.25 # 5 years
539
+ tgaps = np.logspace(np.log10(tMin), np.log10(tMax), 100)
540
+
541
+ for f in filterlist:
542
+ m1 = metrics.TgapsMetric(bins=tgaps, all_gaps=False)
543
+ plotDict = {
544
+ "bins": tgaps,
545
+ "xscale": "log",
546
+ "y_min": 0,
547
+ "figsize": (8, 6),
548
+ "ylabel": "Number of observation pairs",
549
+ "xlabel": "Time gap between pairs of visits (days)",
550
+ "color": colors[f],
551
+ }
552
+ plotFuncs = [plots.SummaryHistogram()]
553
+ displayDict["caption"] = (
554
+ f"Summed Histogram of time between visits at each point in the sky, " f"in {f} band(s)."
555
+ )
556
+ displayDict["order"] = orders[f]
557
+ bundleList.append(
558
+ mb.MetricBundle(
559
+ m1,
560
+ slicer,
561
+ constraint=sqls[f],
562
+ info_label=info_label[f],
563
+ run_name=runName,
564
+ plot_dict=plotDict,
565
+ plot_funcs=plotFuncs,
566
+ display_dict=displayDict,
567
+ )
568
+ )
569
+
570
+ gaps = [3.0, 7.0, 24.0]
571
+ for gap in gaps:
572
+ summary_stats = []
573
+ summary_stats.append(
574
+ metrics.AreaSummaryMetric(
575
+ area=18000, reduce_func=np.median, decreasing=True, metric_name="Median (top 18k)"
576
+ )
577
+ )
578
+
579
+ summary_stats.append(
580
+ metrics.AreaSummaryMetric(
581
+ area=18000, reduce_func=np.mean, decreasing=True, metric_name="Mean (top 18k)"
582
+ )
583
+ )
584
+
585
+ summary_stats.append(metrics.MeanMetric())
586
+ summary_stats.append(metrics.MedianMetric())
587
+
588
+ m2 = metrics.GapsMetric(time_scale=gap, metric_name=f"Gaps at {gap: .1f} hr")
589
+ plotFuncs = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
590
+ plotDict = {"color_min": 0, "color": colors[f], "percentile_clip": 95}
591
+ displayDict["subgroup"] = "Gaps Sampling"
592
+ displayDict["caption"] = (
593
+ f"Number of times the timescale of ~{gap: .1f} hours is sampled in {f} band(s)."
594
+ )
595
+ displayDict["order"] = orders[f]
596
+ bundleList.append(
597
+ mb.MetricBundle(
598
+ m2,
599
+ slicer,
600
+ constraint=sqls[f],
601
+ info_label=info_label[f],
602
+ run_name=runName,
603
+ summary_metrics=summary_stats,
604
+ plot_dict=plotDict,
605
+ plot_funcs=plotFuncs,
606
+ display_dict=displayDict,
607
+ )
608
+ )
609
+
610
+ return mb.make_bundles_dict_from_list(bundleList)
611
+
612
+
613
+ def seasons(
614
+ colmap=None,
615
+ runName="opsim",
616
+ nside=64,
617
+ extraSql=None,
618
+ extraInfoLabel=None,
619
+ slicer=None,
620
+ ):
621
+ """Generate a set of statistics about the length and number of seasons.
622
+
623
+ Parameters
624
+ ----------
625
+ colmap : `dict` or None, optional
626
+ A dictionary with a mapping of column names.
627
+ runName : `str`, optional
628
+ The name of the simulated survey.
629
+ nside : `int`, optional
630
+ Nside for the healpix slicer.
631
+ extraSql : `str` or None, optional
632
+ Additional sql constraint to apply to all metrics.
633
+ extraInfoLabel : `str` or None, optional
634
+ Additional info_label to use for all outputs.
635
+ slicer : `maf.BaseSlicer` or None`
636
+ Optionally use something other than a HealpixSlicer
637
+
638
+ Returns
639
+ -------
640
+ metric_bundleDict : `dict` of `maf.MetricBundle`
641
+ """
642
+
643
+ if colmap is None:
644
+ colmap = col_map_dict()
645
+
646
+ bundleList = []
647
+
648
+ # Set up basic all and per filter sql constraints.
649
+ raCol = colmap["ra"]
650
+ decCol = colmap["dec"]
651
+ degrees = colmap["raDecDeg"]
652
+ filterlist, colors, orders, sqls, info_label = filter_list(
653
+ all=True, extra_sql=extraSql, extra_info_label=extraInfoLabel
654
+ )
655
+
656
+ if slicer is None:
657
+ slicer = slicers.HealpixSlicer(nside=nside, lat_col=decCol, lon_col=raCol, lat_lon_deg=degrees)
658
+
659
+ displayDict = {
660
+ "group": "IntraSeason",
661
+ "subgroup": "Season length",
662
+ "caption": None,
663
+ "order": 0,
664
+ }
665
+
666
+ standardStats = standard_summary()
667
+
668
+ metric = metrics.SeasonLengthMetric(
669
+ metric_name="Median Season Length", mjd_col=colmap["mjd"], reduce_func=np.median
670
+ )
671
+ for f in filterlist:
672
+ displayDict["caption"] = "Median season length, %s." % info_label[f]
673
+ displayDict["order"] = orders[f]
674
+ maxS = 250
675
+ if f == "all":
676
+ minS = 90
677
+ else:
678
+ minS = 30
679
+ plotDict = {
680
+ "color": colors[f],
681
+ "color_min": minS,
682
+ "color_max": maxS,
683
+ "x_min": minS,
684
+ "x_max": maxS,
685
+ }
686
+ bundle = mb.MetricBundle(
687
+ metric,
688
+ slicer,
689
+ sqls[f],
690
+ info_label=info_label[f],
691
+ display_dict=displayDict,
692
+ plot_dict=plotDict,
693
+ summary_metrics=standardStats,
694
+ )
695
+ bundleList.append(bundle)
696
+
697
+ # 80th percentile season length -
698
+ # aimed at finding season length during rolling or long years
699
+ def rfunc(simdata):
700
+ return np.percentile(simdata, 80)
701
+
702
+ metric = metrics.SeasonLengthMetric(
703
+ metric_name="80thPercentile Season Length",
704
+ mjd_col=colmap["mjd"],
705
+ reduce_func=rfunc,
706
+ )
707
+ for f in filterlist:
708
+ displayDict["caption"] = "80th percentile season length, %s." % info_label[f]
709
+ displayDict["order"] = orders[f]
710
+ maxS = 350
711
+ if f == "all":
712
+ minS = 90
713
+ else:
714
+ minS = 30
715
+ plotDict = {
716
+ "color": colors[f],
717
+ "color_min": minS,
718
+ "color_max": maxS,
719
+ "x_min": minS,
720
+ "x_max": maxS,
721
+ }
722
+ bundle = mb.MetricBundle(
723
+ metric,
724
+ slicer,
725
+ sqls[f],
726
+ info_label=info_label[f],
727
+ display_dict=displayDict,
728
+ plot_dict=plotDict,
729
+ summary_metrics=standardStats,
730
+ )
731
+ bundleList.append(bundle)
732
+
733
+ # Number of seasons
734
+ metric = metrics.CampaignLengthMetric(
735
+ metric_name="NSeasons",
736
+ mjd_col=colmap["mjd"],
737
+ exp_time_col=colmap["exptime"],
738
+ min_exp_time=15,
739
+ )
740
+ displayDict["caption"] = "Number of seasons, any filter."
741
+ displayDict["order"] = 0
742
+ plotDict = {"color": "k", "color_min": 0, "color_max": 11, "x_min": 0, "x_max": 11}
743
+ bundle = mb.MetricBundle(
744
+ metric,
745
+ slicer,
746
+ sqls["all"],
747
+ info_label=info_label["all"],
748
+ display_dict=displayDict,
749
+ plot_dict=plotDict,
750
+ summary_metrics=standardStats,
751
+ )
752
+ bundleList.append(bundle)
753
+
754
+ # Set the run_name for all bundles and return the bundleDict.
755
+ for b in bundleList:
756
+ b.set_run_name(runName)
757
+ return mb.make_bundles_dict_from_list(bundleList)