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,126 @@
1
+ __all__ = ("NEODistStacker",)
2
+
3
+ import numpy as np
4
+
5
+ from .base_stacker import BaseStacker
6
+
7
+
8
+ class NEODistStacker(BaseStacker):
9
+ """
10
+ For each observation, find the max distance to a ~144 km NEO,
11
+ also stack on the x,y position of the object.
12
+ """
13
+
14
+ cols_added = ["MaxGeoDist", "NEOHelioX", "NEOHelioY"]
15
+
16
+ def __init__(
17
+ self,
18
+ stepsize=0.001,
19
+ max_dist=3.0,
20
+ min_dist=0.3,
21
+ H=22,
22
+ elong_col="solarElong",
23
+ filter_col="filter",
24
+ sun_az_col="sunAz",
25
+ az_col="azimuth",
26
+ m5_col="fiveSigmaDepth",
27
+ ):
28
+ """
29
+ stepsize: The stepsize to use when solving (in AU)
30
+ max_dist: How far out to try and measure (in AU)
31
+ H: Asteroid magnitude
32
+
33
+ Adds columns:
34
+ MaxGeoDist: Geocentric distance to the NEO
35
+ NEOHelioX: Heliocentric X (with Earth at x,y,z (0,1,0))
36
+ NEOHelioY: Heliocentric Y (with Earth at (0,1,0))
37
+
38
+ Note that both opsim v3 and v4 report solarElongation in degrees.
39
+ """
40
+ self.units = ["AU", "AU", "AU"]
41
+ # Also grab things needed for the HA stacker
42
+ self.cols_req = [elong_col, filter_col, sun_az_col, az_col, m5_col]
43
+
44
+ self.sun_az_col = sun_az_col
45
+ self.elong_col = elong_col
46
+ self.filter_col = filter_col
47
+ self.az_col = az_col
48
+ self.m5_col = m5_col
49
+
50
+ self.H = H
51
+ # Magic numbers (Ivezic '15, private comm.)that convert an asteroid
52
+ # V-band magnitude to LSST filters:
53
+ # V_5 = m_5 + (adjust value)
54
+ self.limiting_adjust = {
55
+ "u": -2.1,
56
+ "g": -0.5,
57
+ "r": 0.2,
58
+ "i": 0.4,
59
+ "z": 0.6,
60
+ "y": 0.6,
61
+ }
62
+ self.deltas = np.arange(min_dist, max_dist + stepsize, stepsize)
63
+ self.G = 0.15
64
+
65
+ # Magic numbers from http://adsabs.harvard.edu/abs/2002AJ....124.1776J
66
+ self.a1 = 3.33
67
+ self.b1 = 0.63
68
+ self.a2 = 1.87
69
+ self.b2 = 1.22
70
+
71
+ def _run(self, sim_data, cols_present=False):
72
+ if cols_present:
73
+ # This is a pretty rare stacker. Assume we need to rerun
74
+ pass
75
+ elong_rad = np.radians(sim_data[self.elong_col])
76
+ v5 = np.zeros(sim_data.size, dtype=float) + sim_data[self.m5_col]
77
+ for filter_name in self.limiting_adjust:
78
+ fmatch = np.where(sim_data[self.filter_col] == filter_name)
79
+ v5[fmatch] += self.limiting_adjust[filter_name]
80
+ for i, elong in enumerate(elong_rad):
81
+ # Law of cosines:
82
+ # Heliocentric Radius of the object
83
+ R = np.sqrt(1.0 + self.deltas**2 - 2.0 * self.deltas * np.cos(elong))
84
+ # Angle between sun and earth as seen by NEO
85
+ alphas = np.arccos((1.0 - R**2 - self.deltas**2) / (-2.0 * self.deltas * R))
86
+ ta2 = np.tan(alphas / 2.0)
87
+ phi1 = np.exp(-self.a1 * ta2**self.b1)
88
+ phi2 = np.exp(-self.a2 * ta2**self.b2)
89
+
90
+ alpha_term = 2.5 * np.log10((1.0 - self.G) * phi1 + self.G * phi2)
91
+ appmag = self.H + 5.0 * np.log10(R * self.deltas) - alpha_term
92
+ # There can be some local minima/maxima when solving, so
93
+ # need to find the *1st* spot where it is too faint, not the
94
+ # last spot it is bright enough.
95
+ too_faint = np.where(appmag > v5[i])
96
+
97
+ # Check that there is a minimum
98
+ if np.size(too_faint[0]) == 0:
99
+ sim_data["MaxGeoDist"][i] = 0
100
+ else:
101
+ sim_data["MaxGeoDist"][i] = np.min(self.deltas[too_faint])
102
+
103
+ # Make coords in heliocentric
104
+ interior = np.where(elong_rad <= np.pi / 2.0)
105
+ outer = np.where(elong_rad > np.pi / 2.0)
106
+ sim_data["NEOHelioX"][interior] = sim_data["MaxGeoDist"][interior] * np.sin(elong_rad[interior])
107
+ sim_data["NEOHelioY"][interior] = (
108
+ -sim_data["MaxGeoDist"][interior] * np.cos(elong_rad[interior]) + 1.0
109
+ )
110
+
111
+ sim_data["NEOHelioX"][outer] = sim_data["MaxGeoDist"][outer] * np.sin(np.pi - elong_rad[outer])
112
+ sim_data["NEOHelioY"][outer] = sim_data["MaxGeoDist"][outer] * np.cos(np.pi - elong_rad[outer]) + 1.0
113
+
114
+ # Flip the X coord if sun az is negative?
115
+ if sim_data[self.az_col].min() < -np.pi / 2.0:
116
+ halfval = 180.0
117
+ else:
118
+ halfval = np.pi
119
+ flip = np.where(
120
+ ((sim_data[self.sun_az_col] > halfval) & (sim_data[self.az_col] > halfval))
121
+ | ((sim_data[self.sun_az_col] < halfval) & (sim_data[self.az_col] > halfval))
122
+ )
123
+
124
+ sim_data["NEOHelioX"][flip] *= -1.0
125
+
126
+ return sim_data
@@ -0,0 +1,30 @@
1
+ __all__ = ("SdssRADecStacker",)
2
+
3
+
4
+ import numpy as np
5
+
6
+ from .base_stacker import BaseStacker
7
+ from .coord_stackers import wrap_ra
8
+
9
+
10
+ class SdssRADecStacker(BaseStacker):
11
+ """convert the p1,p2,p3... columns to radians and wrap them"""
12
+
13
+ cols_added = ["RA1", "Dec1", "RA2", "Dec2", "RA3", "Dec3", "RA4", "Dec4"]
14
+
15
+ def __init__(self, pcols=["p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8"]):
16
+ """The p1,p2 columns represent the corners of chips.
17
+ Could generalize this a bit."""
18
+ self.units = ["rad"] * 8
19
+ self.cols_req = pcols
20
+
21
+ def _run(self, sim_data, cols_present=False):
22
+ if cols_present:
23
+ # Assume this is unusual enough to run that you really mean it.
24
+ pass
25
+ for pcol, newcol in zip(self.cols_req, self.cols_added):
26
+ if newcol[0:2] == "RA":
27
+ sim_data[newcol] = wrap_ra(np.radians(sim_data[pcol]))
28
+ else:
29
+ sim_data[newcol] = np.radians(sim_data[pcol])
30
+ return sim_data
@@ -0,0 +1,152 @@
1
+ __all__ = ("CoaddStacker",)
2
+
3
+ import numpy as np
4
+
5
+ from rubin_sim.maf.stackers import BaseStacker
6
+
7
+
8
+ class CoaddStacker(BaseStacker):
9
+ """Stacker to estimate m5 "coadded" per band and par night
10
+
11
+ Parameters
12
+ ----------
13
+ mjd_col : `str`, optional
14
+ Name of the MJD column
15
+ ra_col : `str`, optional
16
+ Name of the RA column
17
+ dec_col : `str`, optional
18
+ Name of the Dec column
19
+ m5_col : `str`, optional
20
+ Name of the m5 column
21
+ filter_col : `str`, optional
22
+ Name of the filter column
23
+ night_col : `str`, optional
24
+ Name of the night column
25
+ num_exposures_col : `str`, optional
26
+ Name of the number of exposures per visit column
27
+ visit_time_col : `str`, optional
28
+ Name of the total visit time column
29
+ visit_exposure_time_col : `str`, optional
30
+ Name of the on-sky exposure time column
31
+ """
32
+
33
+ cols_added = ["coadd"]
34
+
35
+ def __init__(
36
+ self,
37
+ mjd_col="observationStartMJD",
38
+ ra_col="fieldRA",
39
+ dec_col="fieldDec",
40
+ m5_col="fiveSigmaDepth",
41
+ filter_col="band",
42
+ night_col="night",
43
+ num_exposures_col="numExposures",
44
+ visit_time_col="visitTime",
45
+ visit_exposure_time_col="visitExposureTime",
46
+ ):
47
+ self.cols_req = [
48
+ mjd_col,
49
+ ra_col,
50
+ dec_col,
51
+ m5_col,
52
+ filter_col,
53
+ night_col,
54
+ num_exposures_col,
55
+ visit_time_col,
56
+ visit_exposure_time_col,
57
+ ]
58
+ self.ra_col = ra_col
59
+ self.dec_col = dec_col
60
+ self.night_col = night_col
61
+ self.filter_col = filter_col
62
+ self.m5_col = m5_col
63
+ self.num_exposures_col = num_exposures_col
64
+ self.visit_time_col = visit_time_col
65
+ self.visit_exposure_time_col = visit_exposure_time_col
66
+
67
+ self.units = ["int"]
68
+
69
+ def _run(self, sim_data, cols_present=False):
70
+ if cols_present:
71
+ # Column already present in data; assume it is correct
72
+ # and does not need recalculating.
73
+ return sim_data
74
+ self.dtype = sim_data.dtype
75
+ r = []
76
+ for ra, dec, band in np.unique(sim_data[[self.ra_col, self.dec_col, self.filter_col]]):
77
+ idx = np.abs(sim_data[self.ra_col] - ra) < 1.0e-5
78
+ idx &= np.abs(sim_data[self.dec_col] - dec) < 1.0e-5
79
+ idx &= sim_data[self.filter_col] == band
80
+
81
+ sel = sim_data[idx]
82
+ for night in np.unique(sel[self.night_col]):
83
+ idxb = sel[self.night_col] == night
84
+ r.append(tuple(self.fill(sel[idxb])))
85
+
86
+ myarray = np.array(r, dtype=self.dtype)
87
+ return myarray
88
+
89
+ def fill(self, tab):
90
+ """Estimation of new fields (m5 "coadded" values, ...)
91
+
92
+ Parameters
93
+ ---------------
94
+ tab : array of (initial) data
95
+
96
+
97
+ Returns
98
+ -----------
99
+ tuple with modified field values:
100
+ - m5Col: "coadded" m5
101
+ - numExposuresCol: sum of numExposuresCol
102
+ - visitTimeCol: sum of visitTimeCol
103
+ - visitExposureTimeCol: sum of visitExposureTimeCol
104
+ - all other input fields except band (Ra, Dec, night) : median(field)
105
+ """
106
+
107
+ r = []
108
+
109
+ for colname in self.dtype.names:
110
+ if colname not in [
111
+ self.m5_col,
112
+ self.num_exposures_col,
113
+ self.visit_time_col,
114
+ self.visit_exposure_time_col,
115
+ self.filter_col,
116
+ ]:
117
+ if colname == "coadd":
118
+ r.append(1)
119
+ else:
120
+ if tab[colname].dtype == "object":
121
+ r.append(tab[colname][0])
122
+ else:
123
+ r.append(np.median(tab[colname]))
124
+ if colname == self.m5_col:
125
+ r.append(self.m5_coadd(tab[self.m5_col]))
126
+ if colname in [
127
+ self.num_exposures_col,
128
+ self.visit_time_col,
129
+ self.visit_exposure_time_col,
130
+ ]:
131
+ r.append(np.sum(tab[colname]))
132
+ if colname == self.filter_col:
133
+ r.append(np.unique(tab[self.filter_col])[0])
134
+
135
+ return r
136
+
137
+ def m5_coadd(self, m5):
138
+ """Estimation of "coadded" m5 values based on:
139
+ flux_5sigma = 10**(-0.4*m5)
140
+ sigmas = flux_5sigma/5.
141
+ sigma_tot = 1./sqrt(np.sum(1/sigmas**2))
142
+ flux_tot = 5.*sigma_tot
143
+
144
+ Parameters
145
+ ---------------
146
+ m5 : set of m5 (five-sigma depths) values
147
+
148
+ Returns
149
+ -----------
150
+ "coadded" m5 value
151
+ """
152
+ return 1.25 * np.log10(np.sum(10.0 ** (0.8 * m5)))
@@ -0,0 +1,154 @@
1
+ __all__ = ["TEFF_FIDUCIAL_DEPTH", "TEFF_FIDUCIAL_EXPTIME", "TeffStacker", "compute_teff"]
2
+
3
+ from collections import defaultdict
4
+
5
+ import numpy as np
6
+
7
+ from .base_stacker import BaseStacker
8
+
9
+ # From reference von Karman 500nm zenith seeing of 0.69"
10
+ # median zenith dark seeing from sims_skybrightness_pre
11
+ # airmass = 1
12
+ # 2 "snaps" of 15 seconds each
13
+ # m5_flat_sed sysEngVals from rubin_sim
14
+ # commit 6d03bd49550972e48648503ed60784a4e6775b82 (2021-05-18)
15
+ # These include constants from:
16
+ # https://github.com/lsst-pst/syseng_throughputs/blob/master/notebooks/generate_sims_values.ipynb
17
+ # commit 7abb90951fcbc70d9c4d0c805c55a67224f9069f (2021-05-05)
18
+ # See https://github.com/lsst-sims/smtn-002/blob/master/notebooks/teff_fiducial.ipynb
19
+
20
+ # If we do not recognize the filter, return a nan. The np.array(np.nan).item
21
+ # is a hack to define a function that retruns a nan without defining a useless
22
+ # new function or violating the style guide by using a lambda function.
23
+ TEFF_FIDUCIAL_DEPTH = defaultdict(
24
+ np.array(np.nan).item,
25
+ {
26
+ "u": 23.71,
27
+ "g": 24.67,
28
+ "r": 24.24,
29
+ "i": 23.82,
30
+ "z": 23.21,
31
+ "y": 22.40,
32
+ }.items(),
33
+ )
34
+
35
+ TEFF_FIDUCIAL_EXPTIME = 30.0
36
+
37
+
38
+ def compute_teff(m5_depth, filter_name, exptime=None, fiducial_depth=None, teff_base=None, normed=False):
39
+ """Compute the effective exposure time for a limiting magnitude.
40
+
41
+ Parameters
42
+ ----------
43
+ m5_depth : `float` or `numpy.ndarray`, (N,)
44
+ The five sigma point source limiting magintude.
45
+ filter_name : `str` or `numpy.ndarray`, (N,)
46
+ The name of the filter.
47
+ exptime : `float` or `numpy.ndarray`, (N,)
48
+ The expsore time (seconds), defaults to TEFF_FIDUCIAL_EXPTIME.
49
+ fiducial_depth: `dict` [`str`, `float`]
50
+ A mapping of filter to fiducial depth.
51
+ Defaults to TEFF_FIDUCIAL_DEPTH.
52
+ teff_base : `float`
53
+ The exposure time (in seconds) corresponding to the exposure depth.
54
+ normed : `bool`
55
+ Normalize against the exposure time, such that a value of 1 corresponds
56
+ to the exposure having been taken at fiducial conditions. Defaults
57
+ to False.
58
+
59
+ Returns
60
+ -------
61
+ t_eff : `float`
62
+ Effective expsore time, in seconds (if normed is False) or unitless
63
+ (if normed is true).
64
+ """
65
+ if fiducial_depth is None:
66
+ fiducial_depth = TEFF_FIDUCIAL_DEPTH
67
+
68
+ if teff_base is None:
69
+ teff_base = TEFF_FIDUCIAL_EXPTIME
70
+
71
+ if exptime is None:
72
+ exptime = TEFF_FIDUCIAL_EXPTIME
73
+
74
+ try:
75
+ fiducial_m5_depth = fiducial_depth[filter_name]
76
+ except TypeError:
77
+ # If filter_name is not one value, but an iterable, map it according
78
+ # to fiducial_depth.
79
+ if len(filter_name) != len(m5_depth):
80
+ raise ValueError()
81
+
82
+ fiducial_m5_depth = np.array([fiducial_depth[b] for b in filter_name])
83
+
84
+ t_eff = teff_base * 10.0 ** (0.8 * (m5_depth - fiducial_m5_depth))
85
+
86
+ if normed:
87
+ tau = t_eff / exptime
88
+ return tau
89
+ else:
90
+ return t_eff
91
+
92
+
93
+ class TeffStacker(BaseStacker):
94
+ """Add t_eff column corresponding to fiveSigmaDepth.
95
+
96
+ Parameters
97
+ ----------
98
+ m5_col : `str` ('fiveSigmaDepth')
99
+ Colum name for the five sigma limiting depth per pointing.
100
+ Defaults to "fiveSigmaDepth".
101
+ filter_col : `str`
102
+ Defaults to "filter"
103
+ exptime_col : `str`
104
+ The column with the exposure time, defaults to
105
+ "visitExposureTime"
106
+ fiducial_depth: `dict` [`str`, `float`]
107
+ A mapping of filter to fiducial depth.
108
+ Defaults to TEFF_FIDUCIAL_DEPTH.
109
+ fiducial_exptime : `float`
110
+ The exposure time (in seconds) corresponding to the exposure depth.
111
+ normed : `bool`
112
+ Normalize to exporuse time.
113
+ """
114
+
115
+ cols_added = ["t_eff"]
116
+
117
+ def __init__(
118
+ self,
119
+ m5_col="fiveSigmaDepth",
120
+ filter_col="band",
121
+ exptime_col="visitExposureTime",
122
+ fiducial_depth=None,
123
+ fiducial_exptime=None,
124
+ normed=False,
125
+ **kwargs,
126
+ ):
127
+ self.m5_col = m5_col
128
+ self.filter_col = filter_col
129
+ self.exptime_col = exptime_col
130
+ self.normed = normed
131
+ self.fiducial_depth = TEFF_FIDUCIAL_DEPTH if fiducial_depth is None else fiducial_depth
132
+ self.fiducial_exptime = TEFF_FIDUCIAL_EXPTIME if fiducial_exptime is None else fiducial_exptime
133
+ self.cols_req = [self.m5_col, self.filter_col, self.exptime_col]
134
+ if self.normed and self.exptime_col not in self.cols_req:
135
+ self.cols_req.append(self.exptime_col)
136
+
137
+ self.units = "" if self.normed else "seconds"
138
+
139
+ def _run(self, sim_data, cols_present=False):
140
+ if cols_present:
141
+ # Column already present in data; assume it is correct and does not
142
+ # need recalculating.
143
+ return sim_data
144
+
145
+ sim_data["t_eff"] = compute_teff(
146
+ sim_data[self.m5_col],
147
+ sim_data[self.filter_col],
148
+ sim_data[self.exptime_col],
149
+ self.fiducial_depth,
150
+ self.fiducial_exptime,
151
+ normed=self.normed,
152
+ )
153
+
154
+ return sim_data
@@ -0,0 +1,6 @@
1
+ from .astrometry_utils import *
2
+ from .get_date_version import *
3
+ from .maf_utils import *
4
+ from .opsim_utils import *
5
+ from .output_utils import *
6
+ from .stellar_mags import *
@@ -0,0 +1,93 @@
1
+ __all__ = ("sigma_slope", "m52snr", "astrom_precision")
2
+
3
+ import numpy as np
4
+
5
+ """Some simple functions that are useful for astrometry calculations. """
6
+
7
+
8
+ def sigma_slope(x, sigma_y):
9
+ """
10
+ Calculate the uncertainty in fitting a line, as
11
+ given by the spread in x values and the uncertainties
12
+ in the y values.
13
+
14
+ Parameters
15
+ ----------
16
+ x : numpy.ndarray
17
+ The x values of the data
18
+ sigma_y : numpy.ndarray
19
+ The uncertainty in the y values
20
+
21
+ Returns
22
+ -------
23
+ float
24
+ The uncertainty in the line fit
25
+ """
26
+ w = 1.0 / sigma_y**2
27
+ denom = np.sum(w) * np.sum(w * x**2) - np.sum(w * x) ** 2
28
+ if denom <= 0:
29
+ return np.nan
30
+ else:
31
+ result = np.sqrt(np.sum(w) / denom)
32
+ return result
33
+
34
+
35
+ def m52snr(m, m5, gamma=0.04):
36
+ """
37
+ Calculate the SNR for a star of magnitude m in an
38
+ observation with 5-sigma limiting magnitude depth m5.
39
+ Assumes gaussian distribution of photons and might not be
40
+ strictly due in bluer filters. See table 2 and equation 5
41
+ in astroph/0805.2366.
42
+
43
+ Parameters
44
+ ----------
45
+ m : `float` or `np.ndarray` (N,)
46
+ The magnitude of the star
47
+ m5 : `float` or `np.ndarray` (N,)
48
+ The m5 limiting magnitude of the observation
49
+ gamma : `float` or None
50
+ The 'gamma' value used when calculating photometric or
51
+ astrometric errors and weighting SNR accordingly.
52
+ See equation 5 of the LSST Overview paper.
53
+ Use "None" to discount the gamma factor completely
54
+ and use standard 5*10^(0.4 * (m5-m)).
55
+
56
+ Returns
57
+ -------
58
+ snr : `float` or `np.ndarray` (N,)
59
+ The SNR
60
+ """
61
+ # gamma varies per band, but is fairly close to 0.04
62
+
63
+ if gamma is None:
64
+ snr = 5.0 * 10.0 ** (-0.4 * (m - m5))
65
+ else:
66
+ xval = np.power(10, 0.4 * (m - m5))
67
+ snr = 1 / np.sqrt((0.04 - gamma) * xval + gamma * xval * xval)
68
+ return snr
69
+
70
+
71
+ def astrom_precision(fwhm, snr, systematic_floor=0.00):
72
+ """
73
+ Calculate the approximate precision of astrometric measurements,
74
+ given a particular seeing and SNR value.
75
+
76
+ Parameters
77
+ ----------
78
+ fwhm : `float` or `np.ndarray` (N,)
79
+ The seeing (FWHMgeom) of the observation.
80
+ snr : float` or `np.ndarray` (N,)
81
+ The SNR of the object.
82
+ systematic_floor : `float`
83
+ Systematic noise floor for astrometric error, in arcseconds.
84
+ Default here is 0, for backwards compatibility.
85
+ General Rubin use should be 0.01.
86
+
87
+ Returns
88
+ -------
89
+ astrom_err : `float` or `numpy.ndarray` (N,)
90
+ The astrometric precision, in arcseconds.
91
+ """
92
+ astrom_err = np.sqrt((fwhm / snr) ** 2 + systematic_floor**2)
93
+ return astrom_err
@@ -0,0 +1,58 @@
1
+ import numpy as np
2
+ from rubin_scheduler.utils import gnomonic_project_tosky
3
+
4
+ # Use the main stack to make a rough array.
5
+ # This code needs an update to work without lsst.sims.
6
+
7
+ if __name__ == "__main__":
8
+ import lsst.sims.utils as simsUtils
9
+ from lsst.obs.lsst import LsstCamMapper
10
+ from lsst.sims.coordUtils import _chipNameFromRaDec
11
+
12
+ mapper = LsstCamMapper()
13
+ camera = mapper.camera
14
+ epoch = 2000.0
15
+
16
+ ra = 0.0
17
+ dec = 0.0
18
+ rot_sky_pos = 0.0
19
+ mjd = 5300.0
20
+
21
+ obs_metadata = simsUtils.ObservationMetaData(
22
+ pointing_ra=np.degrees(ra),
23
+ pointing_dec=np.degrees(dec),
24
+ rot_sky_pos=np.degrees(rot_sky_pos),
25
+ mjd=mjd,
26
+ )
27
+
28
+ nside = int(1000)
29
+ # 60k pixels, from 0 to 3.5 degrees
30
+ x_one = np.linspace(-1.75, 1.75, int(nside))
31
+
32
+ # make 2-d x,y arrays
33
+ x_two = np.broadcast_to(x_one, (nside, nside))
34
+ y_two = np.broadcast_to(x_one, (nside, nside)).T
35
+
36
+ result = np.ones((nside, nside), dtype=bool)
37
+ ra_two, dec_two = gnomonic_project_tosky(np.radians(x_two), np.radians(y_two), ra, dec)
38
+ chip_names = _chipNameFromRaDec(
39
+ ra_two.ravel(),
40
+ dec_two.ravel(),
41
+ epoch=epoch,
42
+ camera=camera,
43
+ obs_metadata=obs_metadata,
44
+ )
45
+
46
+ chip_names = chip_names.reshape(nside, nside)
47
+ wavefront_names = [
48
+ name
49
+ for name in np.unique(chip_names[np.where(chip_names is not None)])
50
+ if ("SW" in name) | ("R44" in name) | ("R00" in name) | ("R04" in name) | ("R40" in name)
51
+ ]
52
+ # If it's on a waverfront sensor, that's false
53
+ for name in wavefront_names:
54
+ result[np.where(chip_names == name)] = False
55
+ # No chipname, that's a false
56
+ result[np.where(chip_names is None)] = False
57
+
58
+ np.savez("fov_map.npz", x=x_one, image=result)
@@ -0,0 +1,28 @@
1
+ __all__ = ("get_date_version",)
2
+
3
+ import time
4
+ from importlib import metadata
5
+
6
+
7
+ def get_date_version():
8
+ """
9
+ Get today's date and a dictionary with the MAF version information.
10
+ This is written into configuration output files, to help track MAF runs.
11
+
12
+ Returns
13
+ -------
14
+ str, dict
15
+ String with today's date, Dictionary with version information.
16
+ """
17
+
18
+ version = metadata.version("rubin_sim")
19
+ # today_date = time.strftime("%x")
20
+ today_date = "-".join([time.strftime(x) for x in ["%Y", "%m", "%d"]])
21
+ version_info = {
22
+ "__version__": version,
23
+ "__repo_version__": None,
24
+ "__fingerprint__": None,
25
+ "__dependency_versions__": None,
26
+ }
27
+
28
+ return today_date, version_info