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,468 @@
1
+ __all__ = ("BaseObs",)
2
+
3
+ import os
4
+ import warnings
5
+
6
+ import numpy as np
7
+ from rubin_scheduler.data import get_data_dir
8
+ from rubin_scheduler.utils import LsstCameraFootprint, angular_separation
9
+
10
+ from rubin_sim.phot_utils import Bandpass, Sed
11
+
12
+ from .ooephemerides import PyOrbEphemerides
13
+
14
+
15
+ class BaseObs:
16
+ """
17
+ Base class to generate observations of a set of moving objects.
18
+
19
+ Parameters
20
+ ----------
21
+ footPrint: `str`, optional
22
+ Specify the footprint for the FOV.
23
+ Options include "camera", "circle", "rectangle".
24
+ 'Camera' means use the actual LSST camera footprint
25
+ (following a rough cut with a circular FOV).
26
+ Default is camera FOV.
27
+ r_fov : `float`, optional
28
+ If footprint is "circular", this is the radius of the fov (in degrees).
29
+ Default 1.75 degrees (only used for circular fov).
30
+ x_tol : `float`, optional
31
+ If footprint is "rectangular", this is half of the width
32
+ of the (on-sky) fov in the RA direction (in degrees).
33
+ Default 5 degrees.
34
+ y_tol : `float`, optional
35
+ If footprint is "rectangular", this is half of the width of
36
+ the fov in Declination (in degrees).
37
+ Default is 3 degrees
38
+ eph_mode: `str`, optional
39
+ Mode for ephemeris generation - nbody or 2body. Default is nbody.
40
+ eph_type: `str`, optional
41
+ Type of ephemerides to generate - full or basic.
42
+ Full includes all values calculated by openorb;
43
+ Basic includes a more basic set.
44
+ Default is Basic.
45
+ eph_file: `str` or None, optional
46
+ The name of the planetary ephemerides file to use
47
+ for ephemeris generation.
48
+ Default (None) will use the default for PyOrbEphemerides.
49
+ obs_code: `str`, optional
50
+ Observatory code for ephemeris generation.
51
+ Default is "I11" - Cerro Pachon.
52
+ obs_time_col: `str`, optional
53
+ Name of the time column in the obsData.
54
+ Default 'observationStartMJD'.
55
+ obs_time_scale: `str`, optional
56
+ Type of timescale for MJD (TAI or UTC currently).
57
+ Default TAI.
58
+ seeing_col: `str`, optional
59
+ Name of the seeing column in the obsData.
60
+ Default 'seeingFwhmGeom'.
61
+ This should be the geometric/physical seeing
62
+ as it is used for the trailing loss calculation.
63
+ visit_exp_time_col: `str`, optional
64
+ Name of the visit exposure time column in the obsData.
65
+ Default 'visitExposureTime'.
66
+ obs_ra: `str`, optional
67
+ Name of the RA column in the obsData. Default 'fieldRA'.
68
+ obs_dec: `str`, optional
69
+ Name of the Dec column in the obsData. Default 'fieldDec'.
70
+ obs_rot_sky_pos: `str`, optional
71
+ Name of the Rotator column in the obsData. Default 'rotSkyPos'.
72
+ obs_degrees: `bool`, optional
73
+ Whether the observational data is in degrees or radians.
74
+ Default True (degrees).
75
+ outfile_name : `str`, optional
76
+ The output file name.
77
+ Default is 'lsst_obs.dat'.
78
+ obs_info : `str`, optional
79
+ A string that captures provenance information about the observations.
80
+ For example: 'baseline_v2.0_10yrs, years 0-5'
81
+ or 'baseline2018a minus NES'
82
+ Default ''.
83
+ """
84
+
85
+ def __init__(
86
+ self,
87
+ footprint="camera",
88
+ r_fov=1.75,
89
+ x_tol=5,
90
+ y_tol=3,
91
+ eph_mode="nbody",
92
+ eph_type="basic",
93
+ obs_code="I11",
94
+ eph_file=None,
95
+ obs_time_col="observationStartMJD",
96
+ obs_time_scale="TAI",
97
+ seeing_col="seeingFwhmGeom",
98
+ visit_exp_time_col="visitExposureTime",
99
+ obs_ra="fieldRA",
100
+ obs_dec="fieldDec",
101
+ obs_rot_sky_pos="rotSkyPos",
102
+ obs_degrees=True,
103
+ outfile_name="lsst_obs.dat",
104
+ obs_info="",
105
+ camera_footprint_file=None,
106
+ ):
107
+ # Strings relating to the names of columns in the observation metadata.
108
+ self.obs_code = obs_code
109
+ self.obs_time_col = obs_time_col
110
+ self.obs_time_scale = obs_time_scale
111
+ self.seeing_col = seeing_col
112
+ self.visit_exp_time_col = visit_exp_time_col
113
+ self.obs_ra = obs_ra
114
+ self.obs_dec = obs_dec
115
+ self.obs_rot_sky_pos = obs_rot_sky_pos
116
+ self.obs_degrees = obs_degrees
117
+ # Save a space for the standard object colors.
118
+ self.colors = {}
119
+ self.outfile_name = outfile_name
120
+ # Values for identifying observations.
121
+ self.footprint = footprint.lower()
122
+ if self.footprint == "camera":
123
+ self._setup_camera(camera_footprint_file=camera_footprint_file)
124
+ self.r_fov = r_fov
125
+ self.x_tol = x_tol
126
+ self.y_tol = y_tol
127
+ # Values for ephemeris generation.
128
+ if eph_mode.lower() not in ("2body", "nbody"):
129
+ raise ValueError("Ephemeris generation must be 2body or nbody.")
130
+ self.eph_mode = eph_mode
131
+ self.eph_type = eph_type
132
+ self.eph_file = eph_file
133
+
134
+ self._setup_info(obs_info=obs_info)
135
+
136
+ def _setup_info(self, obs_info=""):
137
+ """Generate a dict to record relevant settings"""
138
+ info = {
139
+ "obs_info": obs_info,
140
+ "footprint": self.footprint,
141
+ "eph_mode": self.eph_mode,
142
+ "eph_type": self.eph_type,
143
+ }
144
+ if self.footprint == "circle":
145
+ info["r_fov"] = self.r_fov
146
+ if self.footprint == "rectangle":
147
+ info["xtol"] = self.x_tol
148
+ info["ytol"] = self.y_tol
149
+
150
+ # convert to numpy array in anticipation of saving
151
+ names = list(info.keys())
152
+ types = [np.array(info[key]).dtype for key in names]
153
+ self.info = np.zeros(1, dtype=list(zip(names, types)))
154
+ for key in names:
155
+ self.info[key] = info[key]
156
+
157
+ def _setup_camera(self, camera_footprint_file=None):
158
+ self.camera = LsstCameraFootprint(units="degrees", footprint_file=camera_footprint_file)
159
+
160
+ def setup_ephemerides(self):
161
+ """Initialize the ephemeris generator.
162
+ Save the setup PyOrbEphemeris class.
163
+
164
+ This uses the default engine, pyoorb -
165
+ however this could be overwritten to use another generator.
166
+ """
167
+ self.ephems = PyOrbEphemerides(ephfile=self.eph_file)
168
+
169
+ def generate_ephemerides(self, sso, times, eph_mode=None, eph_type=None):
170
+ """Generate ephemerides for 'sso' at times 'times'
171
+ (assuming MJDs, with timescale self.obs_time_scale).
172
+
173
+ The default engine here is pyoorb, however other ephemeris generation
174
+ could be used with a matching API to PyOrbEphemerides.
175
+
176
+ The initialized pyoorb class (PyOrbEphemerides) is saved,
177
+ to skip setup on subsequent calls.
178
+
179
+ Parameters
180
+ ----------
181
+ sso : `rubin_sim.movingObjects.Orbits`
182
+ Typically this will be a single object.
183
+ times: `np.ndarray`
184
+ The times at which to generate ephemerides. MJD.
185
+ eph_mode: `str` or None, optional
186
+ Potentially override default eph_mode (self.eph_mode).
187
+ Must be '2body' or 'nbody'.
188
+
189
+ Returns
190
+ -------
191
+ ephs : `pd.Dataframe`
192
+ Results from propigating the orbit(s) to the specified times.
193
+ Columns like:
194
+ obj_id, sedname, time, ra, dec, dradt, ddecdt, phase, solarelon.
195
+ """
196
+ if not hasattr(self, "ephems"):
197
+ self.setup_ephemerides()
198
+ if eph_mode is None:
199
+ eph_mode = self.eph_mode
200
+ if eph_type is None:
201
+ eph_type = self.eph_type
202
+ self.ephems.set_orbits(sso)
203
+ ephs = self.ephems.generate_ephemerides(
204
+ times,
205
+ time_scale=self.obs_time_scale,
206
+ obscode=self.obs_code,
207
+ eph_mode=eph_mode,
208
+ eph_type=eph_type,
209
+ by_object=True,
210
+ )
211
+ return ephs
212
+
213
+ def calc_trailing_losses(self, velocity, seeing, texp=30.0):
214
+ """Calculate the detection and SNR trailing losses.
215
+
216
+ 'Trailing' losses = loss in sensitivity due to the photons from the
217
+ source being spread over more pixels; thus more sky background is
218
+ included when calculating the flux from the object and thus the SNR
219
+ is lower than for an equivalent brightness stationary/PSF-like source.
220
+ dmagTrail represents this loss.
221
+
222
+ 'Detection' trailing losses = loss in sensitivity due to the photons
223
+ from the source being spread over more pixels, in a non-stellar-PSF
224
+ way, while source detection is (typically) done using a stellar PSF
225
+ filter and 5-sigma cutoff values based on assuming peaks from
226
+ stellar PSF's above the background; thus the SNR is lower than for an
227
+ equivalent brightness stationary/PSF-like source (and by a greater
228
+ factor than just the simple SNR trailing loss above).
229
+ dmag_detect represents this loss.
230
+
231
+ Parameters
232
+ ----------
233
+ velocity : `np.ndarray` or `float`
234
+ The velocity of the moving objects, in deg/day.
235
+ seeing : `np.ndarray` or `float`
236
+ The seeing of the images, in arcseconds.
237
+ texp : `np.ndarray` or `float`, optional
238
+ The exposure time of the images, in seconds. Default 30.
239
+
240
+ Returns
241
+ -------
242
+ dmag Trail, dmag_detect : (`np.ndarray` `np.ndarray`)
243
+ or (`float`, `float`)
244
+ dmag_trail and dmag_detect for each set of
245
+ velocity/seeing/texp values.
246
+ """
247
+ a_trail = 0.761
248
+ b_trail = 1.162
249
+ a_det = 0.420
250
+ b_det = 0.003
251
+ x = velocity * texp / seeing / 24.0
252
+ dmag_trail = 1.25 * np.log10(1 + a_trail * x**2 / (1 + b_trail * x))
253
+ dmag_detect = 1.25 * np.log10(1 + a_det * x**2 / (1 + b_det * x))
254
+ return (dmag_trail, dmag_detect)
255
+
256
+ def read_filters(
257
+ self,
258
+ filter_dir=None,
259
+ bandpass_root="total_",
260
+ bandpass_suffix=".dat",
261
+ filterlist=("u", "g", "r", "i", "z", "y"),
262
+ v_dir=None,
263
+ v_filter="harris_V.dat",
264
+ ):
265
+ """Read (LSST) and Harris (V) filter throughput curves.
266
+
267
+ Only the defaults are LSST specific;
268
+ this can easily be adapted for any survey.
269
+
270
+ Parameters
271
+ ----------
272
+ filter_dir : `str`, optional
273
+ Directory containing the filter throughput curves ('total*.dat')
274
+ Default set by 'LSST_THROUGHPUTS_BASELINE' env variable.
275
+ bandpass_root : `str`, optional
276
+ Rootname of the throughput curves in filterlist.
277
+ E.g. throughput curve names are bandpass_root + filterlist[i]
278
+ + bandpass_suffix
279
+ Default `total_` (appropriate for LSST throughput repo).
280
+ bandpass_suffix : `str`, optional
281
+ Suffix for the throughput curves in filterlist.
282
+ Default '.dat' (appropriate for LSST throughput repo).
283
+ filterlist : `list`, optional
284
+ List containing the filter names to use to calculate colors.
285
+ Default ('u', 'g', 'r', 'i', 'z', 'y')
286
+ v_dir : `str`, optional
287
+ Directory containing the V band throughput curve.
288
+ Default None = $RUBIN_SIM_DATA_DIR/movingObjects
289
+ v_filter : `str`, optional
290
+ Name of the V band filter curve.
291
+ Default harris_V.dat.
292
+ """
293
+ if filter_dir is None:
294
+ filter_dir = os.path.join(get_data_dir(), "throughputs/baseline")
295
+ if v_dir is None:
296
+ v_dir = os.path.join(get_data_dir(), "movingObjects")
297
+ self.filterlist = filterlist
298
+ # Read filter throughput curves from disk.
299
+ self.lsst = {}
300
+ for f in self.filterlist:
301
+ self.lsst[f] = Bandpass()
302
+ self.lsst[f].read_throughput(os.path.join(filter_dir, bandpass_root + f + bandpass_suffix))
303
+ self.vband = Bandpass()
304
+ self.vband.read_throughput(os.path.join(v_dir, v_filter))
305
+
306
+ def calc_colors(self, sedname="C.dat", sed_dir=None):
307
+ """Calculate the colors for a given SED.
308
+
309
+ If the sedname is not already in the dictionary self.colors,
310
+ this reads the SED from disk and calculates all V-[filter] colors
311
+ for all filters in self.filterlist.
312
+ The result is stored in self.colors[sedname][filter], so will not
313
+ be recalculated if the SED + color is reused for another object.
314
+
315
+ Parameters
316
+ ----------
317
+ sedname : `str`, optional
318
+ Name of the SED. Default 'C.dat'.
319
+ sed_dir : `str`, optional
320
+ Directory containing the SEDs of the moving objects.
321
+ Default None = $RUBIN_SIM_DATA_DIR/movingObjects,
322
+
323
+ Returns
324
+ -------
325
+ colors : `dict` {'filter': color}}
326
+ Dictionary of the colors in self.filterlist.
327
+ """
328
+ if sedname not in self.colors:
329
+ if sed_dir is None:
330
+ sed_dir = os.path.join(get_data_dir(), "movingObjects")
331
+ mo_sed = Sed()
332
+ mo_sed.read_sed_flambda(os.path.join(sed_dir, sedname))
333
+ vmag = mo_sed.calc_mag(self.vband)
334
+ self.colors[sedname] = {}
335
+ for f in self.filterlist:
336
+ self.colors[sedname][f] = mo_sed.calc_mag(self.lsst[f]) - vmag
337
+ return self.colors[sedname]
338
+
339
+ def sso_in_circle_fov(self, ephems, obs_data):
340
+ """Determine which observations are within a circular fov
341
+ for a series of observations.
342
+ Note that ephems and obs_data must be the same length.
343
+
344
+ Parameters
345
+ ----------
346
+ ephems : `np.recarray`
347
+ Ephemerides for the objects.
348
+ obs_data : `np.recarray`
349
+ The observation pointings.
350
+
351
+ Returns
352
+ -------
353
+ indices : `np.ndarray`
354
+ Returns the indexes of the numpy array of the object
355
+ observations which are inside the fov.
356
+ """
357
+ return self._sso_in_circle_fov(ephems, obs_data, self.r_fov)
358
+
359
+ def _sso_in_circle_fov(self, ephems, obs_data, r_fov):
360
+ if not self.obs_degrees:
361
+ sep = angular_separation(
362
+ ephems["ra"],
363
+ ephems["dec"],
364
+ np.degrees(obs_data[self.obs_ra]),
365
+ np.degrees(obs_data[self.obs_dec]),
366
+ )
367
+ else:
368
+ sep = angular_separation(
369
+ ephems["ra"],
370
+ ephems["dec"],
371
+ obs_data[self.obs_ra],
372
+ obs_data[self.obs_dec],
373
+ )
374
+ idx_obs = np.where(sep <= r_fov)[0]
375
+ return idx_obs
376
+
377
+ def sso_in_rectangle_fov(self, ephems, obs_data):
378
+ """Determine which observations are within a rectangular FoV
379
+ for a series of observations.
380
+ Note that ephems and obs_data must be the same length.
381
+
382
+ Parameters
383
+ ----------
384
+ ephems : `np.recarray`
385
+ Ephemerides for the objects.
386
+ obs_data : `np.recarray`
387
+ The observation pointings.
388
+
389
+ Returns
390
+ -------
391
+ indices : `np.ndarray`
392
+ Returns the indexes of the numpy array of the object
393
+ observations which are inside the fov.
394
+ """
395
+ return self._sso_in_rectangle_fov(ephems, obs_data, self.x_tol, self.y_tol)
396
+
397
+ def _sso_in_rectangle_fov(self, ephems, obs_data, x_tol, y_tol):
398
+ delta_dec = np.abs(ephems["dec"] - obs_data[self.obs_dec])
399
+ delta_ra = np.abs((ephems["ra"] - obs_data[self.obs_ra]) * np.cos(np.radians(obs_data[self.obs_dec])))
400
+ idx_obs = np.where((delta_dec <= y_tol) & (delta_ra <= x_tol))[0]
401
+ return idx_obs
402
+
403
+ def sso_in_camera_fov(self, ephems, obs_data):
404
+ """Determine which observations are within the actual
405
+ camera footprint for a series of observations.
406
+ Note that ephems and obs_data must be the same length.
407
+
408
+ Parameters
409
+ ----------
410
+ ephems : `np.ndarray`
411
+ Ephemerides for the objects.
412
+ obs_data : `np.ndarray`
413
+ Observation pointings.
414
+
415
+ Returns
416
+ -------
417
+ indices : `np.ndarray`
418
+ Returns the indexes of the numpy array of the object
419
+ observations which are inside the fov.
420
+ """
421
+ if not hasattr(self, "camera"):
422
+ self._setup_camera()
423
+
424
+ if not self.obs_degrees:
425
+ idx = self.camera(
426
+ ephems["ra"],
427
+ ephems["dec"],
428
+ np.degrees(obs_data[self.obs_ra]),
429
+ np.degrees(obs_data[self.obs_dec]),
430
+ np.degrees(obs_data[self.obs_rot_sky_pos]),
431
+ )
432
+ else:
433
+ idx = self.camera(
434
+ ephems["ra"],
435
+ ephems["dec"],
436
+ obs_data[self.obs_ra],
437
+ obs_data[self.obs_dec],
438
+ obs_data[self.obs_rot_sky_pos],
439
+ )
440
+ return idx
441
+
442
+ def sso_in_fov(self, ephems, obs_data):
443
+ """Convenience layer - determine which footprint method to
444
+ apply (from self.footprint) and use it.
445
+
446
+ Parameters
447
+ ----------
448
+ ephems : `np.ndarray`
449
+ Ephemerides for the objects.
450
+ obs_data : `np.ndarray`
451
+ Observation pointings.
452
+
453
+ Returns
454
+ -------
455
+ indices : `np.ndarray`
456
+ Returns the indexes of the numpy array of the object
457
+ observations which are inside the fov.
458
+ """
459
+ if self.footprint == "camera":
460
+ return self.sso_in_camera_fov(ephems, obs_data)
461
+ elif self.footprint == "rectangle":
462
+ return self.sso_in_rectangle_fov(ephems, obs_data)
463
+ elif self.footprint == "circle":
464
+ return self.sso_in_circle_fov(ephems, obs_data)
465
+ else:
466
+ warnings.warn("Using circular fov; could not match specified footprint.")
467
+ self.footprint = "circle"
468
+ return self.sso_in_circle_fov(ephems, obs_data)