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,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
|