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,513 @@
1
+ # Base class for all 'Slicer' objects.
2
+ #
3
+ __all__ = ("SlicerRegistry", "BaseSlicer")
4
+
5
+ import inspect
6
+ import json
7
+ import warnings
8
+ from io import StringIO
9
+
10
+ import numpy as np
11
+ import numpy.ma as ma
12
+
13
+ from rubin_sim.maf.utils import get_date_version
14
+
15
+
16
+ class SlicerRegistry(type):
17
+ """
18
+ Meta class for slicers, to build a registry of slicer classes.
19
+ """
20
+
21
+ def __init__(cls, name, bases, dict):
22
+ super(SlicerRegistry, cls).__init__(name, bases, dict)
23
+ if not hasattr(cls, "registry"):
24
+ cls.registry = {}
25
+ modname = inspect.getmodule(cls).__name__ + "."
26
+ if modname.startswith("rubin_sim.maf.slicers"):
27
+ modname = ""
28
+ slicername = modname + name
29
+ if slicername in cls.registry:
30
+ raise Exception("Redefining metric %s! (there are >1 slicers with the same name)" % (slicername))
31
+ if slicername not in ["BaseSlicer", "BaseSpatialSlicer"]:
32
+ cls.registry[slicername] = cls
33
+
34
+ def get_class(cls, slicername):
35
+ return cls.registry[slicername]
36
+
37
+ def help(cls, doc=False):
38
+ for slicername in sorted(cls.registry):
39
+ if not doc:
40
+ print(slicername)
41
+ if doc:
42
+ print("---- ", slicername, " ----")
43
+ print(inspect.getdoc(cls.registry[slicername]))
44
+
45
+
46
+ class BaseSlicer(metaclass=SlicerRegistry):
47
+ """
48
+ Base class for all slicers: sets required methods and
49
+ implements common functionality.
50
+
51
+ After first construction, the slicer should be ready for
52
+ `setup_slicer` which defines slice_points, allowing the slicer to "slice"
53
+ data and generate plots.
54
+ After init after a restore: everything necessary for using slicer for
55
+ plotting or saving/restoring metric data should be present, although
56
+ the slicer does not need to be able to slice data again and generally
57
+ will not be able to do so.
58
+
59
+ Parameters
60
+ ----------
61
+ verbose: `bool`, optional
62
+ True/False flag to send extra output to screen.
63
+ badval: `int` or `float`, optional
64
+ The value the Slicer uses to fill masked metric data values
65
+ """
66
+
67
+ def __init__(self, verbose=False, badval=-666):
68
+ self.verbose = verbose
69
+ self.badval = badval
70
+ # Set the cache_size.
71
+ # Currently only healpixSlicers (and their derivatives) use the cache.
72
+ # The size of the cache is set directly by those slicers.
73
+ self.cache_size = 0
74
+ # Set length of Slicer. This determines the endpoint for iteration.
75
+ self.nslice = None
76
+ # Set the length of the data (metric) values.
77
+ # This is often but not necessarily the same as nslice.
78
+ self.shape = None
79
+ self.slice_points = {}
80
+ self.slicer_name = self.__class__.__name__
81
+ self.columns_needed = []
82
+ # Create a dict that saves how to re-init the slicer.
83
+ # This may not be the whole set of args/kwargs, may only be
84
+ # those which carry useful metadata or are necesary for init.
85
+ self.slicer_init = {"badval": badval}
86
+ self.plot_funcs = []
87
+
88
+ def _run_maps(self, maps):
89
+ """Add map metadata to slice_points."""
90
+ if maps is not None:
91
+ for m in maps:
92
+ self.slice_points = m.run(self.slice_points)
93
+
94
+ def setup_slicer(self, sim_data, maps=None):
95
+ """Set up Slicer for data slicing.
96
+
97
+ Set up internal parameters necessary for slicer to slice data
98
+ and generates indexes on sim_data.
99
+ Also sets _slice_sim_data for a particular slicer.
100
+
101
+ Parameters
102
+ -----------
103
+ sim_data : `np.recarray`
104
+ The simulated data to be sliced.
105
+ maps : `list` of `rubin_sim.maf.maps` objects, optional.
106
+ Maps to apply at each slice_point,
107
+ to add to the slice_point metadata.
108
+ """
109
+ raise NotImplementedError()
110
+
111
+ def get_slice_points(self):
112
+ """Return the slice_point metadata, for all slice points."""
113
+ return self.slice_points
114
+
115
+ def __len__(self):
116
+ """Return nslice, the number of slice_points in the slicer."""
117
+ return self.nslice
118
+
119
+ def __iter__(self):
120
+ """Iterate over the slices."""
121
+ self.islice = 0
122
+ return self
123
+
124
+ def __next__(self):
125
+ """Returns results of self._slice_sim_data when iterating over slicer.
126
+
127
+ Results of self._slice_sim_data should be dictionary of
128
+ {'idxs': the data indexes relevant for this slice of the slicer,
129
+ 'slice_point': the metadata for the slice_point, which always
130
+ includes 'sid' key for ID of slice_point.}
131
+ """
132
+ if self.islice >= self.nslice:
133
+ raise StopIteration
134
+ islice = self.islice
135
+ self.islice += 1
136
+ return self._slice_sim_data(islice)
137
+
138
+ def __getitem__(self, islice):
139
+ return self._slice_sim_data(islice)
140
+
141
+ def __eq__(self, other_slicer):
142
+ """Evaluate if two slicers are equivalent."""
143
+ raise NotImplementedError()
144
+
145
+ def __ne__(self, other_slicer):
146
+ """Evaluate if two slicers are not equivalent."""
147
+ if self == other_slicer:
148
+ return False
149
+ else:
150
+ return True
151
+
152
+ def _slice_sim_data(self, slice_point):
153
+ """Slice the simulation data appropriately for the slicer.
154
+
155
+ Given the identifying slice_point metadata
156
+ The slice of data returned will be the indices of the
157
+ numpy rec array (the sim_data) which are appropriate for the metric
158
+ to be working on, for that slice_point.
159
+ """
160
+ raise NotImplementedError('This method is set up by "setup_slicer" - run that first.')
161
+
162
+ def write_data(
163
+ self,
164
+ outfilename,
165
+ metric_values,
166
+ metric_name="",
167
+ sim_data_name="",
168
+ constraint=None,
169
+ info_label="",
170
+ plot_dict=None,
171
+ display_dict=None,
172
+ summary_values=None,
173
+ ):
174
+ """
175
+ Save metric values along with the information required to
176
+ re-build the slicer.
177
+
178
+ Parameters
179
+ -----------
180
+ outfilename : `str`
181
+ The output file name.
182
+ metric_values : `np.ma.MaskedArray` or `np.ndarray`
183
+ The metric values to save to disk.
184
+ metric_name : `str`
185
+ Name of the metric as configured when run
186
+ sim_data_name : `str`
187
+ Name of the simulation metric run on
188
+ constraint : `str`
189
+ Constraint used to subselect data
190
+ info_label : `str`
191
+ Descriptive additional information
192
+ plot_dict : `dict`
193
+ Dictionary of plotting parameters
194
+ display_dict : `dict`
195
+ Dictionary of display parameters, including caption
196
+ summary_values : `dict`
197
+ Dictionary of summary statistics
198
+ """
199
+ header = {}
200
+ header["metric_name"] = metric_name
201
+ header["constraint"] = constraint
202
+ header["info_label"] = info_label
203
+ header["sim_data_name"] = sim_data_name
204
+ date, version_info = get_date_version()
205
+ header["date_ran"] = date
206
+ if display_dict is None:
207
+ display_dict = {"group": "Ungrouped"}
208
+ header["display_dict"] = display_dict
209
+ header["plot_dict"] = plot_dict
210
+ header["summary_values"] = summary_values
211
+ for key in version_info:
212
+ header[key] = version_info[key]
213
+ if hasattr(metric_values, "mask"): # If it is a masked array
214
+ data = metric_values.data
215
+ mask = metric_values.mask
216
+ fill = metric_values.fill_value
217
+ else:
218
+ data = metric_values
219
+ mask = None
220
+ fill = None
221
+ # npz file acts like dictionary: each keyword/value pair
222
+ # below acts as a dictionary in loaded NPZ file.
223
+ np.savez(
224
+ outfilename,
225
+ # header saved as dictionary
226
+ header=header,
227
+ # metric data values
228
+ metric_values=data,
229
+ # metric mask values
230
+ mask=mask,
231
+ # metric badval/fill val
232
+ fill=fill,
233
+ # dictionary of instantiation parameters
234
+ slicer_init=self.slicer_init,
235
+ # class name
236
+ slicer_name=self.slicer_name,
237
+ # slice_point metadata saved (is a dictionary)
238
+ slice_points=self.slice_points,
239
+ slicer_n_slice=self.nslice,
240
+ slicer_shape=self.shape,
241
+ )
242
+
243
+ def output_json(
244
+ self,
245
+ metric_values,
246
+ metric_name="",
247
+ sim_data_name="",
248
+ info_label="",
249
+ plot_dict=None,
250
+ ):
251
+ """
252
+ Send metric data to JSON streaming API,
253
+ along with a little bit of metadata.
254
+
255
+ This method will only work for metrics where the
256
+ metricDtype is float or int, as JSON will not interpret more
257
+ complex data properly. These values can't be plotted anyway though.
258
+
259
+ Parameters
260
+ -----------
261
+ metric_values : `np.ma.MaskedArray` or `np.ndarray`
262
+ The metric values.
263
+ metric_name : `str`, optional
264
+ The name of the metric.
265
+ sim_data_name : `str`, optional
266
+ The name of the simulated data source.
267
+ info_label : `str`, optional
268
+ Some additional information about this metric
269
+ and how it was calculated.
270
+ plot_dict : `dict`, optional.
271
+ The plot_dict for this metric bundle.
272
+
273
+ Returns
274
+ --------
275
+ io : `StringIO`
276
+ StringIO object containing a header dictionary with
277
+ metric_name/metadata/sim_data_name/slicer_name,
278
+ and plot labels from plot_dict, and metric values/data for plot.
279
+ if oneDSlicer,
280
+ the data is [ [bin_left_edge, value], [bin_left_edge, value]..].
281
+ if a spatial slicer,
282
+ the data is [ [lon, lat, value], [lon, lat, value] ..].
283
+ """
284
+ # Bail if this is not a good data type for JSON.
285
+ if not (metric_values.dtype == "float") or (metric_values.dtype == "int"):
286
+ warnings.warn("Cannot generate JSON.")
287
+ io = StringIO()
288
+ json.dump(["Cannot generate JSON for this file."], io)
289
+ return None
290
+ # Else put everything together for JSON output.
291
+ if plot_dict is None:
292
+ plot_dict = {}
293
+ plot_dict["units"] = ""
294
+ # Preserve some of the metadata for the plot.
295
+ header = {}
296
+ header["metric_name"] = metric_name
297
+ header["info_label"] = info_label
298
+ header["sim_data_name"] = sim_data_name
299
+ header["slicer_name"] = self.slicer_name
300
+ header["slicer_len"] = int(self.nslice)
301
+ # Set some default plot labels if appropriate.
302
+ if "title" in plot_dict:
303
+ header["title"] = plot_dict["title"]
304
+ else:
305
+ header["title"] = "%s %s: %s" % (sim_data_name, info_label, metric_name)
306
+ if "xlabel" in plot_dict:
307
+ header["xlabel"] = plot_dict["xlabel"]
308
+ else:
309
+ if hasattr(self, "slice_col_name"):
310
+ header["xlabel"] = "%s (%s)" % (
311
+ self.slice_col_name,
312
+ self.slice_col_units,
313
+ )
314
+ else:
315
+ header["xlabel"] = "%s" % metric_name
316
+ if "units" in plot_dict:
317
+ header["xlabel"] += " (%s)" % (plot_dict["units"])
318
+ if "ylabel" in plot_dict:
319
+ header["ylabel"] = plot_dict["ylabel"]
320
+ else:
321
+ if hasattr(self, "slice_col_name"):
322
+ header["ylabel"] = "%s" % metric_name
323
+ if "units" in plot_dict:
324
+ header["ylabel"] += " (%s)" % (plot_dict["units"])
325
+ else:
326
+ # If it's not a oneDslicer and no ylabel given, don't need one.
327
+ pass
328
+ # Bundle up slicer and metric info.
329
+ metric = []
330
+ # If metric values is a masked array.
331
+ if hasattr(metric_values, "mask"):
332
+ if "ra" in self.slice_points:
333
+ # Spatial slicer.
334
+ # Translate ra/dec to lon/lat in degrees and
335
+ # output with metric value.
336
+ for ra, dec, value, mask in zip(
337
+ self.slice_points["ra"],
338
+ self.slice_points["dec"],
339
+ metric_values.data,
340
+ metric_values.mask,
341
+ ):
342
+ if not mask:
343
+ lon = ra * 180.0 / np.pi
344
+ lat = dec * 180.0 / np.pi
345
+ metric.append([lon, lat, value])
346
+ elif "bins" in self.slice_points:
347
+ # OneD slicer. Translate bins into bin/left and
348
+ # output with metric value.
349
+ for i in range(len(metric_values)):
350
+ bin_left = self.slice_points["bins"][i]
351
+ value = metric_values.data[i]
352
+ mask = metric_values.mask[i]
353
+ if not mask:
354
+ metric.append([bin_left, value])
355
+ else:
356
+ metric.append([bin_left, 0])
357
+ metric.append([self.slice_points["bins"][i + 1], 0])
358
+ elif self.slicer_name == "UniSlicer":
359
+ metric.append([metric_values[0]])
360
+ # Else:
361
+ else:
362
+ if "ra" in self.slice_points:
363
+ for ra, dec, value in zip(self.slice_points["ra"], self.slice_points["dec"], metric_values):
364
+ lon = ra * 180.0 / np.pi
365
+ lat = dec * 180.0 / np.pi
366
+ metric.append([lon, lat, value])
367
+ elif "bins" in self.slice_points:
368
+ for i in range(len(metric_values)):
369
+ bin_left = self.slice_points["bins"][i]
370
+ value = metric_values[i]
371
+ metric.append([bin_left, value])
372
+ metric.append(self.slice_points["bins"][i + 1][0])
373
+ elif self.slicer_name == "UniSlicer":
374
+ metric.append([metric_values[0]])
375
+ # Write out JSON output.
376
+ io = StringIO()
377
+ json.dump([header, metric], io)
378
+ return io
379
+
380
+ def read_data(self, infilename):
381
+ """
382
+ Read metric data from disk, along with the info to
383
+ rebuild the slicer (minus new slicing capability).
384
+
385
+ Parameters
386
+ -----------
387
+ infilename: `str`
388
+ The filename containing the metric data.
389
+
390
+ Returns
391
+ -------
392
+ metric_values, slicer, header : `np.ma.MaskedArray`,
393
+ `rubin_sim.maf.slicer`, `dict`
394
+ MetricValues stored in data file,
395
+ the slicer basis for those metric values,
396
+ and a dictionary containing header information
397
+ (run_name, metadata, etc.).
398
+ """
399
+ import rubin_sim.maf.slicers as slicers
400
+
401
+ # Allowing pickles here is required, because otherwise we cannot
402
+ # restore data saved as objects.
403
+ restored = np.load(infilename, allow_pickle=True)
404
+ if "slicer_name" not in restored:
405
+ metric_values, slicer, header = self.read_backwards_compatible(restored, infilename)
406
+ return metric_values, slicer, header
407
+ # This is the standard behavior and will be the
408
+ # sole behavior at a future release point.
409
+ # Get metadata and other sim_data info.
410
+ header = restored["header"][()]
411
+ if "dateRan" in header:
412
+ header["date_ran"] = header["dateRan"]
413
+ # Get slicer information.
414
+ slicer_init = restored["slicer_init"][()]
415
+ slicer_name = str(restored["slicer_name"])
416
+ slice_points = restored["slice_points"][()]
417
+ slicer_nslice = restored["slicer_n_slice"]
418
+ slicer_shape = restored["slicer_shape"]
419
+ try:
420
+ slicer = getattr(slicers, slicer_name)(**slicer_init)
421
+ except TypeError:
422
+ if self.verbose:
423
+ warnings.warn(
424
+ f"Cannot use saved slicer init values; falling back to defaults for {infilename}"
425
+ )
426
+ slicer = getattr(slicers, slicer_name)()
427
+ # Restore slice_point information.
428
+ slicer.nslice = slicer_nslice
429
+ slicer.slice_points = slice_points
430
+ slicer.shape = slicer_shape
431
+ # Get metric data set
432
+ if restored["mask"][()] is None:
433
+ metric_values = ma.MaskedArray(data=restored["metric_values"])
434
+ else:
435
+ metric_values = ma.MaskedArray(
436
+ data=restored["metric_values"],
437
+ mask=restored["mask"],
438
+ fill_value=restored["fill"],
439
+ )
440
+ return metric_values, slicer, header
441
+
442
+ def read_backwards_compatible(self, restored, infilename):
443
+ """Read pre v1.0 metric files."""
444
+ # Backwards compatibility for pre-v1.0 metric outputs.
445
+ # To be deprecated at a future release.
446
+ warnings.warn(
447
+ "Reading pre-v1.0 metric data. To be deprecated in a future release.",
448
+ FutureWarning,
449
+ )
450
+ import rubin_sim.maf.slicers as slicers
451
+
452
+ header = restored["header"][()]
453
+ header["metric_name"] = header["metricName"]
454
+ header["sim_data_name"] = header["simDataName"]
455
+ if "metadata" in header:
456
+ header["info_label"] = header["metadata"]
457
+ if "plotDict" in header:
458
+ header["plot_dict"] = header["plotDict"]
459
+ if "displayDict" in header:
460
+ header["display_dict"] = header["displayDict"]
461
+ if "dateRan" in header:
462
+ header["date_ran"] = header["dateRan"]
463
+ slicer_init = restored["slicer_init"][()]
464
+ slicer_name = str(restored["slicerName"])
465
+ slice_points = restored["slicePoints"][()]
466
+ slicer_nslice = restored["slicerNSlice"]
467
+ slicer_shape = restored["slicerShape"]
468
+ # Slicer init update
469
+ new = ["lat_col", "lon_col", "use_camera"]
470
+ old = ["latCol", "lonCol", "useCamera"]
471
+ for n, o in zip(new, old):
472
+ if o in slicer_init:
473
+ slicer_init[n] = slicer_init[o]
474
+ del slicer_init[o]
475
+ if "Hrange" in slicer_init:
476
+ slicer_init["h_range"] = slicer_init["Hrange"]
477
+ del slicer_init["Hrange"]
478
+ new = ["bin_min", "bin_max", "bin_size", "slice_col_name", "slice_col_units"]
479
+ old = ["binMin", "binMax", "binsize", "sliceColName", "sliceColUnits"]
480
+ for n, o in zip(new, old):
481
+ if o in slicer_init:
482
+ slicer_init[n] = slicer_init[o]
483
+ del slicer_init[o]
484
+ # An earlier backwards compatibility issue -
485
+ # map 'spatialkey1/spatialkey2' to 'lon_col/lat_col'.
486
+ if "spatialkey1" in slicer_init:
487
+ slicer_init["lon_col"] = slicer_init["spatialkey1"]
488
+ del slicer_init["spatialkey1"]
489
+ if "spatialkey2" in slicer_init:
490
+ slicer_init["lat_col"] = slicer_init["spatialkey2"]
491
+ del slicer_init["spatialkey2"]
492
+ try:
493
+ slicer = getattr(slicers, slicer_name)(**slicer_init)
494
+ except TypeError:
495
+ if self.verbose:
496
+ warnings.warn(
497
+ f"Cannot use saved slicer init values; falling back to defaults for {infilename}"
498
+ )
499
+ slicer = getattr(slicers, slicer_name)()
500
+ # Restore slice_point information.
501
+ slicer.nslice = slicer_nslice
502
+ slicer.slice_points = slice_points
503
+ slicer.shape = slicer_shape
504
+ # Get metric data set
505
+ if restored["mask"][()] is None:
506
+ metric_values = ma.MaskedArray(data=restored["metricValues"])
507
+ else:
508
+ metric_values = ma.MaskedArray(
509
+ data=restored["metricValues"],
510
+ mask=restored["mask"],
511
+ fill_value=restored["fill"],
512
+ )
513
+ return metric_values, slicer, header