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
sql/make_vseqmeta.sql ADDED
@@ -0,0 +1,251 @@
1
+ CREATE SCHEMA {};
2
+
3
+ SET SEARCH_PATH TO {};
4
+
5
+ CREATE TABLE visitseq (
6
+ visitseq_uuid UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- RFC 4122 Universally Unique IDentifier
7
+ visitseq_sha256 BYTEA NOT NULL, -- hash of the visit table
8
+ visitseq_label TEXT NOT NULL, -- label for plots and table
9
+ visitseq_url TEXT, -- If null, the actual visits are not available
10
+ telescope TEXT NOT NULL, -- (probably) "simonyi" or "auxtel"
11
+ first_day_obs DATE, -- local calendar date of evening of first night in the set
12
+ last_day_obs DATE, -- local calendar date of the eveninig of the last night in the set
13
+ creation_time TIMESTAMP WITH TIME ZONE DEFAULT NOW() -- when the simulation was run
14
+ );
15
+
16
+ CREATE TABLE simulations (
17
+ scheduler_version TEXT, -- version of rubin_scheduler
18
+ config_url TEXT, -- URL for the config script, perhaps on github based on hash
19
+ conda_env_sha256 BYTEA, -- SHA256 hash of output of conda list --json
20
+ parent_visitseq_uuid UUID, -- UUID of visitseq loaded into scheduler before running
21
+ sim_runner_kwargs JSONB, -- arguments to sim runner as a json dict
22
+ parent_last_day_obs DATE, -- day_obs of last visit loaded into scheduler before running
23
+ PRIMARY KEY (visitseq_uuid)
24
+ ) INHERITS (visitseq);
25
+
26
+ CREATE TABLE completed (
27
+ query TEXT, -- The query to the consdb used
28
+ PRIMARY KEY (visitseq_uuid)
29
+ ) INHERITS (visitseq);
30
+
31
+ CREATE TABLE mixedvisitseq (
32
+ last_early_day_obs DATE, -- the last day obs drawn from the early parent
33
+ first_late_day_obs DATE, -- the first day obs drawn from the late parent
34
+ early_parent_uuid UUID, -- the UUID of the early parent
35
+ late_parent_uuid UUID, -- the UUID of the late parent
36
+ PRIMARY KEY (visitseq_uuid)
37
+ ) INHERITS (visitseq);
38
+
39
+ -- All of the tables that follow include a visitseq_uuid that refereneces
40
+ -- visitseq or one of its children.
41
+ -- These are not declared as foreign keys, because postgresql cannot enforce
42
+ -- a FK on both a table and its children: we would need to specify which child
43
+ -- the uuid would refer to, when really we need it to be allowed to reference
44
+ -- any of the children.
45
+ -- (In principle, we could do something complicated with triggers.)
46
+
47
+ CREATE TABLE tags (
48
+ visitseq_uuid UUID, -- RFC 4122 Universally Unique IDentifier
49
+ tag TEXT NOT NULL -- The tag
50
+ );
51
+ -- we will most often want to search for all runs with a given tag.
52
+ CREATE INDEX tag_idx ON tags(tag);
53
+
54
+ CREATE TABLE comments (
55
+ visitseq_uuid UUID, -- RFC 4122 Universally Unique IDentifier
56
+ comment_time TIMESTAMP WITH TIME ZONE DEFAULT NOW() , -- The date and time at which the comment was added
57
+ author TEXT, -- The user who added the comment
58
+ comment TEXT NOT NULL -- The comment
59
+ );
60
+ -- we will most often want to search for all comments for a given visitseq
61
+ CREATE INDEX comments_visitseq_idx ON comments(visitseq_uuid);
62
+
63
+ CREATE TABLE files (
64
+ visitseq_uuid UUID, -- RFC 4122 Universally Unique IDentifier
65
+ file_type TEXT NOT NULL, -- Examples include "rewards", "scheduler", and "observatory"
66
+ file_sha256 BYTEA NOT NULL, -- hash of the file
67
+ file_url TEXT, -- URL for the file, may be null if we wish only to store the hash
68
+ PRIMARY KEY (visitseq_uuid, file_type)
69
+ );
70
+ CREATE INDEX files_visitseq_idx ON files(visitseq_uuid);
71
+
72
+ -- A view to make it easy to query simulations and get tags, comments, and files back.
73
+ CREATE VIEW simulations_extra AS
74
+ SELECT
75
+ DATE(s.creation_time - INTERVAL '12 hours') AS sim_creation_day_obs,
76
+ ROW_NUMBER() OVER (PARTITION BY DATE(s.creation_time - INTERVAL '12 hours') ORDER BY s.creation_time - INTERVAL '12 hours') AS daily_id,
77
+ s.visitseq_uuid,
78
+ s.visitseq_label,
79
+ s.visitseq_url,
80
+ s.telescope,
81
+ s.first_day_obs,
82
+ s.last_day_obs,
83
+ s.creation_time,
84
+ s.scheduler_version,
85
+ s.config_url,
86
+ s.sim_runner_kwargs,
87
+ s.conda_env_sha256,
88
+ s.parent_visitseq_uuid,
89
+ s.parent_last_day_obs,
90
+ COALESCE (
91
+ JSONB_AGG(DISTINCT t.tag) FILTER (WHERE t.tag IS NOT NULL),
92
+ '[]'::JSONB
93
+ ) AS tags,
94
+ COALESCE (
95
+ JSONB_OBJECT_AGG(c.comment_time, c.comment) FILTER (WHERE c.comment_time IS NOT NULL),
96
+ '{{}}'::JSONB
97
+ ) AS comments,
98
+ COALESCE (
99
+ JSONB_OBJECT_AGG(f.file_type, f.file_url) FILTER (WHERE f.file_type IS NOT NULL),
100
+ '{{}}'::JSONB
101
+ ) AS files
102
+ FROM simulations AS s
103
+ LEFT JOIN tags AS t ON t.visitseq_uuid=s.visitseq_uuid
104
+ LEFT JOIN comments AS c ON c.visitseq_uuid=s.visitseq_uuid
105
+ LEFT JOIN files AS f ON f.visitseq_uuid=s.visitseq_uuid
106
+ GROUP BY s.visitseq_uuid,
107
+ s.visitseq_label,
108
+ s.visitseq_url,
109
+ s.telescope,
110
+ s.first_day_obs,
111
+ s.last_day_obs,
112
+ s.creation_time,
113
+ s.scheduler_version,
114
+ s.config_url,
115
+ s.sim_runner_kwargs,
116
+ s.conda_env_sha256,
117
+ s.parent_visitseq_uuid,
118
+ s.parent_last_day_obs;
119
+
120
+ CREATE TABLE conda_env (
121
+ conda_env_hash BYTEA PRIMARY KEY, -- SHA256 hash of output of `conda list --json`
122
+ conda_env JSONB NOT NULL -- output of `conda list --json`
123
+ );
124
+
125
+ -- Make a view so we do not need to remember
126
+ -- postgresql syntex for jsonb.
127
+ CREATE VIEW conda_packages AS (
128
+ SELECT
129
+ c.conda_env_hash,
130
+ p.name AS package_name,
131
+ p.channel,
132
+ p.version AS package_version,
133
+ p.base_url,
134
+ p.platform,
135
+ p.dist_name,
136
+ p.build_number,
137
+ p.build_string
138
+ FROM
139
+ conda_env AS c,
140
+ jsonb_to_recordset(conda_env) AS p (
141
+ name TEXT,
142
+ channel TEXT,
143
+ version TEXT,
144
+ base_url TEXT,
145
+ platform TEXT,
146
+ dist_name TEXT,
147
+ build_number TEXT,
148
+ build_string TEXT
149
+ )
150
+ );
151
+
152
+ CREATE VIEW simulation_packages AS (
153
+ SELECT s.visitseq_uuid, p.*
154
+ FROM conda_packages AS p
155
+ JOIN simulations AS s ON p.conda_env_hash = s.conda_env_sha256
156
+ );
157
+
158
+ CREATE TABLE nightly_stats (
159
+ visitseq_uuid UUID NOT NULL, -- RFC 4122 Universally Unique IDentifier
160
+ day_obs DATE NOT NULL, -- The day obs of the visits included
161
+ value_name TEXT NOT NULL, -- metric or column name
162
+ accumulated BOOLEAN NOT NULL, -- Whether the statistics include all data through night day_obs, or only data on night day_obs
163
+ count INTEGER, -- number of values in distribution
164
+ mean DOUBLE PRECISION, -- mean
165
+ std DOUBLE PRECISION, -- standard deviation
166
+ min DOUBLE PRECISION, -- min value
167
+ p05 DOUBLE PRECISION, -- 5% quantile
168
+ q1 DOUBLE PRECISION, -- first quartile
169
+ median DOUBLE PRECISION, -- median
170
+ q3 DOUBLE PRECISION, -- third quartile
171
+ p95 DOUBLE PRECISION, -- 95% quantile
172
+ max DOUBLE PRECISION, -- maximum
173
+ PRIMARY KEY (visitseq_uuid, day_obs, value_name, accumulated)
174
+ );
175
+
176
+ -- Tables to support functionality like that of rubin_sim.maf.run_comparison
177
+
178
+ -- Use tags to mark visit sequences as being runs that are part of a given run family.
179
+
180
+ -- Table to keep track of exactly what metrics were run in maf.
181
+ CREATE TABLE maf_metrics (
182
+ maf_metric_name TEXT PRIMARY KEY, -- name for this maf metric
183
+ rubin_sim_version TEXT, -- the version of rubin_sim used
184
+ maf_constraint TEXT, -- constraint imposed in maf
185
+ metric_class_name TEXT, -- class name of the metric
186
+ metric_args JSONB, -- arguments to the metric constructor
187
+ slicer_class_name TEXT, -- class name of the slicer
188
+ slicer_args JSONB -- arguments to the slicer constructor
189
+ );
190
+ CREATE INDEX maf_metrics_name_idx ON maf_metrics(maf_metric_name);
191
+
192
+ -- Support functionality like that of rubin_sim.maf.run_comparison run summaries,
193
+ -- but sampled at whatever dates are of interest rather than just the end.
194
+ -- To get it into the "wide" format like that in run_comparison, use either
195
+ -- a tablefunc in the postgresql query, or (probably easier) use unstack on
196
+ -- the returned dataframe.
197
+ CREATE TABLE maf_summary_metrics (
198
+ visitseq_uuid UUID, -- RFC 4122 Universally Unique IDentifier
199
+ maf_metric_name TEXT REFERENCES maf_metrics(maf_metric_name), -- The name of the maf metric
200
+ day_obs DATE, -- The day obs of the visits included
201
+ accumulated BOOLEAN, -- Whether the statistics include all data through night day_obs, or only data on night day_obs
202
+ summary_value DOUBLE PRECISION,
203
+ PRIMARY KEY (visitseq_uuid, maf_metric_name)
204
+ );
205
+ CREATE INDEX maf_summary_metrics_name_idx ON maf_summary_metrics(maf_metric_name);
206
+
207
+ -- metric sets for rubin_sim.maf.run_comparison
208
+ CREATE TABLE maf_metric_sets (
209
+ metric_set TEXT, -- name of the metric set
210
+ maf_metric_name TEXT REFERENCES maf_metrics(maf_metric_name), -- name of the maf metric
211
+ short_name TEXT, -- a shorter label to use in plots
212
+ style TEXT, -- matplotlib line style
213
+ invert BOOLEAN, -- negative is lower is better
214
+ mag BOOLEAN, -- value is a magnitude
215
+ PRIMARY KEY (metric_set, maf_metric_name)
216
+ );
217
+ CREATE INDEX maf_metric_sets_metric_name_idx ON maf_metric_sets(maf_metric_name);
218
+ CREATE INDEX maf_metric_sets_set_idx ON maf_metric_sets(metric_set);
219
+
220
+ -- Create a view to make it easy to get everything for the summary metrics for one metric set
221
+ -- applied to runs with specified tags.
222
+ CREATE VIEW maf_summary AS
223
+ SELECT mms.metric_set, mms.maf_metric_name, v.visitseq_label,
224
+ msm.day_obs, msm.accumulated, msm.summary_value,
225
+ mms.short_name, mms.style, mms.invert, mms.mag, t.tag
226
+ FROM maf_metric_sets AS mms
227
+ JOIN maf_summary_metrics AS msm ON msm.maf_metric_name=mms.maf_metric_name
228
+ JOIN tags AS t ON t.visitseq_uuid=msm.visitseq_uuid
229
+ JOIN visitseq AS v ON msm.visitseq_uuid=v.visitseq_uuid
230
+ ;
231
+
232
+
233
+ CREATE TABLE maf_healpix_stats (
234
+ visitseq_uuid UUID NOT NULL, -- RFC 4122 Universally Unique IDentifier
235
+ maf_metric_name TEXT REFERENCES maf_metrics(maf_metric_name), -- The name of the maf statistic
236
+ day_obs DATE NOT NULL, -- The day obs of the visits included
237
+ accumulated BOOLEAN NOT NULL, -- Whether the statistics include all data through night day_obs, or only data on night day_obs
238
+ nside INTEGER NOT NULL, -- The nside of the healpix array
239
+ count INTEGER NOT NULL, -- The number of unmasked values in the distribution
240
+ mean DOUBLE PRECISION, -- mean
241
+ std DOUBLE PRECISION, -- standard deviation
242
+ min DOUBLE PRECISION, -- min value
243
+ p05 DOUBLE PRECISION, -- 5% quantile
244
+ q1 DOUBLE PRECISION, -- first quartile
245
+ median DOUBLE PRECISION, -- median
246
+ q3 DOUBLE PRECISION, -- third quartile
247
+ p95 DOUBLE PRECISION, -- 95% quantile
248
+ max DOUBLE PRECISION, -- maximum
249
+ url TEXT, -- URL for the array of healpix values, if saved
250
+ PRIMARY KEY (visitseq_uuid, maf_metric_name, day_obs, accumulated, nside)
251
+ );
@@ -0,0 +1,26 @@
1
+ import os
2
+ import unittest
3
+
4
+ from rubin_scheduler.data import data_versions, get_data_dir
5
+
6
+ from rubin_sim.data import get_baseline
7
+ from rubin_sim.data import get_data_dir as gdd
8
+
9
+
10
+ class DataTest(unittest.TestCase):
11
+ def testBaseline(self):
12
+ """
13
+ Get the baseline sim location
14
+ """
15
+ data_dir = get_data_dir()
16
+ dd2 = gdd()
17
+
18
+ assert data_dir == dd2
19
+
20
+ if "sim_baseline" in os.listdir(data_dir):
21
+ _ = get_baseline()
22
+ _ = data_versions()
23
+
24
+
25
+ if __name__ == "__main__":
26
+ unittest.main()
@@ -0,0 +1,17 @@
1
+ import unittest
2
+
3
+ from rubin_scheduler.scheduler.surveys import generate_ddf_grid
4
+
5
+
6
+ class GenerateDDFTest(unittest.TestCase):
7
+ def testGenDDF(self):
8
+ """
9
+ Test the DDF grid generator over in rubin_scheduler
10
+ """
11
+ # This triggers several RunTimeErrors (intentionally?).
12
+ result = generate_ddf_grid(survey_length=0.01, verbose=False)
13
+ assert result is not None
14
+
15
+
16
+ if __name__ == "__main__":
17
+ unittest.main()
@@ -0,0 +1,68 @@
1
+ import os
2
+ import shutil
3
+ import tempfile
4
+ import unittest
5
+
6
+ from rubin_scheduler.data import get_data_dir
7
+ from rubin_scheduler.utils.code_utilities import sims_clean_up
8
+
9
+ import rubin_sim.maf as maf
10
+
11
+
12
+ class Test3x2(unittest.TestCase):
13
+ @classmethod
14
+ def tearDownClass(cls):
15
+ sims_clean_up()
16
+
17
+ def setUp(self):
18
+ self.out_dir = tempfile.mkdtemp(prefix="TMB")
19
+
20
+ @unittest.skipUnless(
21
+ os.path.isdir(os.path.join(get_data_dir(), "maps")),
22
+ "Skipping 3x3 metric test because no dust maps.",
23
+ )
24
+ def test_3x2(self):
25
+ # Only testing that the metric successfully runs, not checking that
26
+ # the output values are valid.
27
+ bundle_list = []
28
+ nside = 64
29
+ colmap = maf.batches.col_map_dict("fbs_sim")
30
+ nfilters_needed = 6
31
+ lim_ebv = 0.2
32
+ ptsrc_lim_mag_i_band = 25.9
33
+ m = maf.metrics.ExgalM5WithCuts(
34
+ m5_col=colmap["fiveSigmaDepth"],
35
+ filter_col="band",
36
+ lsst_filter="i",
37
+ n_filters=nfilters_needed,
38
+ extinction_cut=lim_ebv,
39
+ depth_cut=ptsrc_lim_mag_i_band,
40
+ )
41
+ s = maf.slicers.HealpixSlicer(nside=nside, use_cache=False)
42
+ sql = "scheduler_note not like 'DD%' and night < 365"
43
+ threeby_two_summary_simple = maf.metrics.StaticProbesFoMEmulatorMetricSimple(
44
+ metric_name="3x2ptFoM_simple"
45
+ )
46
+ threeby_two_summary = maf.maf_contrib.StaticProbesFoMEmulatorMetric(metric_name="3x2ptFoM")
47
+ bundle_list.append(
48
+ maf.metric_bundles.MetricBundle(
49
+ m,
50
+ s,
51
+ sql,
52
+ summary_metrics=[threeby_two_summary, threeby_two_summary_simple],
53
+ )
54
+ )
55
+
56
+ database = os.path.join(get_data_dir(), "sim_baseline", "baseline.db")
57
+ results_db = maf.db.ResultsDb(out_dir=self.out_dir)
58
+ bd = maf.metric_bundles.make_bundles_dict_from_list(bundle_list)
59
+ bg = maf.metric_bundles.MetricBundleGroup(bd, database, out_dir=self.out_dir, results_db=results_db)
60
+ bg.run_all()
61
+
62
+ def tearDown(self):
63
+ if os.path.isdir(self.out_dir):
64
+ shutil.rmtree(self.out_dir)
65
+
66
+
67
+ if __name__ == "__main__":
68
+ unittest.main()
@@ -0,0 +1,162 @@
1
+ # imports
2
+ import os
3
+ import sys
4
+ import unittest
5
+ from os import path
6
+ from tempfile import TemporaryDirectory
7
+ from unittest.mock import patch
8
+
9
+ import pandas as pd
10
+
11
+ from rubin_sim import maf
12
+ from rubin_sim.data import get_data_dir
13
+
14
+ # constants
15
+
16
+ URLROOT = "https://raw.githubusercontent.com/lsst-pst/survey_strategy/main/fbs_2.0/"
17
+ FAMILY_SOURCE = URLROOT + "runs_v2.1.json"
18
+ METRIC_SUBSET_SOURCE = os.path.join(get_data_dir(), "maf", "metric_subsets.json")
19
+ SUMMARY_SOURCE = os.path.join(get_data_dir(), "maf", "baseline_summary.h5")
20
+
21
+ # exception classes
22
+
23
+ # interface functions
24
+
25
+ # classes
26
+
27
+
28
+ class TestArchive(unittest.TestCase):
29
+ num_runs = 11
30
+ num_metrics = 7
31
+
32
+ def test_get_family_runs(self):
33
+ runs = maf.get_family_runs(FAMILY_SOURCE)
34
+
35
+ self.assertIsInstance(runs, pd.DataFrame)
36
+
37
+ columns = ("run", "brief", "filepath", "url")
38
+ for column in columns:
39
+ self.assertIn(column, runs.columns)
40
+
41
+ self.assertEqual(runs.index.name, "family")
42
+
43
+ def test_get_runs(self):
44
+ runs = maf.get_runs(FAMILY_SOURCE)
45
+ self.assertEqual(runs.index.name, "run")
46
+
47
+ columns = ("family", "brief", "filepath", "url")
48
+ for column in columns:
49
+ self.assertIn(column, runs.columns)
50
+
51
+ self.assertEqual(runs.index.name, "run")
52
+
53
+ @unittest.skip("skipping long running test.")
54
+ def test_download_runs(self):
55
+ run = maf.get_runs(FAMILY_SOURCE).index.values[0]
56
+
57
+ temp_dir_itself = TemporaryDirectory()
58
+ temp_dir = temp_dir_itself.name
59
+
60
+ dest_fnames = maf.download_runs(run, dest_dir=temp_dir)
61
+ self.assertTrue(path.exists(dest_fnames[0]))
62
+
63
+ temp_dir_itself.cleanup()
64
+
65
+ def test_get_metric_subsets(self):
66
+ metric_subsets = maf.get_metric_subsets(METRIC_SUBSET_SOURCE)
67
+ self.assertIsInstance(metric_subsets, pd.DataFrame)
68
+ self.assertIn("metric subset", metric_subsets.index.names)
69
+ self.assertIn("metric", metric_subsets.index.names)
70
+
71
+ columns = ("style", "invert", "mag")
72
+ for column in columns:
73
+ self.assertIn(column, metric_subsets.columns)
74
+
75
+ def test_get_metric_summaries(self):
76
+ summary = maf.get_metric_summaries(summary_source=SUMMARY_SOURCE)
77
+ self.assertIsInstance(summary, pd.DataFrame)
78
+ self.assertEqual(summary.columns.name, "metric")
79
+ self.assertEqual(summary.index.name, "run")
80
+
81
+ my_summary = maf.get_metric_summaries(
82
+ runs=["baseline_v3.0_10yrs", "baseline_v3.4_10yrs"],
83
+ metrics=[
84
+ "Rms Max normairmass All sky all bands HealpixSlicer",
85
+ "Median Max normairmass All sky all bands HealpixSlicer",
86
+ "Max Max normairmass All sky all bands HealpixSlicer",
87
+ ],
88
+ summary_source=summary,
89
+ )
90
+ self.assertEqual(len(my_summary), 2)
91
+ self.assertEqual(len(my_summary.columns), 3)
92
+
93
+ srd_sim = maf.get_metric_summaries(
94
+ metric_subsets="SRD",
95
+ summary_source=summary,
96
+ metric_subset_source=METRIC_SUBSET_SOURCE,
97
+ )
98
+ self.assertGreater(len(srd_sim.columns), 3)
99
+ self.assertLess(len(srd_sim.columns), len(summary.columns))
100
+
101
+ srdnvis_sim = maf.get_metric_summaries(
102
+ metric_subsets=["SRD", "N Visits"],
103
+ summary_source=summary,
104
+ metric_subset_source=METRIC_SUBSET_SOURCE,
105
+ )
106
+ self.assertGreater(len(srdnvis_sim.columns), len(srd_sim.columns))
107
+ self.assertLess(len(srdnvis_sim.columns), len(summary.columns))
108
+
109
+ def test_get_family_descriptions(self):
110
+ families = maf.get_family_descriptions(FAMILY_SOURCE)
111
+ self.assertIsInstance(families, pd.DataFrame)
112
+ self.assertEqual(families.index.name, "family")
113
+
114
+ def test_describe_families(self):
115
+ if "IPython" in sys.modules:
116
+ with (
117
+ patch("IPython.display.display_markdown") as _,
118
+ patch("IPython.display.HTML") as _,
119
+ patch("IPython.display") as _,
120
+ ):
121
+ self.perform_describe_families_test()
122
+ else:
123
+ with patch("builtins.print") as _:
124
+ self.perform_describe_families_test()
125
+
126
+ @unittest.skip("Skipping; family descriptions out of sync with summary")
127
+ def perform_describe_families_test(self):
128
+ families = maf.get_family_descriptions(FAMILY_SOURCE)
129
+ disp_families = families[:2]
130
+
131
+ fig, ax = maf.describe_families(families)
132
+ self.assertIsNone(fig)
133
+ self.assertIsNone(ax)
134
+
135
+ all_metric_subsets = maf.get_metric_subsets(METRIC_SUBSET_SOURCE)
136
+ summary = maf.get_metric_summaries(summary_source=SUMMARY_SOURCE)
137
+
138
+ table_metric_subset = all_metric_subsets.loc["SRD"]
139
+ fig, ax = maf.describe_families(
140
+ disp_families, summary=summary, table_metric_subset=table_metric_subset
141
+ )
142
+ self.assertIsNone(fig)
143
+ self.assertIsNone(ax)
144
+
145
+ plot_metric_subset = all_metric_subsets.loc["N Visits"]
146
+ fig, ax = maf.describe_families(disp_families, summary=summary, plot_metric_subset=plot_metric_subset)
147
+
148
+ def test_create_metric_subset(self):
149
+ metrics = ["Urania", "Thalia", "Calliope", "Terpsichore"]
150
+ metric_subset_name = "Muses"
151
+ metric_subset = maf.create_metric_subset(metric_subset_name, metrics)
152
+ self.assertSequenceEqual(metrics, metric_subset.metric.tolist())
153
+ self.assertSequenceEqual(
154
+ metric_subset.columns.tolist(),
155
+ ["metric", "short_name", "style", "invert", "mag"],
156
+ )
157
+ self.assertSequenceEqual(metric_subset.index.names, ["metric subset", "metric"])
158
+
159
+
160
+ run_tests_now = __name__ == "__main__"
161
+ if run_tests_now:
162
+ unittest.main()
@@ -0,0 +1,99 @@
1
+ import unittest
2
+
3
+ import rubin_sim.maf.metrics as metrics
4
+
5
+
6
+ class TestBaseMetric(unittest.TestCase):
7
+ def test_reduce_dict(self):
8
+ """Test that reduce dictionary is created."""
9
+ testmetric = metrics.BaseMetric("testcol")
10
+ self.assertEqual(list(testmetric.reduce_funcs.keys()), [])
11
+
12
+ def test_metric_name(self):
13
+ """Test that metric name is set appropriately automatically
14
+ and when explicitly passed.
15
+ """
16
+ # Test automatic setting of metric name
17
+ testmetric = metrics.BaseMetric("testcol")
18
+ self.assertEqual(testmetric.name, "Base testcol")
19
+ testmetric = metrics.BaseMetric(["testcol1", "testcol2"])
20
+ self.assertEqual(testmetric.name, "Base testcol1, testcol2")
21
+ # Test explicit setting of metric name
22
+ testmetric = metrics.BaseMetric("testcol", metric_name="Test")
23
+ self.assertEqual(testmetric.name, "Test")
24
+
25
+ def test_col_registry(self):
26
+ """Test column registry adds to colRegistry as expected"""
27
+ # Clear the registry to make sure we start clear
28
+ colreg = metrics.ColRegistry()
29
+ colreg.clear_reg()
30
+
31
+ cols = "onecolumn"
32
+ colset = set()
33
+ colset.add(cols)
34
+ testmetric = metrics.BaseMetric(cols)
35
+ # Class registry should have dictionary with values =
36
+ # set of columns for metric class
37
+ for item in colset:
38
+ self.assertIn(item, testmetric.col_registry.col_set)
39
+ cols = ["onecolumn", "twocolumn"]
40
+ colset.add("twocolumn")
41
+ testmetric = metrics.BaseMetric(cols)
42
+ for item in colset:
43
+ self.assertIn(item, testmetric.col_registry.col_set)
44
+ # Test with additional (different) metric
45
+ cols = "twocolumn"
46
+ testmetric2 = metrics.MeanMetric(cols)
47
+ for item in colset:
48
+ self.assertIn(item, testmetric2.col_registry.col_set)
49
+
50
+ # test that the registry can be cleared
51
+ colreg.clear_reg()
52
+ assert len(colreg.col_set) == 0
53
+ assert len(colreg.db_set) == 0
54
+ assert len(colreg.stacker_dict) == 0
55
+
56
+ def test_metric_dtype(self):
57
+ """Test that base metric data value type set appropriately"""
58
+ cols = "onecolumn"
59
+ testmetric = metrics.BaseMetric(cols)
60
+ self.assertEqual(testmetric.metric_dtype, "float")
61
+ testmetric = metrics.BaseMetric(cols, metric_dtype="object")
62
+ self.assertEqual(testmetric.metric_dtype, "object")
63
+
64
+ def test_units(self):
65
+ """Test unit setting (including units set by utils.getColInfo)"""
66
+ cols = "onecolumn"
67
+ # Test for column not in colInfo, units not set by hand.
68
+ testmetric = metrics.BaseMetric(cols)
69
+ self.assertEqual(testmetric.units, "")
70
+ # Test for column not in colInfo, units set by hand.
71
+ testmetric = metrics.BaseMetric(cols, units="Test")
72
+ self.assertEqual(testmetric.units, "Test")
73
+ # Test for column in colInfo (looking up units in colInfo)
74
+ cols = "finSeeing"
75
+ testmetric = metrics.BaseMetric(cols)
76
+ self.assertEqual(testmetric.units, "arcsec")
77
+ # Test for column in colInfo but units overriden
78
+ testmetric = metrics.BaseMetric(cols, units="Test")
79
+ self.assertEqual(testmetric.units, "Test")
80
+ # Test for multiple columns not in colInfo
81
+ cols = ["onecol", "twocol"]
82
+ testmetric = metrics.BaseMetric(cols)
83
+ self.assertEqual(testmetric.units, "")
84
+ # Test for multiple columns in colInfo
85
+ cols = ["finSeeing", "filtSkyBrightness"]
86
+ testmetric = metrics.BaseMetric(cols)
87
+ self.assertEqual(testmetric.units, "arcsec mag/sq arcsec")
88
+ # Test for multiple columns, only one in colInfo
89
+ cols = ["finSeeing", "twocol"]
90
+ testmetric = metrics.BaseMetric(cols)
91
+ self.assertEqual(testmetric.units, "arcsec ")
92
+ # Test for multiple columns both in colInfo but repeated
93
+ cols = ["finSeeing", "finSeeing"]
94
+ testmetric = metrics.BaseMetric(cols)
95
+ self.assertEqual(testmetric.units, "arcsec arcsec")
96
+
97
+
98
+ if __name__ == "__main__":
99
+ unittest.main()
@@ -0,0 +1,36 @@
1
+ import unittest
2
+
3
+ import rubin_sim.maf.batches as batches
4
+
5
+
6
+ class TestCommon(unittest.TestCase):
7
+ def test_col_map(self):
8
+ colmap = batches.col_map_dict("opsimv4")
9
+ self.assertEqual(colmap["raDecDeg"], True)
10
+ self.assertEqual(colmap["ra"], "fieldRA")
11
+ colmap = batches.col_map_dict("fbs")
12
+ self.assertEqual(colmap["raDecDeg"], True)
13
+ self.assertEqual(colmap["skyBrightness"], "skyBrightness")
14
+
15
+ def test_filter_list(self):
16
+ filterlist, colors, orders, sqls, info_label = batches.common.filter_list(all=False, extra_sql=None)
17
+ self.assertEqual(len(filterlist), 6)
18
+ self.assertEqual(len(colors), 6)
19
+ self.assertEqual(sqls["u"], "band = 'u'")
20
+ filterlist, colors, orders, sqls, info_label = batches.common.filter_list(all=True, extra_sql=None)
21
+ self.assertIn("all", filterlist)
22
+ self.assertEqual(sqls["all"], "")
23
+ filterlist, colors, orders, sqls, info_label = batches.common.filter_list(
24
+ all=True, extra_sql="night=3"
25
+ )
26
+ self.assertEqual(sqls["all"], "night=3")
27
+ self.assertEqual(sqls["u"], "(night=3) and (band = 'u')")
28
+ self.assertEqual(info_label["u"], "night=3 u band")
29
+ filterlist, colors, orders, sqls, info_label = batches.common.filter_list(
30
+ all=True, extra_sql="night=3", extra_info_label="night 3"
31
+ )
32
+ self.assertEqual(info_label["u"], "night 3 u band")
33
+
34
+
35
+ if __name__ == "__main__":
36
+ unittest.main()