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,202 @@
1
+ # The base class for all spatial slicers.
2
+ # Slicers are 'data slicers' at heart; spatial slicers slice data by RA/Dec and
3
+ # return the relevant indices in the sim_data to the metric.
4
+ # The primary things added here are the methods to slice the data
5
+ # (for any spatial slicer) as this uses a KD-tree built on spatial
6
+ # (RA/Dec type) indexes.
7
+
8
+ __all__ = ("BaseSpatialSlicer",)
9
+
10
+ import warnings
11
+ from functools import wraps
12
+
13
+ import numpy as np
14
+ import rubin_scheduler.utils as simsUtils
15
+
16
+ from rubin_sim.maf.plots.spatial_plotters import BaseHistogram, BaseSkyMap
17
+
18
+ from .base_slicer import BaseSlicer
19
+
20
+
21
+ def rotate(x, y, rotation_angle_rad):
22
+ """rotate 2d points around the origin (0,0)"""
23
+ cos_rad = np.cos(rotation_angle_rad)
24
+ sin_rad = np.sin(rotation_angle_rad)
25
+ qx = cos_rad * x - sin_rad * y
26
+ qy = sin_rad * x + cos_rad * y
27
+ return qx, qy
28
+
29
+
30
+ class BaseSpatialSlicer(BaseSlicer):
31
+ """Base spatial slicer object, contains additional functionality
32
+ for spatial slicing, including setting up and traversing a kdtree
33
+ containing the simulated data points.
34
+
35
+ Parameters
36
+ ----------
37
+ lon_col : `str`, optional
38
+ Name of the longitude (RA equivalent) column.
39
+ lat_col : `str`, optional
40
+ Name of the latitude (Dec equivalent) column.
41
+ rot_sky_pos_col_name : `str`, optional
42
+ Name of the rotSkyPos column in the input data.
43
+ Only used if use_camera is True.
44
+ Describes the orientation of the camera orientation on the sky.
45
+ lat_lon_deg : `bool`, optional
46
+ Flag indicating whether lat and lon values from input data are
47
+ in degrees (True) or radians (False).
48
+ verbose : `bool`, optional
49
+ Verbosity flag - noisy or quiet.
50
+ badval : `float`, optional
51
+ Bad value flag, relevant for plotting.
52
+ leafsize : `int`, optional
53
+ Leafsize value for kdtree.
54
+ radius : `float`, optional
55
+ Radius for matching in the kdtree.
56
+ Equivalent to the radius of the FOV, in degrees.
57
+ use_camera : `bool`, optional
58
+ Flag to indicate whether to use the LSST camera footprint or not.
59
+ camera_radius : `float`, optional
60
+ max_radius for the LsstCameraFootprint (degrees).
61
+ camera_footprint_file : `str`, optional
62
+ Name of the camera footprint map to use.
63
+ Can be None, which will use the default file.
64
+ """
65
+
66
+ def __init__(
67
+ self,
68
+ lon_col="fieldRA",
69
+ lat_col="fieldDec",
70
+ rot_sky_pos_col_name="rotSkyPos",
71
+ lat_lon_deg=True,
72
+ verbose=True,
73
+ badval=-666,
74
+ leafsize=100,
75
+ radius=2.45,
76
+ use_camera=True,
77
+ camera_radius=1.94,
78
+ camera_footprint_file=None,
79
+ ):
80
+ super().__init__(verbose=verbose, badval=badval)
81
+ self.lon_col = lon_col
82
+ self.lat_col = lat_col
83
+ self.latLonDeg = lat_lon_deg
84
+ self.rotSkyPosColName = rot_sky_pos_col_name
85
+ self.columns_needed = [lon_col, lat_col, rot_sky_pos_col_name]
86
+ self.use_camera = use_camera
87
+ self.camera_radius = camera_radius
88
+ self.camera_footprint_file = camera_footprint_file
89
+ self.radius = radius
90
+ self.leafsize = leafsize
91
+ self.slicer_init = {
92
+ "lon_col": self.lon_col,
93
+ "lat_col": self.lat_col,
94
+ "radius": self.radius,
95
+ "badval": self.badval,
96
+ "use_camera": self.use_camera,
97
+ }
98
+ # RA and Dec are required slice_point info for any spatial slicer.
99
+ # slice_point RA/Dec are in radians.
100
+ self.slice_points["sid"] = None
101
+ self.slice_points["ra"] = None
102
+ self.slice_points["dec"] = None
103
+ self.nslice = None
104
+ self.shape = None
105
+ self.plot_funcs = [BaseHistogram, BaseSkyMap]
106
+
107
+ def setup_slicer(self, sim_data, maps=None):
108
+ """Use sim_data[self.lon_col] and sim_data[self.lat_col]
109
+ (in radians) to set up KDTree.
110
+
111
+ Parameters
112
+ -----------
113
+ sim_data : `numpy.ndarray`
114
+ The simulated data, including the location of each pointing.
115
+ maps : `list` of `rubin_sim.maf.maps` objects, optional
116
+ List of maps (such as dust extinction) that will run to build up
117
+ additional data at each slice_point. This additional data
118
+ is available to metrics via the slice_point dictionary.
119
+ """
120
+ if maps is not None:
121
+ if self.cache_size != 0 and len(maps) > 0:
122
+ warnings.warn(
123
+ "Warning: Loading maps but cache on." "Should probably set use_cache=False in slicer."
124
+ )
125
+ self._run_maps(maps)
126
+ self._set_rad(self.radius)
127
+
128
+ if self.latLonDeg:
129
+ self.data_ra = np.radians(sim_data[self.lon_col])
130
+ self.data_dec = np.radians(sim_data[self.lat_col])
131
+ self.data_rot = np.radians(sim_data[self.rotSkyPosColName])
132
+ else:
133
+ self.data_ra = sim_data[self.lon_col]
134
+ self.data_dec = sim_data[self.lat_col]
135
+ self.data_rot = sim_data[self.rotSkyPosColName]
136
+ if self.use_camera:
137
+ self._setupLSSTCamera()
138
+
139
+ self._build_tree(self.data_ra, self.data_dec, self.leafsize)
140
+
141
+ @wraps(self._slice_sim_data)
142
+ def _slice_sim_data(islice):
143
+ """Return indexes for relevant opsim data at slice_point
144
+ (slice_point=lon_col/lat_col value .. usually ra/dec).
145
+ """
146
+
147
+ # Build dict for slice_point info
148
+ slice_point = {"sid": islice}
149
+ sx, sy, sz = simsUtils._xyz_from_ra_dec(
150
+ self.slice_points["ra"][islice], self.slice_points["dec"][islice]
151
+ )
152
+ # Query against tree.
153
+ indices = self.opsimtree.query_ball_point((sx, sy, sz), self.rad)
154
+
155
+ if (self.use_camera) & (len(indices) > 0):
156
+ # Find the indices *of those indices*
157
+ # which fall in the camera footprint
158
+ camera_idx = self.camera(
159
+ self.slice_points["ra"][islice],
160
+ self.slice_points["dec"][islice],
161
+ self.data_ra[indices],
162
+ self.data_dec[indices],
163
+ self.data_rot[indices],
164
+ )
165
+ indices = np.array(indices)[camera_idx]
166
+
167
+ # Loop through all the slice_point keys.
168
+ # If the first dimension of slice_point[key] has the same shape
169
+ # as the slicer, assume it is information per slice_point.
170
+ # Otherwise, pass the whole slice_point[key] information.
171
+ # Useful for stellar LF maps where we want to pass only the
172
+ # relevant LF and the bins that go with it.
173
+ for key in self.slice_points:
174
+ if len(np.shape(self.slice_points[key])) == 0:
175
+ keyShape = 0
176
+ else:
177
+ keyShape = np.shape(self.slice_points[key])[0]
178
+ if keyShape == self.nslice:
179
+ slice_point[key] = self.slice_points[key][islice]
180
+ else:
181
+ slice_point[key] = self.slice_points[key]
182
+ return {"idxs": indices, "slice_point": slice_point}
183
+
184
+ setattr(self, "_slice_sim_data", _slice_sim_data)
185
+
186
+ def _setupLSSTCamera(self):
187
+ """If we want to include the camera chip gaps, etc."""
188
+ self.camera = simsUtils.LsstCameraFootprint(
189
+ units="radians", footprint_file=self.camera_footprint_file, max_radius=self.camera_radius
190
+ )
191
+
192
+ def _build_tree(self, sim_dataRa, sim_dataDec, leafsize=100):
193
+ """Build KD tree on sim_dataRA/Dec.
194
+
195
+ sim_dataRA, sim_dataDec = RA and Dec values (in radians).
196
+ leafsize = the number of Ra/Dec pointings in each leaf node.
197
+ """
198
+ self.opsimtree = simsUtils._build_tree(sim_dataRa, sim_dataDec, leafsize)
199
+
200
+ def _set_rad(self, radius=1.75):
201
+ """Set radius (in degrees) for kdtree search."""
202
+ self.rad = simsUtils.xyz_angular_radius(radius)
@@ -0,0 +1,118 @@
1
+ __all__ = ("HealpixSDSSSlicer",)
2
+
3
+ from functools import wraps
4
+
5
+ import matplotlib.path as mplPath
6
+ import numpy as np
7
+ from rubin_scheduler.utils import _xyz_from_ra_dec, gnomonic_project_toxy
8
+
9
+ from rubin_sim.maf.plots import HealpixSDSSSkyMap
10
+
11
+ from .healpix_slicer import HealpixSlicer
12
+
13
+
14
+ class HealpixSDSSSlicer(HealpixSlicer):
15
+ """For use with SDSS stripe 82 square images"""
16
+
17
+ def __init__(
18
+ self,
19
+ nside=128,
20
+ lon_col="RA1",
21
+ lat_col="Dec1",
22
+ verbose=True,
23
+ use_cache=True,
24
+ radius=17.0 / 60.0,
25
+ leafsize=100,
26
+ **kwargs,
27
+ ):
28
+ """Using one corner of the chip as the spatial key and the
29
+ diagonal as the radius."""
30
+ super().__init__(
31
+ verbose=verbose,
32
+ lon_col=lon_col,
33
+ lat_col=lat_col,
34
+ radius=radius,
35
+ leafsize=leafsize,
36
+ use_cache=use_cache,
37
+ nside=nside,
38
+ )
39
+ self.cornerLables = ["RA1", "Dec1", "RA2", "Dec2", "RA3", "Dec3", "RA4", "Dec4"]
40
+ self.plot_funcs = [
41
+ HealpixSDSSSkyMap,
42
+ ]
43
+
44
+ def setup_slicer(self, sim_data, maps=None):
45
+ """
46
+ Use sim_data[self.lon_col] and sim_data[self.lat_col]
47
+ (in radians) to set up KDTree.
48
+ """
49
+ self._run_maps(maps)
50
+ self._build_tree(sim_data[self.lon_col], sim_data[self.lat_col], self.leafsize)
51
+ self._set_rad(self.radius)
52
+ self.corners = sim_data[self.cornerLables]
53
+
54
+ @wraps(self._slice_sim_data)
55
+ def _slice_sim_data(islice):
56
+ """Return indexes for relevant opsim data at slice_point
57
+ (slice_point=lon_col/lat_col value .. usually ra/dec)."""
58
+ sx, sy, sz = _xyz_from_ra_dec(self.slice_points["ra"][islice], self.slice_points["dec"][islice])
59
+ # Query against tree.
60
+ initIndices = self.opsimtree.query_ball_point((sx, sy, sz), self.rad)
61
+ # Loop through all the images and check if the slice_point
62
+ # is inside the corners of the chip
63
+ indices = []
64
+ # Gnomic project all the corners that are near the slice point,
65
+ # centered on slice point
66
+ x1, y1 = gnomonic_project_toxy(
67
+ self.corners["RA1"][initIndices],
68
+ self.corners["Dec1"][initIndices],
69
+ self.slice_points["ra"][islice],
70
+ self.slice_points["dec"][islice],
71
+ )
72
+ x2, y2 = gnomonic_project_toxy(
73
+ self.corners["RA2"][initIndices],
74
+ self.corners["Dec2"][initIndices],
75
+ self.slice_points["ra"][islice],
76
+ self.slice_points["dec"][islice],
77
+ )
78
+ x3, y3 = gnomonic_project_toxy(
79
+ self.corners["RA3"][initIndices],
80
+ self.corners["Dec3"][initIndices],
81
+ self.slice_points["ra"][islice],
82
+ self.slice_points["dec"][islice],
83
+ )
84
+ x4, y4 = gnomonic_project_toxy(
85
+ self.corners["RA4"][initIndices],
86
+ self.corners["Dec4"][initIndices],
87
+ self.slice_points["ra"][islice],
88
+ self.slice_points["dec"][islice],
89
+ )
90
+
91
+ for i, ind in enumerate(initIndices):
92
+ # Use matplotlib to make a polygon on
93
+ bbPath = mplPath.Path(
94
+ np.array(
95
+ [
96
+ [x1[i], y1[i]],
97
+ [x2[i], y2[i]],
98
+ [x3[i], y3[i]],
99
+ [x4[i], y4[i]],
100
+ [x1[i], y1[i]],
101
+ ]
102
+ )
103
+ )
104
+ # Check if the slice_point is inside the image corners
105
+ # and append to list if it is
106
+ if bbPath.contains_point((0.0, 0.0)) == 1:
107
+ indices.append(ind)
108
+
109
+ return {
110
+ "idxs": indices,
111
+ "slice_point": {
112
+ "sid": self.slice_points["sid"][islice],
113
+ "ra": self.slice_points["ra"][islice],
114
+ "dec": self.slice_points["dec"][islice],
115
+ },
116
+ }
117
+
118
+ setattr(self, "_slice_sim_data", _slice_sim_data)
@@ -0,0 +1,189 @@
1
+ """A slicer that uses a Healpix grid to calculate metric values
2
+ (at the center of each healpixel)."""
3
+
4
+ # Requires healpy
5
+ # See more documentation on healpy here
6
+ # http://healpy.readthedocs.org/en/latest/tutorial.html
7
+ # Also requires numpy (for histogram and power spectrum plotting)
8
+
9
+ __all__ = ("HealpixSlicer",)
10
+
11
+ import healpy as hp
12
+ import numpy as np
13
+ from astropy import units as u
14
+ from astropy.coordinates import SkyCoord
15
+
16
+ from rubin_sim.maf.plots.spatial_plotters import HealpixHistogram, HealpixSkyMap
17
+
18
+ from .base_spatial_slicer import BaseSpatialSlicer
19
+
20
+
21
+ class HealpixSlicer(BaseSpatialSlicer):
22
+ """
23
+ A spatial slicer that evaluates pointings on a healpix-based grid.
24
+
25
+ Note that a healpix slicer is intended to evaluate the sky
26
+ on a spatial grid. Usually this grid will be something like RA as
27
+ the lon_col and Dec as the lat_col.
28
+ However, it could also be altitude and azimuth,
29
+ in which case altitude as lat_col, and azimuth as lon_col.
30
+ An additional alternative is to use HA/Dec, with lon_col=HA, lat_col=Dec.
31
+
32
+ When plotting with RA/Dec, the default HealpixSkyMap can be used,
33
+ corresponding to
34
+ {'rot': (0, 0, 0), 'flip': 'astro'}.
35
+ When plotting with alt/az, either the LambertSkyMap can be used
36
+ (if Basemap is installed)
37
+ or the HealpixSkyMap can be used with a modified plot_dict,
38
+ {'rot': (90, 90, 90), 'flip': 'geo'}.
39
+ When plotting with HA/Dec, only the HealpixSkyMap can be used,
40
+ with a modified plot_dict of
41
+ {'rot': (0, -30, 0), 'flip': 'geo'}.
42
+
43
+ Parameters
44
+ ----------
45
+ nside : `int`, optional
46
+ The nside parameter of the healpix grid. Must be a power of 2.
47
+ lon_col : `str`, optional
48
+ Name of the longitude (RA equivalent) column to use from the
49
+ input data.
50
+ lat_col : `str`, optional
51
+ Name of the latitude (Dec equivalent) column to use from
52
+ the input data.
53
+ lat_lon_deg : `bool`, optional
54
+ Flag indicating whether the lat and lon values in the input data are
55
+ in degrees (True) or radians (False).
56
+ verbose : `bool`, optional
57
+ Flag to indicate whether or not to write additional information to
58
+ stdout during runtime.
59
+ use_cache : `bool`, optional
60
+ Flag allowing the user to indicate whether or not to cache
61
+ (and reuse) metric results calculated with the same set of
62
+ simulated data pointings.
63
+ This can be safely set to True for slicers not using maps and
64
+ will result in increased speed.
65
+ When calculating metric results using maps, the map data at each
66
+ individual ra/dec point may influence the metric results and so
67
+ use_cache should be set to False.
68
+ leafsize : `int`, optional
69
+ Leafsize value for kdtree. Default 100.
70
+ radius : `float`, optional
71
+ Radius for matching in the kdtree.
72
+ Equivalent to the radius of the FOV. Degrees.
73
+ use_camera : `bool`, optional
74
+ Flag to indicate whether to use the LSST camera footprint or not.
75
+ camera_radius : `float`, optional
76
+ max_radius for the LsstCameraFootprint (degrees).
77
+ camera_footprint_file : `str`, optional
78
+ Name of the camera footprint map to use.
79
+ Can be None, which will use the default footprint map.
80
+ rot_sky_pos_col_name : `str`, optional
81
+ Name of the rotSkyPos column in the input data.
82
+ Only used if use_camera is True.
83
+ Describes the orientation of the camera orientation
84
+ compared to the sky.
85
+ badval: `float`, optional
86
+ The value to place use in place of bad data values.
87
+ Use np.nan unless specifically needing other values.
88
+ """
89
+
90
+ def __init__(
91
+ self,
92
+ nside=128,
93
+ lon_col="fieldRA",
94
+ lat_col="fieldDec",
95
+ lat_lon_deg=True,
96
+ verbose=True,
97
+ use_cache=True,
98
+ leafsize=100,
99
+ radius=2.45,
100
+ use_camera=True,
101
+ camera_radius=1.94,
102
+ camera_footprint_file=None,
103
+ rot_sky_pos_col_name="rotSkyPos",
104
+ badval=np.nan,
105
+ ):
106
+ super().__init__(
107
+ verbose=verbose,
108
+ lon_col=lon_col,
109
+ lat_col=lat_col,
110
+ badval=badval,
111
+ radius=radius,
112
+ leafsize=leafsize,
113
+ use_camera=use_camera,
114
+ camera_radius=camera_radius,
115
+ camera_footprint_file=camera_footprint_file,
116
+ rot_sky_pos_col_name=rot_sky_pos_col_name,
117
+ lat_lon_deg=lat_lon_deg,
118
+ )
119
+ # Valid values of nside are powers of 2.
120
+ # nside=64 gives about 1 deg resolution
121
+ # nside=256 gives about 13' resolution (~1 CCD)
122
+ # nside=1024 gives about 3' resolution
123
+ # Check validity of nside:
124
+ if not (hp.isnsideok(nside)):
125
+ raise ValueError("Valid values of nside are powers of 2.")
126
+ self.nside = int(nside)
127
+ self.pix_area = hp.nside2pixarea(self.nside)
128
+ self.nslice = hp.nside2npix(self.nside)
129
+ self.shape = self.nslice
130
+ if self.verbose:
131
+ print(
132
+ "Healpix slicer using NSIDE=%d, " % (self.nside)
133
+ + "approximate resolution %f arcminutes" % (hp.nside2resol(self.nside, arcmin=True))
134
+ )
135
+ # Set variables so slicer can be re-constructed
136
+ self.slicer_init = {
137
+ "nside": nside,
138
+ "lon_col": lon_col,
139
+ "lat_col": lat_col,
140
+ "radius": radius,
141
+ }
142
+ self.use_cache = use_cache
143
+ if use_cache:
144
+ # use_cache set the size of the cache for the memoize function in
145
+ # sliceMetric.
146
+ bin_res = hp.nside2resol(nside) # Pixel size in radians
147
+ # Set the cache size to be ~2x the circumference
148
+ self.cache_size = int(np.round(4.0 * np.pi / bin_res))
149
+ # Set up slice_point metadata.
150
+ self.slice_points["nside"] = nside
151
+ self.slice_points["sid"] = np.arange(self.nslice)
152
+ self.slice_points["ra"], self.slice_points["dec"] = self._pix2radec(self.slice_points["sid"])
153
+ c = SkyCoord(ra=self.slice_points["ra"] * u.rad, dec=self.slice_points["dec"] * u.rad).transform_to(
154
+ "galactic"
155
+ )
156
+ gall, galb = c.l.rad, c.b.rad
157
+
158
+ self.slice_points["gall"] = gall
159
+ self.slice_points["galb"] = galb
160
+
161
+ # Set the default plotting functions.
162
+ self.plot_funcs = [HealpixSkyMap, HealpixHistogram]
163
+
164
+ def __eq__(self, other_slicer):
165
+ """Evaluate if two slicers are equivalent."""
166
+ # If the two slicers are both healpix slicers, check nsides value.
167
+ result = False
168
+ if isinstance(other_slicer, HealpixSlicer):
169
+ if other_slicer.nside == self.nside:
170
+ if other_slicer.lon_col == self.lon_col and other_slicer.lat_col == self.lat_col:
171
+ if other_slicer.radius == self.radius:
172
+ if other_slicer.use_camera == self.use_camera:
173
+ if other_slicer.rotSkyPosColName == self.rotSkyPosColName:
174
+ if np.all(other_slicer.shape == self.shape):
175
+ if other_slicer.use_cache == self.use_cache:
176
+ result = True
177
+ return result
178
+
179
+ def _pix2radec(self, islice):
180
+ """Given the pixel number / sliceID, return the RA/Dec of the
181
+ pointing, in radians.
182
+ """
183
+ # Calculate RA/Dec in RADIANS of pixel in this healpix slicer.
184
+ # Note that ipix could be an array,
185
+ # in which case RA/Dec values will be an array also.
186
+ lat, ra = hp.pix2ang(self.nside, islice)
187
+ # Move dec to +/- 90 degrees
188
+ dec = np.pi / 2.0 - lat
189
+ return ra, dec