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,145 @@
1
+ import os
2
+ import sqlite3
3
+ import unittest
4
+ from tempfile import TemporaryDirectory
5
+
6
+ import pandas as pd
7
+
8
+ import rubin_sim.maf.db as db
9
+ import rubin_sim.maf.metric_bundles as metric_bundles
10
+ import rubin_sim.maf.metrics as metrics
11
+ import rubin_sim.maf.plots as plots
12
+ import rubin_sim.maf.slicers as slicers
13
+
14
+
15
+ class TestScalarHourglassPlots(unittest.TestCase):
16
+ def setUp(self):
17
+ self._data_dir_itself = TemporaryDirectory()
18
+ opsdb_fname = create_sample_visit_db(self._data_dir_itself.name)
19
+ self._out_dir_itself = TemporaryDirectory()
20
+ self.out_dir = self._out_dir_itself.name
21
+ self.results_db = db.ResultsDb(out_dir=self.out_dir)
22
+ self.ops_db = db.OpsimDatabase(opsdb_fname)
23
+ self.slicer = slicers.TimeIntervalSlicer(interval_seconds=3600)
24
+ self.metric = metrics.MedianMetric("seeingFwhmEff")
25
+
26
+ @unittest.skip("This is now throwing astropy.utils.iers.iers.IERSRangeError, but only sometimes?")
27
+ def test_month_plot(self):
28
+ sql_constraint = ""
29
+ metric_bundle = metric_bundles.MetricBundle(self.metric, self.slicer, sql_constraint)
30
+ bundle_dict = {1: metric_bundle}
31
+ bundle_group = metric_bundles.MetricBundleGroup(
32
+ bundle_dict,
33
+ self.ops_db,
34
+ out_dir=self.out_dir,
35
+ results_db=self.results_db,
36
+ )
37
+ _ = bundle_group.run_all()
38
+ plot_func = plots.YearHourglassPlot(2023)
39
+ _ = metric_bundle.plot(plotFunc=plot_func)
40
+
41
+
42
+ class TestTimeUseHourglassPlots(unittest.TestCase):
43
+ def setUp(self):
44
+ self._data_dir_itself = TemporaryDirectory()
45
+ opsdb_fname = create_sample_visit_db(self._data_dir_itself.name)
46
+
47
+ self._out_dir_itself = TemporaryDirectory()
48
+ self.out_dir = self._out_dir_itself.name
49
+ self.results_db = db.ResultsDb(out_dir=self.out_dir)
50
+ self.ops_db = db.OpsimDatabase(opsdb_fname)
51
+ self.slicer = slicers.BlockIntervalSlicer()
52
+ self.metric = metrics.UseMetric()
53
+
54
+ @unittest.skip("XXX-seems like this was erroneously passing before?")
55
+ def test_year_plot(self):
56
+ sql_constraint = ""
57
+ metric_bundle = metric_bundles.MetricBundle(self.metric, self.slicer, sql_constraint)
58
+ bundle_dict = {1: metric_bundle}
59
+ bundle_group = metric_bundles.MetricBundleGroup(
60
+ bundle_dict,
61
+ self.ops_db,
62
+ out_dir=self.out_dir,
63
+ results_db=self.results_db,
64
+ )
65
+ _ = bundle_group.run_all()
66
+ plot_func = plots.YearHourglassUsePlot(2023)
67
+ _ = metric_bundle.plot(plotFunc=plot_func)
68
+
69
+
70
+ def create_sample_visit_db(dir_name):
71
+ fname = os.path.join(dir_name, "opsim.sqlite3")
72
+
73
+ sample_visits_dict = {
74
+ "observationStartMJD": {
75
+ 75831: 59974.1403819843,
76
+ 88243: 59991.13314155574,
77
+ 84877: 59986.16509162588,
78
+ 73474: 59971.038614223085,
79
+ 91024: 59994.3667217889,
80
+ 94567: 60001.38094520713,
81
+ 88867: 59992.06039742178,
82
+ 91397: 59995.17212771153,
83
+ 88282: 59991.151247547146,
84
+ 82396: 59983.0460827712,
85
+ },
86
+ "visitTime": {
87
+ 75831: 34.0,
88
+ 88243: 34.0,
89
+ 84877: 34.0,
90
+ 73474: 34.0,
91
+ 91024: 34.0,
92
+ 94567: 34.0,
93
+ 88867: 34.0,
94
+ 91397: 34.0,
95
+ 88282: 34.0,
96
+ 82396: 34.0,
97
+ },
98
+ "seeingFwhmEff": {
99
+ 75831: 0.9580660562409485,
100
+ 88243: 1.2816139136535794,
101
+ 84877: 0.8711626732163685,
102
+ 73474: 1.138078694389459,
103
+ 91024: 0.6851416920629385,
104
+ 94567: 0.9526705179882091,
105
+ 88867: 1.0749841095670385,
106
+ 91397: 0.9092889658087193,
107
+ 88282: 1.3069907982221605,
108
+ 82396: 0.8034796448061345,
109
+ },
110
+ "filter": {
111
+ 75831: "y",
112
+ 88243: "g",
113
+ 84877: "z",
114
+ 73474: "r",
115
+ 91024: "r",
116
+ 94567: "y",
117
+ 88867: "r",
118
+ 91397: "r",
119
+ 88282: "g",
120
+ 82396: "r",
121
+ },
122
+ "scheduler_note": {
123
+ 75831: "blob, zy, b",
124
+ 88243: "blob, ug, b",
125
+ 84877: "blob, iz, b",
126
+ 73474: "greedy",
127
+ 91024: "greedy",
128
+ 94567: "greedy",
129
+ 88867: "blob, ur, b",
130
+ 91397: "blob, ri, a",
131
+ 88282: "blob, gr, a",
132
+ 82396: "DD:ECDFS",
133
+ },
134
+ }
135
+
136
+ visits = pd.DataFrame(sample_visits_dict)
137
+ with sqlite3.connect(fname) as con:
138
+ visits.to_sql("observations", con=con)
139
+
140
+ return fname
141
+
142
+
143
+ run_tests_now = __name__ == "__main__"
144
+ if run_tests_now:
145
+ unittest.main()
@@ -0,0 +1,33 @@
1
+ import unittest
2
+
3
+ import numpy as np
4
+
5
+ import rubin_sim.maf.metrics as metrics
6
+
7
+
8
+ class TestHourglassmetric(unittest.TestCase):
9
+ def test_hourglass_metric(self):
10
+ """Test the hourglass metric"""
11
+ names = ["observationStartMJD", "night", "band"]
12
+ types = [float, float, str]
13
+ npts = 50
14
+ data = np.zeros(npts, dtype=list(zip(names, types)))
15
+ day0 = 59000
16
+ data["observationStartMJD"] = np.arange(0, 10, 0.2)[:npts] + day0
17
+ data["night"] = np.floor(data["observationStartMJD"] - day0)
18
+ data["band"] = "r"
19
+ data["band"][-1] = "g"
20
+ slice_point = [0]
21
+ metric = metrics.HourglassMetric()
22
+ result = metric.run(data, slice_point)
23
+ pernight = result["pernight"]
24
+ perfilter = result["perfilter"]
25
+
26
+ # All the gaps are larger than 2 min.
27
+ assert np.size(perfilter) == 2 * data.size
28
+ # Check that the format is right at least
29
+ assert len(pernight.dtype.names) == 9
30
+
31
+
32
+ if __name__ == "__main__":
33
+ unittest.main()
tests/maf/test_io.py ADDED
@@ -0,0 +1,187 @@
1
+ import unittest
2
+ from tempfile import TemporaryFile
3
+
4
+ import healpy as hp
5
+ import numpy as np
6
+ import numpy.ma as ma
7
+
8
+ import rubin_sim.maf.slicers as slicers
9
+
10
+
11
+ class TestSlicers(unittest.TestCase):
12
+ def setUp(self):
13
+ self.filenames = []
14
+ self.baseslicer = slicers.BaseSlicer()
15
+
16
+ def test_healpix_slicer_obj(self):
17
+ rng = np.random.RandomState(8121)
18
+ nside = 32
19
+ slicer = slicers.HealpixSlicer(nside=nside)
20
+ metric_values = rng.rand(hp.nside2npix(nside)).astype("object")
21
+ metric_values = ma.MaskedArray(
22
+ data=metric_values,
23
+ mask=np.where(metric_values < 0.1, True, False),
24
+ fill_value=slicer.badval,
25
+ )
26
+ with TemporaryFile() as filename:
27
+ info_label = "testdata"
28
+ slicer.write_data(filename, metric_values, info_label=info_label)
29
+ _ = filename.seek(0)
30
+ metric_values_back, slicer_back, header = self.baseslicer.read_data(filename)
31
+ np.testing.assert_almost_equal(metric_values_back, metric_values)
32
+ assert slicer == slicer_back
33
+ assert info_label == header["info_label"]
34
+ attr2check = ["nside", "nslice", "columns_needed", "lon_col", "lat_col"]
35
+ for att in attr2check:
36
+ assert getattr(slicer, att) == getattr(slicer_back, att)
37
+
38
+ def test_healpix_slicer_floats(self):
39
+ rng = np.random.RandomState(71231)
40
+ nside = 32
41
+ slicer = slicers.HealpixSlicer(nside=nside)
42
+ metric_values = rng.rand(hp.nside2npix(nside))
43
+ with TemporaryFile() as filename:
44
+ slicer.write_data(filename, metric_values, info_label="testdata")
45
+ _ = filename.seek(0)
46
+ metric_values_back, slicer_back, header = self.baseslicer.read_data(filename)
47
+ np.testing.assert_almost_equal(metric_values_back, metric_values)
48
+ assert slicer == slicer_back
49
+ attr2check = ["nside", "nslice", "columns_needed", "lon_col", "lat_col"]
50
+ for att in attr2check:
51
+ assert getattr(slicer, att) == getattr(slicer_back, att)
52
+
53
+ def test_healpix_slicer_masked(self):
54
+ rng = np.random.RandomState(712551)
55
+ nside = 32
56
+ slicer = slicers.HealpixSlicer(nside=nside)
57
+ metric_values = rng.rand(hp.nside2npix(nside))
58
+ metric_values = ma.MaskedArray(
59
+ data=metric_values,
60
+ mask=np.where(metric_values < 0.1, True, False),
61
+ fill_value=slicer.badval,
62
+ )
63
+ with TemporaryFile() as filename:
64
+ slicer.write_data(filename, metric_values, info_label="testdata")
65
+ _ = filename.seek(0)
66
+ metric_values_back, slicer_back, header = self.baseslicer.read_data(filename)
67
+ np.testing.assert_almost_equal(metric_values_back, metric_values)
68
+ assert slicer == slicer_back
69
+ attr2check = ["nside", "nslice", "columns_needed", "lon_col", "lat_col"]
70
+ for att in attr2check:
71
+ assert getattr(slicer, att) == getattr(slicer_back, att)
72
+
73
+ def test_one_d_slicer(self):
74
+ rng = np.random.RandomState(71111)
75
+ slicer = slicers.OneDSlicer(slice_col_name="testdata")
76
+ data_values = np.zeros(10000, dtype=[("testdata", "float")])
77
+ data_values["testdata"] = rng.rand(10000)
78
+ slicer.setup_slicer(data_values)
79
+ with TemporaryFile() as filename:
80
+ slicer.write_data(filename, data_values[:100])
81
+ _ = filename.seek(0)
82
+ data_back, slicer_back, header = self.baseslicer.read_data(filename)
83
+ assert slicer == slicer_back
84
+ # np.testing.assert_almost_equal(data_back,data_values[:100])
85
+ attr2check = ["nslice", "columns_needed"]
86
+ for att in attr2check:
87
+ if type(getattr(slicer, att)).__module__ == "numpy":
88
+ np.testing.assert_almost_equal(getattr(slicer, att), getattr(slicer_back, att))
89
+ else:
90
+ assert getattr(slicer, att) == getattr(slicer_back, att)
91
+
92
+ def test_userpoints_slicer(self):
93
+ rng = np.random.RandomState(7442)
94
+
95
+ names = ["fieldRA", "fieldDec", "fieldId"]
96
+ dt = ["float", "float", "int"]
97
+ metric_values = rng.rand(100)
98
+ field_data = np.zeros(100, dtype=list(zip(names, dt)))
99
+ field_data["fieldRA"] = rng.rand(100)
100
+ field_data["fieldDec"] = rng.rand(100)
101
+ field_data["fieldId"] = np.arange(100)
102
+
103
+ slicer = slicers.UserPointsSlicer(ra=field_data["fieldRA"], dec=field_data["fieldDec"])
104
+
105
+ names = ["data1", "data2", "fieldId"]
106
+ sim_data = np.zeros(100, dtype=list(zip(names, dt)))
107
+ sim_data["data1"] = rng.rand(100)
108
+ sim_data["fieldId"] = np.arange(100)
109
+ with TemporaryFile() as filename:
110
+ slicer.write_data(filename, metric_values)
111
+ _ = filename.seek(0)
112
+ metric_back, slicer_back, header = self.baseslicer.read_data(filename)
113
+ assert slicer == slicer_back
114
+ np.testing.assert_almost_equal(metric_back, metric_values)
115
+ attr2check = [
116
+ "nslice",
117
+ "columns_needed",
118
+ "lon_col",
119
+ "lat_col",
120
+ "shape",
121
+ ]
122
+ for att in attr2check:
123
+ if type(getattr(slicer, att)).__name__ == "dict":
124
+ for key in getattr(slicer, att):
125
+ np.testing.assert_almost_equal(
126
+ getattr(slicer, att)[key], getattr(slicer_back, att)[key]
127
+ )
128
+ else:
129
+ assert getattr(slicer, att) == getattr(slicer_back, att)
130
+
131
+ def test_unislicer(self):
132
+ rng = np.random.RandomState(34229)
133
+ slicer = slicers.UniSlicer()
134
+ data = np.zeros(1, dtype=[("testdata", "float")])
135
+ data[:] = rng.rand(1)
136
+ slicer.setup_slicer(data)
137
+ with TemporaryFile() as filename:
138
+ metric_value = np.array([25.0])
139
+ slicer.write_data(filename, metric_value)
140
+ _ = filename.seek(0)
141
+ data_back, slicer_back, header = self.baseslicer.read_data(filename)
142
+ assert slicer == slicer_back
143
+ np.testing.assert_almost_equal(data_back, metric_value)
144
+ attr2check = ["nslice", "columns_needed"]
145
+ for att in attr2check:
146
+ assert getattr(slicer, att) == getattr(slicer_back, att)
147
+
148
+ def test_complex(self):
149
+ # Test case where there is a complex metric
150
+ rng = np.random.RandomState(5442)
151
+ nside = 8
152
+ slicer = slicers.HealpixSlicer(nside=nside)
153
+ data = np.zeros(slicer.nslice, dtype="object")
154
+ for i, ack in enumerate(data):
155
+ n_el = rng.rand(1) * 4 # up to 4 elements
156
+ data[i] = np.arange(n_el[0])
157
+ with TemporaryFile() as filename:
158
+ slicer.write_data(filename, data)
159
+ _ = filename.seek(0)
160
+ data_back, slicer_back, header = self.baseslicer.read_data(filename)
161
+ assert slicer == slicer_back
162
+ # This is a crazy slow loop!
163
+ for i, ack in enumerate(data):
164
+ np.testing.assert_almost_equal(data_back[i], data[i])
165
+
166
+ def test_n_d_slicer(self):
167
+ rng = np.random.RandomState(621)
168
+ colnames = ["test1", "test2", "test3"]
169
+ n = 1000
170
+ dv = np.zeros(n, dtype=list(zip(colnames, [float] * 3)))
171
+ for c in colnames:
172
+ dv[c] = rng.rand(n)
173
+ slicer = slicers.NDSlicer(colnames, bins_list=10)
174
+ slicer.setup_slicer(dv)
175
+ with TemporaryFile() as filename:
176
+ metricdata = np.zeros(slicer.nslice, dtype="float")
177
+ for i, s in enumerate(slicer):
178
+ metricdata[i] = i
179
+ slicer.write_data(filename, metricdata)
180
+ _ = filename.seek(0)
181
+ data_back, slicer_back, header = self.baseslicer.read_data(filename)
182
+ assert slicer == slicer_back
183
+ np.testing.assert_almost_equal(data_back, metricdata)
184
+
185
+
186
+ if __name__ == "__main__":
187
+ unittest.main()
tests/maf/test_json.py ADDED
@@ -0,0 +1,169 @@
1
+ import json
2
+ import unittest
3
+
4
+ import numpy as np
5
+ import numpy.ma as ma
6
+
7
+ import rubin_sim.maf.slicers as slicers
8
+
9
+
10
+ def make_data_values(size=100, min=0.0, max=1.0, random=-1):
11
+ """Generate a simple array of numbers, evenly arranged between min/max,
12
+ but (optional) random order."""
13
+ datavalues = np.arange(0, size, dtype="float")
14
+ datavalues *= (float(max) - float(min)) / (datavalues.max() - datavalues.min())
15
+ datavalues += min
16
+ if random > 0:
17
+ rng = np.random.RandomState(random)
18
+ randorder = rng.rand(size)
19
+ randind = np.argsort(randorder)
20
+ datavalues = datavalues[randind]
21
+ datavalues = np.array(list(zip(datavalues)), dtype=[("testdata", "float")])
22
+ return datavalues
23
+
24
+
25
+ def make_metric_data(slicer, dtype="float", seed=8800):
26
+ rng = np.random.RandomState(seed)
27
+ metric_values = rng.rand(len(slicer)).astype(dtype)
28
+ metric_values = ma.MaskedArray(
29
+ data=metric_values, mask=np.zeros(len(slicer), "bool"), fill_value=slicer.badval
30
+ )
31
+ return metric_values
32
+
33
+
34
+ def make_field_data():
35
+ """Set up sample field data."""
36
+ # These are a subset of the fields from opsim.
37
+ field_id = [2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010]
38
+ ra_rad = [
39
+ 1.4961071750760884,
40
+ 4.009380232682723,
41
+ 2.2738050744968632,
42
+ 2.7527439701957053,
43
+ 6.043715459855715,
44
+ 0.23946974745438585,
45
+ 3.4768050063149119,
46
+ 2.8063803008646744,
47
+ 4.0630173623005916,
48
+ 2.2201678117208452,
49
+ ]
50
+ dec_rad = [
51
+ -0.25205231807872636,
52
+ -0.25205228478831621,
53
+ -0.25205228478831621,
54
+ -0.25205228478831621,
55
+ -0.25205145255075168,
56
+ -0.25205145255075168,
57
+ -0.24630904473998308,
58
+ -0.24630904473998308,
59
+ -0.24630894487049795,
60
+ -0.24630894487049795,
61
+ ]
62
+ field_id = np.array(field_id, "int")
63
+ ra_rad = np.array(ra_rad, "float")
64
+ dec_rad = np.array(dec_rad, "float")
65
+ field_data = np.core.records.fromarrays(
66
+ [field_id, ra_rad, dec_rad], names=["field_id", "fieldRA", "fieldDec"]
67
+ )
68
+ return field_data
69
+
70
+
71
+ def make_opsim_data_values(field_data, size=10000, min=0.0, max=1.0, random=88):
72
+ """Generate a simple array of numbers, evenly arranged between min/max,
73
+ but (optional) random order."""
74
+ datavalues = np.arange(0, size, dtype="float")
75
+ datavalues *= (float(max) - float(min)) / (datavalues.max() - datavalues.min())
76
+ datavalues += min
77
+ rng = np.random.RandomState(random)
78
+ randorder = rng.rand(size)
79
+ randind = np.argsort(randorder)
80
+ datavalues = datavalues[randind]
81
+ # Add valid field_id values to match data values
82
+ field_id = np.zeros(len(datavalues), "int")
83
+ idxs = rng.rand(size) * len(field_data["field_id"])
84
+ for i, d in enumerate(datavalues):
85
+ field_id[i] = field_data[int(idxs[i])][0]
86
+ sim_data = np.core.records.fromarrays([field_id, datavalues], names=["field_id", "testdata"])
87
+ return sim_data
88
+
89
+
90
+ class TestJSONoutUniSlicer(unittest.TestCase):
91
+ def setUp(self):
92
+ self.testslicer = slicers.UniSlicer()
93
+
94
+ def tearDown(self):
95
+ del self.testslicer
96
+
97
+ def test(self):
98
+ metric_val = make_metric_data(self.testslicer, "float", seed=88102231)
99
+ io = self.testslicer.output_json(
100
+ metric_val,
101
+ metric_name="testMetric",
102
+ sim_data_name="testSim",
103
+ info_label="testmeta",
104
+ )
105
+ jsn = json.loads(io.getvalue())
106
+ jsn_header = jsn[0]
107
+ jsn_data = jsn[1]
108
+ self.assertEqual(jsn_header["metric_name"], "testMetric")
109
+ self.assertEqual(jsn_header["sim_data_name"], "testSim")
110
+ self.assertEqual(jsn_header["info_label"], "testmeta")
111
+ self.assertEqual(jsn_header["slicer_name"], "UniSlicer")
112
+ self.assertEqual(jsn_header["slicer_len"], 1)
113
+ self.assertEqual(len(jsn_data), 1)
114
+
115
+
116
+ class TestJSONoutOneDSlicer2(unittest.TestCase):
117
+ def setUp(self):
118
+ # Set up a slicer and some metric data for that slicer.
119
+ dv = make_data_values(1000, random=40082)
120
+ self.testslicer = slicers.OneDSlicer(slice_col_name="testdata")
121
+ self.testslicer.setup_slicer(dv)
122
+
123
+ def tearDown(self):
124
+ del self.testslicer
125
+
126
+ def test(self):
127
+ metric_val = make_metric_data(self.testslicer, "float", seed=18)
128
+ io = self.testslicer.output_json(metric_val)
129
+ jsn = json.loads(io.getvalue())
130
+ jsn_header = jsn[0]
131
+ jsn_data = jsn[1]
132
+ self.assertEqual(jsn_header["slicer_name"], "OneDSlicer")
133
+ self.assertEqual(jsn_header["slicer_len"], len(self.testslicer))
134
+ self.assertEqual(len(jsn_data), len(metric_val) + 1)
135
+ for jsndat, bin_left, mval in zip(jsn_data, self.testslicer.slice_points["bins"], metric_val.data):
136
+ self.assertEqual(jsndat[0], bin_left)
137
+ self.assertEqual(jsndat[1], mval)
138
+
139
+
140
+ class TestJSONoutHealpixSlicer(unittest.TestCase):
141
+ def setUp(self):
142
+ # Set up a slicer and some metric data for that slicer.
143
+ self.testslicer = slicers.HealpixSlicer(nside=4, verbose=False)
144
+
145
+ def tearDown(self):
146
+ del self.testslicer
147
+
148
+ def test(self):
149
+ metric_val = make_metric_data(self.testslicer, "float", seed=452)
150
+ io = self.testslicer.output_json(metric_val)
151
+ jsn = json.loads(io.getvalue())
152
+ jsn_header = jsn[0]
153
+ jsn_data = jsn[1]
154
+ self.assertEqual(jsn_header["slicer_name"], "HealpixSlicer")
155
+ self.assertEqual(jsn_header["slicer_len"], len(self.testslicer))
156
+ self.assertEqual(len(jsn_data), len(metric_val))
157
+ for jsndat, ra, dec, mval in zip(
158
+ jsn_data,
159
+ self.testslicer.slice_points["ra"],
160
+ self.testslicer.slice_points["dec"],
161
+ metric_val.data,
162
+ ):
163
+ self.assertAlmostEqual(jsndat[0], ra / np.pi * 180.0)
164
+ self.assertAlmostEqual(jsndat[1], dec / np.pi * 180.0)
165
+ self.assertEqual(jsndat[2], mval)
166
+
167
+
168
+ if __name__ == "__main__":
169
+ unittest.main()