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,425 @@
1
+ #
2
+ # LSST Data Management System
3
+ # Copyright 2008, 2009, 2010, 2011, 2012 LSST Corporation.
4
+ #
5
+ # This product includes software developed by the
6
+ # LSST Project (http://www.lsst.org/).
7
+ #
8
+ # This program is free software: you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation, either version 3 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the LSST License Statement and
19
+ # the GNU General Public License along with this program. If not,
20
+ # see <http://www.lsstcorp.org/LegalNotices/>.
21
+ #
22
+
23
+ __all__ = ("Bandpass", "rubin_bandpasses")
24
+
25
+ import gzip
26
+ import os
27
+ import warnings
28
+
29
+ import numpy as np
30
+
31
+ try:
32
+ from numpy import trapezoid as trapezoid
33
+ except ImportError:
34
+ from numpy import trapz as trapezoid
35
+ import scipy.interpolate as interpolate
36
+
37
+ from rubin_sim.data import get_data_dir
38
+
39
+ from .physical_parameters import PhysicalParameters
40
+ from .sed import Sed
41
+
42
+
43
+ def rubin_bandpasses():
44
+ """Return the standard expected Rubin filter bandpasses."""
45
+ filterlist = ["u", "g", "r", "i", "z", "y"]
46
+ dd = get_data_dir()
47
+
48
+ filter_dict = {}
49
+ for f in filterlist:
50
+ filter_dict[f] = Bandpass()
51
+ filter_dict[f].read_throughput(os.path.join(dd, "throughputs", "baseline", f"total_{f}.dat"))
52
+ return filter_dict
53
+
54
+
55
+ class Bandpass:
56
+ """
57
+ Hold and use telescope throughput curves.
58
+
59
+ Parameters
60
+ ----------
61
+ wavelen : `np.ndarray`, (N,)
62
+ Wavelength array in nm.
63
+ sb : `np.ndarray`, (N,)
64
+ Throughput array (fraction, 0-1).
65
+ sampling_warning : `float`
66
+ If wavelength sampling lower than this,
67
+ throw a warning because it might provide accurate magnitudes
68
+ due to how magnitudes are calculated in Sed (nm).
69
+ """
70
+
71
+ def __init__(self, wavelen=None, sb=None, sampling_warning=0.2):
72
+ self._phys_params = PhysicalParameters()
73
+ self.sampling_warning = sampling_warning
74
+ self.wavelen = None
75
+ self.sb = None
76
+ self.phi = None
77
+ self.bandpassname = None
78
+ if (wavelen is not None) and (sb is not None):
79
+ self.set_bandpass(wavelen, sb)
80
+ return
81
+
82
+ def set_bandpass(self, wavelen, sb):
83
+ """
84
+ Populate bandpass data with wavelen/sb arrays.
85
+
86
+ Phi set to None.
87
+
88
+ Parameters
89
+ ----------
90
+ wavelen : `np.ndarray`, (N,)
91
+ Wavelength array in nm.
92
+ sb : `np.ndarray`, (N,)
93
+ Throughput array (fraction, 0-1).
94
+
95
+ Raises
96
+ ------
97
+ ValueError
98
+ Raised if ``wavelen`` and ``sb`` have different length.
99
+ """
100
+ # Check data type.
101
+ if (isinstance(wavelen, np.ndarray) is False) or (isinstance(sb, np.ndarray) is False):
102
+ raise ValueError("Wavelen and sb arrays must be numpy arrays.")
103
+ # Check data matches in length.
104
+ if len(wavelen) != len(sb):
105
+ raise ValueError("Wavelen and sb arrays must have the same length.")
106
+
107
+ self.wavelen = np.copy(wavelen)
108
+ self.phi = None
109
+ self.sb = np.copy(sb)
110
+ self.bandpassname = "FromArrays"
111
+
112
+ def imsim_bandpass(self, imsimwavelen=500.0, wavelen_min=300, wavelen_max=1150, wavelen_step=0.1):
113
+ """
114
+ Populate bandpass data with sb=0 everywhere except at imsimwavelen.
115
+
116
+ Sets wavelen/sb, with grid min/max/step as Parameters.
117
+ """
118
+ # Set up arrays.
119
+ self.wavelen = np.arange(
120
+ wavelen_min,
121
+ wavelen_max + wavelen_step,
122
+ wavelen_step,
123
+ dtype="float",
124
+ )
125
+ self.phi = None
126
+ # Set sb.
127
+ self.sb = np.zeros(len(self.wavelen), dtype="float")
128
+ self.sb[abs(self.wavelen - imsimwavelen) < wavelen_step / 2.0] = 1.0
129
+ self.bandpassname = "IMSIM"
130
+
131
+ def read_throughput(self, filename):
132
+ """
133
+ Populate bandpass data with data (wavelen/sb) read from file.
134
+
135
+ Sets wavelen/sb. Does NOT set phi.
136
+ """
137
+ # Set self values to None in case of file read error.
138
+ self.wavelen = None
139
+ self.phi = None
140
+ self.sb = None
141
+ # Check for filename error.
142
+ # If given list of filenames,
143
+ # pass to (and return from) read_throughputList.
144
+ if isinstance(filename, list):
145
+ warnings.warn(
146
+ "Was given list of files, instead of a single file. Using read_throughputList instead"
147
+ )
148
+ self.read_throughput_list(component_list=filename)
149
+ # Filename is single file, now try to open file and read data.
150
+ try:
151
+ if filename.endswith(".gz"):
152
+ f = gzip.open(filename, "rt")
153
+ else:
154
+ f = open(filename, "r")
155
+ except IOError:
156
+ try:
157
+ if filename.endswith(".gz"):
158
+ f = open(filename[:-3], "r")
159
+ else:
160
+ f = gzip.open(filename + ".gz", "rt")
161
+ except IOError:
162
+ raise IOError("The throughput file %s does not exist" % (filename))
163
+ # The throughput file should have [wavelength(A), throughput(Sb)]
164
+ wavelen = []
165
+ sb = []
166
+ for line in f:
167
+ if line.startswith("#") or line.startswith("$") or line.startswith("!"):
168
+ continue
169
+ values = line.split()
170
+ if len(values) < 2:
171
+ continue
172
+ if (values[0] == "$") or (values[0] == "#") or (values[0] == "!"):
173
+ continue
174
+ wavelen.append(float(values[0]))
175
+ sb.append(float(values[1]))
176
+ f.close()
177
+ self.bandpassname = filename
178
+ # Set up wavelen/sb.
179
+ self.wavelen = np.array(wavelen, dtype="float")
180
+ self.sb = np.array(sb, dtype="float")
181
+ # Check that wavelength is monotonic increasing and
182
+ # non-repeating in wavelength. (Sort on wavelength).
183
+ if len(self.wavelen) != len(np.unique(self.wavelen)):
184
+ raise ValueError("The wavelength values in file %s are non-unique." % (filename))
185
+ # Sort values.
186
+ p = self.wavelen.argsort()
187
+ self.wavelen = self.wavelen[p]
188
+ self.sb = self.sb[p]
189
+
190
+ def read_throughput_list(
191
+ self,
192
+ component_list=(
193
+ "detector.dat",
194
+ "lens1.dat",
195
+ "lens2.dat",
196
+ "lens3.dat",
197
+ "m1.dat",
198
+ "m2.dat",
199
+ "m3.dat",
200
+ "atmos_std.dat",
201
+ ),
202
+ root_dir=".",
203
+ wavelen_min=300,
204
+ wavelen_max=1150,
205
+ wavelen_step=0.1,
206
+ ):
207
+ """
208
+ Populate bandpass data by reading from a series of files
209
+ containing wavelen/Sb data.
210
+
211
+ Multiplies throughputs (sb) from each file to give a final
212
+ bandpass throughput.
213
+ Sets wavelen/sb, with grid min/max/step as Parameters.
214
+ Does NOT set phi.
215
+ """
216
+ # ComponentList = names of files in that directory.
217
+ # A typical component list of all files to build final component list,
218
+ # including filter, might be:
219
+ # ['detector.dat', 'lens1.dat', 'lens2.dat', 'lens3.dat',
220
+ # 'm1.dat', 'm2.dat', 'm3.dat', 'atmos_std.dat', 'ideal_g.dat']
221
+ #
222
+ # Set up wavelen/sb on grid.
223
+ self.wavelen = np.arange(
224
+ wavelen_min,
225
+ wavelen_max + wavelen_step / 2.0,
226
+ wavelen_step,
227
+ dtype="float",
228
+ )
229
+ self.phi = None
230
+ self.sb = np.ones(len(self.wavelen), dtype="float")
231
+ # Set up a temporary bandpass object to hold data from each file.
232
+ tempbandpass = Bandpass()
233
+ for component in component_list:
234
+ # Read data from file.
235
+ with warnings.catch_warnings():
236
+ warnings.simplefilter("ignore")
237
+ tempbandpass.read_throughput(os.path.join(root_dir, component))
238
+ tempbandpass.resample_bandpass(
239
+ wavelen_min=wavelen_min,
240
+ wavelen_max=wavelen_max,
241
+ wavelen_step=wavelen_step,
242
+ )
243
+ # Multiply self by new sb values.
244
+ self.sb = self.sb * tempbandpass.sb
245
+ self.bandpassname = "".join(component_list)
246
+
247
+ def get_bandpass(self):
248
+ wavelen = np.copy(self.wavelen)
249
+ sb = np.copy(self.sb)
250
+ return wavelen, sb
251
+
252
+ # utilities
253
+
254
+ def check_use_self(self, wavelen, sb):
255
+ """
256
+ Simple utility to check if should be using self.wavelen/sb
257
+ or passed arrays.
258
+
259
+ Useful for other methods in this class.
260
+ Also does data integrity check on wavelen/sb if not self.
261
+ """
262
+ update_self = False
263
+ if (wavelen is None) or (sb is None):
264
+ # Then one of the arrays was not passed - check if true for both.
265
+ if (wavelen is not None) or (sb is not None):
266
+ # Then only one of the arrays was passed - raise exception.
267
+ raise ValueError("Must either pass *both* wavelen/sb pair, or use self defaults")
268
+ # Okay, neither wavelen or sb was passed in - using self only.
269
+ update_self = True
270
+ else:
271
+ # Both of the arrays were passed in - check their validity.
272
+ if (isinstance(wavelen, np.ndarray) is False) or (isinstance(sb, np.ndarray) is False):
273
+ raise ValueError("Must pass wavelen/sb as numpy arrays")
274
+ if len(wavelen) != len(sb):
275
+ raise ValueError("Must pass equal length wavelen/sb arrays")
276
+ return update_self
277
+
278
+ def resample_bandpass(
279
+ self,
280
+ wavelen=None,
281
+ sb=None,
282
+ wavelen_min=300,
283
+ wavelen_max=1150,
284
+ wavelen_step=0.1,
285
+ ):
286
+ """
287
+ Resamples wavelen/sb (or self.wavelen/sb) onto grid
288
+ defined by min/max/step.
289
+
290
+ Either returns wavelen/sb (if given those arrays) or
291
+ updates wavelen / Sb in self. If updating self, resets phi to None.
292
+ """
293
+ # Check wavelength limits.
294
+ wavelen_min = wavelen_min
295
+ wavelen_max = wavelen_max
296
+ wavelen_step = wavelen_step
297
+ # Is method acting on self.wavelen/sb or passed in wavelen/sb?
298
+ update_self = (wavelen is None) & (sb is None)
299
+ if update_self:
300
+ wavelen = self.wavelen
301
+ sb = self.sb
302
+ # Now, on with the resampling.
303
+ if (wavelen.min() > wavelen_max) or (wavelen.max() < wavelen_min):
304
+ raise Exception("No overlap between known wavelength range and desired wavelength range.")
305
+ # Set up gridded wavelength.
306
+ wavelen_grid = np.arange(wavelen_min, wavelen_max + wavelen_step / 2.0, wavelen_step, dtype="float")
307
+ # Do the interpolation of wavelen/sb onto the grid.
308
+ # (note wavelen/sb type failures will die here).
309
+ f = interpolate.interp1d(wavelen, sb, fill_value=0, bounds_error=False)
310
+ sb_grid = f(wavelen_grid)
311
+ # Update self values if necessary.
312
+ if update_self:
313
+ self.phi = None
314
+ self.wavelen = wavelen_grid
315
+ self.sb = sb_grid
316
+ return
317
+ return wavelen_grid, sb_grid
318
+
319
+ # more complicated bandpass functions
320
+
321
+ def sb_tophi(self):
322
+ """
323
+ Calculate and set phi - the normalized system response.
324
+
325
+ This function only updates self.phi.
326
+ """
327
+ # The definition of phi = (Sb/wavelength)/\int(Sb/wavelength)dlambda.
328
+ self.phi = self.sb / self.wavelen
329
+ # Normalize phi so that the integral of phi is 1.
330
+ norm = trapezoid(self.phi, x=self.wavelen)
331
+ self.phi = self.phi / norm
332
+ return
333
+
334
+ def multiply_throughputs(self, wavelen_other, sb_other):
335
+ """
336
+ Multiply self.sb by another wavelen/sb pair, return wavelen/sb arrays.
337
+
338
+ The returned arrays will be gridded like this bandpass.
339
+ This method does not affect self.
340
+ """
341
+ # Resample wavelen_other/sb_other to match this bandpass.
342
+ if not np.all(self.wavelen == wavelen_other):
343
+ wavelen_other, sb_other = self.resample_bandpass(
344
+ wavelen=wavelen_other,
345
+ sb=sb_other,
346
+ wavelen_min=self.wavelen.min(),
347
+ wavelen_max=self.wavelen.max(),
348
+ wavelen_step=self.wavelen[1] - self.wavelen[0],
349
+ )
350
+ # Make new memory copy of wavelen.
351
+ wavelen_new = np.copy(self.wavelen)
352
+ # Calculate new transmission - this is also new memory.
353
+ sb_new = self.sb * sb_other
354
+ return wavelen_new, sb_new
355
+
356
+ def calc_zp_t(self, photometric_parameters):
357
+ """
358
+ Calculate the instrumental zeropoint for a bandpass.
359
+
360
+ Parameters
361
+ ----------
362
+ photometric_parameters : `PhotometricParameters`
363
+ Details about the photometric response of the telescope.
364
+ Defaults to LSST values.
365
+ """
366
+ # ZP_t is the magnitude of a (F_nu flat) source which produced
367
+ # 1 count per second.
368
+ # This is often also known as the 'instrumental zeropoint'.
369
+ # Set gain to 1 if want to explore photo-electrons rather than adu.
370
+ # The typical LSST exposure time is 15s and this is default here,
371
+ # but typical zp_t definition is for 1s.
372
+ # SED class uses flambda in ergs/cm^2/s/nm, so need effarea in cm^2.
373
+ #
374
+ # Check dlambda value for integral.
375
+ self.wavelen[1] - self.wavelen[0]
376
+ # Set up flat source of arbitrary brightness,
377
+ # but where the units of fnu are Jansky (for AB mag zeropoint = -8.9).
378
+ flatsource = Sed()
379
+ flatsource.set_flat_sed()
380
+ adu = flatsource.calc_adu(self, phot_params=photometric_parameters)
381
+ # Scale fnu so that adu is 1 count/expTime.
382
+ flatsource.fnu = flatsource.fnu * (1 / adu)
383
+ # Now need to calculate AB magnitude of the source with this fnu.
384
+ if self.phi is None:
385
+ self.sb_tophi()
386
+ zp_t = flatsource.calc_mag(self)
387
+ return zp_t
388
+
389
+ def calc_eff_wavelen(self):
390
+ """
391
+ Calculate effective wavelengths for filters.
392
+ """
393
+ # This is useful for summary numbers for filters.
394
+ # Calculate effective wavelength of filters.
395
+ if self.phi is None:
396
+ self.sb_tophi()
397
+ effwavelenphi = (self.wavelen * self.phi).sum() / self.phi.sum()
398
+ effwavelensb = (self.wavelen * self.sb).sum() / self.sb.sum()
399
+ return effwavelenphi, effwavelensb
400
+
401
+ def write_throughput(self, filename, print_header=None, write_phi=False):
402
+ """
403
+ Write throughput to a file.
404
+ """
405
+ # Useful if you build a throughput up from components
406
+ # and need to record the combined value.
407
+ f = open(filename, "w")
408
+ # Print header.
409
+ if print_header is not None:
410
+ if not print_header.startswith("#"):
411
+ print_header = "#" + print_header
412
+ f.write(print_header)
413
+ if write_phi:
414
+ if self.phi is None:
415
+ self.sb_tophi()
416
+ print("# Wavelength(nm) Throughput(0-1) Phi", file=f)
417
+ else:
418
+ print("# Wavelength(nm) Throughput(0-1)", file=f)
419
+ # Loop through data, printing out to file.
420
+ for i in range(0, len(self.wavelen), 1):
421
+ if write_phi:
422
+ print(self.wavelen[i], self.sb[i], self.phi[i], file=f)
423
+ else:
424
+ print(self.wavelen[i], self.sb[i], file=f)
425
+ f.close()