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,646 @@
1
+ __all__ = (
2
+ "MoMetricBundle",
3
+ "MoMetricBundleGroup",
4
+ "create_empty_mo_metric_bundle",
5
+ "make_completeness_bundle",
6
+ )
7
+
8
+ import os
9
+ import warnings
10
+
11
+ import matplotlib.pyplot as plt
12
+ import numpy as np
13
+ import numpy.ma as ma
14
+
15
+ from rubin_sim.maf.metrics import BaseMoMetric, ValueAtHMetric
16
+ from rubin_sim.maf.plots import PlotHandler
17
+ from rubin_sim.maf.slicers import MoObjSlicer
18
+ from rubin_sim.maf.stackers import BaseMoStacker, MoMagStacker
19
+
20
+ from .metric_bundle import MetricBundle
21
+
22
+
23
+ def create_empty_mo_metric_bundle():
24
+ """Create an empty metric bundle.
25
+
26
+ Returns
27
+ -------
28
+ MoMetricBundle : `~rubin_sim.maf.metricBundles.MoMetricBundle`
29
+ An empty metric bundle, configured with just
30
+ the :class:`BaseMetric` and :class:`BaseSlicer`.
31
+ """
32
+ return MoMetricBundle(BaseMoMetric(), MoObjSlicer(), None)
33
+
34
+
35
+ def make_completeness_bundle(bundle, completeness_metric, h_mark=None, results_db=None):
36
+ """Evaluate a MoMetricBundle with a completeness-style metric, and
37
+ downsample into a new MoMetricBundle marginalized over the population.
38
+
39
+ Parameters
40
+ ----------
41
+ bundle : `~rubin_sim.maf.metricBundles.MoMetricBundle`
42
+ The metric bundle with a completeness summary statistic.
43
+ completeness_metric : `~rubin_sim.maf.metric`
44
+ The summary (completeness) metric to run on the bundle.
45
+ h_mark : `float`, optional
46
+ The Hmark value to add to the plotting dictionary of the new
47
+ mock bundle. Default None.
48
+ results_db : `~rubin_sim.maf.db.ResultsDb`, optional
49
+ The results_db in which to record the summary statistic value at
50
+ Hmark. Default None.
51
+
52
+ Returns
53
+ -------
54
+ mo_metric_bundle : `~rubin_sim.maf.metricBundles.MoMetricBundle`
55
+
56
+ Notes
57
+ -----
58
+ This utility turns a metric bundle which could evaluate a metric over
59
+ the population, into a secondary or mock metric bundle, using either
60
+ MoCompleteness or MoCumulativeCompleteness summary
61
+ metrics to marginalize over the population of moving objects.
62
+ This lets us use the plotHandler + plots.MetricVsH
63
+ to generate plots across the population, using the completeness
64
+ information.
65
+ This utility will also work with completeness metric run in order
66
+ to calculate fraction of the population,
67
+ or with MoCompletenessAtTime metric.
68
+ """
69
+ bundle.set_summary_metrics(completeness_metric)
70
+ # This step adds summary values at each point to the original metric -
71
+ # we use this to populate the completeness values in the next step.
72
+ # However, we may not want them to go into the results_db.
73
+ bundle.compute_summary_stats(results_db)
74
+ summary_name = completeness_metric.name
75
+ # Make up the bundle, including the metric values.
76
+ completeness = ma.MaskedArray(
77
+ data=bundle.summary_values[summary_name]["value"],
78
+ mask=np.zeros(len(bundle.summary_values[summary_name]["value"])),
79
+ fill_value=0,
80
+ )
81
+ mb = MoMetricBundle(
82
+ completeness_metric,
83
+ bundle.slicer,
84
+ constraint=bundle.constraint,
85
+ run_name=bundle.run_name,
86
+ info_label=bundle.info_label,
87
+ display_dict=bundle.display_dict,
88
+ )
89
+ plot_dict = {}
90
+ plot_dict.update(bundle.plot_dict)
91
+ plot_dict["label"] = bundle.info_label
92
+ if "Completeness" not in summary_name:
93
+ plot_dict["label"] += " " + summary_name.replace("FractionPop_", "")
94
+ mb.metric_values = completeness.reshape(1, len(completeness))
95
+ if h_mark is not None:
96
+ metric = ValueAtHMetric(h_mark=h_mark)
97
+ mb.set_summary_metrics(metric)
98
+ mb.compute_summary_stats(results_db)
99
+ val = mb.summary_values["Value At H=%.1f" % h_mark]
100
+ if val is None:
101
+ val = 0
102
+ if summary_name.startswith("Cumulative"):
103
+ plot_dict["label"] += ": @ H(<=%.1f) = %.1f%s" % (h_mark, val * 100, "%")
104
+ else:
105
+ plot_dict["label"] += ": @ H(=%.1f) = %.1f%s" % (h_mark, val * 100, "%")
106
+ mb.set_plot_dict(plot_dict)
107
+ return mb
108
+
109
+
110
+ class MoMetricBundle(MetricBundle):
111
+ """Define a moving object metric bundle combination of
112
+ moving-object metric, moving-object slicer, and constraint.
113
+
114
+ Parameters
115
+ ----------
116
+ metric : `~rubin_sim.maf.metric`
117
+ The Metric class to run per slice_point
118
+ slicer : `~rubin_sim.maf.slicer`
119
+ The Slicer to apply to the incoming visit data (the observations).
120
+ constraint : `str` or None, opt
121
+ A (sql-style) constraint to apply to the visit data, to apply a
122
+ broad sub-selection.
123
+ stacker_list : `list` [`~rubin_sim.maf.stacker`], opt
124
+ A list of pre-configured stackers to use to generate additional
125
+ columns per visit.
126
+ These will be generated automatically if needed, but pre-configured
127
+ versions will override these.
128
+ run_name : `str`, opt
129
+ The name of the simulation being run.
130
+ This will be added to output files and plots.
131
+ Setting it prevents file conflicts when running the same
132
+ metric on multiple simulations, and
133
+ provides a way to identify which simulation is being analyzed.
134
+ info_label : `str` or None, opt
135
+ Information to add to the output metric data file name and plot labels.
136
+ If this is not provided, it will be auto-generated from the
137
+ constraint (if any).
138
+ Setting this provides an easy way to specify different
139
+ configurations of a metric, a slicer,
140
+ or just to rewrite your constraint into friendlier terms.
141
+ (i.e. a constraint like 'scheduler_note not like "%DD%"' can become
142
+ "non-DD" in the file name and plot labels
143
+ by specifying info_label).
144
+ plot_dict : `dict` of plotting parameters, opt
145
+ Specify general plotting parameters, such as x/y/color limits.
146
+ display_dict : `dict` of display parameters, opt
147
+ Specify parameters for show_maf web pages, such as the
148
+ side bar labels and figure captions.
149
+ Keys: 'group', 'subgroup', 'caption', and 'order'
150
+ (such as to set metrics in filter order, etc)
151
+ child_metrics : `list` of `~rubin_sim.maf.metrics`
152
+ A list of child metrics to run to summarize the
153
+ primary metric, such as Discovery_At_Time, etc.
154
+ summary_metrics : `list` of `~rubin_sim.maf.metrics`
155
+ A list of summary metrics to run to summarize the
156
+ primary or child metric, such as CompletenessAtH, etc.
157
+
158
+ Notes
159
+ -----
160
+ Define the "thing" you are measuring, with a combination of
161
+ * metric (calculated per object)
162
+ * slicer (contains information on the moving objects
163
+ and their observations)
164
+ * constraint (an optional definition of a large subset of data)
165
+
166
+ The MoMetricBundle also saves the child metrics to be used
167
+ to generate summary statistics over those metric values,
168
+ as well as the resulting summary statistic values.
169
+
170
+ Plotting parameters and display parameters (for show_maf) are saved
171
+ in the MoMetricBundle, as well as additional info_label such as the
172
+ opsim run name, and relevant stackers and maps
173
+ to apply when calculating the metric values.
174
+ """
175
+
176
+ def __init__(
177
+ self,
178
+ metric,
179
+ slicer,
180
+ constraint=None,
181
+ stacker_list=None,
182
+ run_name="run name",
183
+ info_label=None,
184
+ file_root=None,
185
+ plot_dict=None,
186
+ plot_funcs=None,
187
+ display_dict=None,
188
+ child_metrics=None,
189
+ summary_metrics=None,
190
+ ):
191
+ self.metric = metric
192
+ self.slicer = slicer
193
+ if constraint == "":
194
+ constraint = None
195
+ self.constraint = constraint
196
+ # Set the stackerlist.
197
+ if stacker_list is not None:
198
+ if isinstance(stacker_list, BaseMoStacker):
199
+ self.stacker_list = [
200
+ stacker_list,
201
+ ]
202
+ else:
203
+ self.stacker_list = []
204
+ for s in stacker_list:
205
+ if not isinstance(s, BaseMoStacker):
206
+ raise ValueError(
207
+ "stackerList must only contain " "rubin_sim.maf.stackers.BaseMoStacker type objs"
208
+ )
209
+ self.stacker_list.append(s)
210
+ else:
211
+ self.stacker_list = []
212
+ # Add the basic 'visibility/mag' stacker if not present.
213
+ mag_stacker_found = False
214
+ for s in self.stacker_list:
215
+ if s.__class__.__name__ == "MoMagStacker":
216
+ mag_stacker_found = True
217
+ break
218
+ if not mag_stacker_found:
219
+ self.stacker_list.append(MoMagStacker())
220
+ # Set a mapsList just for compatibility with generic MetricBundle.
221
+ self.maps_list = []
222
+ # Add the summary stats, if applicable.
223
+ self.set_summary_metrics(summary_metrics)
224
+ # Set the provenance/info_label.
225
+ self.run_name = run_name
226
+ self._build_metadata(info_label)
227
+ # Build the output filename root if not provided.
228
+ if file_root is not None:
229
+ self.file_root = file_root
230
+ else:
231
+ self._build_file_root()
232
+ # Set the plotting classes/functions.
233
+ self.set_plot_funcs(plot_funcs)
234
+ # Set the plot_dict and displayDicts.
235
+ self.plot_dict = {"units": "@H"}
236
+ self.set_plot_dict(plot_dict)
237
+ # Update/set display_dict.
238
+ self.display_dict = {}
239
+ self.set_display_dict(display_dict)
240
+ # Set the list of child metrics.
241
+ self.set_child_bundles(child_metrics)
242
+ # This is where we store the metric values and summary stats.
243
+ self.metric_values = None
244
+ self.summary_values = None
245
+
246
+ def _reset_metric_bundle(self):
247
+ """Reset all properties of MetricBundle."""
248
+ self.metric = None
249
+ self.slicer = None
250
+ self.constraint = None
251
+ self.stacker_list = [MoMagStacker()]
252
+ self.maps_list = []
253
+ self.summary_metrics = []
254
+ self.plot_funcs = []
255
+ self.run_name = "opsim"
256
+ self.info_label = ""
257
+ self.db_cols = None
258
+ self.file_root = None
259
+ self.plot_dict = {}
260
+ self.display_dict = {}
261
+ self.child_metrics = None
262
+ self.metric_values = None
263
+ self.summary_values = None
264
+
265
+ def _build_metadata(self, info_label):
266
+ """If no info_label is provided, auto-generate it from the
267
+ obs_file + constraint."""
268
+ if info_label is None:
269
+ try:
270
+ self.info_label = self.slicer.obsfile.replace(".txt", "").replace(".dat", "")
271
+ self.info_label = self.info_label.replace("_obs", "").replace("_allObs", "")
272
+ except AttributeError:
273
+ self.info_label = "noObs"
274
+ # And modify by constraint.
275
+ if self.constraint is not None:
276
+ self.info_label += " " + self.constraint
277
+ else:
278
+ self.info_label = info_label
279
+
280
+ def _find_req_cols(self):
281
+ # Doesn't quite work the same way yet. No stacker list, for example.
282
+ raise NotImplementedError
283
+
284
+ def set_child_bundles(self, child_metrics=None):
285
+ """Identify any child metrics to be run on this (parent) bundle.
286
+ and create the new metric bundles that will hold the child values,
287
+ linking to this bundle.
288
+ Remove the summaryMetrics from self afterwards.
289
+
290
+ Parameters
291
+ ----------
292
+ child_metrics : `~maf.MoMetric`
293
+ Child metrics work like reduce functions for non-moving objects.
294
+ They pull out subsets of the original metric values, typically
295
+ do more processing on those values, and then save them in
296
+ new metric bundles.
297
+ """
298
+ self.child_bundles = {}
299
+ if child_metrics is None:
300
+ child_metrics = self.metric.child_metrics
301
+ for c_name, cMetric in child_metrics.items():
302
+ c_bundle = MoMetricBundle(
303
+ metric=cMetric,
304
+ slicer=self.slicer,
305
+ constraint=self.constraint,
306
+ stacker_list=self.stacker_list,
307
+ run_name=self.run_name,
308
+ info_label=self.info_label,
309
+ plot_dict=self.plot_dict,
310
+ plot_funcs=self.plot_funcs,
311
+ display_dict=self.display_dict,
312
+ summary_metrics=self.summary_metrics,
313
+ )
314
+ self.child_bundles[c_name] = c_bundle
315
+ if len(child_metrics) > 0:
316
+ self.summary_metrics = []
317
+
318
+ def compute_summary_stats(self, results_db=None):
319
+ """Compute summary statistics on metric_values, using summaryMetrics,
320
+ for self and child bundles.
321
+
322
+ Parameters
323
+ ----------
324
+ results_db : `~maf.ResultsDb`
325
+ Database which holds the summary statistic information.
326
+ """
327
+ if self.summary_values is None:
328
+ self.summary_values = {}
329
+ if self.summary_metrics is not None:
330
+ # Build array of metric values, to use for summary statistics.
331
+ for m in self.summary_metrics:
332
+ summary_name = m.name
333
+ summary_val = m.run(self.metric_values, self.slicer.slice_points["H"])
334
+ self.summary_values[summary_name] = summary_val
335
+ # Add summary metric info to results database, if applicable.
336
+ if results_db:
337
+ metric_id = results_db.update_metric(
338
+ self.metric.name,
339
+ self.slicer.slicer_name,
340
+ self.run_name,
341
+ self.constraint,
342
+ self.info_label,
343
+ None,
344
+ )
345
+ results_db.update_summary_stat(
346
+ metric_id, summary_name=summary_name, summary_value=summary_val
347
+ )
348
+
349
+ def reduce_metric(self, reduce_func, reduce_plot_dict=None, reduce_display_dict=None):
350
+ raise NotImplementedError
351
+
352
+
353
+ class MoMetricBundleGroup:
354
+ """Run groups of MoMetricBundles.
355
+
356
+ Parameters
357
+ ----------
358
+ bundle_dict : `dict` or `list` [`MoMetricBundles`]
359
+ Individual MoMetricBundles should be placed into a dictionary,
360
+ and then passed to the MoMetricBundleGroup.
361
+ The dictionary keys can then be used to identify MoMetricBundles
362
+ if needed -- and to identify new MetricBundles which could be
363
+ created if 'reduce' functions are run on a particular MoMetricBundle.
364
+ MoMetricBundles must all have the same Slicer (same set of moving
365
+ object observations).
366
+ out_dir : `str`, opt
367
+ Directory to save the metric results.
368
+ Default is the current directory.
369
+ results_db : `ResultsDb`, opt
370
+ A results database to store summary stat information.
371
+ If not specified, one will be created in the out_dir.
372
+ This database saves information about the metrics calculated,
373
+ including their summary statistics.
374
+ verbose : `bool`, opt
375
+ Flag to turn on/off verbose feedback.
376
+ """
377
+
378
+ def __init__(self, bundle_dict, out_dir=".", results_db=None, verbose=True):
379
+ self.verbose = verbose
380
+ self.bundle_dict = bundle_dict
381
+ self.out_dir = out_dir
382
+ if not os.path.isdir(self.out_dir):
383
+ os.makedirs(self.out_dir)
384
+ self.results_db = results_db
385
+
386
+ self.slicer = list(self.bundle_dict.values())[0].slicer
387
+ for b in self.bundle_dict.values():
388
+ if b.slicer != self.slicer:
389
+ raise ValueError(
390
+ "Currently, the slicers for the MoMetricBundleGroup must be equal,"
391
+ " using the same observations and Hvals."
392
+ )
393
+ self.constraints = list(set([b.constraint for b in bundle_dict.values()]))
394
+
395
+ def _check_compatible(self, metric_bundle1, metric_bundle2):
396
+ """Check if two MetricBundles are "compatible".
397
+ Compatible indicates that the constraints, the slicers,
398
+ and the maps are the same, and
399
+ that the stackers do not interfere with each other
400
+ (i.e. are not trying to set the same column in different ways).
401
+ Returns True if the MetricBundles are compatible, False if not.
402
+
403
+ Parameters
404
+ ----------
405
+ metric_bundle1 : `MetricBundle`
406
+ metric_bundle2 : `MetricBundle`
407
+
408
+ Returns
409
+ -------
410
+ match : `bool`
411
+ """
412
+ if metric_bundle1.constraint != metric_bundle2.constraint:
413
+ return False
414
+ if metric_bundle1.slicer != metric_bundle2.slicer:
415
+ return False
416
+ if metric_bundle1.maps_list.sort() != metric_bundle2.maps_list.sort():
417
+ return False
418
+ for stacker in metric_bundle1.stacker_list:
419
+ for stacker2 in metric_bundle2.stacker_list:
420
+ # If the stackers have different names, that's OK,
421
+ # and if they are identical, that's ok.
422
+ if (stacker.__class__.__name__ == stacker2.__class__.__name__) & (stacker != stacker2):
423
+ return False
424
+ # But if we got this far, everything matches.
425
+ return True
426
+
427
+ def _find_compatible(self, test_keys):
428
+ """Private utility to find which metricBundles with keys in the
429
+ list 'test_keys' can be calculated
430
+ at the same time -- having the same slicer, constraint, maps,
431
+ and compatible stackers.
432
+
433
+ Parameters
434
+ -----------
435
+ test_keys : `list`
436
+ List of the dictionary keys (of self.bundle_dict) to
437
+ test for compatibility.
438
+
439
+ Returns
440
+ --------
441
+ compatible_lists : `list` [`lists`]
442
+ Returns test_keys, split into separate lists of
443
+ compatible metricBundles.
444
+ """
445
+ compatible_lists = []
446
+ for k in test_keys:
447
+ try:
448
+ b = self.bundle_dict[k]
449
+ except KeyError:
450
+ warnings.warn(
451
+ "Received %s in testkeys, but this is not present in self.bundle_dict."
452
+ "Will continue, but this is not expected."
453
+ )
454
+ continue
455
+ found_compatible = False
456
+ checked_all = False
457
+ while not (found_compatible) and not (checked_all):
458
+ # Go through the existing lists in compatible_lists, to see
459
+ # if this metricBundle matches.
460
+ for compatible_list in compatible_lists:
461
+ # Compare to all the metricBundles in this subset,
462
+ # to check all stackers are compatible.
463
+ found_compatible = True
464
+ for comparison_key in compatible_list:
465
+ compatible = self._check_compatible(self.bundle_dict[comparison_key], b)
466
+ if not compatible:
467
+ # Found a metricBundle which is not compatible,
468
+ # so stop and go onto the next subset.
469
+ found_compatible = False
470
+ break
471
+ checked_all = True
472
+ if found_compatible:
473
+ compatible_list.append(k)
474
+ else:
475
+ compatible_lists.append(
476
+ [
477
+ k,
478
+ ]
479
+ )
480
+ return compatible_lists
481
+
482
+ def run_constraint(self, constraint):
483
+ """Calculate the metric values for all the metricBundles which
484
+ match this constraint in the metricBundleGroup.
485
+ Also calculates child metrics and summary statistics,
486
+ and writes all to disk.
487
+
488
+ Parameters
489
+ ----------
490
+ constraint : `str`
491
+ SQL-where or pandas constraint for the metricBundles.
492
+ """
493
+ # Find the dict keys of the bundles which match this constraint.
494
+ keys_matching_constraint = []
495
+ for k, b in self.bundle_dict.items():
496
+ if b.constraint == constraint:
497
+ keys_matching_constraint.append(k)
498
+ if len(keys_matching_constraint) == 0:
499
+ return
500
+ # Identify the observations which are relevant for this constraint.
501
+ # This sets slicer.obs (valid for all H values).
502
+ self.slicer.subset_obs(constraint)
503
+ # Identify the sets of these metricBundles can be run at the same time
504
+ # (also have the same stackers).
505
+ compatible_lists = self._find_compatible(keys_matching_constraint)
506
+
507
+ # And now run each of those subsets of compatible metricBundles.
508
+ for compatible_list in compatible_lists:
509
+ self._run_compatible(compatible_list)
510
+
511
+ def _run_compatible(self, compatible_list):
512
+ """Calculate the metric values for set of (parent and child) bundles,
513
+ as well as the summary stats, and write to disk.
514
+
515
+ Parameters
516
+ -----------
517
+ compatible_list : `list`
518
+ List of dictionary keys, of the metricBundles which can be
519
+ calculated together. This means they are 'compatible' and have
520
+ the same slicer, constraint, and non-conflicting mappers and
521
+ stackers.
522
+ """
523
+ if self.verbose:
524
+ print("Running metrics %s" % compatible_list)
525
+
526
+ b_dict = self.bundle_dict
527
+
528
+ # Find the unique stackers and maps.
529
+ # These are already "compatible" (as id'd by compatible_list).
530
+ uniq_stackers = []
531
+ all_stackers = []
532
+ uniq_maps = []
533
+ all_maps = []
534
+ for b in b_dict.values():
535
+ all_stackers += b.stacker_list
536
+ all_maps += b.maps_list
537
+ for s in all_stackers:
538
+ if s not in uniq_stackers:
539
+ uniq_stackers.append(s)
540
+ for m in all_maps:
541
+ if m not in uniq_maps:
542
+ uniq_maps.append(m)
543
+
544
+ if len(uniq_maps) > 0:
545
+ print("Got some maps .. that was unexpected at the moment. Can't use them here yet.")
546
+
547
+ # Set up all of the metric values, including for the child bundles.
548
+ for k in compatible_list:
549
+ b = self.bundle_dict[k]
550
+ b._setup_metric_values()
551
+ for cb in b.child_bundles.values():
552
+ cb._setup_metric_values()
553
+ # Calculate the metric values.
554
+ for i, slice_point in enumerate(self.slicer):
555
+ sso_obs = slice_point["obs"]
556
+ for j, Hval in enumerate(slice_point["Hvals"]):
557
+ # Run stackers to add extra columns (that depend on h_val)
558
+ with warnings.catch_warnings():
559
+ warnings.simplefilter("ignore")
560
+ for s in uniq_stackers:
561
+ sso_obs = s.run(sso_obs, slice_point["orbit"]["H"], Hval)
562
+ # Run all the parent metrics.
563
+ for k in compatible_list:
564
+ b = self.bundle_dict[k]
565
+ # Mask the parent metric (and then child metrics)
566
+ # if there was no data.
567
+ if len(sso_obs) == 0:
568
+ b.metric_values.mask[i][j] = True
569
+ for cb in list(b.child_bundles.values()):
570
+ cb.metric_values.mask[i][j] = True
571
+ # Otherwise, calculate the metric value for the parent,
572
+ # and then child.
573
+ else:
574
+ # Calculate for the parent.
575
+ m_val = b.metric.run(sso_obs, slice_point["orbit"], Hval)
576
+ # Mask if the parent metric returned a bad value.
577
+ if m_val == b.metric.badval:
578
+ b.metric_values.mask[i][j] = True
579
+ for cb in b.child_bundles.values():
580
+ cb.metric_values.mask[i][j] = True
581
+ # Otherwise, set the parent value and calculate
582
+ # the child metric values as well.
583
+ else:
584
+ b.metric_values.data[i][j] = m_val
585
+ for cb in b.child_bundles.values():
586
+ child_val = cb.metric.run(sso_obs, slice_point["orbit"], Hval, m_val)
587
+ if child_val == cb.metric.badval:
588
+ cb.metric_values.mask[i][j] = True
589
+ else:
590
+ cb.metric_values.data[i][j] = child_val
591
+ for k in compatible_list:
592
+ b = self.bundle_dict[k]
593
+ b.compute_summary_stats(self.results_db)
594
+ for c_b in b.child_bundles.values():
595
+ c_b.compute_summary_stats(self.results_db)
596
+ # Write to disk.
597
+ c_b.write(out_dir=self.out_dir, results_db=self.results_db)
598
+ # Write to disk.
599
+ b.write(out_dir=self.out_dir, results_db=self.results_db)
600
+
601
+ def run_all(self):
602
+ """Run all constraints and metrics for these moMetricBundles."""
603
+ for constraint in self.constraints:
604
+ self.run_constraint(constraint)
605
+ if self.verbose:
606
+ print("Calculated and saved all metrics.")
607
+
608
+ def plot_all(
609
+ self,
610
+ savefig=True,
611
+ outfile_suffix=None,
612
+ fig_format="pdf",
613
+ dpi=600,
614
+ thumbnail=True,
615
+ closefigs=True,
616
+ ):
617
+ """
618
+ Make a few generically desired plots.
619
+ Given the nature of the outputs for much of the moving object
620
+ metrics, a good deal of the plotting for the moving object batch
621
+ is handled in a custom manner joining together multiple
622
+ metricsbundles.
623
+ """
624
+ plot_handler = PlotHandler(
625
+ out_dir=self.out_dir,
626
+ results_db=self.results_db,
627
+ savefig=savefig,
628
+ fig_format=fig_format,
629
+ dpi=dpi,
630
+ thumbnail=thumbnail,
631
+ )
632
+ for b in self.bundle_dict.values():
633
+ try:
634
+ b.plot(
635
+ plot_handler=plot_handler,
636
+ outfile_suffix=outfile_suffix,
637
+ savefig=savefig,
638
+ )
639
+ except ValueError as ve:
640
+ message = "Plotting failed for metricBundle %s." % (b.file_root)
641
+ message += " Error message: %s" % (ve.message)
642
+ warnings.warn(message)
643
+ if closefigs:
644
+ plt.close("all")
645
+ if self.verbose:
646
+ print("Plotting all metrics.")
@@ -0,0 +1,52 @@
1
+ from .agn_time_lag_metric import *
2
+ from .agnstructure import *
3
+ from .area_summary_metrics import *
4
+ from .base_metric import *
5
+ from .brown_dwarf_metric import *
6
+ from .cadence_metrics import *
7
+ from .calibration_metrics import *
8
+ from .chip_vendor_metric import *
9
+ from .color_slope_metrics import *
10
+ from .cosmology_summary_metrics import *
11
+ from .coverage_metric import *
12
+ from .crowding_metric import *
13
+ from .cumulative_metric import *
14
+ from .dcr_metric import *
15
+ from .exgal_m5 import *
16
+ from .fft_metric import *
17
+ from .galactic_plane_metrics import *
18
+ from .galplane_time_sampling_metrics import *
19
+ from .hourglass_metric import *
20
+ from .incremental_template_metric import *
21
+ from .kuiper_metrics import *
22
+ from .mo_metrics import *
23
+ from .mo_summary_metrics import *
24
+ from .night_pointing_metric import *
25
+ from .optimal_m5_metric import *
26
+ from .pair_metric import *
27
+ from .periodic_detect_metric import *
28
+ from .phase_gap_metric import *
29
+ from .qso_number_counts_metric import *
30
+ from .scaling_metrics import *
31
+ from .schedview_metrics import *
32
+ from .season_metrics import *
33
+ from .simple_metrics import *
34
+ from .sky_sat_metric import *
35
+ from .sn_cadence_metric import *
36
+ from .sn_n_sn_metric import *
37
+ from .sn_sl_metric import *
38
+ from .sn_snr_metric import *
39
+ from .snr_weight import *
40
+ from .star_density import *
41
+ from .string_count_metric import *
42
+ from .summary_metrics import *
43
+ from .surfb_metric import *
44
+ from .technical_metrics import *
45
+ from .tgaps import *
46
+ from .tomography_models import *
47
+ from .transient_metrics import *
48
+ from .uniformity_metrics import *
49
+ from .use_metrics import *
50
+ from .vector_metrics import *
51
+ from .visit_groups_metric import *
52
+ from .weak_lensing_systematics_metric import *