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,200 @@
1
+ import unittest
2
+
3
+ import numpy as np
4
+
5
+ import rubin_sim.maf.metrics as metrics
6
+
7
+
8
+ class TestSimpleMetrics(unittest.TestCase):
9
+ def setUp(self):
10
+ dv = np.arange(0, 10, 0.5)
11
+ dv2 = np.arange(-10, 10.25, 0.5)
12
+ self.dv = np.array(list(zip(dv)), dtype=[("testdata", "float")])
13
+ self.dv2 = np.array(list(zip(dv2)), dtype=[("testdata", "float")])
14
+
15
+ def test_max_metric(self):
16
+ """Test max metric."""
17
+ testmetric = metrics.MaxMetric("testdata")
18
+ self.assertEqual(testmetric.run(self.dv), self.dv["testdata"].max())
19
+
20
+ def test_min_metric(self):
21
+ """Test min metric."""
22
+ testmetric = metrics.MinMetric("testdata")
23
+ self.assertEqual(testmetric.run(self.dv), self.dv["testdata"].min())
24
+
25
+ def test_mean_metric(self):
26
+ """Test mean metric."""
27
+ testmetric = metrics.MeanMetric("testdata")
28
+ self.assertEqual(testmetric.run(self.dv), self.dv["testdata"].mean())
29
+
30
+ def test_median_metric(self):
31
+ """Test median metric."""
32
+ testmetric = metrics.MedianMetric("testdata")
33
+ self.assertEqual(testmetric.run(self.dv), np.median(self.dv["testdata"]))
34
+
35
+ def test_abs_median_metric(self):
36
+ testmetric = metrics.AbsMedianMetric("testdata")
37
+ self.assertEqual(testmetric.run(self.dv), np.abs(np.median(self.dv["testdata"])))
38
+
39
+ def test_full_range_metric(self):
40
+ """Test full range metric."""
41
+ testmetric = metrics.FullRangeMetric("testdata")
42
+ self.assertEqual(
43
+ testmetric.run(self.dv),
44
+ self.dv["testdata"].max() - self.dv["testdata"].min(),
45
+ )
46
+
47
+ def test_coaddm5_metric(self):
48
+ """Test coaddm5 metric."""
49
+ testmetric = metrics.Coaddm5Metric(m5_col="testdata")
50
+ self.assertEqual(
51
+ testmetric.run(self.dv),
52
+ 1.25 * np.log10(np.sum(10.0 ** (0.8 * self.dv["testdata"]))),
53
+ )
54
+
55
+ def test_rms_metric(self):
56
+ """Test rms metric."""
57
+ testmetric = metrics.RmsMetric("testdata")
58
+ self.assertEqual(testmetric.run(self.dv), np.std(self.dv["testdata"]))
59
+
60
+ def test_sum_metric(self):
61
+ """Test Sum metric."""
62
+ testmetric = metrics.SumMetric("testdata")
63
+ self.assertEqual(testmetric.run(self.dv), self.dv["testdata"].sum())
64
+
65
+ def test_count_unique_metric(self):
66
+ """Test CountUniqueMetric"""
67
+ testmetric = metrics.CountUniqueMetric("testdata")
68
+ self.assertEqual(testmetric.run(self.dv), np.size(np.unique(self.dv["testdata"])))
69
+ d2 = self.dv.copy()
70
+ d2["testdata"][1] = d2["testdata"][0]
71
+ self.assertEqual(testmetric.run(d2), np.size(np.unique(d2)))
72
+
73
+ def test_count_metric(self):
74
+ """Test count metric."""
75
+ testmetric = metrics.CountMetric("testdata")
76
+ self.assertEqual(testmetric.run(self.dv), np.size(self.dv["testdata"]))
77
+
78
+ def test_count_ratio_metric(self):
79
+ """Test countratio metric."""
80
+ testmetric = metrics.CountRatioMetric("testdata", norm_val=2.0)
81
+ self.assertEqual(testmetric.run(self.dv), np.size(self.dv["testdata"]) / 2.0)
82
+
83
+ def test_count_subset_metric(self):
84
+ """Test countsubset metric."""
85
+ testmetric = metrics.CountSubsetMetric("testdata", subset=0)
86
+ self.assertEqual(testmetric.run(self.dv), 1)
87
+
88
+ def test_max_percent_metric(self):
89
+ testmetric = metrics.MaxPercentMetric("testdata")
90
+ self.assertEqual(testmetric.run(self.dv), 1.0 / len(self.dv) * 100.0)
91
+ self.assertEqual(testmetric.run(self.dv2), 1.0 / len(self.dv2) * 100.0)
92
+
93
+ def test_abs_max_percent_metric(self):
94
+ testmetric = metrics.AbsMaxPercentMetric("testdata")
95
+ self.assertEqual(testmetric.run(self.dv), 1.0 / len(self.dv) * 100.0)
96
+ self.assertEqual(testmetric.run(self.dv2), 2.0 / len(self.dv2) * 100.0)
97
+
98
+ def test_robust_rms_metric(self):
99
+ """Test Robust RMS metric."""
100
+ testmetric = metrics.RobustRmsMetric("testdata")
101
+ rms_approx = (np.percentile(self.dv["testdata"], 75) - np.percentile(self.dv["testdata"], 25)) / 1.349
102
+ self.assertEqual(testmetric.run(self.dv), rms_approx)
103
+
104
+ def test_frac_above_metric(self):
105
+ cutoff = 5.1
106
+ testmetric = metrics.FracAboveMetric("testdata", cutoff=cutoff)
107
+ self.assertEqual(
108
+ testmetric.run(self.dv),
109
+ np.size(np.where(self.dv["testdata"] >= cutoff)[0]) / float(np.size(self.dv)),
110
+ )
111
+ testmetric = metrics.FracAboveMetric("testdata", cutoff=cutoff, scale=2)
112
+ self.assertEqual(
113
+ testmetric.run(self.dv),
114
+ 2.0 * np.size(np.where(self.dv["testdata"] >= cutoff)[0]) / float(np.size(self.dv)),
115
+ )
116
+
117
+ def test_frac_below_metric(self):
118
+ cutoff = 5.1
119
+ testmetric = metrics.FracBelowMetric("testdata", cutoff=cutoff)
120
+ self.assertEqual(
121
+ testmetric.run(self.dv),
122
+ np.size(np.where(self.dv["testdata"] <= cutoff)[0]) / float(np.size(self.dv)),
123
+ )
124
+ testmetric = metrics.FracBelowMetric("testdata", cutoff=cutoff, scale=2)
125
+ self.assertEqual(
126
+ testmetric.run(self.dv),
127
+ 2.0 * np.size(np.where(self.dv["testdata"] <= cutoff)[0]) / float(np.size(self.dv)),
128
+ )
129
+
130
+ def test_noutliers_nsigma(self):
131
+ data = self.dv
132
+ testmetric = metrics.NoutliersNsigmaMetric("testdata", n_sigma=1.0)
133
+ med = np.mean(data["testdata"])
134
+ should_be = np.size(np.where(data["testdata"] > med + data["testdata"].std())[0])
135
+ self.assertEqual(should_be, testmetric.run(data))
136
+ testmetric = metrics.NoutliersNsigmaMetric("testdata", n_sigma=-1.0)
137
+ should_be = np.size(np.where(data["testdata"] < med - data["testdata"].std())[0])
138
+ self.assertEqual(should_be, testmetric.run(data))
139
+
140
+ def test_mean_angle_metric(self):
141
+ """Test mean angle metric."""
142
+ rng = np.random.RandomState(6573)
143
+ dv1 = np.arange(0, 32, 2.5)
144
+ dv2 = (dv1 - 20.0) % 360.0
145
+ dv1 = np.array(list(zip(dv1)), dtype=[("testdata", "float")])
146
+ dv2 = np.array(list(zip(dv2)), dtype=[("testdata", "float")])
147
+ testmetric = metrics.MeanAngleMetric("testdata")
148
+ result1 = testmetric.run(dv1)
149
+ result2 = testmetric.run(dv2)
150
+ self.assertAlmostEqual(result1, (result2 + 20) % 360.0)
151
+ dv = rng.rand(10000) * 360.0
152
+ dv = dv
153
+ dv = np.array(list(zip(dv)), dtype=[("testdata", "float")])
154
+ result = testmetric.run(dv)
155
+ result = result
156
+ self.assertAlmostEqual(result, 180)
157
+
158
+ def test_full_range_angle_metric(self):
159
+ """Test full range angle metric."""
160
+ rng = np.random.RandomState(5422)
161
+ dv1 = np.arange(0, 32, 2.5)
162
+ dv2 = (dv1 - 20.0) % 360.0
163
+ dv1 = np.array(list(zip(dv1)), dtype=[("testdata", "float")])
164
+ dv2 = np.array(list(zip(dv2)), dtype=[("testdata", "float")])
165
+ testmetric = metrics.FullRangeAngleMetric("testdata")
166
+ result1 = testmetric.run(dv1)
167
+ result2 = testmetric.run(dv2)
168
+ self.assertAlmostEqual(result1, result2)
169
+ dv = np.arange(0, 358, 5)
170
+ dv = np.array(list(zip(dv)), dtype=[("testdata", "float")])
171
+ result = testmetric.run(dv)
172
+ self.assertAlmostEqual(result, 355)
173
+ dv = rng.rand(10000) * 360.0
174
+ dv = np.array(list(zip(dv)), dtype=[("testdata", "float")])
175
+ result = testmetric.run(dv)
176
+ result = result
177
+ self.assertGreater(result, 355)
178
+
179
+ def test_surfb_metric(self):
180
+ """Test the surface brightness metric"""
181
+ testmetric = metrics.SurfaceBrightLimitMetric()
182
+ names = [
183
+ "airmass",
184
+ "visitExposureTime",
185
+ "skyBrightness",
186
+ "numExposures",
187
+ "band",
188
+ ]
189
+ types = [float] * 4 + ["|U1"]
190
+ data = np.zeros(10, dtype=list(zip(names, types)))
191
+ data["airmass"] = 1.2
192
+ data["visitExposureTime"] = 30.0
193
+ data["skyBrightness"] = 25.0
194
+ data["numExposures"] = 2.0
195
+ data["band"] = "r"
196
+ _ = testmetric.run(data, None)
197
+
198
+
199
+ if __name__ == "__main__":
200
+ unittest.main()
@@ -0,0 +1,335 @@
1
+ import os
2
+ import unittest
3
+ import warnings
4
+
5
+ import numpy as np
6
+ from rubin_scheduler.data import get_data_dir
7
+
8
+ from rubin_sim.maf.metrics import SNCadenceMetric, SNSLMetric, SNSNRMetric
9
+ from rubin_sim.maf.utils.sn_utils import Lims, ReferenceData
10
+
11
+ m5_ref = dict(zip("ugrizy", [23.60, 24.83, 24.38, 23.92, 23.35, 22.44]))
12
+
13
+
14
+ def observations_band(day0=59000, daymin=59000, cadence=3.0, season_length=140.0, band="r"):
15
+ # Define fake data
16
+ names = [
17
+ "observationStartMJD",
18
+ "fieldRA",
19
+ "fieldDec",
20
+ "fiveSigmaDepth",
21
+ "visitExposureTime",
22
+ "numExposures",
23
+ "visitTime",
24
+ "season",
25
+ "seeingFwhmEff",
26
+ "seeingFwhmGeom",
27
+ "pixRA",
28
+ "pixDec",
29
+ ]
30
+ types = ["f8"] * len(names)
31
+ names += ["night", "healpixID"]
32
+ types += ["i2", "i2"]
33
+ names += ["band"]
34
+ types += ["O"]
35
+
36
+ daylast = daymin + season_length
37
+ cadence = cadence
38
+ dayobs = np.arange(daymin, daylast, cadence)
39
+ npts = len(dayobs)
40
+ data = np.zeros(npts, dtype=list(zip(names, types)))
41
+ data["observationStartMJD"] = dayobs
42
+ data["night"] = np.floor(data["observationStartMJD"] - day0 + 1)
43
+ data["fiveSigmaDepth"] = m5_ref[band]
44
+ data["visitExposureTime"] = 30.0
45
+ data["numExposures"] = 1
46
+ data["visitTime"] = 34
47
+ data["band"] = band
48
+ data["seeingFwhmEff"] = 0.8
49
+ data["seeingFwhmGeom"] = 0.8
50
+ data["healpixID"] = 10
51
+ data["pixRA"] = 0.0
52
+ data["pixDec"] = 0.0
53
+ return data
54
+
55
+
56
+ def observations_season(mjdmin=59000, cadence=3.0):
57
+ bands = "grizy"
58
+ nvisits = dict(zip(bands, [10, 20, 20, 26, 20]))
59
+ rat = 34.0 / 3600.0 / 24.0
60
+ shift_visits = {}
61
+ shift_visits["g"] = 0
62
+ shift_visits["r"] = rat * nvisits["g"]
63
+ shift_visits["i"] = rat * nvisits["r"]
64
+ shift_visits["z"] = rat * nvisits["i"]
65
+ shift_visits["y"] = rat * nvisits["z"]
66
+
67
+ # get data
68
+ data = None
69
+ season_length = 180
70
+ shift = 30.0 / (3600.0 * 24)
71
+ for band in bands:
72
+ mjd = mjdmin + shift_visits[band]
73
+ for i in range(nvisits[band]):
74
+ mjd += shift
75
+ dat = observations_band(daymin=mjd, season_length=season_length, cadence=cadence, band=band)
76
+ if data is None:
77
+ data = dat
78
+ else:
79
+ data = np.concatenate((data, dat))
80
+
81
+ return data
82
+
83
+
84
+ def fake_data(band, season=1):
85
+ # Define fake data
86
+ names = [
87
+ "observationStartMJD",
88
+ "fieldRA",
89
+ "fieldDec",
90
+ "fiveSigmaDepth",
91
+ "visitExposureTime",
92
+ "numExposures",
93
+ "visitTime",
94
+ "season",
95
+ "seeingFwhmEff",
96
+ "seeingFwhmGeom",
97
+ "airmass",
98
+ "sky",
99
+ "moonPhase",
100
+ "pixRA",
101
+ "pixDec",
102
+ ]
103
+
104
+ types = ["f8"] * len(names)
105
+ names += ["night"]
106
+ types += ["i2"]
107
+ names += ["healpixID"]
108
+ types += ["i2"]
109
+ names += ["band"]
110
+ types += ["O"]
111
+
112
+ dayobs = [
113
+ 59948.31957176,
114
+ 59959.2821412,
115
+ 59970.26134259,
116
+ 59973.25978009,
117
+ 59976.26383102,
118
+ 59988.20670139,
119
+ 59991.18412037,
120
+ 60004.1853588,
121
+ 60032.08975694,
122
+ 60045.11981481,
123
+ 60047.98747685,
124
+ 60060.02083333,
125
+ 60071.986875,
126
+ 60075.96452546,
127
+ ]
128
+ day0 = np.min(dayobs)
129
+ npts = len(dayobs)
130
+ data = np.zeros(npts, dtype=list(zip(names, types)))
131
+ data["observationStartMJD"] = dayobs
132
+ data["night"] = np.floor(data["observationStartMJD"] - day0 + 1)
133
+ data["fiveSigmaDepth"] = m5_ref[band]
134
+ data["visitExposureTime"] = 15.0
135
+ data["numExposures"] = 2
136
+ data["visitTime"] = 2.0 * 15.0
137
+ data["season"] = season
138
+ data["band"] = band
139
+ data["seeingFwhmEff"] = 0.0
140
+ data["seeingFwhmGeom"] = 0.0
141
+ data["airmass"] = 1.2
142
+ data["sky"] = 20.0
143
+ data["moonPhase"] = 0.5
144
+ data["pixRA"] = 0.0
145
+ data["pixDec"] = 0.0
146
+ data["healpixID"] = 1
147
+
148
+ return data
149
+
150
+
151
+ class TestSNmetrics(unittest.TestCase):
152
+ def setUp(self):
153
+ if not os.path.isdir(os.path.join(get_data_dir(), "maf")):
154
+ self.skipTest("Skipping SN tests because running unit tests without full rubin_sim.data.")
155
+
156
+ @unittest.skip("The SNCadenceMetric is not used")
157
+ def test_sn_cadence_metric(self):
158
+ """Test the SN cadence metric"""
159
+
160
+ # Load up the files from sims_maf_contrib if possible
161
+ sims_maf_contrib_dir = os.path.join(get_data_dir(), "maf")
162
+ if sims_maf_contrib_dir is not None:
163
+ # Load required SN info to run the metric
164
+ band = "r"
165
+ SNR = dict(zip("griz", [30.0, 40.0, 30.0, 20.0])) # SNR for WFD
166
+ mag_range = [21.0, 25.5] # WFD mag range
167
+ dt_range = [0.5, 30.0] # WFD dt range
168
+ li_files = [os.path.join(sims_maf_contrib_dir, "Li_SNCosmo_-2.0_0.2.npy")]
169
+ mag_to_flux_files = [os.path.join(sims_maf_contrib_dir, "Mag_to_Flux_SNCosmo.npy")]
170
+ lim_sn = Lims(
171
+ li_files,
172
+ mag_to_flux_files,
173
+ band,
174
+ SNR[band],
175
+ mag_range=mag_range,
176
+ dt_range=dt_range,
177
+ )
178
+
179
+ # Define fake data
180
+ names = [
181
+ "observationStartMJD",
182
+ "fieldRA",
183
+ "fieldDec",
184
+ "fiveSigmaDepth",
185
+ "visitExposureTime",
186
+ "numExposures",
187
+ "visitTime",
188
+ ]
189
+ types = ["f8"] * len(names)
190
+ names += ["night"]
191
+ types += ["i2"]
192
+ names += ["band"]
193
+ types += ["O"]
194
+
195
+ day0 = 59000
196
+ daylast = day0 + 250
197
+ cadence = 5
198
+ dayobs = np.arange(day0, daylast, cadence)
199
+ npts = len(dayobs)
200
+ data = np.zeros(npts, dtype=list(zip(names, types)))
201
+ data["observationStartMJD"] = dayobs
202
+ data["night"] = np.floor(data["observationStartMJD"] - day0)
203
+ data["fiveSigmaDepth"] = m5_ref[band]
204
+ data["visitExposureTime"] = 15.0
205
+ data["numExposures"] = 2
206
+ data["visitTime"] = 2.0 * 15.0
207
+ data["band"] = band
208
+
209
+ # Run the metric with these fake data
210
+ slice_point = {"nside": 64, "ebv": 0}
211
+ metric = SNCadenceMetric(lim_sn=lim_sn, coadd=False)
212
+ result = metric.run(data, slice_point)
213
+
214
+ # And the result should be...
215
+ result_ref = 0.3743514
216
+
217
+ assert np.abs(result - result_ref) < 1.0e-5
218
+
219
+ else:
220
+ warnings.warn("skipping SN test because no rubin_sim.data set")
221
+
222
+ @unittest.skip("This metric is not used")
223
+ def test_snsnr_metric(self):
224
+ """Test the SN SNR metric"""
225
+
226
+ sims_maf_contrib_dir = os.path.join(get_data_dir(), "maf")
227
+ if sims_maf_contrib_dir is not None:
228
+ # Load required SN info to run the metric
229
+ band = "r"
230
+ z = 0.3
231
+ season = 1.0
232
+ li_files = [os.path.join(sims_maf_contrib_dir, "Li_SNCosmo_-2.0_0.2.npy")]
233
+ mag_to_flux_files = [os.path.join(sims_maf_contrib_dir, "Mag_to_Flux_SNCosmo.npy")]
234
+
235
+ names_ref = ["SNCosmo"]
236
+ coadd = False
237
+
238
+ lim_sn = ReferenceData(li_files, mag_to_flux_files, band, z)
239
+
240
+ # Define fake data
241
+ names = [
242
+ "observationStartMJD",
243
+ "fieldRA",
244
+ "fieldDec",
245
+ "fiveSigmaDepth",
246
+ "visitExposureTime",
247
+ "numExposures",
248
+ "visitTime",
249
+ "season",
250
+ ]
251
+ types = ["f8"] * len(names)
252
+ names += ["night"]
253
+ types += ["i2"]
254
+ names += ["band"]
255
+ types += ["O"]
256
+
257
+ dayobs = [
258
+ 59948.31957176,
259
+ 59959.2821412,
260
+ 59970.26134259,
261
+ 59973.25978009,
262
+ 59976.26383102,
263
+ 59988.20670139,
264
+ 59991.18412037,
265
+ 60004.1853588,
266
+ 60032.08975694,
267
+ 60045.11981481,
268
+ 60047.98747685,
269
+ 60060.02083333,
270
+ 60071.986875,
271
+ 60075.96452546,
272
+ ]
273
+ day0 = np.min(dayobs)
274
+ npts = len(dayobs)
275
+ data = np.zeros(npts, dtype=list(zip(names, types)))
276
+
277
+ data["observationStartMJD"] = dayobs
278
+ data["night"] = np.floor(data["observationStartMJD"] - day0)
279
+ data["fiveSigmaDepth"] = m5_ref[band]
280
+ data["visitExposureTime"] = 15.0
281
+ data["numExposures"] = 2
282
+ data["visitTime"] = 2.0 * 15.0
283
+ data["season"] = season
284
+ data["band"] = band
285
+
286
+ # Run the metric with these fake data
287
+ slice_point = {"nside": 64, "ebv": 0.0}
288
+ metric = SNSNRMetric(lim_sn=lim_sn, coadd=coadd, names_ref=names_ref, season=season, z=z)
289
+
290
+ result = metric.run(data, slice_point)
291
+
292
+ # And the result should be...
293
+ result_ref = 0.4830508474576271
294
+
295
+ assert np.abs(result - result_ref) < 1.0e-5
296
+ else:
297
+ warnings.warn("skipping SN test because no rubin_sim.data set")
298
+
299
+ def test_snsl_metric(self):
300
+ """Test the SN SL metric"""
301
+
302
+ # load some fake data
303
+ data = None
304
+ bands = "griz"
305
+ cadence = dict(zip(bands, [2, 1, 2, 1]))
306
+ for band in bands:
307
+ for i in range(cadence[band]):
308
+ fakes = fake_data(band)
309
+ if data is None:
310
+ data = fakes
311
+ else:
312
+ data = np.concatenate((data, fakes))
313
+
314
+ # metric instance
315
+
316
+ metric = SNSLMetric(
317
+ nfilters_min=4,
318
+ min_season_obs=5,
319
+ m5mins={"u": 22.7, "g": 24.1, "r": 23.7, "i": 23.1, "z": 22.2, "y": 21.4},
320
+ )
321
+
322
+ # run the metric
323
+ n_sl = metric.run(data, slice_point={"nside": 64, "ra": 0.0, "ebv": 0.0})
324
+
325
+ # and the result should be
326
+ # Changing the reference value because we have new coadd and mag limits
327
+ # Change again to switch to per-season calc rather than average
328
+ # Change again to reflect updated calculation
329
+ # (due to counting year = 365.25 days, not 360)
330
+ n_sl_ref = 1.4569195613987307e-06
331
+ assert np.abs(n_sl - n_sl_ref) < 1.0e-8
332
+
333
+
334
+ if __name__ == "__main__":
335
+ unittest.main()
@@ -0,0 +1,123 @@
1
+ import os
2
+ import unittest
3
+
4
+ import numpy as np
5
+ import pandas as pd
6
+ from rubin_scheduler.data import get_data_dir
7
+
8
+ import rubin_sim.maf as maf
9
+
10
+
11
+ class TestSNmetrics(unittest.TestCase):
12
+ def setUp(self):
13
+ # Make sure we can read SN lightcurve and reference info
14
+ if not os.path.isdir(os.path.join(get_data_dir(), "maf")):
15
+ self.skipTest("Skipping SN tests because running unit tests without full rubin_scheduler.data.")
16
+ # Read test point data
17
+ testfile = os.path.join(get_data_dir(), "tests", "test_simData.hdf")
18
+ if not os.path.isfile(testfile):
19
+ raise FileExistsError("%s not found" % testfile)
20
+ self.simdata = {}
21
+ with pd.HDFStore(testfile, mode="r") as f:
22
+ keys = f.keys()
23
+ for k in keys:
24
+ newkey = k.lstrip("/")
25
+ self.simdata[newkey] = f.get(k).to_records()
26
+
27
+ def test_nsn(self):
28
+ # Set up a mock slicerPoint
29
+ nside = 64
30
+ slice_point = {"nside": nside, "ebv": 0.0}
31
+
32
+ # Set up the metric
33
+ metric = maf.SNNSNMetric(
34
+ season=[-1],
35
+ n_aft=8,
36
+ n_bef=3,
37
+ add_dust=False,
38
+ hard_dust_cut=0.25,
39
+ zmin=0.1,
40
+ zmax=0.5,
41
+ z_step=0.03,
42
+ daymax_step=3,
43
+ snr_min=1,
44
+ zlim_coeff=0.95,
45
+ sigma_c=0.04,
46
+ bands="grizy",
47
+ gamma_name="gamma_WFD.hdf5",
48
+ verbose=False,
49
+ # To match old test data
50
+ filter_col="filter",
51
+ )
52
+
53
+ # Expected keys and results
54
+ expected = {}
55
+ # Muddle with m5 - very shallow
56
+ expected["one_season_shallow"] = metric.badval
57
+ # Very few visits
58
+ expected["sparse_pointing"] = metric.badval
59
+ # Very dense pointing
60
+ expected["dense_pointing"] = np.rec.fromrecords([(5.158324, 0.276509)], names=["nSN", "zlim"])
61
+ # These are of the same point on the sky, with/without DD fields -
62
+ # they should be the same as the metric rejects DD visits internally
63
+ # ---XXX except now the metric does
64
+ # not reject visits based on notes, so not sure why these still pass
65
+
66
+ expected["one_season_noDD"] = np.rec.fromrecords([(0.870031, 0.289703)], names=["nSN", "zlim"])
67
+ expected["one_season_wDD"] = np.rec.fromrecords([(0.870031, 0.289703)], names=["nSN", "zlim"])
68
+ # Here we muddle with the visit exposure time (without changing m5)
69
+ expected["one_season_singleExp_20"] = np.rec.fromrecords([(0.879159, 0.29006)], names=["nSN", "zlim"])
70
+ # Here we muddle with the number of visits per exposure,
71
+ # without changing m5 or visitExpTime
72
+ expected["one_season_singleExp_30"] = np.rec.fromrecords(
73
+ [(0.870031, 0.289703)], names=["nSN", "zlim"]
74
+ )
75
+
76
+ verbose = True
77
+
78
+ for k in self.simdata:
79
+ res = metric.run(self.simdata[k], slice_point=slice_point)
80
+ if verbose:
81
+ print("")
82
+ print(f"pointing test {k} with {len(self.simdata[k])} visits")
83
+ try:
84
+ print(f"expected results {expected[k]}")
85
+ except KeyError:
86
+ print(f"no expected results for {k}")
87
+ print(f"calculated results {res}")
88
+ print("")
89
+ # self.assertEqual(expected[k], res)
90
+
91
+ # And run for DD observations
92
+ metric = maf.SNNSNMetric(
93
+ season=[-1],
94
+ n_aft=10,
95
+ n_bef=4,
96
+ add_dust=False,
97
+ hard_dust_cut=0.25,
98
+ zmin=0.1,
99
+ zmax=0.5,
100
+ z_step=0.03,
101
+ daymax_step=3,
102
+ snr_min=1,
103
+ zlim_coeff=0.95,
104
+ sigma_c=0.04,
105
+ bands="grizy",
106
+ gamma_name="gamma_DDF.hdf5",
107
+ coadd_night=True,
108
+ verbose=False,
109
+ # Match old test data
110
+ filter_col="filter",
111
+ )
112
+ for k in ["one_season_wDD"]:
113
+ res = metric.run(self.simdata[k], slice_point=slice_point)
114
+ if verbose:
115
+ print("")
116
+ print(f"pointing test {k} for {len(self.simdata[k])} DD-only visits")
117
+
118
+ print(f"calculated results {res}")
119
+ print("")
120
+
121
+
122
+ if __name__ == "__main__":
123
+ unittest.main()