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,283 @@
1
+ """MAF slicers to slice into time intervals based on MJD
2
+
3
+ Primarily intended for hourglass plots.
4
+ """
5
+
6
+ # pylint: disable=too-many-arguments
7
+ __all__ = (
8
+ "TimeIntervalSlicer",
9
+ "BlockIntervalSlicer",
10
+ "VisitIntervalSlicer",
11
+ "SlicerNotSetupError",
12
+ )
13
+
14
+ from collections import defaultdict
15
+
16
+ # imports
17
+ from functools import wraps
18
+
19
+ import numpy as np
20
+ import pandas as pd
21
+
22
+ from .base_slicer import BaseSlicer
23
+
24
+
25
+ class SlicerNotSetupError(Exception):
26
+ """Thrown when a slicer is not setup for the method called."""
27
+
28
+
29
+ # interface functions
30
+
31
+ # classes
32
+
33
+
34
+ class TimeIntervalSlicer(BaseSlicer):
35
+ """Base for all time interval slicers.
36
+
37
+ Slices in constant time intervals.
38
+
39
+ Parameters
40
+ ----------
41
+ interval_seconds : `int`
42
+ Duration of slice time intervals, in seconds
43
+ mjd_column_name : `str`
44
+ Name of column on which to slice, must be in units of days
45
+ badval : `float`
46
+ Value to use for bad values in slice
47
+ verbose : `bool`
48
+ Print extra information?
49
+ """
50
+
51
+ def __init__(
52
+ self,
53
+ interval_seconds=90,
54
+ mjd_column_name="observationStartMJD",
55
+ badval=np.nan,
56
+ verbose=False,
57
+ ):
58
+ super().__init__(verbose=verbose, badval=badval)
59
+ self.interval_seconds = interval_seconds
60
+ self.mjd_column_name = mjd_column_name
61
+ self.columns_needed = [mjd_column_name]
62
+ self.sim_idxs = defaultdict(list) # pylint: disable=invalid-name
63
+
64
+ def setup_slicer(self, sim_data, maps=None):
65
+ visit_mjds = sim_data[self.mjd_column_name]
66
+ start_mjd = np.floor(np.min(visit_mjds)).astype(int)
67
+ end_mjd = np.ceil(np.max(visit_mjds)).astype(int)
68
+ interval_days = self.interval_seconds / (24 * 60 * 60.0)
69
+
70
+ mjd_bin_edges = np.arange(start_mjd, end_mjd + interval_days, interval_days)
71
+
72
+ self.sim_idxs.update(
73
+ pd.DataFrame(
74
+ {
75
+ "visit_idx": np.arange(len(visit_mjds)),
76
+ "sid": np.digitize(visit_mjds, mjd_bin_edges),
77
+ }
78
+ )
79
+ .groupby("sid")
80
+ .agg(list)
81
+ .to_dict()["visit_idx"]
82
+ )
83
+
84
+ mjds = np.arange(start_mjd, end_mjd, interval_days)
85
+ self.slice_points["sid"] = np.arange(len(mjds))
86
+ self.slice_points["mjd"] = mjds
87
+ self.slice_points["duration"] = np.full_like(mjds, self.interval_seconds)
88
+ self.nslice = len(mjds)
89
+ self.shape = self.nslice
90
+ self._run_maps(maps)
91
+
92
+ @wraps(self._slice_sim_data)
93
+ def _slice_sim_data(islice): # pylint: disable=invalid-name
94
+ idxs = self.sim_idxs[islice]
95
+
96
+ try:
97
+ _ = idxs[0]
98
+ except (TypeError, IndexError):
99
+ idxs = [idxs]
100
+
101
+ slice_points = {
102
+ "sid": islice,
103
+ "mjd": self.slice_points["mjd"][islice],
104
+ "duration": self.slice_points["duration"][islice],
105
+ }
106
+
107
+ return {"idxs": idxs, "slice_point": slice_points}
108
+
109
+ setattr(self, "_slice_sim_data", _slice_sim_data)
110
+
111
+ def __eq__(self, other_slicer):
112
+ """Evaluate if slicers are equivalent."""
113
+ if not isinstance(other_slicer, self.__class__):
114
+ return False
115
+
116
+ for key in ["sid", "mjd", "duration"]:
117
+ if not np.array_equal(other_slicer.slice_points[key], self.slice_points[key]):
118
+ return False
119
+
120
+ return True
121
+
122
+ def _slice_sim_data(self, *args, **kwargs):
123
+ raise SlicerNotSetupError()
124
+
125
+
126
+ class BlockIntervalSlicer(TimeIntervalSlicer):
127
+ """Slices into intervals with common "note" values and no long gaps.
128
+
129
+ Parameters
130
+ ----------
131
+ mjd_column_name : `str`
132
+ Name of column on which to slice, must be in units of days
133
+ duration_column_name : `str`
134
+ Name of column with the duration of each visit (in seconds)
135
+ note_column_name : `str`
136
+ Name of column with the visit note.
137
+ badval : `float`
138
+ Value to use for bad values in slice
139
+ verbose : `bool`
140
+ Print extra information?
141
+ """
142
+
143
+ # Gap between visits in the same block, in hours
144
+ gap_tolerance = 0.1
145
+
146
+ def __init__(
147
+ self,
148
+ mjd_column_name="observationStartMJD",
149
+ duration_column_name="visitTime",
150
+ note_column_name="scheduler_note",
151
+ badval=np.nan,
152
+ verbose=False,
153
+ ):
154
+ super().__init__(verbose=verbose, badval=badval)
155
+ self.mjd_column_name = mjd_column_name
156
+ self.duration_column_name = duration_column_name
157
+ self.note_column_name = note_column_name
158
+ self.columns_needed = [
159
+ mjd_column_name,
160
+ duration_column_name,
161
+ note_column_name,
162
+ ]
163
+ self.sim_idxs = defaultdict(list) # pylint: disable=invalid-name
164
+
165
+ def setup_slicer(self, sim_data, maps=None):
166
+ visits = pd.DataFrame(
167
+ sim_data,
168
+ index=pd.Index(np.arange(len(sim_data[self.mjd_column_name])), name="visit_idx"),
169
+ )
170
+ visits.rename(
171
+ columns={
172
+ self.mjd_column_name: "mjd",
173
+ self.duration_column_name: "duration",
174
+ self.note_column_name: "scheduler_note",
175
+ },
176
+ inplace=True,
177
+ )
178
+ # convert to hours
179
+ visits.sort_values("mjd", inplace=True)
180
+ visits["end_mjd"] = visits.mjd + visits.duration / (60 * 60 * 24.0)
181
+
182
+ same_note = visits.scheduler_note == visits.scheduler_note.shift(-1)
183
+ adjacent_times = visits.end_mjd + self.gap_tolerance / 24.0 > visits.mjd.shift(-1)
184
+ visits["sid"] = np.logical_not(np.logical_and(same_note, adjacent_times)).cumsum().shift()
185
+ visits.fillna({"sid": 0}, inplace=True)
186
+ visits["sid"] = visits["sid"].astype(int)
187
+
188
+ blocks = visits.groupby("sid").agg(
189
+ mjd=pd.NamedAgg(column="mjd", aggfunc="min"),
190
+ end_mjd=pd.NamedAgg(column="end_mjd", aggfunc="max"),
191
+ )
192
+ blocks["duration"] = (blocks.end_mjd - blocks.mjd) * 24 * 60 * 60
193
+
194
+ self.nslice = len(blocks)
195
+ self.shape = self.nslice
196
+ self.sim_idxs.update(
197
+ visits.reset_index()[["sid", "visit_idx"]].groupby("sid").agg(list).to_dict()["visit_idx"]
198
+ )
199
+
200
+ self.slice_points["sid"] = blocks.reset_index().sid.values
201
+ self.slice_points["mjd"] = blocks.mjd.values
202
+ self.slice_points["duration"] = blocks.duration.values
203
+ self._run_maps(maps)
204
+
205
+ @wraps(self._slice_sim_data)
206
+ def _slice_sim_data(islice): # pylint: disable=invalid-name
207
+ idxs = self.sim_idxs[islice]
208
+
209
+ try:
210
+ _ = idxs[0]
211
+ except TypeError:
212
+ idxs = [idxs]
213
+
214
+ slice_points = {
215
+ "sid": islice,
216
+ "mjd": self.slice_points["mjd"][islice],
217
+ "duration": self.slice_points["duration"][islice],
218
+ }
219
+
220
+ return {"idxs": idxs, "slice_point": slice_points}
221
+
222
+ setattr(self, "_slice_sim_data", _slice_sim_data)
223
+
224
+
225
+ class VisitIntervalSlicer(TimeIntervalSlicer):
226
+ """Slices into intervals each of which contain one visit
227
+
228
+ Parameters
229
+ ----------
230
+ mjd_column_name : `str`
231
+ Name of column on which to slice, must be in units of days
232
+ duration_column_name : `str`
233
+ Name of column with the duration of each visit (in seconds)
234
+ badval : `float`
235
+ Value to use for bad values in slice
236
+ verbose : `bool`
237
+ Print extra information?
238
+ """
239
+
240
+ def __init__(
241
+ self,
242
+ mjd_column_name="observationStartMJD",
243
+ duration_column_name="visitTime",
244
+ extra_column_names=tuple(),
245
+ badval=np.nan,
246
+ verbose=False,
247
+ ):
248
+ super().__init__(verbose=verbose, badval=badval)
249
+ self.mjd_column_name = mjd_column_name
250
+ self.duration_column_name = duration_column_name
251
+ self.extra_column_names = extra_column_names
252
+ self.columns_needed = [mjd_column_name, duration_column_name]
253
+ self.sim_idxs = None # pylint: disable=invalid-name
254
+
255
+ def setup_slicer(self, sim_data, maps=None):
256
+ self.nslice = len(sim_data[self.mjd_column_name])
257
+ self.shape = self.nslice
258
+
259
+ self.sim_idxs = np.argsort(sim_data[self.mjd_column_name])
260
+ self.slice_points["sid"] = np.arange(self.nslice)
261
+ self.slice_points["mjd"] = sim_data[self.mjd_column_name]
262
+ self.slice_points["duration"] = sim_data[self.duration_column_name]
263
+ for column_name in self.extra_column_names:
264
+ self.slice_points[column_name] = sim_data[column_name]
265
+ self._run_maps(maps)
266
+
267
+ @wraps(self._slice_sim_data)
268
+ def _slice_sim_data(islice): # pylint: disable=invalid-name
269
+ idxs = self.sim_idxs[islice]
270
+ slice_points = {
271
+ "sid": [idxs],
272
+ "mjd": self.slice_points["mjd"][islice],
273
+ "duration": self.slice_points["duration"][islice],
274
+ }
275
+ for column_name in self.extra_column_names:
276
+ slice_points[column_name] = self.slice_points[column_name]
277
+
278
+ return {"idxs": idxs, "slice_point": slice_points}
279
+
280
+ setattr(self, "_slice_sim_data", _slice_sim_data)
281
+
282
+
283
+ # internal functions & classes
@@ -0,0 +1,57 @@
1
+ """UniSlicer - no slicing at all, simply return all data points."""
2
+
3
+ __all__ = ("UniSlicer",)
4
+
5
+ from functools import wraps
6
+
7
+ import numpy as np
8
+
9
+ from .base_slicer import BaseSlicer
10
+
11
+
12
+ class UniSlicer(BaseSlicer):
13
+ """UniSlicer."""
14
+
15
+ def __init__(self, verbose=True, badval=-666):
16
+ """Instantiate unislicer."""
17
+ super(UniSlicer, self).__init__(verbose=verbose, badval=badval)
18
+ self.nslice = 1
19
+ self.shape = self.nslice
20
+ self.slice_points["sid"] = np.array(
21
+ [
22
+ 0,
23
+ ],
24
+ int,
25
+ )
26
+ self.plot_funcs = []
27
+
28
+ def setup_slicer(self, sim_data, maps=None):
29
+ """Use sim_data to set indexes to return."""
30
+ self._run_maps(maps)
31
+ sim_dataCol = sim_data.dtype.names[0]
32
+ self.indices = np.ones(len(sim_data[sim_dataCol]), dtype="bool")
33
+
34
+ @wraps(self._slice_sim_data)
35
+ def _slice_sim_data(islice):
36
+ """Return all indexes in sim_data."""
37
+ idxs = self.indices
38
+ slice_point = {"sid": islice}
39
+ for key in self.slice_points:
40
+ if len(np.shape(self.slice_points[key])) == 0:
41
+ keyShape = 0
42
+ else:
43
+ keyShape = np.shape(self.slice_points[key])[0]
44
+ if keyShape == self.nslice:
45
+ slice_point[key] = self.slice_points[key][islice]
46
+ else:
47
+ slice_point[key] = self.slice_points[key]
48
+ return {"idxs": idxs, "slice_point": slice_point}
49
+
50
+ setattr(self, "_slice_sim_data", _slice_sim_data)
51
+
52
+ def __eq__(self, other_slicer):
53
+ """Evaluate if slicers are equivalent."""
54
+ if isinstance(other_slicer, UniSlicer):
55
+ return True
56
+ else:
57
+ return False
@@ -0,0 +1,141 @@
1
+ __all__ = ("UserPointsSlicer",)
2
+
3
+ import numpy as np
4
+ from astropy import units as u
5
+ from astropy.coordinates import SkyCoord
6
+
7
+ from rubin_sim.maf.plots.spatial_plotters import BaseHistogram, BaseSkyMap
8
+
9
+ from .base_spatial_slicer import BaseSpatialSlicer
10
+
11
+
12
+ class UserPointsSlicer(BaseSpatialSlicer):
13
+ """A spatial slicer based on a user-provided list of points.
14
+ The data_slices returned are the visit pointings which overlap
15
+ each of these points.
16
+
17
+ Parameters
18
+ ----------
19
+ ra : `list` or `numpy.ndarray`
20
+ User-selected RA points, in degrees. Stored internally in radians.
21
+ dec : `list` or `numpy.ndarray`
22
+ User-selected Dec points, in degrees. Stored internally in radians.
23
+ lon_col : `str`, optional
24
+ Name of the longitude (RA equivalent) column in the input data.
25
+ Default fieldRA
26
+ lat_col : `str`, optional
27
+ Name of the latitude (Dec equivalent) column in the input data.
28
+ Default fieldDec
29
+ latLonDeg : `bool`, optional
30
+ Flag indicating whether the lon and lat values will be in
31
+ degrees (True) or radians (False).
32
+ Default True.
33
+ verbose : `bool`, optional
34
+ Flag to indicate whether or not to write additional
35
+ information to stdout during runtime.
36
+ Default True.
37
+ badval : `float`, optional
38
+ Bad value flag, relevant for plotting. Default -666.
39
+ leafsize : `int`, optional
40
+ Leafsize value for kdtree. Default 100.
41
+ radius : `float`, optional
42
+ Radius for matching in the kdtree.
43
+ Equivalent to the radius of the FOV. Degrees.
44
+ Default 2.45.
45
+ use_camera : `bool`, optional
46
+ Flag to indicate whether to use the LSST camera footprint or not.
47
+ Default True.
48
+ camera_radius : `float`, optional
49
+ max_radius for the LsstCameraFootprint (degrees).
50
+ camera_footprint_file : `str`, optional
51
+ Name of the camera footprint map to use.
52
+ Can be None, which will use the default.
53
+ rotSkyPosColName : `str`, optional
54
+ Name of the rotSkyPos column in the input data.
55
+ Only used if use_camera is True.
56
+ Describes the camera orientation compared to the sky.
57
+ Default rotSkyPos.
58
+ """
59
+
60
+ def __init__(
61
+ self,
62
+ ra,
63
+ dec,
64
+ lon_col="fieldRA",
65
+ lat_col="fieldDec",
66
+ lat_lon_deg=True,
67
+ verbose=True,
68
+ badval=-666,
69
+ leafsize=100,
70
+ radius=2.45,
71
+ use_camera=True,
72
+ camera_radius=1.94,
73
+ camera_footprint_file=None,
74
+ rot_sky_pos_col_name="rotSkyPos",
75
+ ):
76
+ super().__init__(
77
+ lon_col=lon_col,
78
+ lat_col=lat_col,
79
+ lat_lon_deg=lat_lon_deg,
80
+ verbose=verbose,
81
+ badval=badval,
82
+ radius=radius,
83
+ leafsize=leafsize,
84
+ use_camera=use_camera,
85
+ camera_radius=camera_radius,
86
+ camera_footprint_file=camera_footprint_file,
87
+ rot_sky_pos_col_name=rot_sky_pos_col_name,
88
+ )
89
+ # check that ra and dec are iterable,
90
+ # if not, they are probably naked numbers, wrap in list
91
+ if not hasattr(ra, "__iter__"):
92
+ ra = [ra]
93
+ if not hasattr(dec, "__iter__"):
94
+ dec = [dec]
95
+ if len(ra) != len(dec):
96
+ raise ValueError("RA and Dec must be the same length")
97
+ ra = np.radians(ra)
98
+ dec = np.radians(dec)
99
+ self.slice_points["sid"] = np.arange(np.size(ra))
100
+ self.slice_points["ra"] = np.array(ra)
101
+ self.slice_points["dec"] = np.array(dec)
102
+ c = SkyCoord(ra=self.slice_points["ra"] * u.rad, dec=self.slice_points["dec"] * u.rad).transform_to(
103
+ "galactic"
104
+ )
105
+ gall, galb = c.l.rad, c.b.rad
106
+ self.slice_points["gall"] = gall
107
+ self.slice_points["galb"] = galb
108
+
109
+ self.nslice = np.size(ra)
110
+ self.shape = self.nslice
111
+ self.slicer_init = {
112
+ "ra": ra,
113
+ "dec": dec,
114
+ "lon_col": lon_col,
115
+ "lat_col": lat_col,
116
+ "radius": radius,
117
+ }
118
+ self.plot_funcs = [BaseSkyMap, BaseHistogram]
119
+
120
+ def __eq__(self, other_slicer):
121
+ """Evaluate if two slicers are equivalent."""
122
+ result = False
123
+ # check the slice_points
124
+ for key in other_slicer.slice_points:
125
+ if key in self.slice_points.keys():
126
+ if not np.array_equal(other_slicer.slice_points[key], self.slice_points[key]):
127
+ return False
128
+ else:
129
+ return False
130
+ if isinstance(other_slicer, UserPointsSlicer):
131
+ if other_slicer.nslice == self.nslice:
132
+ if np.array_equal(
133
+ other_slicer.slice_points["ra"], self.slice_points["ra"]
134
+ ) and np.array_equal(other_slicer.slice_points["dec"], self.slice_points["dec"]):
135
+ if other_slicer.lon_col == self.lon_col and other_slicer.lat_col == self.lat_col:
136
+ if other_slicer.radius == self.radius:
137
+ if other_slicer.use_camera == self.use_camera:
138
+ if other_slicer.rotSkyPosColName == self.rotSkyPosColName:
139
+ if np.array_equal(other_slicer.shape, self.shape):
140
+ result = True
141
+ return result
@@ -0,0 +1,13 @@
1
+ from .base_stacker import *
2
+ from .coord_stackers import *
3
+ from .date_stackers import *
4
+ from .general_stackers import *
5
+ from .get_col_info import *
6
+ from .label_stackers import *
7
+ from .m5_optimal_stacker import *
8
+ from .mo_stackers import *
9
+ from .n_follow_stacker import *
10
+ from .neo_dist_stacker import *
11
+ from .sdss_stackers import *
12
+ from .sn_stacker import *
13
+ from .teff_stacker import *