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,375 @@
1
+ __all__ = (
2
+ "galplane_nvisits_thresholds",
3
+ "galplane_priority_map_thresholds",
4
+ "GalPlaneFootprintMetric",
5
+ "GalPlaneTimePerFilterMetric",
6
+ )
7
+
8
+ from types import MethodType
9
+
10
+ import numpy as np
11
+
12
+ from rubin_sim.maf.maps.galactic_plane_priority_maps import gp_priority_map_components_to_keys
13
+
14
+ from .base_metric import BaseMetric
15
+
16
+ # These are a suite of metrics aimed at evaluating high-level
17
+ # quantities regarding galactic plane coverage.
18
+ # The metrics here evaluate the coverage
19
+ # (just number of visits and exposure time per filter)
20
+ # in relation to the desired coverage from the galactic plane priority map.
21
+ # There is a related metric in transientTimeSampling which
22
+ # evaluates the cadence weighted by this same map.
23
+
24
+ TAU_OBS = np.array([2.0, 5.0, 11.0, 20.0, 46.5, 73.0])
25
+
26
+
27
+ def galplane_nvisits_thresholds(tau_obs, nyears=10):
28
+ """Return estimated nvisits required to well-sample lightcurves
29
+ that need sampling every tau_obs (days).
30
+
31
+ This does a very basic estimate, just counting how many visits you
32
+ would have if you distributed them at tau_obs intervals for a period
33
+ of nyears, assuming a season length of 6.5 years and that visits in
34
+ each night are in pairs.
35
+
36
+ Parameters
37
+ ----------
38
+ tau_obs : `np.ndarray` or `list` of `float`
39
+ Timescale that variability must be sampled at, in days.
40
+ nyears : `float`, opt
41
+ Number of years in the survey (as sampled). Default 10.
42
+
43
+ Returns
44
+ -------
45
+ n_visits_thresholds : `np.ndarray`
46
+ Estimated number of visits required to well sample lightcurves
47
+ which require sampling on tau_obs
48
+ """
49
+ # How many nights in the survey
50
+ nnights_total = 365.25 * nyears
51
+ # Estimate that the observing season is 6.5 months long, not a full year
52
+ # And account for the fact that each 'night' will (currently) need 2 visits
53
+ nnights = nnights_total * (6.5 / 12) * 2
54
+ n_visits_thresholds = nnights / tau_obs
55
+ return n_visits_thresholds
56
+
57
+
58
+ def galplane_priority_map_thresholds(science_map):
59
+ """Return minimum threshold for priority maps,
60
+ when considering filter balance.
61
+
62
+ Parameters
63
+ ----------
64
+ science_map : `str`
65
+ The name of the science map in the galactic plane priority map.
66
+
67
+ Returns
68
+ -------
69
+ priority_threshold : `float`
70
+ The minimum threshold to consider from the priority map
71
+ """
72
+ if science_map == "galactic_plane":
73
+ priority_threshold = 0.4
74
+ elif science_map == "combined_map":
75
+ priority_threshold = 0.001
76
+ else:
77
+ priority_threshold = 0.0
78
+ return priority_threshold
79
+
80
+
81
+ # this is a bit of a hack .. it helps us use a variety of tau_obs values,
82
+ # and dynamically set up reduce functions
83
+ def help_set_reduce_func(obj, metricval, nvisits_thresh):
84
+ def _nvisits_cut(obj, metricval):
85
+ if metricval["n_observations"] >= nvisits_thresh:
86
+ return metricval["map_priority"]
87
+ else:
88
+ return 0
89
+
90
+ return _nvisits_cut
91
+
92
+
93
+ class GalPlaneFootprintMetric(BaseMetric):
94
+ """Evaluate the survey overlap with desired regions in the
95
+ Galactic Plane and Magellanic Clouds, by referencing the
96
+ pre-computed priority maps provided.
97
+ These priority maps are keyed by science area (science_map) and per filter.
98
+ The returned metric values are summed over all filters.
99
+
100
+ Parameters
101
+ ----------
102
+ science_map : `str`
103
+ Name of the priority footprint map key to use from the column
104
+ headers contained in the priority_GalPlane_footprint_map_data tables.
105
+ tau_obs : `np.ndarray` or `list` of `float`, opt
106
+ Timescales of minimum-required observations intervals for
107
+ various classes of time variability.
108
+ Default (None), uses TAU_OBS. In general, this should be left as
109
+ the default and consistent across all galactic-plane oriented metrics.
110
+ mag_cuts : `dict` of `float`, opt
111
+ Magnitudes to use as cutoffs for individual image depths.
112
+ Default None uses a default set of values which correspond
113
+ roughly to the 50th percentile.
114
+ filter_col : `str`, opt
115
+ Name of the filter column. Default 'filter'.
116
+ m5_col : `str`, opt
117
+ Name of the five-sigma depth column. Default 'fiveSigmaDepth'.
118
+ filterlist : `list` of `str`, opt
119
+ The filters to consider from the priority map and observations.
120
+ Default None uses u, g, r, i, z, and y.
121
+ metricName : `str`, opt
122
+ Name for the metric. Default 'GalPlaneFootprintMetric_{scienceMap}
123
+ """
124
+
125
+ def __init__(
126
+ self,
127
+ science_map,
128
+ tau_obs=None,
129
+ mag_cuts=None,
130
+ filter_col="band",
131
+ m5_col="fiveSigmaDepth",
132
+ filterlist=None,
133
+ **kwargs,
134
+ ):
135
+ self.science_map = science_map
136
+ self.priority_map_threshold = galplane_priority_map_thresholds(self.science_map)
137
+ # tau_obs is an array of minimum-required observation intervals for
138
+ # four categories of time variability
139
+ if tau_obs is not None:
140
+ self.tau_obs = tau_obs
141
+ else:
142
+ self.tau_obs = TAU_OBS
143
+ self.nvisits_threshold = galplane_nvisits_thresholds(self.tau_obs)
144
+ self.filter_col = filter_col
145
+ self.m5_col = m5_col
146
+ if filterlist is not None:
147
+ self.filterlist = filterlist
148
+ else:
149
+ self.filterlist = ["u", "g", "r", "i", "z", "y"]
150
+ if mag_cuts is not None:
151
+ self.mag_cuts = mag_cuts
152
+ else:
153
+ self.mag_cuts = {
154
+ "u": 22.7,
155
+ "g": 24.1,
156
+ "r": 23.7,
157
+ "i": 23.1,
158
+ "z": 22.2,
159
+ "y": 21.4,
160
+ }
161
+ maps = ["GalacticPlanePriorityMap"]
162
+ if "metric_name" not in kwargs:
163
+ metric_name = f"GalplaneFootprintMetric_{self.science_map}"
164
+ else:
165
+ metric_name = kwargs["metric_name"]
166
+ del kwargs["metric_name"]
167
+ for tau, nvisits in zip(self.tau_obs, self.nvisits_threshold):
168
+ tau_reduce_name = f"reduce_Tau_{tau:.1f}".replace(".", "_")
169
+ rfunc = help_set_reduce_func(self, None, nvisits)
170
+ # MethodType(newmethod, self) is how this next line SHOULD go
171
+ # but that doesn't work .. the scope isn't correct somehow.
172
+ # Using this alternate string of tau_reduce_name *does* work.
173
+ setattr(self, tau_reduce_name, MethodType(rfunc, tau_reduce_name))
174
+ super().__init__(
175
+ col=[self.filter_col, self.m5_col],
176
+ metric_name=metric_name,
177
+ maps=maps,
178
+ **kwargs,
179
+ )
180
+ self.reduce_order = {"n_obs": 0, "n_obs_priority": 1}
181
+ for i, tau in enumerate(self.tau_obs):
182
+ r_name = f"Tau_{tau:.1f}".replace(".", "_")
183
+ self.reduce_order[r_name] = i + 2
184
+
185
+ def run(self, data_slice, slice_point):
186
+ """Calculate the number of observations that meet the mag_cut values
187
+ at each slice_point.
188
+
189
+ Also calculate the number of observations * the priority map summed
190
+ over all filter. Return both of these values as a dictionary.
191
+ """
192
+ # Check if we want to evaluate this part of the sky,
193
+ # or if the weight is below threshold.
194
+ mapkey = gp_priority_map_components_to_keys("sum", self.science_map)
195
+ priority = slice_point[mapkey]
196
+ if priority <= self.priority_map_threshold:
197
+ return self.badval
198
+ # Count the number of observations per filter, above the mag cuts
199
+ n_obs = 0
200
+ n_obs_priority = 0
201
+ for f in self.filterlist:
202
+ obs_in_filter = np.where(data_slice[self.filter_col] == f)
203
+ above_cut = np.where(data_slice[obs_in_filter][self.m5_col] >= self.mag_cuts[f])
204
+ n_obs += len(above_cut[0])
205
+ mapkey = gp_priority_map_components_to_keys(f, self.science_map)
206
+ n_obs_priority += len(above_cut[0]) * slice_point[mapkey]
207
+
208
+ return {
209
+ "n_observations": n_obs,
210
+ "n_obs_priority": n_obs_priority,
211
+ "map_priority": priority,
212
+ }
213
+
214
+ def reduce_n_obs(self, metricval):
215
+ return metricval["n_observations"]
216
+
217
+ def reduce_n_obs_priority(self, metricval):
218
+ return metricval["n_obs_priority"]
219
+
220
+
221
+ class GalPlaneTimePerFilterMetric(BaseMetric):
222
+ """Evaluate the fraction of exposure time spent in each filter as a
223
+ fraction of the total exposure time dedicated to that healpix in the
224
+ weighted galactic plane priority maps.
225
+
226
+ Parameters
227
+ ----------
228
+ scienceMap : `str`
229
+ Name of the priority footprint map key to use from the column
230
+ headers contained in the
231
+ priority_GalPlane_footprint_map_data tables.
232
+ magCuts : `dict` of `float`, opt
233
+ Magnitudes to use as cutoffs for individual image depths.
234
+ Default None uses a default set of values which correspond
235
+ roughly to the 50th percentile.
236
+ mjd_col : `str`, opt
237
+ Name of the observation start MJD column.
238
+ Default 'observationStartMJD'.
239
+ exp_time_col : `str`, opt
240
+ Name of the exposure time column. Default 'visitExposureTime'.
241
+ filter_col : `str`, opt
242
+ Name of the filter column. Default 'filter'.
243
+ m5_col : `str`, opt
244
+ Name of the five-sigma depth column. Default 'fiveSigmaDepth'.
245
+ filterlist : `list` of `str`, opt
246
+ The filters to consider from the priority map and observations.
247
+ Default None uses u, g, r, i, z, and y.
248
+ metricName : `str`, opt
249
+ Name for the metric. Default 'GalPlaneFootprintMetric_{scienceMap}
250
+ """
251
+
252
+ def __init__(
253
+ self,
254
+ science_map,
255
+ mag_cuts=None,
256
+ mjd_col="observationStartMJD",
257
+ exp_time_col="visitExposureTime",
258
+ filter_col="band",
259
+ m5_col="fiveSigmaDepth",
260
+ filterlist=None,
261
+ **kwargs,
262
+ ):
263
+ self.science_map = science_map
264
+ self.priority_map_threshold = galplane_priority_map_thresholds(self.science_map)
265
+ self.filter_col = filter_col
266
+ self.m5_col = m5_col
267
+ self.mjd_col = mjd_col
268
+ self.exp_time_col = exp_time_col
269
+ if filterlist is not None:
270
+ self.filterlist = filterlist
271
+ else:
272
+ self.filterlist = ["u", "g", "r", "i", "z", "y"]
273
+ if mag_cuts is not None:
274
+ self.mag_cuts = mag_cuts
275
+ else:
276
+ self.mag_cuts = {
277
+ "u": 22.7,
278
+ "g": 24.1,
279
+ "r": 23.7,
280
+ "i": 23.1,
281
+ "z": 22.2,
282
+ "y": 21.4,
283
+ }
284
+ maps = ["GalacticPlanePriorityMap"]
285
+ if "metric_name" not in kwargs:
286
+ metric_name = f"GalplaneTimePerFilter_{self.science_map}"
287
+ else:
288
+ metric_name = kwargs["metric_name"]
289
+ del kwargs["metric_name"]
290
+ super().__init__(
291
+ col=[self.filter_col, self.m5_col, self.mjd_col, self.exp_time_col],
292
+ maps=maps,
293
+ metric_name=metric_name,
294
+ **kwargs,
295
+ )
296
+ # Put the reduce functions into filter order
297
+ for i, f in enumerate(self.filterlist):
298
+ self.reduce_order[f"{f}"] = i
299
+
300
+ def run(self, data_slice, slice_point):
301
+ """Calculate the ratio of the actual on-sky exposure time per filter
302
+ compared to the ideal on-sky exposure time per filter at this point
303
+ on the sky across all filters.
304
+ """
305
+ # Check if we want to evaluate this part of the sky,
306
+ # or if the weight is below threshold.
307
+ weight_all_filters = slice_point[gp_priority_map_components_to_keys("sum", self.science_map)]
308
+ if weight_all_filters <= self.priority_map_threshold:
309
+ return self.badval
310
+
311
+ # Calculate the ideal weighting per filter compared to all
312
+ # filters at this point in the sky
313
+ relative_filter_weight = {}
314
+ for f in self.filterlist:
315
+ mapkey = gp_priority_map_components_to_keys(f, self.science_map)
316
+ relative_filter_weight[f] = slice_point[mapkey] / weight_all_filters
317
+
318
+ exp_time_per_filter = {}
319
+ for f in self.filterlist:
320
+ # Select observations within the OpSim for the current filter
321
+ # which match the S/N requirement, and extract the exposure times
322
+ # for those observations
323
+ idx1 = np.where(data_slice[self.filter_col] == f)[0]
324
+ idx2 = np.where(data_slice[self.m5_col] >= self.mag_cuts[f])[0]
325
+ match = list(set(idx1).intersection(set(idx2)))
326
+
327
+ # Now calculate the actual fraction of exposure time spent
328
+ # in this filter for the current slice_point, relative to the total
329
+ # exposure time spent on this slice_point.
330
+ # Note that this includes dithered observations.
331
+ # If no exposures are expected in this filter, this returns 1
332
+ # on the principle that 100% of the expected observations are
333
+ # provided, and additional data in other filters is usually welcome
334
+ exp_time_per_filter[f] = data_slice[self.exp_time_col][match].sum()
335
+
336
+ # Calculate the time on-sky in each filter that overlaps this point,
337
+ # and meets mag_cuts
338
+ total_expt_mag_cut = 0
339
+ for f in self.filterlist:
340
+ total_expt_mag_cut += exp_time_per_filter[f].sum()
341
+
342
+ # normalize by the relative filter weight.
343
+ # Ideally metric results are close to 1.
344
+ normalized_exp_time = {}
345
+ for f in self.filterlist:
346
+ if total_expt_mag_cut == 0:
347
+ normalized_exp_time[f] = 0
348
+ else:
349
+ # If no exposures are expected in this filter for this
350
+ # location, metric returns the mask val for this filter only.
351
+ if relative_filter_weight[f] > 0:
352
+ normalized_exp_time[f] = (
353
+ exp_time_per_filter[f] / total_expt_mag_cut / relative_filter_weight[f]
354
+ )
355
+ else:
356
+ normalized_exp_time[f] = self.badval
357
+ return normalized_exp_time
358
+
359
+ def reduce_u(self, metricval):
360
+ return metricval["u"]
361
+
362
+ def reduce_g(self, metricval):
363
+ return metricval["g"]
364
+
365
+ def reduce_r(self, metricval):
366
+ return metricval["r"]
367
+
368
+ def reduce_i(self, metricval):
369
+ return metricval["i"]
370
+
371
+ def reduce_z(self, metricval):
372
+ return metricval["z"]
373
+
374
+ def reduce_y(self, metricval):
375
+ return metricval["y"]
@@ -0,0 +1,236 @@
1
+ ###################################################################
2
+ # Metric to evaluate the transientTimeSamplingMetric
3
+ #
4
+ # Author - Rachel Street: rstreet@lco.global
5
+ ###################################################################
6
+ __all__ = (
7
+ "calc_interval_decay",
8
+ "GalPlaneVisitIntervalsTimescaleMetric",
9
+ "GalPlaneSeasonGapsTimescaleMetric",
10
+ )
11
+
12
+ from types import MethodType
13
+
14
+ import numpy as np
15
+ from rubin_scheduler.utils import calc_season
16
+
17
+ from rubin_sim.maf.maps.galactic_plane_priority_maps import gp_priority_map_components_to_keys
18
+
19
+ from .base_metric import BaseMetric
20
+ from .galactic_plane_metrics import galplane_priority_map_thresholds
21
+ from .season_metrics import find_season_edges
22
+
23
+ TAU_OBS = np.array([2.0, 5.0, 11.0, 20.0, 46.5, 73.0])
24
+
25
+
26
+ def calc_interval_decay(delta_tobs, tau):
27
+ # Decay constant for metric value relationship as function of obs interval
28
+ K = 1.0 / tau
29
+ m = np.exp(-K * (delta_tobs - tau))
30
+ # But where observation interval is <= tau, replace with 1
31
+ m[np.where(delta_tobs <= tau)] = 1.0
32
+ return m
33
+
34
+
35
+ # this is a bit of a hack .. it helps us use a variety of tau_obs values,
36
+ # and dynamically set up reduce functions
37
+ def help_set_reduce_func(obj, metricval, tau):
38
+ def _reduce_tau(obj, metricval):
39
+ return metricval[tau]
40
+
41
+ return _reduce_tau
42
+
43
+
44
+ class GalPlaneVisitIntervalsTimescaleMetric(BaseMetric):
45
+ """Evaluate the intervals between sequential observations in a
46
+ lightcurve relative to the scientifically desired sampling interval.
47
+
48
+ Parameters
49
+ ----------
50
+ science_map : `str`
51
+ Name of the priority footprint map key to use from the column
52
+ headers contained in the priority_GalPlane_footprint_map_data tables.
53
+ tau_obs : `np.ndarray` or `list` of `float`, opt
54
+ Timescales of minimum-required observations intervals for various
55
+ classes of time variability.
56
+ Default (None), uses TAU_OBS. In general, this should be left as the
57
+ default and consistent across all galactic-plane oriented metrics.
58
+ mag_limit : `float`, opt
59
+ Magnitude limit to use as a cutoff for various observations.
60
+ Default 22.0.
61
+ mjd_col : `str`, opt
62
+ The name of the observation start MJD column.
63
+ Default 'observationStartMJD'.
64
+ m5_col : `str', opt
65
+ The name of the five sigma depth column. Default 'fiveSigmaDepth'.
66
+ """
67
+
68
+ def __init__(
69
+ self,
70
+ science_map,
71
+ tau_obs=None,
72
+ mag_limit=22.0,
73
+ mjd_col="observationStartMJD",
74
+ m5_col="fiveSigmaDepth",
75
+ **kwargs,
76
+ ):
77
+ self.science_map = science_map
78
+ self.priority_map_threshold = galplane_priority_map_thresholds(self.science_map)
79
+ # tau_obs is an array of minimum-required observation intervals for
80
+ # four categories of time variability
81
+ if tau_obs is not None:
82
+ self.tau_obs = tau_obs
83
+ else:
84
+ self.tau_obs = TAU_OBS
85
+ # Create reduce functions for the class that are return the metric
86
+ # for each value in tau_obs
87
+
88
+ self.mag_limit = mag_limit
89
+ self.mjd_col = mjd_col
90
+ self.m5_col = m5_col
91
+ maps = ["GalacticPlanePriorityMap"]
92
+ if "metric_name" not in kwargs:
93
+ metric_name = f"GalPlaneVisitIntervalsTimescales_{self.science_map}"
94
+ else:
95
+ metric_name = kwargs["metric_name"]
96
+ del kwargs["metric_name"]
97
+ for tau in self.tau_obs:
98
+ tau_reduce_name = f"reduce_Tau_{tau:.1f}".replace(".", "_")
99
+ newmethod = help_set_reduce_func(self, None, tau)
100
+ setattr(self, tau_reduce_name, MethodType(newmethod, tau_reduce_name))
101
+ super().__init__(
102
+ col=[self.mjd_col, self.m5_col],
103
+ metric_name=metric_name,
104
+ maps=maps,
105
+ **kwargs,
106
+ )
107
+ for i, tau in enumerate(self.tau_obs):
108
+ self.reduce_order[f"reduceTau_{tau:.1f}".replace(".", "_").replace("reduce", "")] = i
109
+
110
+ def run(self, data_slice, slice_point=None):
111
+ # Check if we want to evaluate this part of the sky,
112
+ # or if the weight is below threshold.
113
+ if (
114
+ slice_point[gp_priority_map_components_to_keys("sum", self.science_map)]
115
+ <= self.priority_map_threshold
116
+ ):
117
+ return self.badval
118
+ # Select observations in the time sequence that fulfill the
119
+ # S/N requirements:
120
+ match = np.where(data_slice[self.m5_col] >= self.mag_limit)[0]
121
+ # We need at least two visits which match these requirements
122
+ # to calculate visit gaps
123
+ if len(match) < 2:
124
+ return self.badval
125
+ # Find the time gaps between visits (in any filter)
126
+ times = data_slice[self.mjd_col][match]
127
+ times.sort()
128
+ delta_tobs = np.diff(times)
129
+ # Compare the time gap distribution to the time gap required
130
+ # to characterize variability
131
+ metric_data = {}
132
+ for tau in self.tau_obs:
133
+ # Normalize
134
+ metric_data[tau] = calc_interval_decay(delta_tobs, tau).sum() / len(delta_tobs)
135
+ return metric_data
136
+
137
+
138
+ class GalPlaneSeasonGapsTimescaleMetric(BaseMetric):
139
+ """Evaluate the gap between sequential seasonal gaps in
140
+ observations in a lightcurve relative to the scientifically desired
141
+ sampling interval.
142
+
143
+ Parameters
144
+ ----------
145
+ science_map : `str`
146
+ Name of the priority footprint map key to use from the column
147
+ headers contained in the
148
+ priority_GalPlane_footprint_map_data tables.
149
+ tau_var : `np.ndarray` or `list` of `float`, opt
150
+ Timescales of variability for various classes of time variability.
151
+ Default (None), uses TAU_OBS * 5. In general, this should be left
152
+ as the default and consistent
153
+ across all galactic-plane oriented metrics.
154
+ mag_limit : `float`, opt
155
+ Magnitude limit to use as a cutoff for various observations.
156
+ Default 22.0.
157
+ expected_season_gap : `float`, opt
158
+ The typical season gap expected for a galactic plane field in days.
159
+ The default, 145 days, is typical for a bulge field.
160
+ mjd_col : `str`, opt
161
+ The name of the observation start MJD column.
162
+ Default 'observationStartMJD'.
163
+ m5_col : `str', opt
164
+ The name of the five sigma depth column. Default 'fiveSigmaDepth'.
165
+ """
166
+
167
+ def __init__(
168
+ self,
169
+ science_map,
170
+ tau_var=None,
171
+ mag_limit=22.0,
172
+ expected_season_gap=145,
173
+ mjd_col="observationStartMJD",
174
+ m5_col="fiveSigmaDepth",
175
+ **kwargs,
176
+ ):
177
+ self.science_map = science_map
178
+ self.priority_map_threshold = galplane_priority_map_thresholds(self.science_map)
179
+ # tau_obs is an array of minimum-required observation intervals for
180
+ # four categories of time variability; tau_var is the related timescale
181
+ # for the variability (tau_var is approximately 5*tau_obs, in general)
182
+ if tau_var is not None:
183
+ self.tau_var = tau_var
184
+ else:
185
+ self.tau_var = TAU_OBS * 5
186
+ # NOTE: I would recommend dropping tau_var 10 and 25 from this
187
+ # analysis unless the metric is changed
188
+ # these intervals are so short they will *always* be dropped
189
+ # during the season gap
190
+ self.mag_limit = mag_limit
191
+ self.expected_season_gap = expected_season_gap
192
+ self.mjd_col = mjd_col
193
+ self.m5_col = m5_col
194
+ if "metric_name" not in kwargs:
195
+ metric_name = f"GalPlaneSeasonGapsTimescales_{self.science_map}"
196
+ else:
197
+ metric_name = kwargs["metric_name"]
198
+ del kwargs["metric_name"]
199
+ for tau in self.tau_var:
200
+ tau_reduce_name = f"reduce_Tau_{tau:.1f}".replace(".", "_")
201
+ newmethod = help_set_reduce_func(self, None, tau)
202
+ setattr(self, tau_reduce_name, MethodType(newmethod, tau_reduce_name))
203
+ super().__init__(col=[self.mjd_col, self.m5_col], metric_name=metric_name, **kwargs)
204
+ for i, tau in enumerate(self.tau_var):
205
+ self.reduce_order[f"reduce_Tau_{tau:.1f}".replace(".", "_").replace("reduce", "")] = i
206
+
207
+ def run(self, data_slice, slice_point):
208
+ # Check if we want to evaluate this part of the sky,
209
+ # or if the weight is below threshold.
210
+ if (
211
+ slice_point[gp_priority_map_components_to_keys("sum", self.science_map)]
212
+ <= self.priority_map_threshold
213
+ ):
214
+ return self.badval
215
+ # Find the length of the gaps between each season
216
+ times = data_slice[self.mjd_col]
217
+ times.sort()
218
+ # data = np.sort(data_slice[self.mjd_col], order=self.mjd_col)
219
+ # SlicePoints ra/dec are always in radians -
220
+ # convert to degrees to calculate season
221
+ seasons = calc_season(np.degrees(slice_point["ra"]), times)
222
+ first_of_season, last_of_season = find_season_edges(seasons)
223
+ # season_lengths = times[last_of_season] - times[first_of_season]
224
+ # would this match interval calc better?
225
+ season_gaps = times[first_of_season][1:] - times[last_of_season][:-1]
226
+ if len(season_gaps) == 0:
227
+ return self.badval
228
+ metric_data = {}
229
+ for i, tau in enumerate(self.tau_var):
230
+ metric_data[tau] = calc_interval_decay(season_gaps, tau)
231
+ # if the season gap is shorter than the expected season gap,
232
+ # count this as 'good'
233
+ good_season_gaps = np.where(season_gaps <= self.expected_season_gap)
234
+ metric_data[tau][good_season_gaps] = 1
235
+ metric_data[tau] = metric_data[tau].sum() / len(season_gaps)
236
+ return metric_data