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,186 @@
1
+ __all__ = ("PeriodicStar", "PeriodicStarMetric")
2
+
3
+ import warnings
4
+
5
+ import numpy as np
6
+ from scipy.optimize import curve_fit
7
+
8
+ from rubin_sim.maf.metrics.base_metric import BaseMetric
9
+ from rubin_sim.maf.utils import m52snr
10
+
11
+
12
+ class PeriodicStar:
13
+ def __init__(self, filternames):
14
+ self.filternames = filternames
15
+
16
+ def __call__(self, t, x0, x1, x2, x3, x4, x5, x6, x7, x8):
17
+ """Approximate a periodic star as a simple sin wave.
18
+ t: array with "time" in days, and "filter" dtype names.
19
+ x0: Period (days)
20
+ x1: Phase (days)
21
+ x2: Amplitude (mag)
22
+ x3: mean u mag
23
+ x4: mean g mag
24
+ x5: mean r mag
25
+ x6: mean i mag
26
+ x7: mean z mag
27
+ x8: mean y mag
28
+ """
29
+ filter2index = {"u": 3, "g": 4, "r": 5, "i": 6, "z": 7, "y": 8}
30
+ filter_names = np.unique(self.filternames)
31
+ mags = x2 * np.sin((t + x1) / x0 * 2.0 * np.pi)
32
+ x = [x0, x1, x2, x3, x4, x5, x6, x7, x8]
33
+ for f in filter_names:
34
+ good = np.where(self.filternames == f)
35
+ mags[good] += x[filter2index[f]]
36
+ return mags
37
+
38
+
39
+ class PeriodicStarMetric(BaseMetric):
40
+ """At each slice_point, run a Monte Carlo simulation to see how
41
+ well a periodic source can be fit. Assumes a simple sin-wave light-curve,
42
+ and generates Gaussain noise based in the 5-sigma limiting depth
43
+ of each observation.
44
+
45
+ Parameters
46
+ ----------
47
+ period : `float`
48
+ The period to check, in days.
49
+ amplitude : `float`
50
+ The amplitude of the sinusoidal light curve, in mags.
51
+ phase : `float`
52
+ The phase of the lightcurve at the time of the first observation.
53
+ n_monte : `int`
54
+ The number of noise realizations to make in the Monte Carlo.
55
+ period_tol : `float`
56
+ The fractional tolerance on the period to require in order for a star
57
+ to be considered well-fit
58
+ amp_tol : `float`
59
+ The fractional tolerance on the amplitude.
60
+ means : `list` [`float`]
61
+ The mean magnitudes in ugrizy of the star.
62
+ mag_tol : `float`
63
+ The mean magnitude tolerance, in magnitudes, for the star to be
64
+ considered well-fit.
65
+ n_bands : `int`
66
+ Number of bands that must be within mag_tol.
67
+ seed : `int`
68
+ Random number seed for the noise realizations.
69
+ """
70
+
71
+ def __init__(
72
+ self,
73
+ metric_name="PeriodicStarMetric",
74
+ mjd_col="observationStartMJD",
75
+ m5_col="fiveSigmaDepth",
76
+ filter_col="band",
77
+ period=10.0,
78
+ amplitude=0.5,
79
+ phase=2.0,
80
+ n_monte=1000,
81
+ period_tol=0.05,
82
+ amp_tol=0.10,
83
+ means=[20.0, 20.0, 20.0, 20.0, 20.0, 20.0],
84
+ mag_tol=0.10,
85
+ n_bands=3,
86
+ seed=42,
87
+ **kwargs,
88
+ ):
89
+ """
90
+ period: days (default 10)
91
+ amplitude: mags (default 1)
92
+ n_monte: number of noise realizations to make in the Monte Carlo
93
+ period_tol: fractional tolerance on the period to demand for a star
94
+ to be considered well-fit
95
+ amp_tol: fractional tolerance on the amplitude to demand
96
+ means: mean magnitudes for ugrizy
97
+ mag_tol: Mean magnitude tolerance (mags)
98
+ n_bands: Number of bands that must be within mag_tol
99
+ seed: random number seed
100
+ """
101
+ self.mjd_col = mjd_col
102
+ self.m5_col = m5_col
103
+ self.filter_col = filter_col
104
+ super(PeriodicStarMetric, self).__init__(
105
+ col=[self.mjd_col, self.m5_col, self.filter_col],
106
+ units="Fraction Detected",
107
+ metric_name=metric_name,
108
+ **kwargs,
109
+ )
110
+ self.period = period
111
+ self.amplitude = amplitude
112
+ self.phase = phase
113
+ self.n_monte = n_monte
114
+ self.period_tol = period_tol
115
+ self.amp_tol = amp_tol
116
+ self.means = np.array(means)
117
+ self.mag_tol = mag_tol
118
+ self.n_bands = n_bands
119
+ np.random.seed(seed)
120
+ self.filter2index = {"u": 3, "g": 4, "r": 5, "i": 6, "z": 7, "y": 8}
121
+
122
+ def run(self, data_slice, slice_point=None):
123
+ # Bail if we don't have enough points
124
+ # (need to fit mean magnitudes in each of the available bands -
125
+ # self.means and for a period, amplitude, and phase)
126
+ if data_slice.size < self.means.size + 3:
127
+ return self.badval
128
+
129
+ # Generate input for true light curve
130
+ t = np.empty(data_slice.size, dtype=list(zip(["time", "filter"], [float, "|U1"])))
131
+ t["time"] = data_slice[self.mjd_col] - data_slice[self.mjd_col].min()
132
+ t["filter"] = data_slice[self.filter_col]
133
+
134
+ # If we are adding a distance modulus to the magnitudes
135
+ if "distMod" in list(slice_point.keys()):
136
+ mags = self.means + slice_point["distMod"]
137
+ else:
138
+ mags = self.means
139
+ true_params = np.append(np.array([self.period, self.phase, self.amplitude]), mags)
140
+ true_obj = PeriodicStar(t["filter"])
141
+ true_lc = true_obj(t["time"], *true_params)
142
+
143
+ # Array to hold the fit results
144
+ fits = np.zeros((self.n_monte, true_params.size), dtype=float)
145
+ for i in np.arange(self.n_monte):
146
+ snr = m52snr(true_lc, data_slice[self.m5_col])
147
+ dmag = 2.5 * np.log10(1.0 + 1.0 / snr)
148
+ noise = np.random.randn(true_lc.size) * dmag
149
+ # Suppress warnings about failing on covariance
150
+ fit_obj = PeriodicStar(t["filter"])
151
+ with warnings.catch_warnings():
152
+ warnings.simplefilter("ignore")
153
+ # If it fails to converge, save values that should fail later
154
+ try:
155
+ parm_vals, pcov = curve_fit(
156
+ fit_obj, t["time"], true_lc + noise, p0=true_params, sigma=dmag
157
+ )
158
+ except RuntimeError:
159
+ parm_vals = true_params * 0 + np.inf
160
+ fits[i, :] = parm_vals
161
+
162
+ # Throw out any magnitude fits if there are no observations
163
+ # in that filter
164
+ ufilters = np.unique(data_slice[self.filter_col])
165
+ if ufilters.size < 9:
166
+ for key in list(self.filter2index.keys()):
167
+ if key not in ufilters:
168
+ fits[:, self.filter2index[key]] = -np.inf
169
+
170
+ # Find the fraction of fits that meet the "well-fit" criteria
171
+ period_frac_err = np.abs((fits[:, 0] - true_params[0]) / true_params[0])
172
+ amp_frac_err = np.abs((fits[:, 2] - true_params[2]) / true_params[2])
173
+ mag_err = np.abs(fits[:, 3:] - true_params[3:])
174
+ n_bands = np.zeros(mag_err.shape, dtype=int)
175
+ n_bands[np.where(mag_err <= self.mag_tol)] = 1
176
+ n_bands = np.sum(n_bands, axis=1)
177
+ n_recovered = np.size(
178
+ np.where(
179
+ (period_frac_err <= self.period_tol)
180
+ & (amp_frac_err <= self.amp_tol)
181
+ & (n_bands >= self.n_bands)
182
+ )[0]
183
+ )
184
+ frac_recovered = float(n_recovered) / self.n_monte
185
+
186
+ return frac_recovered
@@ -0,0 +1,236 @@
1
+ __all__ = ("PeriodicStarModulationMetric",)
2
+
3
+ import random
4
+ import warnings
5
+
6
+ import numpy as np
7
+ from scipy.optimize import curve_fit
8
+
9
+ from rubin_sim.maf.metrics.base_metric import BaseMetric
10
+ from rubin_sim.maf.utils import m52snr
11
+
12
+ from .periodic_star_metric import PeriodicStar
13
+
14
+ """ This metric is based on the PeriodicStar metric
15
+ It was modified in a way to reproduce attempts to identify
16
+ phase modulation (Blazhko effect) in RR Lyrae stars.
17
+ We are not implementing a period/ phase modulation in the light curve,
18
+ but rather use short baselines (e.g.: 20 days) of observations to test
19
+ how well we can recover the period, phase and amplitude.
20
+ We do this as such an attempt is also useful for other purposes,
21
+ i.e. if we want to test whether we can just recover period, phase
22
+ and amplitude from short baselines at all, without necessarily having
23
+ in mind to look for period/ phase modulations.
24
+ Like in the PeriodicStar metric, the light curve of an RR Lyrae star,
25
+ or a periodic star in general, is approximated as a simple sin wave.
26
+ Other solutions might make use of light curve templates
27
+ to generate light curves.
28
+ Two other modifications we introduced are:
29
+ In contrast to the PeriodicStar metric, we allow for a random phase
30
+ offset to mimic observation starting at random phase.
31
+ Also, we vary the periods and amplitudes within +/- 10 % to allow
32
+ for a more realistic sample of variable stars.
33
+
34
+ This metric is based on the cadence note:
35
+ N. Hernitschek, K. Stassun, LSST Cadence Note:
36
+ "Cadence impacts on reliable classification of standard-candle
37
+ variable stars (2021)"
38
+ https://docushare.lsst.org/docushare/dsweb/Get/Document-37673
39
+ """
40
+
41
+
42
+ class PeriodicStarModulationMetric(BaseMetric):
43
+ """Evaluate how well a periodic source can be fit on a short baseline,
44
+ using a Monte Carlo simulation.
45
+
46
+ At each slice_point, run a Monte Carlo simulation to see how well a
47
+ periodic source can be fit.
48
+ Assumes a simple sin-wave light-curve, and generates Gaussain noise
49
+ based in the 5-sigma limiting depth of each observation.
50
+ Light curves are evaluated piecewise to test how well we can recover
51
+ the period, phase and amplitude from shorter baselines.
52
+ We allow for a random phase offset to mimic observation starting
53
+ at random phase. Also, we vary the periods and amplitudes
54
+ within +/- 10 % to allow for a more realistic sample of variable stars.
55
+
56
+ Parameters
57
+ ----------
58
+ period : `float`, opt
59
+ days (default 10)
60
+ amplitude : `float`, opt
61
+ mags (default 0.5)
62
+ phase : `float`, opt
63
+ days (default 2.)
64
+ random_phase : `bool`, opt
65
+ a random phase is assigned (default False)
66
+ time_interval : `float`, opt
67
+ days (default 50);
68
+ the interval over which we want to evaluate the light curve
69
+ n_monte : `int`, opt
70
+ number of noise realizations to make in the Monte Carlo (default 1000)
71
+ period_tol : `float`, opt
72
+ fractional tolerance on the period to demand
73
+ for a star to be considered well-fit (default 0.05)
74
+ amp_tol : `float`, opt
75
+ fractional tolerance on the amplitude to demand (default 0.10)
76
+ means : `list` of `float`, opt
77
+ mean magnitudes for ugrizy (default all 20)
78
+ mag_tol : `float`, opt
79
+ Mean magnitude tolerance (mags) (default 0.1)
80
+ n_bands : `int`, opt
81
+ Number of bands that must be within mag_tol (default 3)
82
+ seed : `int`, opt
83
+ random number seed (default 42)
84
+ """
85
+
86
+ def __init__(
87
+ self,
88
+ metric_name="PeriodicStarModulationMetric",
89
+ mjd_col="observationStartMJD",
90
+ m5_col="fiveSigmaDepth",
91
+ filter_col="band",
92
+ period=10.0,
93
+ amplitude=0.5,
94
+ phase=2.0,
95
+ random_phase=False,
96
+ time_interval=50,
97
+ n_monte=1000,
98
+ period_tol=0.05,
99
+ amp_tol=0.10,
100
+ means=[20.0, 20.0, 20.0, 20.0, 20.0, 20.0],
101
+ mag_tol=0.10,
102
+ n_bands=3,
103
+ seed=42,
104
+ **kwargs,
105
+ ):
106
+ self.mjd_col = mjd_col
107
+ self.m5_col = m5_col
108
+ self.filter_col = filter_col
109
+ super(PeriodicStarModulationMetric, self).__init__(
110
+ col=[self.mjd_col, self.m5_col, self.filter_col],
111
+ units="Fraction Detected",
112
+ metric_name=metric_name,
113
+ **kwargs,
114
+ )
115
+ self.period = period
116
+ self.amplitude = amplitude
117
+ self.time_interval = time_interval
118
+ if random_phase:
119
+ self.phase = np.nan
120
+ else:
121
+ self.phase = phase
122
+ self.n_monte = n_monte
123
+ self.period_tol = period_tol
124
+ self.amp_tol = amp_tol
125
+ self.means = np.array(means)
126
+ self.mag_tol = mag_tol
127
+ self.n_bands = n_bands
128
+ np.random.seed(seed)
129
+ self.filter2index = {"u": 3, "g": 4, "r": 5, "i": 6, "z": 7, "y": 8}
130
+
131
+ def run(self, data_slice, slice_point=None):
132
+ # Bail if we don't have enough points
133
+ # (need to fit mean magnitudes in each of the available bands
134
+ # - self.means and for a period, amplitude, and phase)
135
+ if data_slice.size < self.means.size + 3:
136
+ return self.badval
137
+
138
+ # Generate input for true light curve
139
+
140
+ lightcurvelength = data_slice.size
141
+
142
+ t = np.empty(lightcurvelength, dtype=list(zip(["time", "filter"], [float, "|U1"])))
143
+ t["time"] = data_slice[self.mjd_col] - data_slice[self.mjd_col].min()
144
+ t["filter"] = data_slice[self.filter_col]
145
+ m5 = data_slice[self.m5_col]
146
+
147
+ lightcurvelength_days = self.time_interval
148
+
149
+ # evaluate light curves piecewise in subruns
150
+ subruns = int(np.max(t["time"]) / lightcurvelength_days)
151
+
152
+ # print('number of subruns: ', subruns)
153
+ frac_recovered_list = []
154
+
155
+ for subrun_idx in range(0, subruns):
156
+ good = (t["time"] >= (lightcurvelength_days * (subrun_idx))) & (
157
+ t["time"] <= (lightcurvelength_days * (subrun_idx + 1))
158
+ )
159
+ t_subrun = t[good]
160
+ m5_subrun = m5[good]
161
+ if t_subrun["time"].size > 0:
162
+ # If we are adding a distance modulus to the magnitudes
163
+ if "distMod" in list(slice_point.keys()):
164
+ mags = self.means + slice_point["distMod"]
165
+ else:
166
+ mags = self.means
167
+ # slightly different periods and amplitudes (+/- 10 %)
168
+ # to mimic true stars. random phase offsets to mimic
169
+ # observation starting at random phase
170
+ true_period = random.uniform(0.9, 1.1) * self.period
171
+ true_amplitude = random.uniform(0.9, 1.1) * self.amplitude
172
+ if np.isnan(self.phase):
173
+ # a random phase (in days) should be assigned
174
+ true_phase = random.uniform(0, 1) * self.period
175
+ else:
176
+ true_phase = self.phase
177
+
178
+ true_params = np.append(np.array([true_period, true_phase, true_amplitude]), mags)
179
+ true_obj = PeriodicStar(t_subrun["filter"])
180
+ true_lc = true_obj(t_subrun["time"], *true_params)
181
+
182
+ # Array to hold the fit results
183
+ fits = np.zeros((self.n_monte, true_params.size), dtype=float)
184
+ for i in np.arange(self.n_monte):
185
+ snr = m52snr(true_lc, m5_subrun)
186
+ dmag = 2.5 * np.log10(1.0 + 1.0 / snr)
187
+ noise = np.random.randn(true_lc.size) * dmag
188
+ # Suppress warnings about failing on covariance
189
+ fit_obj = PeriodicStar(t_subrun["filter"])
190
+ # check if we have enough points
191
+ if np.size(true_params) >= np.size(fit_obj):
192
+ parm_vals = true_params * 0 + np.inf
193
+ else:
194
+ with warnings.catch_warnings():
195
+ warnings.simplefilter("ignore")
196
+ # If it fails to converge,
197
+ # save values that should fail later
198
+ try:
199
+ parm_vals, pcov = curve_fit(
200
+ fit_obj,
201
+ t_subrun["time"],
202
+ true_lc + noise,
203
+ p0=true_params,
204
+ sigma=dmag,
205
+ )
206
+ except RuntimeError:
207
+ parm_vals = true_params * 0 + np.inf
208
+ fits[i, :] = parm_vals
209
+
210
+ # Throw out any magnitude fits if there are no
211
+ # observations in that filter
212
+ ufilters = np.unique(data_slice[self.filter_col])
213
+ if ufilters.size < 9:
214
+ for key in list(self.filter2index.keys()):
215
+ if key not in ufilters:
216
+ fits[:, self.filter2index[key]] = -np.inf
217
+
218
+ # Find the fraction of fits that meet the "well-fit" criteria
219
+ period_frac_err = np.abs((fits[:, 0] - true_params[0]) / true_params[0])
220
+ amp_frac_err = np.abs((fits[:, 2] - true_params[2]) / true_params[2])
221
+ mag_err = np.abs(fits[:, 3:] - true_params[3:])
222
+ n_bands = np.zeros(mag_err.shape, dtype=int)
223
+ n_bands[np.where(mag_err <= self.mag_tol)] = 1
224
+ n_bands = np.sum(n_bands, axis=1)
225
+ n_recovered = np.size(
226
+ np.where(
227
+ (period_frac_err <= self.period_tol)
228
+ & (amp_frac_err <= self.amp_tol)
229
+ & (n_bands >= self.n_bands)
230
+ )[0]
231
+ )
232
+ frac_recovered = float(n_recovered) / self.n_monte
233
+ frac_recovered_list.append(frac_recovered)
234
+
235
+ frac_recovered = np.sum(frac_recovered_list) / (len(frac_recovered_list))
236
+ return frac_recovered