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,216 @@
1
+ import unittest
2
+ import warnings
3
+
4
+ import numpy as np
5
+
6
+ from rubin_sim.maf.slicers import MovieSlicer, UniSlicer
7
+
8
+
9
+ def make_times(size=100, min=0.0, max=10.0, random=-1):
10
+ """Generate a simple array of numbers, evenly arranged between min/max."""
11
+ datavalues = np.arange(0, size, dtype="float")
12
+ datavalues *= (float(max) - float(min)) / (datavalues.max() - datavalues.min())
13
+ datavalues += min
14
+ if random > 0:
15
+ rng = np.random.RandomState(random)
16
+ randorder = rng.rand(size)
17
+ randind = np.argsort(randorder)
18
+ datavalues = datavalues[randind]
19
+ datavalues = np.array(list(zip(datavalues)), dtype=[("times", "float")])
20
+ return datavalues
21
+
22
+
23
+ class TestMovieSlicerSetup(unittest.TestCase):
24
+ def setUp(self):
25
+ self.testslicer = MovieSlicer(slice_col_name="times", cumulative=False, force_no_ffmpeg=True)
26
+
27
+ def tearDown(self):
28
+ del self.testslicer
29
+ self.testslicer = None
30
+
31
+ def test_slicertype(self):
32
+ """Test instantiation of slicer sets slicer type as expected."""
33
+ self.assertEqual(self.testslicer.slicer_name, self.testslicer.__class__.__name__)
34
+ self.assertEqual(self.testslicer.slicer_name, "MovieSlicer")
35
+
36
+ def test_setup_slicer_bins(self):
37
+ """Test setting up slicer using defined bins."""
38
+ dvmin = 0
39
+ dvmax = 1
40
+ nvalues = 1000
41
+ bins = np.arange(dvmin, dvmax, 0.1)
42
+ dv = make_times(nvalues, dvmin, dvmax, random=987)
43
+ # Used right bins?
44
+ self.testslicer = MovieSlicer(
45
+ slice_col_name="times", bins=bins, cumulative=False, force_no_ffmpeg=True
46
+ )
47
+ self.testslicer.setup_slicer(dv)
48
+ np.testing.assert_equal(self.testslicer.bins, bins)
49
+ self.assertEqual(self.testslicer.nslice, len(bins) - 1)
50
+
51
+ def test_setup_slicer_binsize(self):
52
+ """Test setting up slicer using bin_size."""
53
+ dvmin = 0
54
+ dvmax = 1
55
+ dv = make_times(1000, dvmin, dvmax, random=1992)
56
+ bin_size = 0.1
57
+ for cumulative in [True, False]:
58
+ self.testslicer = MovieSlicer(
59
+ slice_col_name="times",
60
+ bin_size=bin_size,
61
+ cumulative=cumulative,
62
+ force_no_ffmpeg=True,
63
+ )
64
+ self.testslicer.setup_slicer(dv)
65
+ # Bins of the right size?
66
+ bindiff = np.diff(self.testslicer.bins)
67
+ self.assertAlmostEqual(bindiff.max(), bin_size)
68
+ self.assertAlmostEqual(bindiff.min(), bin_size)
69
+ # Test that warning works.
70
+ with warnings.catch_warnings(record=True) as w:
71
+ warnings.simplefilter("always")
72
+ self.testslicer = MovieSlicer(
73
+ slice_col_name="times",
74
+ bins=200,
75
+ bin_size=bin_size,
76
+ cumulative=False,
77
+ force_no_ffmpeg=True,
78
+ )
79
+ self.testslicer.setup_slicer(dv)
80
+ # Verify some things
81
+ self.assertIn("bin_size", str(w[-1].message))
82
+
83
+ def test_setup_slicer_nbins_zeros(self):
84
+ """Test what happens if give slicer test data that is all
85
+ single-value."""
86
+ dv = np.zeros(100, float)
87
+ dv = np.array(list(zip(dv)), dtype=[("times", "float")])
88
+ nbins = 10
89
+ self.testslicer = MovieSlicer(
90
+ slice_col_name="times", bins=nbins, cumulative=False, force_no_ffmpeg=True
91
+ )
92
+ with warnings.catch_warnings(record=True) as w:
93
+ warnings.simplefilter("always")
94
+ self.testslicer.setup_slicer(dv)
95
+ self.assertIn("creasing bin_max", str(w[-1].message))
96
+ self.assertEqual(self.testslicer.nslice, nbins)
97
+
98
+ def test_setup_slicer_limits(self):
99
+ """Test setting up slicer using bin_min/Max."""
100
+ bin_min = 0
101
+ bin_max = 1
102
+ nbins = 10
103
+ dvmin = -0.5
104
+ dvmax = 1.5
105
+ dv = make_times(1000, dvmin, dvmax, random=1772)
106
+ self.testslicer = MovieSlicer(
107
+ slice_col_name="times",
108
+ bin_min=bin_min,
109
+ bin_max=bin_max,
110
+ bins=nbins,
111
+ cumulative=False,
112
+ force_no_ffmpeg=True,
113
+ )
114
+ self.testslicer.setup_slicer(dv)
115
+ self.assertAlmostEqual(self.testslicer.bins.min(), bin_min)
116
+ self.assertAlmostEqual(self.testslicer.bins.max(), bin_max)
117
+
118
+ def test_indexing(self):
119
+ """Test iteration and indexing."""
120
+ dvmin = 0
121
+ dvmax = 1
122
+ bins = np.arange(dvmin, dvmax + 0.05, 0.05)
123
+ self.testslicer = MovieSlicer(
124
+ slice_col_name="times", bins=bins, cumulative=False, force_no_ffmpeg=True
125
+ )
126
+ dv = make_times(1000, dvmin, dvmax, random=908223)
127
+ self.testslicer.setup_slicer(dv)
128
+ for i, (s, b) in enumerate(zip(self.testslicer, bins)):
129
+ self.assertEqual(s["slice_point"]["sid"], i)
130
+ self.assertEqual(s["slice_point"]["bin_left"], b)
131
+ self.assertLessEqual(s["slice_point"]["bin_right"], bins[i + 1])
132
+ for i in [0, len(self.testslicer) // 2, len(self.testslicer) - 1]:
133
+ self.assertEqual(self.testslicer[i]["slice_point"]["sid"], i)
134
+ self.assertEqual(self.testslicer[i]["slice_point"]["bin_left"], bins[i])
135
+
136
+ def test_equivalence(self):
137
+ """Test equals method."""
138
+ # Note that two Movie slicers will be considered equal
139
+ # if they are both the same kind of
140
+ # slicer AND have the same bins.
141
+ # Set up self..
142
+ dvmin = 0
143
+ dvmax = 1
144
+ nvalues = 1000
145
+ bins = np.arange(dvmin, dvmax, 0.01)
146
+ dv = make_times(nvalues, dvmin, dvmax, random=72031)
147
+ self.testslicer = MovieSlicer(
148
+ slice_col_name="times", bins=bins, cumulative=False, force_no_ffmpeg=True
149
+ )
150
+ self.testslicer.setup_slicer(dv)
151
+ # Set up another slicer to match
152
+ # (same bins, although not the same data).
153
+ dv2 = make_times(nvalues + 100, dvmin, dvmax, random=56221)
154
+ testslicer2 = MovieSlicer(slice_col_name="times", bins=bins, cumulative=False, force_no_ffmpeg=True)
155
+ testslicer2.setup_slicer(dv2)
156
+ self.assertEqual(self.testslicer, testslicer2)
157
+ # Set up another slicer that should not match (different bins)
158
+ dv2 = make_times(nvalues, dvmin + 1, dvmax + 1, random=542093)
159
+ testslicer2 = MovieSlicer(
160
+ slice_col_name="times",
161
+ bins=len(bins),
162
+ cumulative=False,
163
+ force_no_ffmpeg=True,
164
+ )
165
+ testslicer2.setup_slicer(dv2)
166
+ self.assertNotEqual(self.testslicer, testslicer2)
167
+ # Set up a different kind of slicer that should not match.
168
+ dv2 = make_times(100, 0, 1, random=16)
169
+ testslicer2 = UniSlicer()
170
+ testslicer2.setup_slicer(dv2)
171
+ self.assertNotEqual(self.testslicer, testslicer2)
172
+
173
+ def test_slicing(self):
174
+ """Test slicing."""
175
+ dvmin = 0
176
+ dvmax = 1
177
+ nbins = 100
178
+ # Test that testbinner raises appropriate error before it's set up
179
+ # (first time)
180
+ self.assertRaises(NotImplementedError, self.testslicer._slice_sim_data, 0)
181
+ for nvalues in (100, 1000):
182
+ dv = make_times(nvalues, dvmin, dvmax, random=82)
183
+ # Test differential case.
184
+ self.testslicer = MovieSlicer(
185
+ slice_col_name="times",
186
+ bins=nbins,
187
+ cumulative=False,
188
+ force_no_ffmpeg=True,
189
+ )
190
+ self.testslicer.setup_slicer(dv)
191
+ sum = 0
192
+ for i, s in enumerate(self.testslicer):
193
+ idxs = s["idxs"]
194
+ data_slice = dv["times"][idxs]
195
+ sum += len(idxs)
196
+ if len(data_slice) > 0:
197
+ self.assertEqual(len(data_slice), nvalues / float(nbins))
198
+ else:
199
+ raise ValueError("Data in test case expected to always be > 0 len after slicing")
200
+ self.assertEqual(sum, nvalues)
201
+ # And cumulative case.
202
+ self.testslicer = MovieSlicer(
203
+ slice_col_name="times",
204
+ bins=nbins,
205
+ cumulative=True,
206
+ force_no_ffmpeg=True,
207
+ )
208
+ self.testslicer.setup_slicer(dv)
209
+ for i, s in enumerate(self.testslicer):
210
+ idxs = s["idxs"]
211
+ data_slice = dv["times"][idxs]
212
+ self.assertGreater(len(data_slice), 0)
213
+
214
+
215
+ if __name__ == "__main__":
216
+ unittest.main()
@@ -0,0 +1,240 @@
1
+ import itertools
2
+ import unittest
3
+ import warnings
4
+
5
+ import numpy as np
6
+ import numpy.lib.recfunctions as rfn
7
+
8
+ from rubin_sim.maf.slicers import NDSlicer, UniSlicer
9
+
10
+
11
+ def make_data_values(size=100, min=0.0, max=1.0, nd=3, random=-1):
12
+ """Generate a simple array of numbers, evenly arranged between min/max,
13
+ in nd dimensions, but (optional) random order.
14
+ """
15
+ data = []
16
+ for d in range(nd):
17
+ datavalues = np.arange(0, size, dtype="float")
18
+ datavalues *= (float(max) - float(min)) / (datavalues.max() - datavalues.min())
19
+ datavalues += min
20
+ if random > 0:
21
+ rng = np.random.RandomState(random)
22
+ randorder = rng.rand(size)
23
+ randind = np.argsort(randorder)
24
+ datavalues = datavalues[randind]
25
+ datavalues = np.array(list(zip(datavalues)), dtype=[("testdata" + "%d" % (d), "float")])
26
+ data.append(datavalues)
27
+ data = rfn.merge_arrays(data, flatten=True, usemask=False)
28
+ return data
29
+
30
+
31
+ class TestNDSlicerSetup(unittest.TestCase):
32
+ def setUp(self):
33
+ self.dvmin = 0
34
+ self.dvmax = 1
35
+ nvalues = 1000
36
+ self.nd = 3
37
+ self.dv = make_data_values(nvalues, self.dvmin, self.dvmax, self.nd, random=608)
38
+ self.dvlist = self.dv.dtype.names
39
+
40
+ def test_slicertype(self):
41
+ """Test instantiation of slicer sets slicer type as expected."""
42
+ testslicer = NDSlicer(self.dvlist)
43
+ self.assertEqual(testslicer.slicer_name, testslicer.__class__.__name__)
44
+ self.assertEqual(testslicer.slicer_name, "NDSlicer")
45
+
46
+ def test_setup_slicer_bins(self):
47
+ """Test setting up slicer using defined bins."""
48
+ # Used right bins?
49
+ bins = np.arange(self.dvmin, self.dvmax, 0.1)
50
+ binlist = []
51
+ for d in range(self.nd):
52
+ binlist.append(bins)
53
+ testslicer = NDSlicer(self.dvlist, bins_list=binlist)
54
+ testslicer.setup_slicer(self.dv)
55
+ for d in range(self.nd):
56
+ np.testing.assert_equal(testslicer.bins[d], bins)
57
+ self.assertEqual(testslicer.nslice, (len(bins) - 1) ** self.nd)
58
+
59
+ def test_setup_slicer_nbins(self):
60
+ """Test setting up slicer using nbins."""
61
+ for nvalues in (100, 1000):
62
+ for nbins in (5, 25, 74):
63
+ dv = make_data_values(nvalues, self.dvmin, self.dvmax, self.nd, random=-1)
64
+ # Right number of bins?
65
+ # expect one more 'bin' to accomodate last right edge,
66
+ # but nbins accounts for this
67
+ testslicer = NDSlicer(self.dvlist, bins_list=nbins)
68
+ testslicer.setup_slicer(dv)
69
+ self.assertEqual(testslicer.nslice, nbins**self.nd)
70
+ # Bins of the right size?
71
+ for i in range(self.nd):
72
+ bindiff = np.diff(testslicer.bins[i])
73
+ expectedbindiff = (self.dvmax - self.dvmin) / float(nbins)
74
+ np.testing.assert_allclose(bindiff, expectedbindiff)
75
+ # Can we use a list of nbins too and get the
76
+ # right number of bins?
77
+ nbins_list = []
78
+ expectednbins = 1
79
+ for d in range(self.nd):
80
+ nbins_list.append(nbins + d)
81
+ expectednbins *= nbins + d
82
+ testslicer = NDSlicer(self.dvlist, bins_list=nbins_list)
83
+ testslicer.setup_slicer(dv)
84
+ self.assertEqual(testslicer.nslice, expectednbins)
85
+
86
+ def test_setup_slicer_nbins_zeros(self):
87
+ """Test handling case of data being single values."""
88
+ dv = make_data_values(100, 0, 0, self.nd, random=-1)
89
+ nbins = 10
90
+ testslicer = NDSlicer(self.dvlist, bins_list=nbins)
91
+ with warnings.catch_warnings(record=True) as w:
92
+ warnings.simplefilter("always")
93
+ testslicer.setup_slicer(dv)
94
+ self.assertIn("creasing bin_max", str(w[-1].message))
95
+ expectednbins = nbins**self.nd
96
+ self.assertEqual(testslicer.nslice, expectednbins)
97
+
98
+ def test_setup_slicer_equivalent(self):
99
+ """Test setting up slicer using defined bins and nbins is
100
+ equal where expected.
101
+ """
102
+ for nbins in (20, 105):
103
+ testslicer = NDSlicer(self.dvlist, bins_list=nbins)
104
+ bins = make_data_values(nbins + 1, self.dvmin, self.dvmax, self.nd, random=-1)
105
+ bins_list = []
106
+ for i in bins.dtype.names:
107
+ bins_list.append(bins[i])
108
+ for nvalues in (100, 10000):
109
+ dv = make_data_values(nvalues, self.dvmin, self.dvmax, self.nd, random=64432)
110
+ testslicer.setup_slicer(dv)
111
+ for i in range(self.nd):
112
+ np.testing.assert_allclose(testslicer.bins[i], bins_list[i])
113
+
114
+
115
+ class TestNDSlicerEqual(unittest.TestCase):
116
+ def setUp(self):
117
+ self.dvmin = 0
118
+ self.dvmax = 1
119
+ nvalues = 1000
120
+ self.nd = 3
121
+ self.dv = make_data_values(nvalues, self.dvmin, self.dvmax, self.nd, random=20367)
122
+ self.dvlist = self.dv.dtype.names
123
+ self.testslicer = NDSlicer(self.dvlist, bins_list=100)
124
+ self.testslicer.setup_slicer(self.dv)
125
+
126
+ def tearDown(self):
127
+ del self.testslicer
128
+ self.testslicer = None
129
+
130
+ def test_equivalence(self):
131
+ """Test equals method."""
132
+ # Note that two ND slicers will be considered equal if
133
+ # they are both the same kind of slicer AND have the same bins in
134
+ # all dimensions.
135
+ # Set up another slicer to match
136
+ # (same bins, although not the same data).
137
+ dv2 = make_data_values(100, self.dvmin, self.dvmax, self.nd, random=10029)
138
+ dvlist = dv2.dtype.names
139
+ testslicer2 = NDSlicer(slice_col_list=dvlist, bins_list=self.testslicer.bins)
140
+ testslicer2.setup_slicer(dv2)
141
+ self.assertEqual(self.testslicer, testslicer2)
142
+ # Set up another slicer that should not match (different bins)
143
+ dv2 = make_data_values(1000, self.dvmin + 1, self.dvmax + 1, self.nd, random=209837)
144
+ testslicer2 = NDSlicer(slice_col_list=dvlist, bins_list=100)
145
+ testslicer2.setup_slicer(dv2)
146
+ self.assertNotEqual(self.testslicer, testslicer2)
147
+ # Set up another slicer that should not match (different dimensions)
148
+ dv2 = make_data_values(1000, self.dvmin, self.dvmax, self.nd - 1, random=50623)
149
+ testslicer2 = NDSlicer(dv2.dtype.names, bins_list=100)
150
+ testslicer2.setup_slicer(dv2)
151
+ self.assertNotEqual(self.testslicer, testslicer2)
152
+ # Set up a different kind of slicer that should not match.
153
+ testslicer2 = UniSlicer()
154
+ dv2 = make_data_values(100, 0, 1, random=22310098)
155
+ testslicer2.setup_slicer(dv2)
156
+ self.assertNotEqual(self.testslicer, testslicer2)
157
+
158
+
159
+ class TestNDSlicerIteration(unittest.TestCase):
160
+ def setUp(self):
161
+ self.dvmin = 0
162
+ self.dvmax = 1
163
+ nvalues = 1000
164
+ self.nd = 3
165
+ self.dv = make_data_values(nvalues, self.dvmin, self.dvmax, self.nd, random=11081)
166
+ self.dvlist = self.dv.dtype.names
167
+ nvalues = 1000
168
+ bins = np.arange(self.dvmin, self.dvmax, 0.1)
169
+ bins_list = []
170
+ self.iterlist = []
171
+ for i in range(self.nd):
172
+ bins_list.append(bins)
173
+ # (remember iteration doesn't use the very last bin in 'bins')
174
+ self.iterlist.append(bins[:-1])
175
+ dv = make_data_values(nvalues, self.dvmin, self.dvmax, self.nd, random=17)
176
+ self.testslicer = NDSlicer(self.dvlist, bins_list=bins_list)
177
+ self.testslicer.setup_slicer(dv)
178
+
179
+ def tearDown(self):
180
+ del self.testslicer
181
+ self.testslicer = None
182
+
183
+ def test_iteration(self):
184
+ """Test iteration."""
185
+ for s, ib in zip(self.testslicer, itertools.product(*self.iterlist)):
186
+ self.assertEqual(s["slice_point"]["bin_left"], ib)
187
+
188
+ def test_get_item(self):
189
+ """Test getting indexed binpoint."""
190
+ for i, s in enumerate(self.testslicer):
191
+ self.assertEqual(
192
+ self.testslicer[i]["slice_point"]["bin_left"],
193
+ s["slice_point"]["bin_left"],
194
+ )
195
+ self.assertEqual(self.testslicer[0]["slice_point"]["bin_left"], (0.0, 0.0, 0.0))
196
+
197
+
198
+ class TestNDSlicerSlicing(unittest.TestCase):
199
+ def setUp(self):
200
+ self.dvmin = 0
201
+ self.dvmax = 1
202
+ nvalues = 1000
203
+ self.nd = 3
204
+ self.dv = make_data_values(nvalues, self.dvmin, self.dvmax, self.nd, random=173)
205
+ self.dvlist = self.dv.dtype.names
206
+ self.testslicer = NDSlicer(self.dvlist)
207
+
208
+ def tearDown(self):
209
+ del self.testslicer
210
+ self.testslicer = None
211
+
212
+ def test_slicing(self):
213
+ """Test slicing."""
214
+ # Test get error if try to slice before setup.
215
+ self.assertRaises(NotImplementedError, self.testslicer._slice_sim_data, 0)
216
+ nbins = 10
217
+ bin_size = (self.dvmax - self.dvmin) / (float(nbins))
218
+ self.testslicer = NDSlicer(self.dvlist, bins_list=nbins)
219
+ for nvalues in (1000, 10000):
220
+ dv = make_data_values(nvalues, self.dvmin, self.dvmax, self.nd, random=1735)
221
+ self.testslicer.setup_slicer(dv)
222
+ sum = 0
223
+ for i, s in enumerate(self.testslicer):
224
+ idxs = s["idxs"]
225
+ data_slice = dv[idxs]
226
+ sum += len(idxs)
227
+ if len(data_slice) > 0:
228
+ for i, dvname, b in zip(list(range(self.nd)), self.dvlist, s["slice_point"]["bin_left"]):
229
+ self.assertGreaterEqual((data_slice[dvname].min() - b), 0)
230
+ if i < self.testslicer.nslice - 1:
231
+ self.assertLessEqual((data_slice[dvname].max() - b), bin_size)
232
+ else:
233
+ self.assertAlmostEqual((data_slice[dvname].max() - b), bin_size)
234
+ self.assertEqual(len(data_slice), nvalues / float(nbins))
235
+ # and check that every data value was assigned somewhere.
236
+ self.assertEqual(sum, nvalues)
237
+
238
+
239
+ if __name__ == "__main__":
240
+ unittest.main()
@@ -0,0 +1,41 @@
1
+ import unittest
2
+
3
+ import numpy as np
4
+
5
+ import rubin_sim.maf.plots as plots
6
+
7
+
8
+ class TestNeoDistancePlotter(unittest.TestCase):
9
+ def setUp(self):
10
+ rng = np.random.RandomState(61723009)
11
+ names = [
12
+ "eclipLat",
13
+ "eclipLon",
14
+ "MaxGeoDist",
15
+ "NEOHelioX",
16
+ "NEOHelioY",
17
+ "filter",
18
+ ]
19
+ types = [float] * 5
20
+ types.append("|S1")
21
+ npts = 100
22
+ self.metric_values = np.zeros(npts, list(zip(names, types)))
23
+ self.metric_values["MaxGeoDist"] = rng.rand(npts) * 2.0
24
+ self.metric_values["eclipLat"] = rng.rand(npts)
25
+ self.metric_values["NEOHelioX"] = rng.rand(npts) * 3 - 1.5
26
+ self.metric_values["NEOHelioY"] = rng.rand(npts) * 3 - 1.5 + 1
27
+ self.metric_values["filter"] = "g"
28
+
29
+ def test_plotter(self):
30
+ """
31
+ Just test that it can make a figure without throwing an error.
32
+ """
33
+ plotter = plots.NeoDistancePlotter()
34
+ # Need to wrap in a list because it will usually go through the
35
+ # UniSlicer, and will thus be an array inside a 1-element masked array
36
+ fig = plotter([self.metric_values], None, {})
37
+ self.assertNotEqual(fig, None)
38
+
39
+
40
+ if __name__ == "__main__":
41
+ unittest.main()