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,200 @@
1
+ """Young Stellar Objects metric.
2
+ Converted from notebook 211116_yso_3D_90b.ipynb.
3
+ Formatted with black."""
4
+
5
+ __all__ = ("NYoungStarsMetric",)
6
+
7
+ import healpy as hp
8
+ import numpy as np
9
+ import scipy.integrate as integrate
10
+
11
+ from rubin_sim.maf.maps import DustMap, DustMap3D, StellarDensityMap
12
+ from rubin_sim.maf.metrics.base_metric import BaseMetric
13
+ from rubin_sim.maf.metrics.crowding_metric import CrowdingM5Metric
14
+ from rubin_sim.phot_utils import DustValues
15
+
16
+
17
+ class StarDensity:
18
+ """integrate from zero to some max distance, then multiply by angular area
19
+
20
+ Parameters
21
+ ----------
22
+ l : float
23
+ Galactic longitude, radians
24
+ b : float
25
+ Galactic latitude, radians
26
+ """
27
+
28
+ def __init__(self, gall, galb):
29
+ """Calculate the expected number of stars along a line of site"""
30
+ self.r_thin = 2.6 # scale length of the thin disk, kpc
31
+ self.d_gc = 8.178 # Distance to the galactic center, kpc
32
+ self.h_thin = 0.300 # scale height of the thin disk, kpc
33
+
34
+ self.gall = gall
35
+ self.galb = galb
36
+
37
+ self.A = 0.8e8 / (4.0 * np.pi * self.h_thin * self.r_thin**2)
38
+
39
+ def __call__(self, r):
40
+ """
41
+ Parameters
42
+ ----------
43
+ r : float
44
+ Distance in kpc
45
+ """
46
+ r_galac = ((self.d_gc - r * np.cos(self.gall)) ** 2 + (r * np.sin(self.gall)) ** 2) ** 0.5
47
+
48
+ exponent = -1.0 * r * np.abs(np.sin(self.galb)) / self.h_thin - r_galac / self.r_thin
49
+
50
+ result = self.A * r**2 * np.exp(exponent)
51
+ return result
52
+
53
+
54
+ class NYoungStarsMetric(BaseMetric):
55
+ """Calculate the distance or number of stars with
56
+ color uncertainty defined by mags/snrs.
57
+
58
+ Parameters
59
+ ----------
60
+ metric_name : `str`, opt
61
+ Default 'young_stars'.
62
+ m5_col : `str`, opt
63
+ The default column name for m5 information in the input data.
64
+ Default fiveSigmaDepth.
65
+ filter_col : `str`, opt
66
+ The column name for the filter information. Default filter.
67
+ mags : `dict`, opt
68
+ The absolute magnitude of the object in question.
69
+ Keys of filter name, values in mags.
70
+ Default is for a 0.3 solar mass star at age = 100 Myr.
71
+ snrs : `dict`, opt
72
+ The SNR to demand for each filter.
73
+ galb_limit : `float`, opt
74
+ The galactic latitude above which to return zero (degrees).
75
+ Default 90.
76
+ badval : `float`, opt
77
+ The value to return when the metric value cannot be calculated.
78
+ Default 0.
79
+ return_distance : `bool`, opt
80
+ Whether the metric will return the maximum distance that
81
+ can be reached for each slice_point,
82
+ or the total number of stars down to mags/snrs.
83
+ crowding_error : `float`, opt
84
+ Crowding error that gets passed to CrowdingM5Metric. Default 0.25.
85
+ use_2D_extinction : `bool`, opt
86
+ Uses the 2D extinction map instead of the 3D one. Default False.
87
+ """
88
+
89
+ def __init__(
90
+ self,
91
+ metric_name="young_stars",
92
+ m5_col="fiveSigmaDepth",
93
+ filter_col="band",
94
+ seeing_col="seeingFwhmGeom",
95
+ mags={"g": 10.32, "r": 9.28, "i": 7.97},
96
+ snrs={"g": 5.0, "r": 5.0, "i": 5.0},
97
+ galb_limit=90.0,
98
+ badval=0,
99
+ return_distance=False,
100
+ crowding_error=0.25,
101
+ use_2D_extinction=False,
102
+ **kwargs,
103
+ ):
104
+ cols = [m5_col, filter_col, seeing_col]
105
+ maps = [
106
+ DustMap3D(),
107
+ StellarDensityMap(filtername="g"),
108
+ StellarDensityMap(filtername="r"),
109
+ StellarDensityMap(filtername="i"),
110
+ ]
111
+ self.use_2D_extinction = use_2D_extinction
112
+ if self.use_2D_extinction:
113
+ maps[0] = DustMap()
114
+ # This will give us access to the dust map get_distance_at_dmag routine
115
+ # but does not require loading another copy of the map
116
+ self.ebvmap = DustMap3D()
117
+ self.return_distance = return_distance
118
+ units = "kpc" if self.return_distance else "N stars"
119
+ super().__init__(cols, metric_name=metric_name, maps=maps, units=units, badval=badval, **kwargs)
120
+ # Save R_x values for on-the-fly calculation of dust extinction
121
+ self.r_x = DustValues().r_x.copy()
122
+ # set return type
123
+ self.m5_col = m5_col
124
+ self.filter_col = filter_col
125
+ self.galb_limit = np.radians(galb_limit)
126
+ self.mags = mags
127
+ self.filters = list(self.mags.keys())
128
+ self.snrs = snrs
129
+ self.crowding_error = crowding_error
130
+ self.m5crowding = {
131
+ f: CrowdingM5Metric(
132
+ crowding_error=crowding_error,
133
+ filtername=f,
134
+ seeing_col=seeing_col,
135
+ maps=maps,
136
+ )
137
+ for f in self.filters
138
+ }
139
+ dust_properties = DustValues()
140
+ self.ax1 = dust_properties.ax1
141
+
142
+ def run(self, data_slice, slice_point=None):
143
+ # Evaluate area on sky for this slice_point, in radians
144
+ if "nside" in slice_point:
145
+ # Best area /pixel calculation, appropriate for healpix slicers
146
+ sky_area = hp.nside2pixarea(slice_point["nside"], degrees=False)
147
+ else:
148
+ # Assume single, approximate, circular FOV
149
+ sky_area = np.pi * (np.radians(1.75)) ** 2
150
+
151
+ # if we are outside the galb_limit, return nothing
152
+ # Note we could make this a more complicated function that
153
+ # returns an expected density of star forming regions
154
+ if np.abs(slice_point["galb"]) > self.galb_limit:
155
+ return self.badval
156
+
157
+ # Compute depth for each filter
158
+ depths = {}
159
+ # ignore the divide by zero warnings
160
+ with np.errstate(divide="ignore"):
161
+ for filtername in self.filters:
162
+ in_filt = np.where(data_slice[self.filter_col] == filtername)[0]
163
+ # Calculate coadded depth per filter
164
+ depth_m5 = 1.25 * np.log10(np.sum(10.0 ** (0.8 * data_slice[self.m5_col][in_filt])))
165
+ if self.crowding_error > 0:
166
+ depth_crowding = self.m5crowding[filtername].run(data_slice, slice_point)
167
+ depths[filtername] = min(depth_m5, depth_crowding)
168
+ else:
169
+ depths[filtername] = depth_m5
170
+
171
+ # solve for the distances in each filter where we hit the required SNR
172
+ distances = []
173
+ for filtername in self.filters:
174
+ # Apparent magnitude at the SNR requirement
175
+ m_app = -2.5 * np.log10(self.snrs[filtername] / 5.0)
176
+ m_app += depths[filtername]
177
+ if self.use_2D_extinction:
178
+ A_x = self.ax1[filtername] * slice_point["ebv"]
179
+ # Assuming all the dust along the line of sight matters.
180
+ m_app = m_app - A_x
181
+ dist = 10.0 * (100 ** ((m_app - self.mags[filtername]) / 5.0)) ** 0.5
182
+ else:
183
+ dist = self.ebvmap.distance_at_dmag(
184
+ dmag=m_app - self.mags[filtername],
185
+ dists=slice_point["ebv3d_dists"],
186
+ ebvs=slice_point["ebv3d_ebvs"],
187
+ filtername=filtername,
188
+ )
189
+ distances.append(dist)
190
+ # compute the final distance, limited by whichever filter is
191
+ # most shallow
192
+ final_distance = np.min(distances, axis=-1) / 1e3 # to kpc
193
+ if self.return_distance:
194
+ return final_distance
195
+ else:
196
+ # Resorting to numerical integration of ugly function
197
+ sd = StarDensity(slice_point["gall"], slice_point["galb"])
198
+ stars_per_sterr, _err = integrate.quad(sd, 0, final_distance)
199
+ stars_tot = stars_per_sterr * sky_area
200
+ return stars_tot
@@ -0,0 +1,200 @@
1
+ from . import db as db
2
+ from . import metricBundles as metricBundles
3
+ from . import metrics as metrics
4
+ from . import plots as plots
5
+ from . import slicers as slicers
6
+ from .batches import col_map_dict
7
+
8
+ __all__ = ("make_bundle_list", "maf_night_report")
9
+
10
+ import argparse
11
+
12
+ import matplotlib
13
+
14
+ # Set matplotlib backend (to create plots where DISPLAY is not set).
15
+ matplotlib.use("Agg")
16
+
17
+
18
+ def make_bundle_list(
19
+ db_file,
20
+ night=1,
21
+ nside=64,
22
+ latCol="fieldDec",
23
+ lonCol="fieldRA",
24
+ notes=True,
25
+ colmap=None,
26
+ ):
27
+ """
28
+ Make a bundleList of things to run
29
+ """
30
+
31
+ if colmap is None:
32
+ colmap = col_map_dict("opsimV4")
33
+
34
+ mjdCol = "observationStartMJD"
35
+ altCol = "altitude"
36
+ azCol = "azimuth"
37
+ # Construct sql queries for each filter and all filters
38
+ filters = ["u", "g", "r", "i", "z", "y"]
39
+ sqls = ["night=%i and filter='%s'" % (night, f) for f in filters]
40
+ sqls.append("night=%i" % night)
41
+
42
+ bundleList = []
43
+ plotFuncs_lam = [plots.LambertSkyMap()]
44
+
45
+ # Hourglass
46
+ hourslicer = slicers.HourglassSlicer()
47
+ display_dict = {"group": "Hourglass"}
48
+ md = ""
49
+ sql = "night=%i" % night
50
+ metric = metrics.HourglassMetric(
51
+ night_col=colmap["night"], mjd_col=colmap["mjd"], metric_name="Hourglass"
52
+ )
53
+ bundle = metricBundles.MetricBundle(
54
+ metric, hourslicer, constraint=sql, info_label=md, display_dict=display_dict
55
+ )
56
+ bundleList.append(bundle)
57
+
58
+ reg_slicer = slicers.HealpixSlicer(nside=nside, lon_col=lonCol, lat_col=latCol, lat_lon_deg=True)
59
+ altaz_slicer = slicers.HealpixSlicer(
60
+ nside=nside, lat_col=altCol, lat_lon_deg=True, lon_col=azCol, use_cache=False
61
+ )
62
+
63
+ unislicer = slicers.UniSlicer()
64
+ for sql in sqls:
65
+ # Number of exposures
66
+ metric = metrics.CountMetric(mjdCol, metric_name="N visits")
67
+ bundle = metricBundles.MetricBundle(metric, reg_slicer, sql)
68
+ bundleList.append(bundle)
69
+ metric = metrics.CountMetric(mjdCol, metric_name="N visits alt az")
70
+ bundle = metricBundles.MetricBundle(metric, altaz_slicer, sql, plot_funcs=plotFuncs_lam)
71
+ bundleList.append(bundle)
72
+
73
+ metric = metrics.MeanMetric(mjdCol, metric_name="Mean Visit Time")
74
+ bundle = metricBundles.MetricBundle(metric, reg_slicer, sql)
75
+ bundleList.append(bundle)
76
+ metric = metrics.MeanMetric(mjdCol, metric_name="Mean Visit Time alt az")
77
+ bundle = metricBundles.MetricBundle(metric, altaz_slicer, sql, plot_funcs=plotFuncs_lam)
78
+ bundleList.append(bundle)
79
+
80
+ metric = metrics.CountMetric(mjdCol, metric_name="N_visits")
81
+ bundle = metricBundles.MetricBundle(metric, unislicer, sql)
82
+ bundleList.append(bundle)
83
+
84
+ # Need pairs in window to get a map of how well it gathered SS pairs.
85
+
86
+ # Moon phase.
87
+
88
+ metric = metrics.NChangesMetric(col="filter", metric_name="Filter Changes")
89
+ bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
90
+ bundleList.append(bundle)
91
+
92
+ metric = metrics.BruteOSFMetric()
93
+ bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
94
+ bundleList.append(bundle)
95
+
96
+ metric = metrics.MeanMetric("slewTime")
97
+ bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
98
+ bundleList.append(bundle)
99
+
100
+ metric = metrics.MinMetric("slewTime")
101
+ bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
102
+ bundleList.append(bundle)
103
+
104
+ metric = metrics.MaxMetric("slewTime")
105
+ bundle = metricBundles.MetricBundle(metric, unislicer, "night=%i" % night)
106
+ bundleList.append(bundle)
107
+
108
+ # Make plots of the solar system pairs that were taken in the night
109
+ metric = metrics.PairMetric(mjd_col=mjdCol)
110
+ sql = "night=%i and (filter ='r' or filter='g' or filter='i')" % night
111
+ bundle = metricBundles.MetricBundle(metric, reg_slicer, sql)
112
+ bundleList.append(bundle)
113
+
114
+ metric = metrics.PairMetric(mjd_col=mjdCol, metric_name="z Pairs")
115
+ sql = "night=%i and filter='z'" % night
116
+ bundle = metricBundles.MetricBundle(metric, reg_slicer, sql)
117
+ bundleList.append(bundle)
118
+
119
+ # Plot up each visit
120
+ metric = metrics.NightPointingMetric(mjd_col=mjdCol)
121
+ slicer = slicers.UniSlicer()
122
+ sql = "night=%i" % night
123
+ plot_funcs = [plots.NightPointingPlotter()]
124
+ bundle = metricBundles.MetricBundle(metric, slicer, sql, plot_funcs=plot_funcs)
125
+ bundleList.append(bundle)
126
+
127
+ # stats from the note column
128
+ if notes:
129
+ display_dict = {"group": "Basic Stats", "subgroup": "Percent stats"}
130
+ metric = metrics.StringCountMetric(col="scheduler_note", percent=True, metric_name="Percents")
131
+ bundle = metricBundles.MetricBundle(metric, unislicer, sql, display_dict=display_dict)
132
+ bundleList.append(bundle)
133
+ display_dict["subgroup"] = "Count Stats"
134
+ metric = metrics.StringCountMetric(col="scheduler_note", metric_name="Counts")
135
+ bundle = metricBundles.MetricBundle(metric, unislicer, sql, display_dict=display_dict)
136
+ bundleList.append(bundle)
137
+
138
+ return metricBundles.make_bundles_dict_from_list(bundleList)
139
+
140
+
141
+ def maf_night_report():
142
+ """Generate a report on a single night."""
143
+
144
+ parser = argparse.ArgumentParser(description="Python script to generate a report on a single night.")
145
+ parser.add_argument(
146
+ "db_file",
147
+ type=str,
148
+ default=None,
149
+ help="full file path to the simulation sqlite file",
150
+ )
151
+ parser.add_argument(
152
+ "--out_dir",
153
+ type=str,
154
+ default="night_report",
155
+ help="Output directory for MAF outputs." + ' Default "Out"',
156
+ )
157
+ parser.add_argument(
158
+ "--nside",
159
+ type=int,
160
+ default=64,
161
+ help="Resolution to run Healpix grid at (must be 2^x). Default 64.",
162
+ )
163
+ parser.add_argument(
164
+ "--lon_col",
165
+ type=str,
166
+ default="fieldRA",
167
+ help="Column to use for RA values (can be a stacker dither column)." + " Default=fieldRA.",
168
+ )
169
+ parser.add_argument(
170
+ "--lat_col",
171
+ type=str,
172
+ default="fieldDec",
173
+ help="Column to use for Dec values (can be a stacker dither column)." + " Default=fieldDec.",
174
+ )
175
+ parser.add_argument("--night", type=int, default=1)
176
+ parser.add_argument("--run_name", type=str, default="run_name")
177
+
178
+ parser.set_defaults()
179
+ args, extras = parser.parse_known_args()
180
+
181
+ bundle_dict = make_bundle_list(
182
+ args.db_file,
183
+ nside=args.nside,
184
+ lonCol=args.lon_col,
185
+ latCol=args.lat_col,
186
+ night=args.night,
187
+ )
188
+
189
+ for key in bundle_dict:
190
+ bundle_dict[key].set_run_name(args.run_name)
191
+
192
+ # Set up / connect to results_db.
193
+ results_db = db.ResultsDb(out_dir=args.out_dir)
194
+
195
+ # Set up metricBundleGroup.
196
+ group = metricBundles.MetricBundleGroup(
197
+ bundle_dict, args.db_file, out_dir=args.out_dir, results_db=results_db
198
+ )
199
+ group.run_all()
200
+ group.plot_all()
@@ -0,0 +1,90 @@
1
+ __all__ = ("make_fbs_tracking_db",)
2
+
3
+ import argparse
4
+ import os
5
+ import sqlite3
6
+
7
+ import pandas as pd
8
+
9
+ from rubin_sim.maf.db import ResultsDb, TrackingDb, VersionRow
10
+
11
+
12
+ def make_fbs_tracking_db():
13
+ """Make a database to track lots of opsim outputs,
14
+ adding in comments and identifiers based on the metric subsets.
15
+ """
16
+ parser = argparse.ArgumentParser(
17
+ description="Create a tracking database for many opsim maf outputs,"
18
+ "with comments and dates. "
19
+ "Assumes metrics are in a subdirectory called 'maf'."
20
+ )
21
+ parser.add_argument(
22
+ "--opsim_list",
23
+ type=str,
24
+ default="opsim_list",
25
+ help="File containing a list of all of the opsim runs to add.",
26
+ )
27
+ args = parser.parse_args()
28
+
29
+ batches = {
30
+ "glance": "Quick Look Metrics",
31
+ "meta": "General Info Metrics",
32
+ "sci": "Science Metrics",
33
+ "ss": "Solar System Metrics",
34
+ "ddf": "Deep Drilling Metrics",
35
+ }
36
+
37
+ tracking_db = TrackingDb()
38
+ print(f"Tracking database in directory {tracking_db.tracking_db_dir}")
39
+
40
+ with open(args.opsim_list, "r") as runlist:
41
+ for run in runlist:
42
+ db_file = run.replace("\n", "")
43
+ vals = db_file.split("/")
44
+ family = vals[-2]
45
+ db_name = vals[-1]
46
+ run_name = db_name.replace(".db", "")
47
+ run_version = run_name.split("_10yrs")[0].split("_v")[-1]
48
+ run_group = family
49
+
50
+ # Try to build a comment on the run based on the run_name
51
+ run_comment = run_version + " "
52
+ run_comment += db_name.split("_v")[0].replace("_", " ")
53
+
54
+ print(run_name, db_file)
55
+ conn = sqlite3.connect(db_file)
56
+ query = "select Value from info where Parameter == 'Date, ymd'"
57
+ result = pd.read_sql(query, conn)
58
+ sched_date = result.iloc[0, 0]
59
+ query = "select Value from info where Parameter like 'rubin_%.__version__'"
60
+ result = pd.read_sql(query, conn)
61
+ sched_version = result.iloc[0, 0]
62
+
63
+ # Look for metrics in any of the above sets
64
+ for k in batches:
65
+ maf_dir = os.path.join("maf", run_name + "_" + k)
66
+ maf_comment = batches[k]
67
+ # Get maf run date and version
68
+ if os.path.isfile(os.path.join(maf_dir, "resultsDb_sqlite.db")):
69
+ resdb = ResultsDb(maf_dir)
70
+ resdb.open()
71
+ query = resdb.session.query(VersionRow).all()
72
+ for v in query:
73
+ maf_version = v.version
74
+ maf_date = v.run_date
75
+ resdb.close()
76
+
77
+ maf_dir = os.path.relpath(maf_dir, start=os.path.dirname(tracking_db.tracking_db_dir))
78
+ runId = tracking_db.add_run(
79
+ run_group=run_group,
80
+ run_name=run_name,
81
+ run_comment=run_comment,
82
+ run_version=sched_version,
83
+ run_date=sched_date,
84
+ maf_comment=maf_comment,
85
+ maf_version=maf_version,
86
+ maf_date=maf_date,
87
+ maf_dir=maf_dir,
88
+ db_file=db_file,
89
+ )
90
+ print("Used MAF RunID %d" % (runId))
@@ -0,0 +1,8 @@
1
+ from .base_map import *
2
+ from .dust_map import *
3
+ from .dust_map_3d import *
4
+ from .ebv_3d_hp import *
5
+ from .gal_coords_map import *
6
+ from .galactic_plane_priority_maps import *
7
+ from .stellar_density_map import *
8
+ from .trilegal_map import *
@@ -0,0 +1,72 @@
1
+ __all__ = ("MapsRegistry", "BaseMap")
2
+
3
+ import inspect
4
+
5
+
6
+ class MapsRegistry(type):
7
+ """
8
+ Meta class for Maps, to build a registry of maps classes.
9
+ """
10
+
11
+ def __init__(cls, name, bases, dict):
12
+ super(MapsRegistry, cls).__init__(name, bases, dict)
13
+ if not hasattr(cls, "registry"):
14
+ cls.registry = {}
15
+ modname = inspect.getmodule(cls).__name__
16
+ if modname.startswith("rubin_sim.maf.maps"):
17
+ modname = ""
18
+ else:
19
+ if len(modname.split(".")) > 1:
20
+ modname = ".".join(modname.split(".")[:-1]) + "."
21
+ else:
22
+ modname = modname + "."
23
+ mapsname = modname + name
24
+ if mapsname in cls.registry:
25
+ raise Exception("Redefining maps %s! (there are >1 maps with the same name)" % (mapsname))
26
+ if mapsname != "BaseMaps":
27
+ cls.registry[mapsname] = cls
28
+
29
+ def get_class(cls, mapsname):
30
+ return cls.registry[mapsname]
31
+
32
+ def help(cls, doc=False):
33
+ for mapsname in sorted(cls.registry):
34
+ if not doc:
35
+ print(mapsname)
36
+ if doc:
37
+ print("---- ", mapsname, " ----")
38
+ print(cls.registry[mapsname].__doc__)
39
+ maps = cls.registry[mapsname]()
40
+ print(" added to slice_point: ", ",".join(maps.keynames))
41
+
42
+
43
+ class BaseMap(metaclass=MapsRegistry):
44
+ """Base for maps classes."""
45
+
46
+ def __init__(self, **kwargs):
47
+ self.keynames = ["newkey"]
48
+
49
+ def __eq__(self, othermap):
50
+ return self.keynames == othermap.keynames
51
+
52
+ def __ne__(self, othermap):
53
+ return self.keynames != othermap.keynames
54
+
55
+ def __lt__(self, othermap):
56
+ return self.keynames < othermap.keynames
57
+
58
+ def __gt__(self, othermap):
59
+ return self.keynames > othermap.keynames
60
+
61
+ def __le__(self, othermap):
62
+ return self.keynames <= othermap.keynames
63
+
64
+ def __ge__(self, othermap):
65
+ return self.keynames >= othermap.keynames
66
+
67
+ def run(self, slice_points):
68
+ """Given slice_points (dict containing metadata about each slice_point,
69
+ including ra/dec), adds additional metadata at each slice_point
70
+ and returns updated dict.
71
+ """
72
+ raise NotImplementedError("This must be defined in subclass")