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,388 @@
1
+ __all__ = (
2
+ "generate_known_lv_dwarf_slicer",
3
+ "make__fake_old_galaxy_lf",
4
+ "make_dwarf_lf_dicts",
5
+ "LVDwarfsMetric",
6
+ )
7
+
8
+ import os
9
+
10
+ import astropy.units as u
11
+ import numpy as np
12
+ from astropy.coordinates import SkyCoord
13
+ from astropy.io import ascii, fits
14
+ from rubin_scheduler.data import get_data_dir
15
+
16
+ from rubin_sim.maf.maf_contrib.lss_obs_strategy import GalaxyCountsMetricExtended
17
+ from rubin_sim.maf.metrics.base_metric import BaseMetric
18
+ from rubin_sim.maf.metrics.exgal_m5 import ExgalM5
19
+ from rubin_sim.maf.metrics.star_density import StarDensityMetric
20
+ from rubin_sim.maf.slicers import UserPointsSlicer
21
+
22
+
23
+ def generate_known_lv_dwarf_slicer():
24
+ """Read the Karachentsev+ catalog of nearby galaxies,
25
+ and put the info about them into a UserPointSlicer object.
26
+ """
27
+ filename = os.path.join(get_data_dir(), "maf/lvdwarfs", "lsst_galaxies_1p25to9Mpc_table.fits")
28
+ lv_dat0 = fits.getdata(filename)
29
+
30
+ # Keep only galaxies at dec < 35 deg.,
31
+ # and with stellar masses > 10^7 M_Sun (and <1e14).
32
+ lv_dat_cuts = (lv_dat0["dec"] < 35.0) & (lv_dat0["MStars"] > 1e7) & (lv_dat0["MStars"] < 1e14)
33
+ lv_dat = lv_dat0[lv_dat_cuts]
34
+
35
+ # Set up the slicer to evaluate the catalog we just made
36
+ slicer = UserPointsSlicer(lv_dat["ra"], lv_dat["dec"], lat_lon_deg=True, badval=-666)
37
+ # Add any additional information about each object to the slicer
38
+ slicer.slice_points["distance"] = lv_dat["dist_Mpc"]
39
+
40
+ return slicer
41
+
42
+
43
+ # make a simulated LF for old galaxy of given integrated B,
44
+ # distance modulus mu, in any of filters ugrizY
45
+ def make__fake_old_galaxy_lf(int_b, mu, filtername):
46
+ """
47
+ Make a simulated luminosity function for an old (10 Gyr) dwarf
48
+ galaxy of given integrated B magnitude, at a given distance modulus,
49
+ in any of the filters ugrizy.
50
+
51
+ Parameters
52
+ ----------
53
+ int_b : `float`
54
+ Integrated B-band magnitude of the dwarf to simulate.
55
+ mu : `float`
56
+ Distance modulus at which to place the simulated dwarf.
57
+ filternams: `str`
58
+ Filter in which to produce the simulated luminosity function.
59
+ """
60
+ if filtername == "y":
61
+ filtername == "Y"
62
+ model_bmag = 6.856379 # integrated B mag of the model LF being read
63
+ # Read a simulated luminosity function of [M/H]=-1.5, 10 Gyr stellar
64
+ # population:
65
+ filename = os.path.join(get_data_dir(), "maf/lvdwarfs", "LF_-1.5_10Gyr.dat")
66
+ LF = ascii.read(filename, header_start=12)
67
+ mags = LF["magbinc"]
68
+ counts = LF[filtername + "mag"]
69
+ # shift model LF to requested distance and dim it
70
+ mags = mags + mu
71
+ model_bmag = model_bmag + mu
72
+ # scale model counts up/down to reach the requested int_b
73
+ factor = np.power(10.0, -0.4 * (int_b - model_bmag))
74
+ counts = factor * counts
75
+ return mags, counts
76
+
77
+
78
+ def make_dwarf_lf_dicts():
79
+ """
80
+ Create dicts containing g- and i-band LFs for simulated dwarfs between
81
+ -10 < M_B < +3, so they can simply be looked up rather than having to
82
+ recreate them each time. Dict is keyed on M_B value.
83
+ """
84
+ lf_dict_i = {}
85
+ lf_dict_g = {}
86
+ # Simulate a range from M_B=-10 to M_B=+5 in 0.1-mag increments.
87
+ tmp_mb = -10.0
88
+
89
+ for i in range(151):
90
+ mbkey = f"MB{tmp_mb:.2f}"
91
+ i_l_fmags, i_l_fcounts = make__fake_old_galaxy_lf(tmp_mb, 0.0, "i")
92
+ lf_dict_i[mbkey] = (np.array(i_l_fmags), np.array(i_l_fcounts))
93
+ g_l_fmags, g_l_fcounts = make__fake_old_galaxy_lf(tmp_mb, 0.0, "g")
94
+ lf_dict_g[mbkey] = (np.array(g_l_fmags), np.array(g_l_fcounts))
95
+ tmp_mb += 0.1
96
+
97
+ return lf_dict_g, lf_dict_i
98
+
99
+
100
+ def _sum_luminosity(l_fmags, l_fcounts):
101
+ """
102
+ Sum the luminosities from a given luminosity function.
103
+
104
+ Uses the first bin's magnitude as a reference, sums luminosities
105
+ relative to that reference star,
106
+ then converts back to magnitude at the end.
107
+
108
+ Parameters
109
+ ----------
110
+ l_fmags : `np.array,` `float`
111
+ Magnitude bin values from the simulated LF.
112
+ l_fcounts : `np.array`, `int`
113
+ Number of stars in each magnitude bin.
114
+ """
115
+ magref = l_fmags[0]
116
+ totlum = 0.0
117
+
118
+ for mag, count in zip(l_fmags, l_fcounts):
119
+ tmpmags = np.repeat(mag, count)
120
+ totlum += np.sum(10.0 ** ((magref - tmpmags) / 2.5))
121
+
122
+ mtot = magref - 2.5 * np.log10(totlum)
123
+ return mtot
124
+
125
+
126
+ def _dwarf_sblimit(glim, ilim, nstars, lf_dict_g, lf_dict_i, distlim, rng):
127
+ """
128
+ Calculate the surface brightness limit given the g- and i-band limiting
129
+ magnitudes and the number of stars required to detect the dwarf of
130
+ interest.
131
+
132
+ Parameters
133
+ ----------
134
+ glim : `float`
135
+ Limiting magnitude (coaddM5) in g-band.
136
+ ilim : `float`
137
+ Limiting magnitude (coaddM5) in i-band.
138
+ nstars : `int`
139
+ Number of stars required to be able to detect the dwarf.
140
+ lf_dict_g, lf_dict_i : `dict`
141
+ Dicts of computed luminosity functions for artificial dwarfs, as
142
+ calculated by the function make_LF_dicts.
143
+ distlim : `float`
144
+ Distance limit (in Mpc) for which to calculate the limiting
145
+ surface brightness for dwarf detection.
146
+ rng : `np.random.Generator`
147
+ Random noise generator for poisson random number use.
148
+ """
149
+ distance_limit = distlim * 1e6 # distance limit in parsecs
150
+ distmod_lim = 5.0 * np.log10(distance_limit) - 5.0
151
+
152
+ if (glim > 15) and (ilim > 15):
153
+ # print(glim, ilim, nstars)
154
+ fake_mb = -10.0
155
+ ng = 1e6
156
+ ni = 1e6
157
+
158
+ while (ng > nstars) and (ni > nstars) and fake_mb < 5.0:
159
+ # B_fake = distmod_limit+fake_mb
160
+ mbkey = f"MB{fake_mb:.2f}"
161
+ i_l_fmags0, i_l_fcounts0 = lf_dict_i[mbkey]
162
+ g_l_fmags0, g_l_fcounts0 = lf_dict_g[mbkey]
163
+ i_l_fcounts = rng.poisson(i_l_fcounts0)
164
+ g_l_fcounts = rng.poisson(g_l_fcounts0)
165
+ # Add the distance modulus to make it apparent mags
166
+ i_l_fmags = i_l_fmags0 + distmod_lim
167
+ # Add the distance modulus to make it apparent mags
168
+ g_l_fmags = g_l_fmags0 + distmod_lim
169
+ gsel = g_l_fmags <= glim
170
+ isel = i_l_fmags <= ilim
171
+ ng = np.sum(g_l_fcounts[gsel])
172
+ ni = np.sum(i_l_fcounts[isel])
173
+ fake_mb += 0.1
174
+
175
+ if fake_mb > -9.9 and (ng > 0) and (ni > 0):
176
+ gmag_tot = _sum_luminosity(g_l_fmags[gsel], g_l_fcounts[gsel]) - distmod_lim
177
+ imag_tot = _sum_luminosity(i_l_fmags[isel], i_l_fcounts[isel]) - distmod_lim
178
+ # S = m + 2.5logA, where in this case things are in sq. arcmin,
179
+ # so A = 1 arcmin^2 = 3600 arcsec^2
180
+ sbtot_g = distmod_lim + gmag_tot + 2.5 * np.log10(3600.0)
181
+ sbtot_i = distmod_lim + imag_tot + 2.5 * np.log10(3600.0)
182
+ mg_lim = gmag_tot
183
+ mi_lim = imag_tot
184
+ sbg_lim = sbtot_g
185
+ sbi_lim = sbtot_i
186
+ if ng < ni:
187
+ flag_lim = "g"
188
+ else:
189
+ flag_lim = "i"
190
+ else:
191
+ mg_lim = 999.9
192
+ mi_lim = 999.9
193
+ sbg_lim = 999.9
194
+ sbi_lim = 999.9
195
+ flag_lim = None
196
+ else:
197
+ mg_lim = 999.9
198
+ mi_lim = 999.9
199
+ sbg_lim = -999.9
200
+ sbi_lim = -999.9
201
+ flag_lim = None
202
+
203
+ return mg_lim, mi_lim, sbg_lim, sbi_lim, flag_lim
204
+
205
+
206
+ class LVDwarfsMetric(BaseMetric):
207
+ """
208
+ Estimate the detection limit in total dwarf luminosity for
209
+ resolved dwarf galaxies at a given distance.
210
+
211
+ This metric class uses simulated luminosity functions of dwarf galaxies
212
+ with known (assumed) luminosities to estimate the detection limit
213
+ (in total dwarf luminosity, M_V) for resolved dwarf galaxies at a
214
+ given distance. It can be applied to either known galaxies with their
215
+ discrete positions and distances, or an entire survey simulation with
216
+ a fixed distance limit.
217
+
218
+ In the default use (with the KnownLvDwarfsSlicer),
219
+ it returns detection limits for a catalog of known local volume dwarfs,
220
+ from the Karachentsev+ catalog of nearby galaxies.
221
+
222
+ Parameters
223
+ ----------
224
+ radius : `float`
225
+ Radius of the field being considered (for discrete fields only).
226
+ By default, UserPointSlicer uses a 2.45-deg field radius.
227
+ distlim : `float`
228
+ Distance threshold in Mpc for which to calculate the limiting
229
+ dwarf detection luminosity. Only needed for healpix slicers,
230
+ but *required* if healpix is used.
231
+ cmd_frac : `float`
232
+ Fraction of the total area of the color-magnitude diagram
233
+ that is spanned by the tracer selection criteria. (e.g.,
234
+ the size of a box in color and magnitude to select RGB-star candidates)
235
+ stargal_contamination : `float`
236
+ Fraction of objects in CMD selection region that are actually
237
+ unresolved galaxies that were mis-classified as stars.
238
+ nsigma : `float`
239
+ Required detection significance to declare a simulated
240
+ dwarf "detected."
241
+ """
242
+
243
+ def __init__(
244
+ self,
245
+ radius=2.45,
246
+ distlim=None,
247
+ cmd_frac=0.1,
248
+ stargal_contamination=0.40,
249
+ nsigma=10.0,
250
+ metric_name="LVDwarfs",
251
+ seed=505,
252
+ **kwargs,
253
+ ):
254
+ self.radius = radius
255
+ self.filter_col = "filter"
256
+ self.m5_col = "fiveSigmaDepth"
257
+ self.cmd_frac = cmd_frac
258
+ self.stargal_contamination = stargal_contamination
259
+ self.nsigma = nsigma
260
+
261
+ if distlim is not None:
262
+ # If the distance limit was set on input, extract that info:
263
+ self.distlim = distlim
264
+ else:
265
+ # If no distance limit specified, assume the intention is to search
266
+ # around known Local Volume host galaxies.
267
+ self.distlim = None
268
+ filename = os.path.join(get_data_dir(), "maf/lvdwarfs", "lsst_galaxies_1p25to9Mpc_table.fits")
269
+ lv_dat0 = fits.getdata(filename)
270
+ # Keep only galaxies at dec < 35 deg.,
271
+ # and with stellar masses > 10^7 M_Sun.
272
+ lv_dat_cuts = (lv_dat0["dec"] < 35.0) & (lv_dat0["MStars"] > 1e7) & (lv_dat0["MStars"] < 1e14)
273
+ lv_dat = lv_dat0[lv_dat_cuts]
274
+ sc_dat = SkyCoord(
275
+ ra=lv_dat["ra"] * u.deg,
276
+ dec=lv_dat["dec"] * u.deg,
277
+ distance=lv_dat["dist_Mpc"] * u.Mpc,
278
+ )
279
+ self.sc_dat = sc_dat
280
+
281
+ self.lf_dict_g, self.lf_dict_i = make_dwarf_lf_dicts()
282
+
283
+ # Set up already-defined metrics that we will need:
284
+ self.exgal_coaddm5 = ExgalM5(m5_col=self.m5_col, filter_col=self.filter_col)
285
+ # The StarDensityMetric calculates the number of stars in i band
286
+ self.star_density_metric = StarDensityMetric(filtername="i")
287
+ # The galaxy counts metric calculates the number of galaxies in i band
288
+ self.galaxy_counts_metric = GalaxyCountsMetricExtended(
289
+ m5_col=self.m5_col, filter_band="i", include_dust_extinction=True
290
+ )
291
+ # Set the scale for the GalaxyCountMetric_extended to 1, so it returns
292
+ # galaxies per sq deg, not n galaxies per healpixel
293
+ self.galaxy_counts_metric.scale = 1
294
+
295
+ cols = [self.m5_col, self.filter_col]
296
+ # GalaxyCountsMetric needs the DustMap,
297
+ # and StarDensityMetric needs StellarDensityMap:
298
+ maps = ["DustMap", "StellarDensityMap"]
299
+ super().__init__(col=cols, metric_name=metric_name, maps=maps, units="M_V limit", **kwargs)
300
+
301
+ # Set up a random number generator,
302
+ # so that metric results are repeatable
303
+ self.rng = np.random.default_rng(seed)
304
+
305
+ def run(self, data_slice, slice_point=None):
306
+ # Identify observations in g and i bandpasses
307
+ gband = data_slice[self.filter_col] == "g"
308
+ iband = data_slice[self.filter_col] == "i"
309
+ # if there are no visits in either of g or i band, exit
310
+ if len(np.where(gband)[0]) == 0 or len(np.where(iband)[0]) == 0:
311
+ return self.badval
312
+
313
+ # calculate the dust-extincted coadded 5-sigma limiting mags
314
+ # in the g and i bands:
315
+ g5 = self.exgal_coaddm5.run(data_slice[gband], slice_point)
316
+ i5 = self.exgal_coaddm5.run(data_slice[iband], slice_point)
317
+
318
+ if g5 < 15 or i5 < 15:
319
+ # If the limiting magnitudes won't even match the
320
+ # stellar density maps, exit
321
+ return self.badval
322
+
323
+ # Find the number of stars per sq arcsecond at the i band limit
324
+ # (this is a bit of a hack to get the starDensityMetric to
325
+ # calculate the nstars at this mag exactly)
326
+ star_i5 = min(27.9, i5)
327
+ self.star_density_metric.magLimit = star_i5
328
+
329
+ nstar_sqarcsec = self.star_density_metric.run(data_slice, slice_point)
330
+
331
+ # Calculate the number of galaxies per sq degree
332
+ ngal_sqdeg = self.galaxy_counts_metric.run(data_slice, slice_point)
333
+ # GalaxyCountsMetric is undefined in some places. These cases return
334
+ # zero; catch these and set the galaxy counts in those regions to a
335
+ # very high value. (this may not be true after catching earlier
336
+ # no-visits issues)
337
+ if ngal_sqdeg < 10.0:
338
+ ngal_sqdeg = 1e7
339
+
340
+ # Convert from per sq deg and per sq arcsecond
341
+ # into #'s per sq arcminute
342
+ ngal_sqarcmin = ngal_sqdeg / 3600
343
+ nstar_sqarcmin = nstar_sqarcsec * 3600
344
+
345
+ if ngal_sqarcmin < 0 or nstar_sqarcmin < 0:
346
+ print(
347
+ f"Here be a problem - ngals_sqarcmin {ngal_sqarcmin} or nstar_sqarcmin {nstar_sqarcmin} "
348
+ f"are negative. depths: {g5}, {i5}. "
349
+ f'{slice_point["ra"], slice_point["dec"], slice_point["sid"]}'
350
+ )
351
+ # The number of stars required to reach nsigma is
352
+ # nsigma times the Poisson fluctuations of the background
353
+ # (stars+galaxies contamination):
354
+ nstars_required = self.nsigma * np.sqrt(
355
+ (ngal_sqarcmin * self.cmd_frac * self.stargal_contamination) + (nstar_sqarcmin * self.cmd_frac)
356
+ )
357
+
358
+ if self.distlim is not None:
359
+ # Use the distlim if a healpix slicer is input
360
+ distlim = self.distlim
361
+ else:
362
+ # Use discrete distances for known galaxies if a
363
+ # UserPointSlicer:
364
+ distlim = slice_point["distance"] * u.Mpc
365
+
366
+ # Calculate the limiting luminosity and surface brightness
367
+ # based on g5 and i5:
368
+ mg_lim, mi_lim, sb_g_lim, sb_i_lim, flag_lim = _dwarf_sblimit(
369
+ g5,
370
+ i5,
371
+ nstars_required,
372
+ self.lf_dict_g,
373
+ self.lf_dict_i,
374
+ distlim=distlim.value,
375
+ rng=self.rng,
376
+ )
377
+
378
+ if flag_lim is None:
379
+ mv = self.badval
380
+
381
+ else:
382
+ # To go from HSC g and i bands to V, use the conversion
383
+ # from Appendix A of Komiyama+2018, ApJ, 853, 29:
384
+ # V = g_hsc - 0.371*(gi_hsc)-0.068
385
+ mv = mg_lim - 0.371 * (mg_lim - mi_lim) - 0.068
386
+ # sbv = sb_g_lim - 0.371 * (sb_g_lim - sb_i_lim) - 0.068
387
+
388
+ return mv