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.
- batch/compile_prenight_metadata_cache.sh +34 -0
- batch/run_auxtel_prenight_sims.sh +163 -0
- batch/run_prenight_sims.sh +239 -0
- docs/.gitignore +3 -0
- docs/Makefile +32 -0
- docs/api.rst +25 -0
- docs/conf.py +8 -0
- docs/data-api.rst +12 -0
- docs/data-download.rst +70 -0
- docs/developer.rst +14 -0
- docs/documenteer.toml +11 -0
- docs/index.rst +22 -0
- docs/installation.rst +76 -0
- docs/introduction.rst +37 -0
- docs/maf-api-batches.rst +12 -0
- docs/maf-api-db.rst +12 -0
- docs/maf-api-maf-contrib.rst +12 -0
- docs/maf-api-maps.rst +12 -0
- docs/maf-api-metricbundles.rst +12 -0
- docs/maf-api-metrics.rst +12 -0
- docs/maf-api-plots.rst +12 -0
- docs/maf-api-run-comparison.rst +12 -0
- docs/maf-api-slicers.rst +12 -0
- docs/maf-api-stackers.rst +12 -0
- docs/maf-api-utils.rst +12 -0
- docs/maf-api.rst +22 -0
- docs/maf.rst +60 -0
- docs/metric_list.py +49 -0
- docs/moving-objects-api.rst +12 -0
- docs/moving-objects.rst +22 -0
- docs/phot-utils-api.rst +12 -0
- docs/phot-utils.rst +11 -0
- docs/prenight.rst +117 -0
- docs/protoarchive.rst +276 -0
- docs/satellite-constellations-api.rst +12 -0
- docs/satellite-constellations.rst +13 -0
- docs/selfcal-api.rst +12 -0
- docs/selfcal.rst +15 -0
- docs/sim-archive-api.rst +12 -0
- docs/skybrightness-api.rst +12 -0
- docs/skybrightness.rst +23 -0
- docs/user-guide.rst +28 -0
- docs/vseqarchive-architecture.rst +438 -0
- docs/vseqarchive-setup.rst +238 -0
- docs/vseqarchive.rst +225 -0
- rubin_sim/__init__.py +7 -0
- rubin_sim/data/__init__.py +1 -0
- rubin_sim/data/rs_download_data.py +155 -0
- rubin_sim/maf/__init__.py +34 -0
- rubin_sim/maf/batches/__init__.py +18 -0
- rubin_sim/maf/batches/altaz_batch.py +161 -0
- rubin_sim/maf/batches/col_map_dict.py +274 -0
- rubin_sim/maf/batches/common.py +388 -0
- rubin_sim/maf/batches/ddf_batch.py +728 -0
- rubin_sim/maf/batches/filterchange_batch.py +182 -0
- rubin_sim/maf/batches/glance_batch.py +591 -0
- rubin_sim/maf/batches/hourglass_batch.py +79 -0
- rubin_sim/maf/batches/info_batch.py +114 -0
- rubin_sim/maf/batches/metadata_batch.py +558 -0
- rubin_sim/maf/batches/moving_objects_batch.py +1587 -0
- rubin_sim/maf/batches/openshutter_batch.py +100 -0
- rubin_sim/maf/batches/radar_limited.py +1100 -0
- rubin_sim/maf/batches/science_radar_batch.py +1910 -0
- rubin_sim/maf/batches/skycoverage.py +155 -0
- rubin_sim/maf/batches/slew_batch.py +146 -0
- rubin_sim/maf/batches/srd_batch.py +637 -0
- rubin_sim/maf/batches/time_batch.py +757 -0
- rubin_sim/maf/batches/time_sci_batch.py +105 -0
- rubin_sim/maf/batches/visitdepth_batch.py +485 -0
- rubin_sim/maf/db/__init__.py +2 -0
- rubin_sim/maf/db/add_run.py +34 -0
- rubin_sim/maf/db/results_db.py +1074 -0
- rubin_sim/maf/db/tracking_db.py +332 -0
- rubin_sim/maf/ddf_dir.py +53 -0
- rubin_sim/maf/generate_ss.py +218 -0
- rubin_sim/maf/glance_dir.py +58 -0
- rubin_sim/maf/maf_contrib/__init__.py +25 -0
- rubin_sim/maf/maf_contrib/calculate_lsst_field_visibility_astropy.py +170 -0
- rubin_sim/maf/maf_contrib/depth_limited_num_gal_metric.py +109 -0
- rubin_sim/maf/maf_contrib/example_new_metrics.py +40 -0
- rubin_sim/maf/maf_contrib/filter_pair_t_gaps_metric.py +208 -0
- rubin_sim/maf/maf_contrib/grb_transient_metric.py +249 -0
- rubin_sim/maf/maf_contrib/gw170817_det_metric.py +72 -0
- rubin_sim/maf/maf_contrib/intervals_between_obs_metric.py +68 -0
- rubin_sim/maf/maf_contrib/kne_metrics.py +473 -0
- rubin_sim/maf/maf_contrib/lss_metrics.py +45 -0
- rubin_sim/maf/maf_contrib/lss_obs_strategy/__init__.py +3 -0
- rubin_sim/maf/maf_contrib/lss_obs_strategy/constants_for_pipeline.py +73 -0
- rubin_sim/maf/maf_contrib/lss_obs_strategy/galaxy_counts_metric_extended.py +205 -0
- rubin_sim/maf/maf_contrib/lss_obs_strategy/galaxy_counts_with_pixel_calibration.py +171 -0
- rubin_sim/maf/maf_contrib/lv_dwarfs/__init__.py +1 -0
- rubin_sim/maf/maf_contrib/lv_dwarfs/lv_dwarfs_metrics.py +388 -0
- rubin_sim/maf/maf_contrib/microlensing_metric.py +593 -0
- rubin_sim/maf/maf_contrib/num_obs_in_survey_time_overlap_metric.py +43 -0
- rubin_sim/maf/maf_contrib/periodic_metric.py +51 -0
- rubin_sim/maf/maf_contrib/periodic_star_metric.py +186 -0
- rubin_sim/maf/maf_contrib/periodic_star_modulation_metric.py +236 -0
- rubin_sim/maf/maf_contrib/presto_color_kne_pop_metric.py +441 -0
- rubin_sim/maf/maf_contrib/selfcal_uniformity_metric.py +171 -0
- rubin_sim/maf/maf_contrib/star_count_mass_metric.py +64 -0
- rubin_sim/maf/maf_contrib/star_count_metric.py +56 -0
- rubin_sim/maf/maf_contrib/star_counts/__init__.py +8 -0
- rubin_sim/maf/maf_contrib/star_counts/abs_mag.py +324 -0
- rubin_sim/maf/maf_contrib/star_counts/coords.py +99 -0
- rubin_sim/maf/maf_contrib/star_counts/readme.txt +1 -0
- rubin_sim/maf/maf_contrib/star_counts/spec_type.py +91 -0
- rubin_sim/maf/maf_contrib/star_counts/starcount.py +30 -0
- rubin_sim/maf/maf_contrib/star_counts/starcount_bymass.py +93 -0
- rubin_sim/maf/maf_contrib/star_counts/stellardensity.py +59 -0
- rubin_sim/maf/maf_contrib/static_probes_fom_summary_metric.py +386 -0
- rubin_sim/maf/maf_contrib/tdes_pop_metric.py +362 -0
- rubin_sim/maf/maf_contrib/transient_ascii_sed_metric.py +652 -0
- rubin_sim/maf/maf_contrib/triplet_metric.py +156 -0
- rubin_sim/maf/maf_contrib/var_depth_metric.py +157 -0
- rubin_sim/maf/maf_contrib/xrb_metrics.py +523 -0
- rubin_sim/maf/maf_contrib/young_stellar_objects_metric.py +200 -0
- rubin_sim/maf/maf_night_report.py +200 -0
- rubin_sim/maf/make_fbs_tracking_db.py +90 -0
- rubin_sim/maf/maps/__init__.py +8 -0
- rubin_sim/maf/maps/base_map.py +72 -0
- rubin_sim/maf/maps/create_gaia_density_map.py +158 -0
- rubin_sim/maf/maps/dust_map.py +66 -0
- rubin_sim/maf/maps/dust_map_3d.py +190 -0
- rubin_sim/maf/maps/ebv_3d_hp.py +170 -0
- rubin_sim/maf/maps/ebv_hp.py +64 -0
- rubin_sim/maf/maps/gal_coords_map.py +22 -0
- rubin_sim/maf/maps/galactic_plane_priority_maps.py +210 -0
- rubin_sim/maf/maps/stellar_density_map.py +73 -0
- rubin_sim/maf/maps/trilegal_map.py +82 -0
- rubin_sim/maf/metadata_dir.py +90 -0
- rubin_sim/maf/metric_bundles/__init__.py +3 -0
- rubin_sim/maf/metric_bundles/metric_bundle.py +816 -0
- rubin_sim/maf/metric_bundles/metric_bundle_group.py +834 -0
- rubin_sim/maf/metric_bundles/mo_metric_bundle.py +646 -0
- rubin_sim/maf/metrics/__init__.py +52 -0
- rubin_sim/maf/metrics/agn_time_lag_metric.py +118 -0
- rubin_sim/maf/metrics/agnstructure.py +141 -0
- rubin_sim/maf/metrics/area_summary_metrics.py +120 -0
- rubin_sim/maf/metrics/base_metric.py +215 -0
- rubin_sim/maf/metrics/brown_dwarf_metric.py +162 -0
- rubin_sim/maf/metrics/cadence_metrics.py +400 -0
- rubin_sim/maf/metrics/calibration_metrics.py +618 -0
- rubin_sim/maf/metrics/chip_vendor_metric.py +43 -0
- rubin_sim/maf/metrics/color_slope_metrics.py +189 -0
- rubin_sim/maf/metrics/cosmology_summary_metrics.py +1212 -0
- rubin_sim/maf/metrics/coverage_metric.py +48 -0
- rubin_sim/maf/metrics/crowding_metric.py +255 -0
- rubin_sim/maf/metrics/cumulative_metric.py +46 -0
- rubin_sim/maf/metrics/dcr_metric.py +93 -0
- rubin_sim/maf/metrics/exgal_m5.py +57 -0
- rubin_sim/maf/metrics/fft_metric.py +27 -0
- rubin_sim/maf/metrics/galactic_plane_metrics.py +375 -0
- rubin_sim/maf/metrics/galplane_time_sampling_metrics.py +236 -0
- rubin_sim/maf/metrics/hourglass_metric.py +130 -0
- rubin_sim/maf/metrics/incremental_template_metric.py +255 -0
- rubin_sim/maf/metrics/kuiper_metrics.py +26 -0
- rubin_sim/maf/metrics/mo_metrics.py +1496 -0
- rubin_sim/maf/metrics/mo_summary_metrics.py +464 -0
- rubin_sim/maf/metrics/night_pointing_metric.py +70 -0
- rubin_sim/maf/metrics/optimal_m5_metric.py +94 -0
- rubin_sim/maf/metrics/pair_metric.py +69 -0
- rubin_sim/maf/metrics/periodic_detect_metric.py +133 -0
- rubin_sim/maf/metrics/phase_gap_metric.py +172 -0
- rubin_sim/maf/metrics/qso_number_counts_metric.py +138 -0
- rubin_sim/maf/metrics/scaling_metrics.py +148 -0
- rubin_sim/maf/metrics/schedview_metrics.py +39 -0
- rubin_sim/maf/metrics/season_metrics.py +344 -0
- rubin_sim/maf/metrics/simple_metrics.py +546 -0
- rubin_sim/maf/metrics/sky_sat_metric.py +18 -0
- rubin_sim/maf/metrics/sn_cadence_metric.py +104 -0
- rubin_sim/maf/metrics/sn_n_sn_metric.py +1364 -0
- rubin_sim/maf/metrics/sn_sl_metric.py +216 -0
- rubin_sim/maf/metrics/sn_snr_metric.py +715 -0
- rubin_sim/maf/metrics/snr_weight.py +24 -0
- rubin_sim/maf/metrics/star_density.py +77 -0
- rubin_sim/maf/metrics/string_count_metric.py +95 -0
- rubin_sim/maf/metrics/summary_metrics.py +201 -0
- rubin_sim/maf/metrics/surfb_metric.py +175 -0
- rubin_sim/maf/metrics/technical_metrics.py +271 -0
- rubin_sim/maf/metrics/tgaps.py +412 -0
- rubin_sim/maf/metrics/tomography_models.py +2034 -0
- rubin_sim/maf/metrics/transient_metrics.py +268 -0
- rubin_sim/maf/metrics/uniformity_metrics.py +418 -0
- rubin_sim/maf/metrics/use_metrics.py +55 -0
- rubin_sim/maf/metrics/vector_metrics.py +190 -0
- rubin_sim/maf/metrics/visit_groups_metric.py +341 -0
- rubin_sim/maf/metrics/weak_lensing_systematics_metric.py +210 -0
- rubin_sim/maf/plots/__init__.py +14 -0
- rubin_sim/maf/plots/hg_plotters.py +1117 -0
- rubin_sim/maf/plots/hourglass_plotters.py +120 -0
- rubin_sim/maf/plots/mo_plotters.py +358 -0
- rubin_sim/maf/plots/nd_plotters.py +220 -0
- rubin_sim/maf/plots/neo_distance_plotter.py +140 -0
- rubin_sim/maf/plots/night_pointing_plotter.py +96 -0
- rubin_sim/maf/plots/oned_plotters.py +114 -0
- rubin_sim/maf/plots/perceptual_rainbow.py +30 -0
- rubin_sim/maf/plots/plot_handler.py +766 -0
- rubin_sim/maf/plots/skyproj_plotters.py +540 -0
- rubin_sim/maf/plots/spatial_plotters.py +1029 -0
- rubin_sim/maf/plots/special_plotters.py +256 -0
- rubin_sim/maf/plots/two_d_plotters.py +177 -0
- rubin_sim/maf/plots/xyplotter.py +37 -0
- rubin_sim/maf/run_comparison/__init__.py +5 -0
- rubin_sim/maf/run_comparison/archive.py +584 -0
- rubin_sim/maf/run_comparison/gather_summaries.py +125 -0
- rubin_sim/maf/run_comparison/microlensing_compare.py +514 -0
- rubin_sim/maf/run_comparison/radar_plot.py +202 -0
- rubin_sim/maf/run_comparison/summary_plots.py +710 -0
- rubin_sim/maf/run_moving_calc.py +239 -0
- rubin_sim/maf/run_moving_fractions.py +128 -0
- rubin_sim/maf/run_moving_join.py +103 -0
- rubin_sim/maf/run_selfcal_metric.py +92 -0
- rubin_sim/maf/scimaf_dir.py +87 -0
- rubin_sim/maf/show_maf.py +227 -0
- rubin_sim/maf/slicers/__init__.py +13 -0
- rubin_sim/maf/slicers/base_slicer.py +513 -0
- rubin_sim/maf/slicers/base_spatial_slicer.py +202 -0
- rubin_sim/maf/slicers/healpix_sdss_slicer.py +118 -0
- rubin_sim/maf/slicers/healpix_slicer.py +189 -0
- rubin_sim/maf/slicers/healpix_subset_slicer.py +293 -0
- rubin_sim/maf/slicers/hourglass_slicer.py +37 -0
- rubin_sim/maf/slicers/mo_slicer.py +171 -0
- rubin_sim/maf/slicers/movie_slicer.py +288 -0
- rubin_sim/maf/slicers/nd_slicer.py +147 -0
- rubin_sim/maf/slicers/one_d_slicer.py +210 -0
- rubin_sim/maf/slicers/time_interval_slicers.py +283 -0
- rubin_sim/maf/slicers/uni_slicer.py +57 -0
- rubin_sim/maf/slicers/user_points_slicer.py +141 -0
- rubin_sim/maf/stackers/__init__.py +13 -0
- rubin_sim/maf/stackers/base_stacker.py +221 -0
- rubin_sim/maf/stackers/coord_stackers.py +224 -0
- rubin_sim/maf/stackers/date_stackers.py +192 -0
- rubin_sim/maf/stackers/general_stackers.py +683 -0
- rubin_sim/maf/stackers/get_col_info.py +104 -0
- rubin_sim/maf/stackers/label_stackers.py +114 -0
- rubin_sim/maf/stackers/m5_optimal_stacker.py +126 -0
- rubin_sim/maf/stackers/mo_phase.py +265 -0
- rubin_sim/maf/stackers/mo_stackers.py +486 -0
- rubin_sim/maf/stackers/n_follow_stacker.py +187 -0
- rubin_sim/maf/stackers/neo_dist_stacker.py +126 -0
- rubin_sim/maf/stackers/sdss_stackers.py +30 -0
- rubin_sim/maf/stackers/sn_stacker.py +152 -0
- rubin_sim/maf/stackers/teff_stacker.py +154 -0
- rubin_sim/maf/utils/__init__.py +6 -0
- rubin_sim/maf/utils/astrometry_utils.py +93 -0
- rubin_sim/maf/utils/generate_fov_map.py +58 -0
- rubin_sim/maf/utils/get_date_version.py +28 -0
- rubin_sim/maf/utils/maf_utils.py +212 -0
- rubin_sim/maf/utils/opsim_utils.py +259 -0
- rubin_sim/maf/utils/output_utils.py +34 -0
- rubin_sim/maf/utils/sn_n_sn_utils.py +894 -0
- rubin_sim/maf/utils/sn_utils.py +369 -0
- rubin_sim/maf/utils/stellar_mags.py +197 -0
- rubin_sim/maf/web/__init__.py +2 -0
- rubin_sim/maf/web/favicon.ico +0 -0
- rubin_sim/maf/web/maf_run_results.py +645 -0
- rubin_sim/maf/web/maf_tracking.py +139 -0
- rubin_sim/maf/web/sorttable.js +496 -0
- rubin_sim/maf/web/templates/allmetricresults.html +72 -0
- rubin_sim/maf/web/templates/configs.html +28 -0
- rubin_sim/maf/web/templates/macros.html +243 -0
- rubin_sim/maf/web/templates/master.html +294 -0
- rubin_sim/maf/web/templates/metricselect.html +91 -0
- rubin_sim/maf/web/templates/multicolor.html +147 -0
- rubin_sim/maf/web/templates/results.html +82 -0
- rubin_sim/maf/web/templates/runselect.html +58 -0
- rubin_sim/maf/web/templates/stats.html +50 -0
- rubin_sim/moving_objects/__init__.py +8 -0
- rubin_sim/moving_objects/base_obs.py +468 -0
- rubin_sim/moving_objects/cheby_fits.py +689 -0
- rubin_sim/moving_objects/cheby_values.py +231 -0
- rubin_sim/moving_objects/chebyshev_utils.py +365 -0
- rubin_sim/moving_objects/direct_obs.py +376 -0
- rubin_sim/moving_objects/make_lsst_obs.py +282 -0
- rubin_sim/moving_objects/ooephemerides.py +643 -0
- rubin_sim/moving_objects/orbits.py +507 -0
- rubin_sim/moving_objects/pre_generate.py +37 -0
- rubin_sim/moving_objects/utils.py +61 -0
- rubin_sim/phot_utils/__init__.py +7 -0
- rubin_sim/phot_utils/bandpass.py +425 -0
- rubin_sim/phot_utils/photometric_parameters.py +449 -0
- rubin_sim/phot_utils/physical_parameters.py +50 -0
- rubin_sim/phot_utils/predicted_zeropoints.py +245 -0
- rubin_sim/phot_utils/sed.py +1773 -0
- rubin_sim/phot_utils/sed_utils.py +52 -0
- rubin_sim/phot_utils/signaltonoise.py +695 -0
- rubin_sim/phot_utils/spectral_resampling.py +161 -0
- rubin_sim/satellite_constellations/__init__.py +3 -0
- rubin_sim/satellite_constellations/basis_function.py +40 -0
- rubin_sim/satellite_constellations/model_observatory.py +157 -0
- rubin_sim/satellite_constellations/sat_utils.py +488 -0
- rubin_sim/selfcal/__init__.py +4 -0
- rubin_sim/selfcal/generate_catalog.py +188 -0
- rubin_sim/selfcal/offsets.py +119 -0
- rubin_sim/selfcal/solver.py +143 -0
- rubin_sim/selfcal/star_tools.py +42 -0
- rubin_sim/sim_archive/__init__.py +14 -0
- rubin_sim/sim_archive/conda_packages.py +65 -0
- rubin_sim/sim_archive/future_vsarch.py +480 -0
- rubin_sim/sim_archive/make_snapshot.py +255 -0
- rubin_sim/sim_archive/prenight.py +216 -0
- rubin_sim/sim_archive/prenightindex.py +229 -0
- rubin_sim/sim_archive/prototype.py +1029 -0
- rubin_sim/sim_archive/sim_archive.py +680 -0
- rubin_sim/sim_archive/tempdb.py +56 -0
- rubin_sim/sim_archive/util.py +146 -0
- rubin_sim/sim_archive/vseqarchive.py +965 -0
- rubin_sim/sim_archive/vseqmetadata.py +1721 -0
- rubin_sim/skybrightness/__init__.py +5 -0
- rubin_sim/skybrightness/allsky_db.py +93 -0
- rubin_sim/skybrightness/data/ESO_Spectra/eso_tools.py +505 -0
- rubin_sim/skybrightness/data/solarSpec/package.py +22 -0
- rubin_sim/skybrightness/generate_hdf5.py +243 -0
- rubin_sim/skybrightness/interp_components.py +798 -0
- rubin_sim/skybrightness/sky_model.py +771 -0
- rubin_sim/skybrightness/twilight_func.py +83 -0
- rubin_sim/skybrightness/utils.py +91 -0
- rubin_sim-2.6.1.dev2.dist-info/METADATA +95 -0
- rubin_sim-2.6.1.dev2.dist-info/RECORD +387 -0
- rubin_sim-2.6.1.dev2.dist-info/WHEEL +5 -0
- rubin_sim-2.6.1.dev2.dist-info/entry_points.txt +24 -0
- rubin_sim-2.6.1.dev2.dist-info/licenses/LICENSE +674 -0
- rubin_sim-2.6.1.dev2.dist-info/top_level.txt +5 -0
- sql/make_vseqmeta.sql +251 -0
- tests/data/test_data.py +26 -0
- tests/data/test_ddf_grid.py +17 -0
- tests/maf/test_3x2fom.py +68 -0
- tests/maf/test_archive.py +162 -0
- tests/maf/test_basemetrics.py +99 -0
- tests/maf/test_batchcommon.py +36 -0
- tests/maf/test_batches.py +159 -0
- tests/maf/test_cadencemetrics.py +388 -0
- tests/maf/test_calibrationmetrics.py +242 -0
- tests/maf/test_color_slopes.py +71 -0
- tests/maf/test_cosmology_summaries.py +20 -0
- tests/maf/test_gathersummaries.py +48 -0
- tests/maf/test_healpixslicer.py +439 -0
- tests/maf/test_healpixsubsetslicer.py +273 -0
- tests/maf/test_hgplotters.py +145 -0
- tests/maf/test_hourglassmetric.py +33 -0
- tests/maf/test_io.py +187 -0
- tests/maf/test_json.py +169 -0
- tests/maf/test_maps.py +199 -0
- tests/maf/test_metricbundle.py +69 -0
- tests/maf/test_mometrics.py +422 -0
- tests/maf/test_movieslicer.py +216 -0
- tests/maf/test_ndslicer.py +240 -0
- tests/maf/test_neodistanceplotter.py +41 -0
- tests/maf/test_onedslicer.py +245 -0
- tests/maf/test_opsimutils.py +80 -0
- tests/maf/test_plotters.py +134 -0
- tests/maf/test_resultsdb.py +145 -0
- tests/maf/test_schedviewmetrics.py +14 -0
- tests/maf/test_simplemetrics.py +200 -0
- tests/maf/test_snmetrics.py +335 -0
- tests/maf/test_snmetrics_nsn.py +123 -0
- tests/maf/test_stackers.py +423 -0
- tests/maf/test_stellarmags.py +50 -0
- tests/maf/test_stringcount.py +26 -0
- tests/maf/test_summary_plots.py +197 -0
- tests/maf/test_summarymetrics.py +82 -0
- tests/maf/test_technicalmetrics.py +267 -0
- tests/maf/test_templatemetrics.py +86 -0
- tests/maf/test_timeintervalslicers.py +97 -0
- tests/maf/test_trackingdb.py +88 -0
- tests/maf/test_unislicer.py +116 -0
- tests/maf/test_vectormetrics.py +225 -0
- tests/maf/test_visitgroupsmetric.py +181 -0
- tests/moving_objects/test_camera.py +39 -0
- tests/moving_objects/test_chebyfits.py +188 -0
- tests/moving_objects/test_chebyshevutils.py +76 -0
- tests/moving_objects/test_chebyvalues.py +245 -0
- tests/moving_objects/test_ephemerides.py +219 -0
- tests/moving_objects/test_orbits.py +170 -0
- tests/moving_objects/test_sed_data.py +61 -0
- tests/phot_utils/test_approximatebandpasses.py +91 -0
- tests/phot_utils/test_photometricparameters.py +268 -0
- tests/phot_utils/test_photometry.py +61 -0
- tests/phot_utils/test_predicted_zeropoints.py +53 -0
- tests/phot_utils/test_read_bandpasses.py +29 -0
- tests/phot_utils/test_sed.py +368 -0
- tests/phot_utils/test_snr.py +370 -0
- tests/satellite_constellations/test_satellites.py +36 -0
- tests/sim_archive/test_make_snapshot.py +24 -0
- tests/sim_archive/test_prototype_sim_archive.py +204 -0
- tests/sim_archive/test_vseqarchive.py +947 -0
- tests/skybrightness/test_skymodel.py +359 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
# Base class for all 'Slicer' objects.
|
|
2
|
+
#
|
|
3
|
+
__all__ = ("SlicerRegistry", "BaseSlicer")
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
import json
|
|
7
|
+
import warnings
|
|
8
|
+
from io import StringIO
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
import numpy.ma as ma
|
|
12
|
+
|
|
13
|
+
from rubin_sim.maf.utils import get_date_version
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SlicerRegistry(type):
|
|
17
|
+
"""
|
|
18
|
+
Meta class for slicers, to build a registry of slicer classes.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(cls, name, bases, dict):
|
|
22
|
+
super(SlicerRegistry, cls).__init__(name, bases, dict)
|
|
23
|
+
if not hasattr(cls, "registry"):
|
|
24
|
+
cls.registry = {}
|
|
25
|
+
modname = inspect.getmodule(cls).__name__ + "."
|
|
26
|
+
if modname.startswith("rubin_sim.maf.slicers"):
|
|
27
|
+
modname = ""
|
|
28
|
+
slicername = modname + name
|
|
29
|
+
if slicername in cls.registry:
|
|
30
|
+
raise Exception("Redefining metric %s! (there are >1 slicers with the same name)" % (slicername))
|
|
31
|
+
if slicername not in ["BaseSlicer", "BaseSpatialSlicer"]:
|
|
32
|
+
cls.registry[slicername] = cls
|
|
33
|
+
|
|
34
|
+
def get_class(cls, slicername):
|
|
35
|
+
return cls.registry[slicername]
|
|
36
|
+
|
|
37
|
+
def help(cls, doc=False):
|
|
38
|
+
for slicername in sorted(cls.registry):
|
|
39
|
+
if not doc:
|
|
40
|
+
print(slicername)
|
|
41
|
+
if doc:
|
|
42
|
+
print("---- ", slicername, " ----")
|
|
43
|
+
print(inspect.getdoc(cls.registry[slicername]))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class BaseSlicer(metaclass=SlicerRegistry):
|
|
47
|
+
"""
|
|
48
|
+
Base class for all slicers: sets required methods and
|
|
49
|
+
implements common functionality.
|
|
50
|
+
|
|
51
|
+
After first construction, the slicer should be ready for
|
|
52
|
+
`setup_slicer` which defines slice_points, allowing the slicer to "slice"
|
|
53
|
+
data and generate plots.
|
|
54
|
+
After init after a restore: everything necessary for using slicer for
|
|
55
|
+
plotting or saving/restoring metric data should be present, although
|
|
56
|
+
the slicer does not need to be able to slice data again and generally
|
|
57
|
+
will not be able to do so.
|
|
58
|
+
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
verbose: `bool`, optional
|
|
62
|
+
True/False flag to send extra output to screen.
|
|
63
|
+
badval: `int` or `float`, optional
|
|
64
|
+
The value the Slicer uses to fill masked metric data values
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
def __init__(self, verbose=False, badval=-666):
|
|
68
|
+
self.verbose = verbose
|
|
69
|
+
self.badval = badval
|
|
70
|
+
# Set the cache_size.
|
|
71
|
+
# Currently only healpixSlicers (and their derivatives) use the cache.
|
|
72
|
+
# The size of the cache is set directly by those slicers.
|
|
73
|
+
self.cache_size = 0
|
|
74
|
+
# Set length of Slicer. This determines the endpoint for iteration.
|
|
75
|
+
self.nslice = None
|
|
76
|
+
# Set the length of the data (metric) values.
|
|
77
|
+
# This is often but not necessarily the same as nslice.
|
|
78
|
+
self.shape = None
|
|
79
|
+
self.slice_points = {}
|
|
80
|
+
self.slicer_name = self.__class__.__name__
|
|
81
|
+
self.columns_needed = []
|
|
82
|
+
# Create a dict that saves how to re-init the slicer.
|
|
83
|
+
# This may not be the whole set of args/kwargs, may only be
|
|
84
|
+
# those which carry useful metadata or are necesary for init.
|
|
85
|
+
self.slicer_init = {"badval": badval}
|
|
86
|
+
self.plot_funcs = []
|
|
87
|
+
|
|
88
|
+
def _run_maps(self, maps):
|
|
89
|
+
"""Add map metadata to slice_points."""
|
|
90
|
+
if maps is not None:
|
|
91
|
+
for m in maps:
|
|
92
|
+
self.slice_points = m.run(self.slice_points)
|
|
93
|
+
|
|
94
|
+
def setup_slicer(self, sim_data, maps=None):
|
|
95
|
+
"""Set up Slicer for data slicing.
|
|
96
|
+
|
|
97
|
+
Set up internal parameters necessary for slicer to slice data
|
|
98
|
+
and generates indexes on sim_data.
|
|
99
|
+
Also sets _slice_sim_data for a particular slicer.
|
|
100
|
+
|
|
101
|
+
Parameters
|
|
102
|
+
-----------
|
|
103
|
+
sim_data : `np.recarray`
|
|
104
|
+
The simulated data to be sliced.
|
|
105
|
+
maps : `list` of `rubin_sim.maf.maps` objects, optional.
|
|
106
|
+
Maps to apply at each slice_point,
|
|
107
|
+
to add to the slice_point metadata.
|
|
108
|
+
"""
|
|
109
|
+
raise NotImplementedError()
|
|
110
|
+
|
|
111
|
+
def get_slice_points(self):
|
|
112
|
+
"""Return the slice_point metadata, for all slice points."""
|
|
113
|
+
return self.slice_points
|
|
114
|
+
|
|
115
|
+
def __len__(self):
|
|
116
|
+
"""Return nslice, the number of slice_points in the slicer."""
|
|
117
|
+
return self.nslice
|
|
118
|
+
|
|
119
|
+
def __iter__(self):
|
|
120
|
+
"""Iterate over the slices."""
|
|
121
|
+
self.islice = 0
|
|
122
|
+
return self
|
|
123
|
+
|
|
124
|
+
def __next__(self):
|
|
125
|
+
"""Returns results of self._slice_sim_data when iterating over slicer.
|
|
126
|
+
|
|
127
|
+
Results of self._slice_sim_data should be dictionary of
|
|
128
|
+
{'idxs': the data indexes relevant for this slice of the slicer,
|
|
129
|
+
'slice_point': the metadata for the slice_point, which always
|
|
130
|
+
includes 'sid' key for ID of slice_point.}
|
|
131
|
+
"""
|
|
132
|
+
if self.islice >= self.nslice:
|
|
133
|
+
raise StopIteration
|
|
134
|
+
islice = self.islice
|
|
135
|
+
self.islice += 1
|
|
136
|
+
return self._slice_sim_data(islice)
|
|
137
|
+
|
|
138
|
+
def __getitem__(self, islice):
|
|
139
|
+
return self._slice_sim_data(islice)
|
|
140
|
+
|
|
141
|
+
def __eq__(self, other_slicer):
|
|
142
|
+
"""Evaluate if two slicers are equivalent."""
|
|
143
|
+
raise NotImplementedError()
|
|
144
|
+
|
|
145
|
+
def __ne__(self, other_slicer):
|
|
146
|
+
"""Evaluate if two slicers are not equivalent."""
|
|
147
|
+
if self == other_slicer:
|
|
148
|
+
return False
|
|
149
|
+
else:
|
|
150
|
+
return True
|
|
151
|
+
|
|
152
|
+
def _slice_sim_data(self, slice_point):
|
|
153
|
+
"""Slice the simulation data appropriately for the slicer.
|
|
154
|
+
|
|
155
|
+
Given the identifying slice_point metadata
|
|
156
|
+
The slice of data returned will be the indices of the
|
|
157
|
+
numpy rec array (the sim_data) which are appropriate for the metric
|
|
158
|
+
to be working on, for that slice_point.
|
|
159
|
+
"""
|
|
160
|
+
raise NotImplementedError('This method is set up by "setup_slicer" - run that first.')
|
|
161
|
+
|
|
162
|
+
def write_data(
|
|
163
|
+
self,
|
|
164
|
+
outfilename,
|
|
165
|
+
metric_values,
|
|
166
|
+
metric_name="",
|
|
167
|
+
sim_data_name="",
|
|
168
|
+
constraint=None,
|
|
169
|
+
info_label="",
|
|
170
|
+
plot_dict=None,
|
|
171
|
+
display_dict=None,
|
|
172
|
+
summary_values=None,
|
|
173
|
+
):
|
|
174
|
+
"""
|
|
175
|
+
Save metric values along with the information required to
|
|
176
|
+
re-build the slicer.
|
|
177
|
+
|
|
178
|
+
Parameters
|
|
179
|
+
-----------
|
|
180
|
+
outfilename : `str`
|
|
181
|
+
The output file name.
|
|
182
|
+
metric_values : `np.ma.MaskedArray` or `np.ndarray`
|
|
183
|
+
The metric values to save to disk.
|
|
184
|
+
metric_name : `str`
|
|
185
|
+
Name of the metric as configured when run
|
|
186
|
+
sim_data_name : `str`
|
|
187
|
+
Name of the simulation metric run on
|
|
188
|
+
constraint : `str`
|
|
189
|
+
Constraint used to subselect data
|
|
190
|
+
info_label : `str`
|
|
191
|
+
Descriptive additional information
|
|
192
|
+
plot_dict : `dict`
|
|
193
|
+
Dictionary of plotting parameters
|
|
194
|
+
display_dict : `dict`
|
|
195
|
+
Dictionary of display parameters, including caption
|
|
196
|
+
summary_values : `dict`
|
|
197
|
+
Dictionary of summary statistics
|
|
198
|
+
"""
|
|
199
|
+
header = {}
|
|
200
|
+
header["metric_name"] = metric_name
|
|
201
|
+
header["constraint"] = constraint
|
|
202
|
+
header["info_label"] = info_label
|
|
203
|
+
header["sim_data_name"] = sim_data_name
|
|
204
|
+
date, version_info = get_date_version()
|
|
205
|
+
header["date_ran"] = date
|
|
206
|
+
if display_dict is None:
|
|
207
|
+
display_dict = {"group": "Ungrouped"}
|
|
208
|
+
header["display_dict"] = display_dict
|
|
209
|
+
header["plot_dict"] = plot_dict
|
|
210
|
+
header["summary_values"] = summary_values
|
|
211
|
+
for key in version_info:
|
|
212
|
+
header[key] = version_info[key]
|
|
213
|
+
if hasattr(metric_values, "mask"): # If it is a masked array
|
|
214
|
+
data = metric_values.data
|
|
215
|
+
mask = metric_values.mask
|
|
216
|
+
fill = metric_values.fill_value
|
|
217
|
+
else:
|
|
218
|
+
data = metric_values
|
|
219
|
+
mask = None
|
|
220
|
+
fill = None
|
|
221
|
+
# npz file acts like dictionary: each keyword/value pair
|
|
222
|
+
# below acts as a dictionary in loaded NPZ file.
|
|
223
|
+
np.savez(
|
|
224
|
+
outfilename,
|
|
225
|
+
# header saved as dictionary
|
|
226
|
+
header=header,
|
|
227
|
+
# metric data values
|
|
228
|
+
metric_values=data,
|
|
229
|
+
# metric mask values
|
|
230
|
+
mask=mask,
|
|
231
|
+
# metric badval/fill val
|
|
232
|
+
fill=fill,
|
|
233
|
+
# dictionary of instantiation parameters
|
|
234
|
+
slicer_init=self.slicer_init,
|
|
235
|
+
# class name
|
|
236
|
+
slicer_name=self.slicer_name,
|
|
237
|
+
# slice_point metadata saved (is a dictionary)
|
|
238
|
+
slice_points=self.slice_points,
|
|
239
|
+
slicer_n_slice=self.nslice,
|
|
240
|
+
slicer_shape=self.shape,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
def output_json(
|
|
244
|
+
self,
|
|
245
|
+
metric_values,
|
|
246
|
+
metric_name="",
|
|
247
|
+
sim_data_name="",
|
|
248
|
+
info_label="",
|
|
249
|
+
plot_dict=None,
|
|
250
|
+
):
|
|
251
|
+
"""
|
|
252
|
+
Send metric data to JSON streaming API,
|
|
253
|
+
along with a little bit of metadata.
|
|
254
|
+
|
|
255
|
+
This method will only work for metrics where the
|
|
256
|
+
metricDtype is float or int, as JSON will not interpret more
|
|
257
|
+
complex data properly. These values can't be plotted anyway though.
|
|
258
|
+
|
|
259
|
+
Parameters
|
|
260
|
+
-----------
|
|
261
|
+
metric_values : `np.ma.MaskedArray` or `np.ndarray`
|
|
262
|
+
The metric values.
|
|
263
|
+
metric_name : `str`, optional
|
|
264
|
+
The name of the metric.
|
|
265
|
+
sim_data_name : `str`, optional
|
|
266
|
+
The name of the simulated data source.
|
|
267
|
+
info_label : `str`, optional
|
|
268
|
+
Some additional information about this metric
|
|
269
|
+
and how it was calculated.
|
|
270
|
+
plot_dict : `dict`, optional.
|
|
271
|
+
The plot_dict for this metric bundle.
|
|
272
|
+
|
|
273
|
+
Returns
|
|
274
|
+
--------
|
|
275
|
+
io : `StringIO`
|
|
276
|
+
StringIO object containing a header dictionary with
|
|
277
|
+
metric_name/metadata/sim_data_name/slicer_name,
|
|
278
|
+
and plot labels from plot_dict, and metric values/data for plot.
|
|
279
|
+
if oneDSlicer,
|
|
280
|
+
the data is [ [bin_left_edge, value], [bin_left_edge, value]..].
|
|
281
|
+
if a spatial slicer,
|
|
282
|
+
the data is [ [lon, lat, value], [lon, lat, value] ..].
|
|
283
|
+
"""
|
|
284
|
+
# Bail if this is not a good data type for JSON.
|
|
285
|
+
if not (metric_values.dtype == "float") or (metric_values.dtype == "int"):
|
|
286
|
+
warnings.warn("Cannot generate JSON.")
|
|
287
|
+
io = StringIO()
|
|
288
|
+
json.dump(["Cannot generate JSON for this file."], io)
|
|
289
|
+
return None
|
|
290
|
+
# Else put everything together for JSON output.
|
|
291
|
+
if plot_dict is None:
|
|
292
|
+
plot_dict = {}
|
|
293
|
+
plot_dict["units"] = ""
|
|
294
|
+
# Preserve some of the metadata for the plot.
|
|
295
|
+
header = {}
|
|
296
|
+
header["metric_name"] = metric_name
|
|
297
|
+
header["info_label"] = info_label
|
|
298
|
+
header["sim_data_name"] = sim_data_name
|
|
299
|
+
header["slicer_name"] = self.slicer_name
|
|
300
|
+
header["slicer_len"] = int(self.nslice)
|
|
301
|
+
# Set some default plot labels if appropriate.
|
|
302
|
+
if "title" in plot_dict:
|
|
303
|
+
header["title"] = plot_dict["title"]
|
|
304
|
+
else:
|
|
305
|
+
header["title"] = "%s %s: %s" % (sim_data_name, info_label, metric_name)
|
|
306
|
+
if "xlabel" in plot_dict:
|
|
307
|
+
header["xlabel"] = plot_dict["xlabel"]
|
|
308
|
+
else:
|
|
309
|
+
if hasattr(self, "slice_col_name"):
|
|
310
|
+
header["xlabel"] = "%s (%s)" % (
|
|
311
|
+
self.slice_col_name,
|
|
312
|
+
self.slice_col_units,
|
|
313
|
+
)
|
|
314
|
+
else:
|
|
315
|
+
header["xlabel"] = "%s" % metric_name
|
|
316
|
+
if "units" in plot_dict:
|
|
317
|
+
header["xlabel"] += " (%s)" % (plot_dict["units"])
|
|
318
|
+
if "ylabel" in plot_dict:
|
|
319
|
+
header["ylabel"] = plot_dict["ylabel"]
|
|
320
|
+
else:
|
|
321
|
+
if hasattr(self, "slice_col_name"):
|
|
322
|
+
header["ylabel"] = "%s" % metric_name
|
|
323
|
+
if "units" in plot_dict:
|
|
324
|
+
header["ylabel"] += " (%s)" % (plot_dict["units"])
|
|
325
|
+
else:
|
|
326
|
+
# If it's not a oneDslicer and no ylabel given, don't need one.
|
|
327
|
+
pass
|
|
328
|
+
# Bundle up slicer and metric info.
|
|
329
|
+
metric = []
|
|
330
|
+
# If metric values is a masked array.
|
|
331
|
+
if hasattr(metric_values, "mask"):
|
|
332
|
+
if "ra" in self.slice_points:
|
|
333
|
+
# Spatial slicer.
|
|
334
|
+
# Translate ra/dec to lon/lat in degrees and
|
|
335
|
+
# output with metric value.
|
|
336
|
+
for ra, dec, value, mask in zip(
|
|
337
|
+
self.slice_points["ra"],
|
|
338
|
+
self.slice_points["dec"],
|
|
339
|
+
metric_values.data,
|
|
340
|
+
metric_values.mask,
|
|
341
|
+
):
|
|
342
|
+
if not mask:
|
|
343
|
+
lon = ra * 180.0 / np.pi
|
|
344
|
+
lat = dec * 180.0 / np.pi
|
|
345
|
+
metric.append([lon, lat, value])
|
|
346
|
+
elif "bins" in self.slice_points:
|
|
347
|
+
# OneD slicer. Translate bins into bin/left and
|
|
348
|
+
# output with metric value.
|
|
349
|
+
for i in range(len(metric_values)):
|
|
350
|
+
bin_left = self.slice_points["bins"][i]
|
|
351
|
+
value = metric_values.data[i]
|
|
352
|
+
mask = metric_values.mask[i]
|
|
353
|
+
if not mask:
|
|
354
|
+
metric.append([bin_left, value])
|
|
355
|
+
else:
|
|
356
|
+
metric.append([bin_left, 0])
|
|
357
|
+
metric.append([self.slice_points["bins"][i + 1], 0])
|
|
358
|
+
elif self.slicer_name == "UniSlicer":
|
|
359
|
+
metric.append([metric_values[0]])
|
|
360
|
+
# Else:
|
|
361
|
+
else:
|
|
362
|
+
if "ra" in self.slice_points:
|
|
363
|
+
for ra, dec, value in zip(self.slice_points["ra"], self.slice_points["dec"], metric_values):
|
|
364
|
+
lon = ra * 180.0 / np.pi
|
|
365
|
+
lat = dec * 180.0 / np.pi
|
|
366
|
+
metric.append([lon, lat, value])
|
|
367
|
+
elif "bins" in self.slice_points:
|
|
368
|
+
for i in range(len(metric_values)):
|
|
369
|
+
bin_left = self.slice_points["bins"][i]
|
|
370
|
+
value = metric_values[i]
|
|
371
|
+
metric.append([bin_left, value])
|
|
372
|
+
metric.append(self.slice_points["bins"][i + 1][0])
|
|
373
|
+
elif self.slicer_name == "UniSlicer":
|
|
374
|
+
metric.append([metric_values[0]])
|
|
375
|
+
# Write out JSON output.
|
|
376
|
+
io = StringIO()
|
|
377
|
+
json.dump([header, metric], io)
|
|
378
|
+
return io
|
|
379
|
+
|
|
380
|
+
def read_data(self, infilename):
|
|
381
|
+
"""
|
|
382
|
+
Read metric data from disk, along with the info to
|
|
383
|
+
rebuild the slicer (minus new slicing capability).
|
|
384
|
+
|
|
385
|
+
Parameters
|
|
386
|
+
-----------
|
|
387
|
+
infilename: `str`
|
|
388
|
+
The filename containing the metric data.
|
|
389
|
+
|
|
390
|
+
Returns
|
|
391
|
+
-------
|
|
392
|
+
metric_values, slicer, header : `np.ma.MaskedArray`,
|
|
393
|
+
`rubin_sim.maf.slicer`, `dict`
|
|
394
|
+
MetricValues stored in data file,
|
|
395
|
+
the slicer basis for those metric values,
|
|
396
|
+
and a dictionary containing header information
|
|
397
|
+
(run_name, metadata, etc.).
|
|
398
|
+
"""
|
|
399
|
+
import rubin_sim.maf.slicers as slicers
|
|
400
|
+
|
|
401
|
+
# Allowing pickles here is required, because otherwise we cannot
|
|
402
|
+
# restore data saved as objects.
|
|
403
|
+
restored = np.load(infilename, allow_pickle=True)
|
|
404
|
+
if "slicer_name" not in restored:
|
|
405
|
+
metric_values, slicer, header = self.read_backwards_compatible(restored, infilename)
|
|
406
|
+
return metric_values, slicer, header
|
|
407
|
+
# This is the standard behavior and will be the
|
|
408
|
+
# sole behavior at a future release point.
|
|
409
|
+
# Get metadata and other sim_data info.
|
|
410
|
+
header = restored["header"][()]
|
|
411
|
+
if "dateRan" in header:
|
|
412
|
+
header["date_ran"] = header["dateRan"]
|
|
413
|
+
# Get slicer information.
|
|
414
|
+
slicer_init = restored["slicer_init"][()]
|
|
415
|
+
slicer_name = str(restored["slicer_name"])
|
|
416
|
+
slice_points = restored["slice_points"][()]
|
|
417
|
+
slicer_nslice = restored["slicer_n_slice"]
|
|
418
|
+
slicer_shape = restored["slicer_shape"]
|
|
419
|
+
try:
|
|
420
|
+
slicer = getattr(slicers, slicer_name)(**slicer_init)
|
|
421
|
+
except TypeError:
|
|
422
|
+
if self.verbose:
|
|
423
|
+
warnings.warn(
|
|
424
|
+
f"Cannot use saved slicer init values; falling back to defaults for {infilename}"
|
|
425
|
+
)
|
|
426
|
+
slicer = getattr(slicers, slicer_name)()
|
|
427
|
+
# Restore slice_point information.
|
|
428
|
+
slicer.nslice = slicer_nslice
|
|
429
|
+
slicer.slice_points = slice_points
|
|
430
|
+
slicer.shape = slicer_shape
|
|
431
|
+
# Get metric data set
|
|
432
|
+
if restored["mask"][()] is None:
|
|
433
|
+
metric_values = ma.MaskedArray(data=restored["metric_values"])
|
|
434
|
+
else:
|
|
435
|
+
metric_values = ma.MaskedArray(
|
|
436
|
+
data=restored["metric_values"],
|
|
437
|
+
mask=restored["mask"],
|
|
438
|
+
fill_value=restored["fill"],
|
|
439
|
+
)
|
|
440
|
+
return metric_values, slicer, header
|
|
441
|
+
|
|
442
|
+
def read_backwards_compatible(self, restored, infilename):
|
|
443
|
+
"""Read pre v1.0 metric files."""
|
|
444
|
+
# Backwards compatibility for pre-v1.0 metric outputs.
|
|
445
|
+
# To be deprecated at a future release.
|
|
446
|
+
warnings.warn(
|
|
447
|
+
"Reading pre-v1.0 metric data. To be deprecated in a future release.",
|
|
448
|
+
FutureWarning,
|
|
449
|
+
)
|
|
450
|
+
import rubin_sim.maf.slicers as slicers
|
|
451
|
+
|
|
452
|
+
header = restored["header"][()]
|
|
453
|
+
header["metric_name"] = header["metricName"]
|
|
454
|
+
header["sim_data_name"] = header["simDataName"]
|
|
455
|
+
if "metadata" in header:
|
|
456
|
+
header["info_label"] = header["metadata"]
|
|
457
|
+
if "plotDict" in header:
|
|
458
|
+
header["plot_dict"] = header["plotDict"]
|
|
459
|
+
if "displayDict" in header:
|
|
460
|
+
header["display_dict"] = header["displayDict"]
|
|
461
|
+
if "dateRan" in header:
|
|
462
|
+
header["date_ran"] = header["dateRan"]
|
|
463
|
+
slicer_init = restored["slicer_init"][()]
|
|
464
|
+
slicer_name = str(restored["slicerName"])
|
|
465
|
+
slice_points = restored["slicePoints"][()]
|
|
466
|
+
slicer_nslice = restored["slicerNSlice"]
|
|
467
|
+
slicer_shape = restored["slicerShape"]
|
|
468
|
+
# Slicer init update
|
|
469
|
+
new = ["lat_col", "lon_col", "use_camera"]
|
|
470
|
+
old = ["latCol", "lonCol", "useCamera"]
|
|
471
|
+
for n, o in zip(new, old):
|
|
472
|
+
if o in slicer_init:
|
|
473
|
+
slicer_init[n] = slicer_init[o]
|
|
474
|
+
del slicer_init[o]
|
|
475
|
+
if "Hrange" in slicer_init:
|
|
476
|
+
slicer_init["h_range"] = slicer_init["Hrange"]
|
|
477
|
+
del slicer_init["Hrange"]
|
|
478
|
+
new = ["bin_min", "bin_max", "bin_size", "slice_col_name", "slice_col_units"]
|
|
479
|
+
old = ["binMin", "binMax", "binsize", "sliceColName", "sliceColUnits"]
|
|
480
|
+
for n, o in zip(new, old):
|
|
481
|
+
if o in slicer_init:
|
|
482
|
+
slicer_init[n] = slicer_init[o]
|
|
483
|
+
del slicer_init[o]
|
|
484
|
+
# An earlier backwards compatibility issue -
|
|
485
|
+
# map 'spatialkey1/spatialkey2' to 'lon_col/lat_col'.
|
|
486
|
+
if "spatialkey1" in slicer_init:
|
|
487
|
+
slicer_init["lon_col"] = slicer_init["spatialkey1"]
|
|
488
|
+
del slicer_init["spatialkey1"]
|
|
489
|
+
if "spatialkey2" in slicer_init:
|
|
490
|
+
slicer_init["lat_col"] = slicer_init["spatialkey2"]
|
|
491
|
+
del slicer_init["spatialkey2"]
|
|
492
|
+
try:
|
|
493
|
+
slicer = getattr(slicers, slicer_name)(**slicer_init)
|
|
494
|
+
except TypeError:
|
|
495
|
+
if self.verbose:
|
|
496
|
+
warnings.warn(
|
|
497
|
+
f"Cannot use saved slicer init values; falling back to defaults for {infilename}"
|
|
498
|
+
)
|
|
499
|
+
slicer = getattr(slicers, slicer_name)()
|
|
500
|
+
# Restore slice_point information.
|
|
501
|
+
slicer.nslice = slicer_nslice
|
|
502
|
+
slicer.slice_points = slice_points
|
|
503
|
+
slicer.shape = slicer_shape
|
|
504
|
+
# Get metric data set
|
|
505
|
+
if restored["mask"][()] is None:
|
|
506
|
+
metric_values = ma.MaskedArray(data=restored["metricValues"])
|
|
507
|
+
else:
|
|
508
|
+
metric_values = ma.MaskedArray(
|
|
509
|
+
data=restored["metricValues"],
|
|
510
|
+
mask=restored["mask"],
|
|
511
|
+
fill_value=restored["fill"],
|
|
512
|
+
)
|
|
513
|
+
return metric_values, slicer, header
|