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,438 @@
1
+ .. py:currentmodule:: rubin_sim.sim_archive
2
+
3
+ .. _archive-architecture:
4
+
5
+ ==========================
6
+ The Visit Sequence Archive
7
+ ==========================
8
+
9
+ Introduction
10
+ ~~~~~~~~~~~~
11
+
12
+ An assortment of tools used in Rubin Observatory depend on access to tables describing sequences of visits, including both opsim output and the results of queries to the consdb.
13
+ For example:
14
+
15
+ - The generation of simulations for both the pre-night briefing and other predictions of future scheduler behavior depend on pre-loading the scheduler with visits already completed, for example as queried from the consdb.
16
+ - The pre-night briefing report includes figures generated from opsim simulations of the night on which it is reporting.
17
+ - ``obsloctap`` provides predictions of visits to be scheduled for observing.
18
+ - Progress reports include maf metrics computed from this visit data.
19
+
20
+ The visit sequence archive is a service for storing and retrieving sequences of visits and ancilliary files associated with sequences of visits (e.g. tables of rewards), tracking metadata describing the sequences of visits, and searching for available sequences of visits based on this metadata.
21
+
22
+ Top-level components
23
+ ~~~~~~~~~~~~~~~~~~~~
24
+
25
+ The visit sequence archive has three major components:
26
+
27
+ 1. A data store that contains the table of visits (as an ``hdf5`` file) and ancilliary data files.
28
+ This is implemented using ``lsst.resources``, and the data store used is set by a base URI relative to which files are stored.
29
+ In production, on S3 bucket is used, while a directory in the local file system is used for testing and demonstrations.
30
+ 2. A ``postgresql`` database with tables of sequences of visits with metadata on provenance, comments, and statistics (but not the table of visits themselves).
31
+ 3. A python API and set of shell commands for adding, updating, and querying the archive.
32
+
33
+ The ``python`` API and shell commands
34
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
35
+
36
+ The ``sim_archive`` submodule of ``rubin_sim`` holds the ``python`` API and shell commands that constitude the higher-level interface to the visit sequence archive.
37
+ It consists of four sub-sub-modules:
38
+
39
+ ``rubin_sim.sim_archive.vseqarchive``
40
+ contains a collection of functions that support interaction with the archive as a whole, combining interaction with the metadata database and data store where it makes sense to do so.
41
+ For example, ``rubin_sim.sim_archive.vseqarchive.add_file`` combines the addition of a file to the data store and making a record of that file in the metadata database.
42
+ This submodule also defines the ``vsarchive`` ``click.group`` and most functions within it are decorated with ``click`` decorators that place them in this group.
43
+ As a result, these python functions each have corresponding shell commands that take the same arguments.
44
+ (See `the click documentation <https://click.palletsprojects.com/en/stable/>`_ for more details.)
45
+ ``rubin_sim.sim_archive.vseqmetadata``
46
+ defines the ``VisitSequenceArchiveMetadata`` class, an API that manages queries to the database and provides methods that wrap queries for standard operations.
47
+ In a typical use, ``python`` code will instantiate an instance of ``VisitSequenceArchiveMetadata`` with database connection parameters.
48
+ Then, it can query of modify the database either by calling methods of this class directly, or passing the instance as an argument to functions provided by ``rubin_sim.sim_archive.vsarchive``.
49
+ In corresponding shell commands created using ``click``, the ``click.group`` definition automatically instantiates an instance using command line arguments and passes it to the subcommand.
50
+ ``rubin_sim.sim_archive.sim_archive``
51
+ provides a handful of functions that replicate functions provided by the prototype implementation.
52
+ For example, the ``obsloctap`` service use the prototype ``fetch_obsloctab_visits`` function to retrieve visits from the best pre-night simultation for a night.
53
+ This submodule therefore implements ``fetch_obsloctap_visits`` here for backwards compatibility.
54
+ ``rubin_sim.sim_archive.prenightindex``
55
+ provides tools that return inventories of pre-night simulations in the archive.
56
+ Few users have credentials for that allow access to the metadata database, and connections are only possible on a very limited subnet.
57
+ A handful of use cases require broader access, particularly by services running at the observatory.
58
+ These use cases require access to the metadata for only a very limited number of predictable queries, in particular getting inventories of pre-night simulations run for specific nights, and statistics on these simulations.
59
+ The services that need this already need and have access to the data store.
60
+ So, to provide access to the required invertories, the ``prenightindex`` submodule provides tools for querying the matadata database and placing the results in a predictable key in the data store,
61
+ and functions that retrieve the needed data by first attempting to query the metadata database, but fall back on reading the pre-generated results from the data store if necessary.
62
+ ``rubin_sim.sim_archive.prototype``
63
+ Contains the functions that implemented the prototype data archive.
64
+ These are retained (for now) to provide access to data recorded by the prototype.
65
+
66
+ The data store
67
+ ~~~~~~~~~~~~~~
68
+
69
+ The visit sequerce archive uses the ``lsst.resources`` package to save and retrieve data.
70
+ Each visit sequence is indentified by a `UUID <https://www.rfc-editor.org/rfc/rfc9562>`_, and the archive store data at a URI according to a base URI for the data store, the telescope, the visit sequence UUID, the date of creation, and a file name:
71
+
72
+ .. parsed-literal::
73
+ ${ARCHIVE_URI}/${TELESCOPE}/${CREATION_DATE}/${VISITSEQ_UUID}/${FILENAME}
74
+
75
+ Where the elements are:
76
+
77
+ ARCHIVE_URI
78
+ is the base of the archive.
79
+ The default is set to ``s3://rubin:rubin-scheduler-prenight/opsim/vseq/`` by the ``rubin_sim.sim_archive.vseqarchive.ARCHIVE_URL`` module-level variable.
80
+ For testing, it is typically set to a temporary local directory (``file:///some/tmp/dir``) generated by ``python``'s ``tempfile`` standard library.
81
+ TELESCOPE
82
+ designates the relevant telescope, either ``simonyi`` or ``auxtel``
83
+ CREATION_DATE
84
+ is the creation date (in the UTC-12 time zone used by `SITCOMTN-032 <https://sitcomtn-032.lsst.io/>`_ for ``dayobs``) of the visit sequence in ISO-8601 (``YYYY-MM-DD``) format.
85
+ In the case of completed visits, this is the date on which the query was made.
86
+ For simulations, it is the date on which the simulation was run.
87
+ When this date is not available, the ``sim_archive`` tools default to the date on which the visit sequence was added to the archive.
88
+ FILENAME
89
+ The name of the file in which the data is stored on local disk.
90
+
91
+ So, a typical URI will look like this:
92
+
93
+ .. parsed-literal::
94
+ s3://rubin:rubin-scheduler-prenight/opsim/vseq/simonyi/2025-10-16/47ed5c53-ec5a-45a3-bdfe-6b93a3f67bf9/visits.h5
95
+
96
+ A URL with a ``FILENAME`` of ``visits.h5``, if present, holds the data for visits themselves in `HDF5 format <https://www.hdfgroup.org/solutions/hdf5/>`_, in the ``observations`` key, corresponding to the ``observations`` table in ``sqlite3`` database produced by the ``rubin_scehduler`` simulations.
97
+ If the visits originated with the database produced by a ``rubin_scheduler`` simulation, other tables in this database will be saved as tables in corresponding keys in ``visits.h5``.
98
+
99
+ The archive infrastructure does not limit the keys and file names of other data to be added, but other keys and filenames used can include:
100
+
101
+ ``rewards.h5``
102
+ An HDF5 containing reward data recorded by ``rubin_scheduler`` simulations when called with ``record_rewards=True``.
103
+ ``opsim.db``
104
+ The ``sqlite3`` file generated by ``rubin_scheduler`` simulations, as written by ``rubin_scheduler``.
105
+ In general, this should be redundant with the ``visits.h5`` file.
106
+
107
+ The ``postgresql`` metadata database
108
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
109
+
110
+ Tables of sequences of visits
111
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
112
+
113
+ The central tables in metadata database are those that save metadata on the visit sequences themselves, with one row per visit sequence.
114
+ There are three such tables:
115
+
116
+ ``simulations``
117
+ The ``simulations`` table stores metadata on sequences of simulated visits, for example as simulated by ``rubin_scheduler``.
118
+ Visit sequences in these tables should include *only* simulated visits.
119
+ Sequences that are created using a combination of completed and simulated visits, for example a sequence that includes completed visits pre-leaded into the scheduler and then simulated thereafter, should be saved in the ``mexedvisitseq`` table instead.
120
+ ``completed``
121
+ The ``completed`` table stores metadata on sequences of actually completed visits, for example results of queries to ``consdb``.
122
+ ``mixed``
123
+ The ``mixed`` table stores metadata in sequences that combine visits from other sequences of visits.
124
+ For example metadat on a set of visits that include completed visits up to some date and simulated visits thereafter would be recorded in the ``mixed`` table.
125
+
126
+ These tables have the following columns in common:
127
+
128
+ .. list-table:: visitseq
129
+ :widths: 25 20 20 35
130
+ :header-rows: 1
131
+
132
+ * - Column
133
+ - Type
134
+ - Default
135
+ - Description
136
+ * - visitseq_uuid
137
+ - UUID
138
+ - ``gen_random_uuid()``
139
+ - Primary key – RFC 9562 Universally Unique Identifier.
140
+ * - visitseq_sha256
141
+ - BYTEA
142
+ - *None*
143
+ - SHA‑256 hash of bytes of the ``numpy.recarray`` representation of the visits table, as calculated in ``vseqmetadata.compute_visits_sha256``
144
+ * - visitseq_label
145
+ - TEXT
146
+ - *None*
147
+ - Human‑readable label for plots and tables
148
+ * - visitseq_url
149
+ - TEXT
150
+ - *None*
151
+ - URL to the full visit table (NULL if not available)
152
+ * - telescope
153
+ - TEXT
154
+ - *None*
155
+ - Telescope used (e.g. "simonyi", "auxtel")
156
+ * - first_day_obs
157
+ - DATE
158
+ - *None*
159
+ - Date (in the UTC-12 hour timezone) of the first night included in the sequence.
160
+ * - last_day_obs
161
+ - DATE
162
+ - *None*
163
+ - Date (in the UTC-12 hour timezone) of the last night included in the sequence.
164
+ * - creation_time
165
+ - TIMESTAMP WITH TIME ZONE
166
+ - ``NOW()``
167
+ - When the simulation was run or (if not set) when the sequence was added to the archive.
168
+
169
+ The values in ``first_day_obs`` and ``last_day_obs`` might not correspond to the dates of the first and last visits in the sequence, if the sequence covers dates on which there were no visits.
170
+ For example, if an entry in the ``completed`` table were created by querying ``consdb`` for visits between ``2025-10-01`` and ``2025-10-31``, but there no visits in ``consdb`` on ``2025-10-01``, the value of ``first_day_obs`` would still be ``2025-10-01``.
171
+ In such a case, a user can interpret such a record as a positive assertion that there were no visits on ``2025-10-01`` fitting the query criteria.
172
+
173
+ The visit tables for each type include extra columns.
174
+
175
+ ``simulations`` has the following additional columns:
176
+
177
+ .. list-table::
178
+ :widths: 25 20 55
179
+ :header-rows: 1
180
+
181
+ * - Column
182
+ - Type
183
+ - Description
184
+ * - scheduler_version
185
+ - TEXT
186
+ - Version of ``rubin_scheduler`` used
187
+ * - config_url
188
+ - TEXT
189
+ - URL of the configuration script, typically a URL for a specific commit of a specific file in github.
190
+ * - conda_env_sha256
191
+ - BYTEA
192
+ - SHA‑256 hash of the output of ``conda list --json``
193
+ * - parent_visitseq_uuid
194
+ - UUID
195
+ - UUID of the visitseq loaded into the scheduler before running
196
+ * - sim_runner_kwargs
197
+ - JSONB
198
+ - Arguments passed to the simulation runner as a JSON dictionary
199
+ * - parent_last_day_obs
200
+ - DATE
201
+ - Date (in the UTC-12hrs time zone) of the last visit loaded into the scheduler before running
202
+
203
+ The ``completed`` table has just one column (in addition to those all visit sequence tables have in common):
204
+
205
+ .. list-table::
206
+ :widths: 25 20 55
207
+ :header-rows: 1
208
+
209
+ * - Column
210
+ - Type
211
+ - Description
212
+ * - query
213
+ - TEXT
214
+ - Query used to select visits from ``consdb``
215
+
216
+ The ``mixed`` table has additional columns describing how the parent visit sequences were combined:
217
+
218
+ .. list-table::
219
+ :widths: 25 20 55
220
+ :header-rows: 1
221
+
222
+ * - Column
223
+ - Type
224
+ - Description
225
+ * - last_early_day_obs
226
+ - DATE
227
+ - The last day_obs drawn from the early parent visit sequence
228
+ * - first_late_day_obs
229
+ - DATE
230
+ - The first day_obs drawn from the late parent visit sequence
231
+ * - early_parent_uuid
232
+ - UUID
233
+ - UUID of the early parent visit sequence
234
+ * - late_parent_uuid
235
+ - UUID
236
+ - UUID of the late parent visit sequence
237
+
238
+ These three tables are implemented in ``postgresql`` as childen of a single parent table, ``visitseq``.
239
+ Therefore, queries of the ``visitseq`` table will include rows from all three of these tables, but only columns they all have in common.
240
+
241
+ Tags
242
+ ^^^^
243
+
244
+ The ``tags`` table associates tags with visit sequences:
245
+
246
+ .. list-table::
247
+ :widths: 25 20 55
248
+ :header-rows: 1
249
+
250
+ * - Column
251
+ - Type
252
+ - Description
253
+ * - visitseq_uuid
254
+ - UUID
255
+ - The visit sequence tagged
256
+ * - tag
257
+ - TEXT
258
+ - The tag
259
+
260
+ Each row corresponds to a tag applied to a visit sequence.
261
+
262
+ To query the metadata archive and get a table with one row per visit sequence and lists of tags as a column, use the ``json`` tools in ``postgresql``.
263
+ For example:
264
+
265
+ .. parsed-literal::
266
+ SET SEARCH_PATH TO vsmd;
267
+ SELECT s.visitseq_uuid,
268
+ s.visitseq_label,
269
+ COALESCE (
270
+ JSONB_AGG(DISTINCT t.tag) FILTER (WHERE t.tag IS NOT NULL),
271
+ '[]'::JSONB) AS tags
272
+ FROM simulations AS s
273
+ LEFT JOIN tags AS t ON t.visitseq_uuid=s.visitseq_uuid
274
+ GROUP BY s.visitseq_uuid, visitseq_label;
275
+
276
+ Reporting tools use tags to identify visit sequences generated to support specific reports.
277
+ For example, the ``prenight`` tag identifies simulations made for the pre-night briefing.
278
+
279
+ Comments
280
+ ^^^^^^^^
281
+
282
+ The ``comments`` table associates comments with visit sequences:
283
+
284
+ .. list-table::
285
+ :widths: 25 25 55
286
+ :header-rows: 1
287
+
288
+ * - Column
289
+ - Type
290
+ - Description
291
+ * - visitseq_uuid
292
+ - UUID
293
+ - Identifier of the visit sequence to which the comment belongs
294
+ * - comment_time
295
+ - TIMESTAMP WITH TIME ZONE
296
+ - When the comment was added (defaults to ``NOW()``)
297
+ * - author
298
+ - TEXT
299
+ - User or system that added the comment
300
+ * - comment
301
+ - TEXT
302
+ - The comment text (not nullable)
303
+
304
+ Files
305
+ ^^^^^
306
+
307
+ The ``files`` table associates URIs of files with file types and visit sequences.
308
+
309
+ .. list-table::
310
+ :widths: 25 20 55
311
+ :header-rows: 1
312
+
313
+ * - Column
314
+ - Type
315
+ - Description
316
+ * - visitseq_uuid
317
+ - UUID
318
+ - Identifier of the visit sequence that the file belongs to
319
+ * - file_type
320
+ - TEXT
321
+ - The type of file (e.g., ``rewards``)
322
+ * - file_sha256
323
+ - BYTEA
324
+ - SHA‑256 hash of the file contents
325
+ * - file_url
326
+ - TEXT
327
+ - URL where the file can be retrieved; may be ``NULL`` if only the hash is stored
328
+
329
+ Note that the ``visits`` ``file_type`` is special, and stored in the corresponding visits sequence table itself rather than in this ``files`` table.
330
+
331
+ ``conda`` environments
332
+ ^^^^^^^^^^^^^^^^^^^^^^
333
+
334
+ The ``simulations`` table records the hash of the specifications for the conda environment (as reported by ``conda list --json``) in which the simulations was run.
335
+ By itself, this record allows a user to identify which simulations were made with the same environment, but not what that environment was.
336
+ The ``conda_env`` table records the actual content of the ``conda list --json`` output, in a format that can be use with ``postgresql``'s json tools.
337
+
338
+ .. list-table::
339
+ :widths: 25 20 55
340
+ :header-rows: 1
341
+
342
+ * - Column
343
+ - Type
344
+ - Description
345
+ * - conda_env_hash
346
+ - BYTEA
347
+ - Primary key – SHA‑256 hash of the output of ``conda list --json``
348
+ * - conda_env
349
+ - JSONB
350
+ - Full JSON representation of the conda environment (``conda list --json`` output)
351
+
352
+ The ``conda_packages`` view supports querying this table as if each package were stored in its own row of a table.
353
+ For example, to get the ``astropy`` versions for all simulations for which the conda environment is recorded:
354
+
355
+ .. parsed-literal::
356
+ SET SEARCH_PATH TO vsmd;
357
+ SELECT creation_time, visitseq_uuid, package_version AS astropy_version FROM simulations NATURAL JOIN conda_packages WHERE package_name='astropy';
358
+
359
+ Nightly statistics
360
+ ^^^^^^^^^^^^^^^^^^
361
+
362
+ The nightly_stats table can records basic statistics by night for any value for which each visit has an associated value.
363
+ Examples can be columns in the visits table referenced by ``visitseq_url``, but may also be derived quentities such as those produced by ``maf`` stackers.
364
+
365
+ .. list-table::
366
+ :widths: 25 25 55
367
+ :header-rows: 1
368
+
369
+ * - Column
370
+ - Type
371
+ - Description
372
+ * - visitseq_uuid
373
+ - UUID
374
+ - Identifier of the visit sequence
375
+ * - day_obs
376
+ - DATE
377
+ - The date (in the UTC-12hrs timezone, following SITCOMTN-032) of the night
378
+ * - value_name
379
+ - TEXT
380
+ - Name of the metric or column being summarized
381
+ * - accumulated
382
+ - BOOLEAN
383
+ - ``TRUE`` if the values include all data through *day_obs*,
384
+ ``FALSE`` if only the data from *day_obs* itself
385
+ * - count
386
+ - INTEGER
387
+ - Number of values in the distribution
388
+ * - mean
389
+ - DOUBLE PRECISION
390
+ - Arithmetic mean of the values
391
+ * - std
392
+ - DOUBLE PRECISION
393
+ - Standard deviation of the values
394
+ * - min
395
+ - DOUBLE PRECISION
396
+ - Minimum value
397
+ * - p05
398
+ - DOUBLE PRECISION
399
+ - 5% quantile
400
+ * - q1
401
+ - DOUBLE PRECISION
402
+ - First quartile (25% quantile)
403
+ * - median
404
+ - DOUBLE PRECISION
405
+ - Median (50% quantile)
406
+ * - q3
407
+ - DOUBLE PRECISION
408
+ - Third quartile (75% quantile)
409
+ * - p95
410
+ - DOUBLE PRECISION
411
+ - 95% quantile
412
+ * - max
413
+ - DOUBLE PRECISION
414
+ - Maximum value
415
+
416
+
417
+ ``maf`` results
418
+ ^^^^^^^^^^^^^^^
419
+
420
+ Additional tables exist for possible future support of saving ``maf`` summary metrics in the visit sequence metadata database.
421
+ There are currently no tools to support their use.
422
+
423
+ These tables are:
424
+
425
+ ``maf_metrics``
426
+ records parameters used to run metrics.
427
+ Columns are ``maf_metric_name``, ``rubin_sim_version``, ``maf_constraint``, ``metric_class_name``, ``metric_args``, ``slicer_class_name``, ``slicer_args``
428
+ ``maf_summary_metrics``
429
+ records the values of summary metrics themselves for a given visit sequence.
430
+ Columns are ``visitseq_uuid``, ``maf_metric_name``, ``day_obs``, ``accumulated``, ``summary_value``.
431
+ The combination of the ``day_obs`` and ``accumulated`` columns support recording values from either visits only on (if ``accumulated`` is ``false``) a specific night (``day_obs``),
432
+ or all visits (if ``accumulated`` is ``true``) up to and including a specific night (``day_obs``).
433
+ ``maf_metric_sets``
434
+ defines sets of metrics, following the use of such sets in ``rubin_sim.maf.run_comparison``.
435
+ ``maf_summary``
436
+ is a view that makes it easy to get everything for the summary metrics for one metric set applied to runs with specified tags.
437
+ ``maf_healpix_stats``
438
+ supports recording of statistics of metric values when the metrics return healpix arrays.
@@ -0,0 +1,238 @@
1
+ .. py:currentmodule:: rubin_sim.sim_archive
2
+
3
+ .. vseqarchive-setup:
4
+
5
+
6
+ Setting up and administering the visit sequence metadata database
7
+ =================================================================
8
+
9
+ Introduction
10
+ ------------
11
+
12
+ This page documents the procedure followed to create the visit sequence archive metadata database.
13
+ **It does not provide instructions that are expected to be repeated again,** but are rather intended as documentation of provenance of the database.
14
+ The code blocks listed here were exported from a jupyter notebook used for the initial setup.
15
+
16
+ Setting up the python kernel
17
+ ----------------------------
18
+
19
+ The setup of the database began by importing necessary python modules:
20
+
21
+ .. code:: ipython3
22
+
23
+ from pathlib import Path
24
+ from psycopg2 import sql
25
+ from rubin_sim.sim_archive import vseqarchive
26
+
27
+ Look at what’s in the database
28
+ ------------------------------
29
+
30
+ I then checked what schema are already there:
31
+
32
+ .. code:: bash
33
+
34
+ %%bash
35
+ psql --host 134.79.23.205 --username rubin --command "\dn" opsim_log
36
+
37
+
38
+ .. parsed-literal::
39
+
40
+ List of schemas
41
+ Name | Owner
42
+ --------+-------------------
43
+ public | pg_database_owner
44
+ (1 row)
45
+
46
+ Note the host used for the database may have changed since the initial setup: the current IP address for the database may be different.
47
+
48
+
49
+ Create a test schema
50
+ --------------------
51
+
52
+ Create an interface to the visit sequence archive metadata database.
53
+ Start by setting connection parameters to a user and host with permissions.
54
+ The ``opsim_log`` database and ``rubin`` user are those set up by the SLAC computing administrators, not by anyone on the scheduling team.
55
+
56
+ .. code:: ipython3
57
+
58
+ metadata_db_kwargs = {
59
+ 'database': 'opsim_log',
60
+ 'host': '134.79.23.205',
61
+ 'user': 'rubin'
62
+ }
63
+
64
+ Make an instance of the interface.
65
+ Set the schema to ``test``, because (for safety reasons) the interface only allows creation of schema with ``test`` in the name.
66
+
67
+ .. code:: ipython3
68
+
69
+ vsarchive = vseqarchive.VisitSequenceArchiveMetadata(
70
+ metadata_db_kwargs,
71
+ metadata_db_schema='test'
72
+ )
73
+
74
+ Run the method that creates an instance of the schema (with name
75
+ ``test``):
76
+
77
+ .. code:: ipython3
78
+
79
+ vsarchive.create_schema_in_database()
80
+
81
+
82
+ .. parsed-literal::
83
+
84
+ Created test database and schema test
85
+
86
+
87
+ Check that it was created:
88
+
89
+ .. code:: bash
90
+
91
+ %%bash
92
+ psql --host 134.79.23.205 --username rubin --command "\dn" opsim_log
93
+
94
+
95
+ .. parsed-literal::
96
+
97
+ List of schemas
98
+ Name | Owner
99
+ --------+-------------------
100
+ public | pg_database_owner
101
+ test | rubin
102
+ (2 rows)
103
+
104
+
105
+
106
+ Rename our newly created ``test`` schema to the production schema name, so it becomes our production schema:
107
+
108
+ .. code:: bash
109
+
110
+ %%bash
111
+ psql --host 134.79.23.205 --username rubin --command "ALTER SCHEMA test RENAME TO vsmd" opsim_log
112
+
113
+
114
+ .. parsed-literal::
115
+
116
+ ALTER SCHEMA
117
+
118
+
119
+ Check that it did what we wanted:
120
+
121
+ .. code:: bash
122
+
123
+ %%bash
124
+ psql --host 134.79.23.205 --username rubin --command "\dn" opsim_log
125
+
126
+
127
+ .. parsed-literal::
128
+
129
+ List of schemas
130
+ Name | Owner
131
+ --------+-------------------
132
+ public | pg_database_owner
133
+ vsmd | rubin
134
+ (2 rows)
135
+
136
+
137
+
138
+ .. code:: bash
139
+
140
+ %%bash
141
+ psql --host 134.79.23.205 --username rubin --command "SELECT table_schema, table_name, table_type FROM information_schema.tables WHERE table_schema = 'vsmd';" opsim_log
142
+
143
+
144
+
145
+ .. parsed-literal::
146
+
147
+ table_schema | table_name | table_type
148
+ --------------+---------------------+------------
149
+ vsmd | visitseq | BASE TABLE
150
+ vsmd | simulations | BASE TABLE
151
+ vsmd | completed | BASE TABLE
152
+ vsmd | mixedvisitseq | BASE TABLE
153
+ vsmd | tags | BASE TABLE
154
+ vsmd | comments | BASE TABLE
155
+ vsmd | files | BASE TABLE
156
+ vsmd | simulations_extra | VIEW
157
+ vsmd | conda_env | BASE TABLE
158
+ vsmd | conda_packages | VIEW
159
+ vsmd | simulation_packages | VIEW
160
+ vsmd | nightly_stats | BASE TABLE
161
+ vsmd | maf_summary_metrics | BASE TABLE
162
+ vsmd | maf_metrics | BASE TABLE
163
+ vsmd | maf_metric_sets | BASE TABLE
164
+ vsmd | maf_summary | VIEW
165
+ vsmd | maf_healpix_stats | BASE TABLE
166
+ (17 rows)
167
+
168
+
169
+
170
+ I also want an actual schema named ``test``, so make it:
171
+
172
+ .. code:: ipython3
173
+
174
+ vsarchive.create_schema_in_database()
175
+
176
+
177
+ .. parsed-literal::
178
+
179
+ Created test database and schema test
180
+
181
+
182
+ .. code:: bash
183
+
184
+ %%bash
185
+ psql --host 134.79.23.205 --username rubin --command "\dn" opsim_log
186
+
187
+
188
+ .. parsed-literal::
189
+
190
+ List of schemas
191
+ Name | Owner
192
+ --------+-------------------
193
+ public | pg_database_owner
194
+ test | rubin
195
+ vsmd | rubin
196
+ (3 rows)
197
+
198
+
199
+
200
+ Creating roles and giving them permissions
201
+ ------------------------------------------
202
+
203
+ Create three roles with login permissions initially.
204
+ Note that, in postgresql, a "user" is just a role with login permissions.
205
+
206
+ - ``reader`` will be a shared account for read-only access.
207
+ - ``writer``` will be a used by the pre-night simulation process to add pre-night simulations to the database.
208
+ - ``tester``` will be used for testing.
209
+
210
+ Use the ``\password`` ``psql`` command to avoid the password being recorded in the ``psql`` history.
211
+
212
+ .. parsed-literal::
213
+
214
+ CREATE USER reader;
215
+ \password reader
216
+ CREATE USER writer;
217
+ \password writer
218
+ CREATE USER tester;
219
+ \password tester
220
+
221
+ Create groups for the users:
222
+
223
+
224
+ .. parsed-literal::
225
+
226
+ CREATE GROUP readers WITH USER reader;
227
+ CREATE GROUP testers WITH USER tester;
228
+ CREATE GROUP writers WITH USER writer;
229
+
230
+ Give the groups permissions:
231
+
232
+ .. parsed-literal::
233
+
234
+ GRANT SELECT ON ALL TABLES IN SCHEMA vsmd TO readers, writers;
235
+ GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA test TO testers;
236
+ GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA vsmd TO writers;
237
+ GRANT USAGE ON SCHEMA vsmd TO readers, writers;
238
+ GRANT USAGE ON SCHEMA test TO testers;