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,523 @@
1
+ __all__ = ("XrbLc", "XRBPopMetric", "generate_xrb_pop_slicer")
2
+
3
+ import numpy as np
4
+ from rubin_scheduler.data import get_data_dir
5
+ from rubin_scheduler.utils import SURVEY_START_MJD
6
+ from scipy.stats import loguniform
7
+
8
+ from rubin_sim.maf.utils import m52snr
9
+ from rubin_sim.phot_utils import DustValues
10
+
11
+ from ..metrics import BaseMetric
12
+ from ..slicers import UserPointsSlicer
13
+
14
+
15
+ class XrbLc:
16
+ """Synthesize XRB outburst lightcurves."""
17
+
18
+ def __init__(self, seed=42):
19
+ dust_properties = DustValues()
20
+ self.ax1 = dust_properties.ax1
21
+
22
+ self.rng = np.random.default_rng(seed)
23
+
24
+ def lmxb_abs_mags(self, size=1):
25
+ """Return LMXB absolute magnitudes per LSST filter.
26
+
27
+ Absolute magnitude relation is taken from Casares 2018
28
+ (2018MNRAS.473.5195C)
29
+ Colors are taken from M. Johnson+ 2019
30
+ (2019MNRAS.484...19J)
31
+
32
+ Parameters
33
+ ----------
34
+ size : `int`
35
+ Number of samples to generate.
36
+
37
+ Returns
38
+ -------
39
+ abs_mags : `list` [`dict`]
40
+ Absolute magnitudes for each LSST filter.
41
+ Porbs: `array` [`float`]
42
+ Randomized orbital periods in days
43
+ """
44
+
45
+ # Derive random orbital periods from the sample in Casares 18 Table 4
46
+ # Since there are significant outliers from a single Gaussian sample,
47
+ # take random choices with replacement, then perturb them fractionally
48
+ catalog__porb = np.array(
49
+ [
50
+ 33.85,
51
+ 6.4713,
52
+ 2.5445,
53
+ 1.7557,
54
+ 1.5420,
55
+ 0.5213,
56
+ 0.4326,
57
+ 0.3441,
58
+ 0.3230,
59
+ 0.3205,
60
+ 0.2852,
61
+ 0.2740,
62
+ 0.2122,
63
+ 0.1699,
64
+ 0.1352,
65
+ 0.117,
66
+ 0.1006,
67
+ ]
68
+ )
69
+
70
+ sample__porbs = self.rng.choice(catalog__porb, size=size)
71
+ sample__porbs *= self.rng.uniform(low=0.5, high=1.5, size=size)
72
+
73
+ # lmxb_abs_mag_r = 4.6 # johnson+18
74
+ # Casares 18
75
+ lmxb_abs_mags_r = 4.64 - 3.69 * np.log10(sample__porbs)
76
+
77
+ return [
78
+ {
79
+ "u": lmxb_abs_mag_r + 4.14,
80
+ "g": lmxb_abs_mag_r + 3.24,
81
+ "r": lmxb_abs_mag_r,
82
+ "i": lmxb_abs_mag_r + 0.33,
83
+ "z": lmxb_abs_mag_r + 1.05,
84
+ "y": lmxb_abs_mag_r + 2.36,
85
+ }
86
+ for lmxb_abs_mag_r in lmxb_abs_mags_r
87
+ ], sample__porbs
88
+
89
+ def outburst_params(self, size=1):
90
+ """Return a parameters at random characterizing the outburst.
91
+
92
+ Uses distributions from Chen, Shrader, & Livio 1997 (ApJ 491, 312).
93
+
94
+ Returns
95
+ -------
96
+ params : `list` [`dict`]
97
+ Rise, decay, and amplitude parameters.
98
+ """
99
+
100
+ # rise timescale (Fig. 11): 50% 1-2 day lognormal,
101
+ # 50% loguniform 0.5-50 days
102
+
103
+ flip = self.rng.uniform(size=size)
104
+ w = flip > 0.5
105
+ tau_rise = np.zeros(size) * np.nan
106
+ tau_rise[w] = loguniform.rvs(0.5, 50, size=np.sum(w))
107
+ tau_rise[~w] = self.rng.lognormal(0, 0.2, size=np.sum(~w)) + 0.3
108
+
109
+ # amplitude = rng.lognormal(9,1,size=1)[0]
110
+ # delta_mag = -2.5 * np.log10(amplitude)
111
+ # The Chen+ 10**4 X-ray flux amplitudes imply -10 optical delta mags,
112
+ # which are generally larger than observed.
113
+ # We'll use a fixed -6 delta mag for simplicity
114
+ delta_mag = -6
115
+ amplitude = 10 ** (-0.4 * delta_mag) * np.ones(size)
116
+
117
+ tau_decay = self.rng.lognormal(2.9, 0.65, size=size)
118
+
119
+ duration = (tau_rise + tau_decay) + np.log(amplitude)
120
+
121
+ abs_mags, porbs = self.lmxb_abs_mags(size=size)
122
+
123
+ return [
124
+ {
125
+ "tau_rise": tr,
126
+ "tau_decay": td,
127
+ "amplitude": amp,
128
+ "outburst_duration": dur,
129
+ "abs_mag": abs_mag,
130
+ "orbital_period": Porb,
131
+ }
132
+ for (tr, td, amp, dur, abs_mag, Porb) in zip(
133
+ tau_rise, tau_decay, amplitude, duration, abs_mags, porbs
134
+ )
135
+ ]
136
+
137
+ def fred(self, t, amplitude, tau_rise, tau_decay):
138
+ """Fast-rise, exponential decay function.
139
+
140
+ Amplitude is defined at the peak time = sqrt(tau_rise*tau_decay).
141
+
142
+ See e.g., Tarnopolski 2021 for discussion.
143
+
144
+ Parameters
145
+ ----------
146
+ t : `array` [`float`]
147
+ The times relative to the start of the outburst
148
+ amplitude : `float`
149
+ Peak amplitude
150
+ tau_rise : `float`
151
+ E-folding time for the rise
152
+ tau_decay : `float`
153
+ E-folding time for the decay
154
+ """
155
+ return amplitude * np.exp(2 * np.sqrt(tau_rise / tau_decay)) * np.exp(-tau_rise / t - t / tau_decay)
156
+
157
+ def lightcurve(self, t, filtername, params):
158
+ """Generate an XRB outburst lightcurve for given times
159
+ and a single filter.
160
+
161
+ Uses a simple fast-rise, exponential decay with parameters taken from
162
+ Chen, Shrader, & Livio 1997 (ApJ 491, 312).
163
+
164
+ For now we ignore the late time linear decay (Tetarenko+2018a,b, and
165
+ references therein.)
166
+
167
+ Parameters
168
+ ----------
169
+ t : `array` [`float`]
170
+ The times relative to the start of the outburst
171
+ filtername : `str`
172
+ The filter. one of ugrizy
173
+ params : `dict`
174
+ parameters for the FRED lightcurve.
175
+
176
+ Returns
177
+ -------
178
+ lc : `array`
179
+ Magnitudes of the outburst at the specified times in
180
+ the given filter
181
+ """
182
+
183
+ # fill lightcurve with nondetections
184
+ lc = np.ones(len(t)) * 99
185
+
186
+ # FRED
187
+ woutburst = (t >= 0) & (t <= params["outburst_duration"])
188
+ if np.sum(woutburst):
189
+ lc[woutburst] = params["abs_mag"][filtername] + -2.5 * np.log10(
190
+ self.fred(
191
+ t[woutburst],
192
+ params["amplitude"],
193
+ params["tau_rise"],
194
+ params["tau_decay"],
195
+ )
196
+ )
197
+
198
+ return lc
199
+
200
+ def detectable_duration(self, params, ebv, distance):
201
+ """Determine time range an outburst is detectable with
202
+ perfect sampling.
203
+
204
+ Does not consider visibility constraints.
205
+
206
+ Parameters
207
+ ----------
208
+ params : `dict`
209
+ lightcurve parameters for XrbLc
210
+ ebv : `float`
211
+ E(B-V)
212
+ distance : `float`
213
+ distance in kpc
214
+
215
+ Returns
216
+ ----------
217
+ visible_start_time : `float`
218
+ first time relative to outburst start that the outburst
219
+ could be detected
220
+ visible_end_time : `float`
221
+ last time relative to outburst start that the outburst
222
+ could be detected
223
+ """
224
+
225
+ nmodelt = 10000
226
+ t = np.linspace(0, params["outburst_duration"], nmodelt)
227
+
228
+ lsst_single_epoch_depth = {
229
+ "u": 23.9,
230
+ "g": 25.0,
231
+ "r": 24.7,
232
+ "i": 24.0,
233
+ "z": 23.3,
234
+ "y": 22.1,
235
+ }
236
+
237
+ visible_start_time = np.inf
238
+ visible_end_time = -np.inf
239
+
240
+ for filtername in ["u", "g", "r", "i", "z", "y"]:
241
+ mags = self.lightcurve(t, filtername, params)
242
+
243
+ # Apply dust extinction on the light curve
244
+ a_x = self.ax1[filtername] * ebv
245
+ mags += a_x
246
+ distmod = 5 * np.log10(distance * 1.0e3) - 5.0
247
+ mags += distmod
248
+
249
+ wdetectable = np.where(mags <= lsst_single_epoch_depth[filtername])[0]
250
+ if len(wdetectable) == 0:
251
+ continue
252
+
253
+ if t[wdetectable[0]] < visible_start_time:
254
+ visible_start_time = t[wdetectable[0]]
255
+
256
+ if t[wdetectable[-1]] >= visible_end_time:
257
+ visible_end_time = t[wdetectable[-1]]
258
+
259
+ if np.isinf(visible_start_time):
260
+ return np.nan, np.nan
261
+
262
+ return visible_start_time, visible_end_time
263
+
264
+
265
+ class XRBPopMetric(BaseMetric):
266
+ """Evaluate whether a given XRB would be detectable.
267
+
268
+ Includes a variety of detection criteria options, including if the
269
+ XRB is possible to detect, if it is detected at least pts_needed times,
270
+ or if it is detected pts_early times within t_early days of the start of
271
+ the outburst.
272
+
273
+ Parameters
274
+ ----------
275
+ pts_needed : `int`, opt
276
+ Minimum number of detections, for simple `detected` option.
277
+ mjd0 : `float`, opt
278
+ Start of survey.
279
+ output_lc : `bool`, opt
280
+ If True, output lightcurve points.
281
+ If False, just return metric values.
282
+ """
283
+
284
+ def __init__(
285
+ self,
286
+ metric_name="XRBPopMetric",
287
+ mjd_col="observationStartMJD",
288
+ m5_col="fiveSigmaDepth",
289
+ filter_col="band",
290
+ night_col="night",
291
+ pts_needed=2,
292
+ pts_early=2,
293
+ t_early=7,
294
+ mjd0=SURVEY_START_MJD,
295
+ output_lc=False,
296
+ badval=-666,
297
+ **kwargs,
298
+ ):
299
+ # maps = ["DustMap"]
300
+ self.mjd_col = mjd_col
301
+ self.m5_col = m5_col
302
+ self.filter_col = filter_col
303
+ self.night_col = night_col
304
+ self.pts_needed = pts_needed
305
+ self.pts_early = pts_early
306
+ self.t_early = t_early
307
+ # `bool` variable, if True the light curve will be exported
308
+ self.output_lc = output_lc
309
+
310
+ self.lightcurves = XrbLc()
311
+ self.mjd0 = mjd0
312
+
313
+ dust_properties = DustValues()
314
+ self.ax1 = dust_properties.ax1
315
+
316
+ cols = [self.mjd_col, self.m5_col, self.filter_col, self.night_col]
317
+ super(XRBPopMetric, self).__init__(
318
+ col=cols,
319
+ units="Detected, 0 or 1",
320
+ metric_name=metric_name,
321
+ # maps=maps,
322
+ badval=badval,
323
+ **kwargs,
324
+ )
325
+ self.comment = "Number or characterization of XRBs."
326
+
327
+ def _ever_detect(self, where_detected):
328
+ """Simple detection criteria: detect at least a certain number
329
+ of times.
330
+ """
331
+ # Detected data points
332
+ return np.size(where_detected) >= self.pts_needed
333
+
334
+ def _number_of_detections(self, where_detected):
335
+ """Count total number of detections."""
336
+ return len(where_detected)
337
+
338
+ def _early_detect(self, where_detected, time, early_window_days=7.0, n_early_detections=2):
339
+ """Detection near the start of the outburst.
340
+
341
+ Parameters
342
+ ----------
343
+ where_detected : `array`
344
+ indexes corresponding to 5 sigma detections
345
+ mags : `array`
346
+ magnitudes obtained interpolating models on the data_slice
347
+ time : `array`
348
+ relative times
349
+ early_window_days : `float`
350
+ time since start of outburst
351
+ n_early_detections : `int`
352
+ number of required early detections
353
+ """
354
+
355
+ return np.sum(time[where_detected] <= early_window_days) >= n_early_detections
356
+
357
+ def _mean_time_between_detections(self, t):
358
+ """Calculate the mean time between detections over the
359
+ visible interval.
360
+
361
+ Parameters
362
+ ----------
363
+ t : `array`
364
+ Times of detections, bracketed by the start and
365
+ end visibility times
366
+
367
+ Return
368
+ ----------
369
+ med_dt : `float`
370
+ separation between observations.
371
+ """
372
+
373
+ return np.mean(np.sort(np.diff(t)))
374
+
375
+ def _possible_to_detect(self, visible_duration):
376
+ """Return True if the outburst is ever bright enough
377
+ for LSST to detect.
378
+
379
+ Parameters
380
+ ----------
381
+ visible_duration : `float`
382
+ Length of time the outburst is above LSST's fiducial limiting mag.
383
+ May be nan.
384
+
385
+ Return
386
+ ----------
387
+ detectable : `bool`
388
+ Return True if outburst is ever detectable by LSST.
389
+ """
390
+
391
+ return ~np.isnan(visible_duration)
392
+
393
+ def run(self, data_slice, slice_point=None):
394
+ result = {}
395
+ t = data_slice[self.mjd_col] - self.mjd0 - slice_point["start_time"]
396
+ mags = np.zeros(t.size, dtype=float)
397
+
398
+ for filtername in np.unique(data_slice[self.filter_col]):
399
+ infilt = np.where(data_slice[self.filter_col] == filtername)
400
+ mags[infilt] = self.lightcurves.lightcurve(t[infilt], filtername, slice_point["outburst_params"])
401
+ # Apply dust extinction on the light curve
402
+ a_x = self.ax1[filtername] * slice_point["ebv"]
403
+ mags[infilt] += a_x
404
+
405
+ distmod = 5 * np.log10(slice_point["distance"] * 1.0e3) - 5.0
406
+ mags[infilt] += distmod
407
+
408
+ # Find the detected points
409
+ where_detected = np.where((mags < data_slice[self.m5_col]))[0]
410
+ # Magnitude uncertainties with Gaussian approximation
411
+ snr = m52snr(mags, data_slice[self.m5_col])
412
+ mags_unc = 2.5 * np.log10(1.0 + 1.0 / snr)
413
+
414
+ result["possible_to_detect"] = self._possible_to_detect(slice_point["visible_duration"])
415
+ result["ever_detect"] = self._ever_detect(where_detected)
416
+ result["early_detect"] = self._early_detect(where_detected, t, self.t_early, self.pts_early)
417
+ result["number_of_detections"] = self._number_of_detections(where_detected)
418
+
419
+ if result["number_of_detections"] > 1:
420
+ result["mean_time_between_detections"] = self._mean_time_between_detections(
421
+ [
422
+ slice_point["visible_start_time"],
423
+ *t[where_detected].tolist(),
424
+ slice_point["visible_end_time"],
425
+ ]
426
+ )
427
+ else:
428
+ result["mean_time_between_detections"] = -999
429
+
430
+ # Export the light curve
431
+ if self.output_lc is True:
432
+ wdet = mags < data_slice[self.m5_col]
433
+ mags[~wdet] = 99.0
434
+ result["lc"] = [
435
+ data_slice[self.mjd_col],
436
+ mags,
437
+ mags_unc,
438
+ data_slice[self.m5_col],
439
+ data_slice[self.filter_col],
440
+ ]
441
+ result["lc_colnames"] = ("t", "mag", "mag_unc", "maglim", "filter")
442
+
443
+ return result
444
+
445
+ def reduce_possible_to_detect(self, metric):
446
+ return metric["possible_to_detect"]
447
+
448
+ def reduce_ever_detect(self, metric):
449
+ return metric["ever_detect"]
450
+
451
+ def reduce_early_detect(self, metric):
452
+ return metric["early_detect"]
453
+
454
+ def reduce_number_of_detections(self, metric):
455
+ return metric["number_of_detections"]
456
+
457
+ def reduce_mean_time_between_detections(self, metric):
458
+ tt = metric["mean_time_between_detections"]
459
+ if tt < 0:
460
+ return self.badval
461
+ else:
462
+ return tt
463
+
464
+
465
+ def generate_xrb_pop_slicer(t_start=1, t_end=3652, n_events=10000, seed=42):
466
+ """Generate a population of XRB events, and put the info about them
467
+ into a UserPointSlicer object.
468
+
469
+ Parameters
470
+ ----------
471
+ t_start : `float`
472
+ The night to start an XRB outburst on (days; default 1)
473
+ t_end : `float`
474
+ The final night of XRBs events (days; default 3652)
475
+ n_events : `int`
476
+ The number of XRB outbursts to generate (default 10000)
477
+ seed : `float`
478
+ The seed passed to np.random (default 42)
479
+ """
480
+
481
+ rng = np.random.default_rng(seed)
482
+
483
+ datadir = get_data_dir()
484
+ xrb_sample = np.genfromtxt(datadir + "/maf/xrb/sample_xrb_positions.csv.gz", delimiter=",")
485
+
486
+ nsamples, nfields = xrb_sample.shape
487
+
488
+ xrb_lc_gen = XrbLc()
489
+
490
+ # select a random subsample
491
+ event_idxs = rng.choice(np.arange(nsamples), size=n_events, replace=True)
492
+ ra = xrb_sample[event_idxs, 0]
493
+ dec = xrb_sample[event_idxs, 1]
494
+ distance_kpc = xrb_sample[event_idxs, 2]
495
+ ebv = xrb_sample[event_idxs, 3]
496
+
497
+ start_times = rng.uniform(low=t_start, high=t_end, size=n_events)
498
+
499
+ # Set up the slicer to evaluate the catalog we just made
500
+ slicer = UserPointsSlicer(ra, dec, lat_lon_deg=True, badval=0)
501
+ # Add any additional information about each object to the slicer
502
+ slicer.slice_points["start_time"] = start_times
503
+ slicer.slice_points["distance"] = distance_kpc
504
+ # use our own 3-d dust map extinctions
505
+ slicer.slice_points["ebv"] = ebv
506
+ # generate random parameters for this event
507
+ slicer.slice_points["outburst_params"] = xrb_lc_gen.outburst_params(size=n_events)
508
+
509
+ # determine detectable durations
510
+ visible_starts = []
511
+ visible_ends = []
512
+ visible_durations = []
513
+ for idx, param in enumerate(slicer.slice_points["outburst_params"]):
514
+ start, end = xrb_lc_gen.detectable_duration(param, ebv[idx], distance_kpc[idx])
515
+ visible_starts.append(start)
516
+ visible_ends.append(end)
517
+ visible_durations.append(end - start)
518
+
519
+ slicer.slice_points["visible_start_time"] = visible_starts
520
+ slicer.slice_points["visible_end_time"] = visible_ends
521
+ slicer.slice_points["visible_duration"] = visible_durations
522
+
523
+ return slicer