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,283 @@
|
|
|
1
|
+
"""MAF slicers to slice into time intervals based on MJD
|
|
2
|
+
|
|
3
|
+
Primarily intended for hourglass plots.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# pylint: disable=too-many-arguments
|
|
7
|
+
__all__ = (
|
|
8
|
+
"TimeIntervalSlicer",
|
|
9
|
+
"BlockIntervalSlicer",
|
|
10
|
+
"VisitIntervalSlicer",
|
|
11
|
+
"SlicerNotSetupError",
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from collections import defaultdict
|
|
15
|
+
|
|
16
|
+
# imports
|
|
17
|
+
from functools import wraps
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
import pandas as pd
|
|
21
|
+
|
|
22
|
+
from .base_slicer import BaseSlicer
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SlicerNotSetupError(Exception):
|
|
26
|
+
"""Thrown when a slicer is not setup for the method called."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# interface functions
|
|
30
|
+
|
|
31
|
+
# classes
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TimeIntervalSlicer(BaseSlicer):
|
|
35
|
+
"""Base for all time interval slicers.
|
|
36
|
+
|
|
37
|
+
Slices in constant time intervals.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
interval_seconds : `int`
|
|
42
|
+
Duration of slice time intervals, in seconds
|
|
43
|
+
mjd_column_name : `str`
|
|
44
|
+
Name of column on which to slice, must be in units of days
|
|
45
|
+
badval : `float`
|
|
46
|
+
Value to use for bad values in slice
|
|
47
|
+
verbose : `bool`
|
|
48
|
+
Print extra information?
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
interval_seconds=90,
|
|
54
|
+
mjd_column_name="observationStartMJD",
|
|
55
|
+
badval=np.nan,
|
|
56
|
+
verbose=False,
|
|
57
|
+
):
|
|
58
|
+
super().__init__(verbose=verbose, badval=badval)
|
|
59
|
+
self.interval_seconds = interval_seconds
|
|
60
|
+
self.mjd_column_name = mjd_column_name
|
|
61
|
+
self.columns_needed = [mjd_column_name]
|
|
62
|
+
self.sim_idxs = defaultdict(list) # pylint: disable=invalid-name
|
|
63
|
+
|
|
64
|
+
def setup_slicer(self, sim_data, maps=None):
|
|
65
|
+
visit_mjds = sim_data[self.mjd_column_name]
|
|
66
|
+
start_mjd = np.floor(np.min(visit_mjds)).astype(int)
|
|
67
|
+
end_mjd = np.ceil(np.max(visit_mjds)).astype(int)
|
|
68
|
+
interval_days = self.interval_seconds / (24 * 60 * 60.0)
|
|
69
|
+
|
|
70
|
+
mjd_bin_edges = np.arange(start_mjd, end_mjd + interval_days, interval_days)
|
|
71
|
+
|
|
72
|
+
self.sim_idxs.update(
|
|
73
|
+
pd.DataFrame(
|
|
74
|
+
{
|
|
75
|
+
"visit_idx": np.arange(len(visit_mjds)),
|
|
76
|
+
"sid": np.digitize(visit_mjds, mjd_bin_edges),
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
.groupby("sid")
|
|
80
|
+
.agg(list)
|
|
81
|
+
.to_dict()["visit_idx"]
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
mjds = np.arange(start_mjd, end_mjd, interval_days)
|
|
85
|
+
self.slice_points["sid"] = np.arange(len(mjds))
|
|
86
|
+
self.slice_points["mjd"] = mjds
|
|
87
|
+
self.slice_points["duration"] = np.full_like(mjds, self.interval_seconds)
|
|
88
|
+
self.nslice = len(mjds)
|
|
89
|
+
self.shape = self.nslice
|
|
90
|
+
self._run_maps(maps)
|
|
91
|
+
|
|
92
|
+
@wraps(self._slice_sim_data)
|
|
93
|
+
def _slice_sim_data(islice): # pylint: disable=invalid-name
|
|
94
|
+
idxs = self.sim_idxs[islice]
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
_ = idxs[0]
|
|
98
|
+
except (TypeError, IndexError):
|
|
99
|
+
idxs = [idxs]
|
|
100
|
+
|
|
101
|
+
slice_points = {
|
|
102
|
+
"sid": islice,
|
|
103
|
+
"mjd": self.slice_points["mjd"][islice],
|
|
104
|
+
"duration": self.slice_points["duration"][islice],
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return {"idxs": idxs, "slice_point": slice_points}
|
|
108
|
+
|
|
109
|
+
setattr(self, "_slice_sim_data", _slice_sim_data)
|
|
110
|
+
|
|
111
|
+
def __eq__(self, other_slicer):
|
|
112
|
+
"""Evaluate if slicers are equivalent."""
|
|
113
|
+
if not isinstance(other_slicer, self.__class__):
|
|
114
|
+
return False
|
|
115
|
+
|
|
116
|
+
for key in ["sid", "mjd", "duration"]:
|
|
117
|
+
if not np.array_equal(other_slicer.slice_points[key], self.slice_points[key]):
|
|
118
|
+
return False
|
|
119
|
+
|
|
120
|
+
return True
|
|
121
|
+
|
|
122
|
+
def _slice_sim_data(self, *args, **kwargs):
|
|
123
|
+
raise SlicerNotSetupError()
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class BlockIntervalSlicer(TimeIntervalSlicer):
|
|
127
|
+
"""Slices into intervals with common "note" values and no long gaps.
|
|
128
|
+
|
|
129
|
+
Parameters
|
|
130
|
+
----------
|
|
131
|
+
mjd_column_name : `str`
|
|
132
|
+
Name of column on which to slice, must be in units of days
|
|
133
|
+
duration_column_name : `str`
|
|
134
|
+
Name of column with the duration of each visit (in seconds)
|
|
135
|
+
note_column_name : `str`
|
|
136
|
+
Name of column with the visit note.
|
|
137
|
+
badval : `float`
|
|
138
|
+
Value to use for bad values in slice
|
|
139
|
+
verbose : `bool`
|
|
140
|
+
Print extra information?
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
# Gap between visits in the same block, in hours
|
|
144
|
+
gap_tolerance = 0.1
|
|
145
|
+
|
|
146
|
+
def __init__(
|
|
147
|
+
self,
|
|
148
|
+
mjd_column_name="observationStartMJD",
|
|
149
|
+
duration_column_name="visitTime",
|
|
150
|
+
note_column_name="scheduler_note",
|
|
151
|
+
badval=np.nan,
|
|
152
|
+
verbose=False,
|
|
153
|
+
):
|
|
154
|
+
super().__init__(verbose=verbose, badval=badval)
|
|
155
|
+
self.mjd_column_name = mjd_column_name
|
|
156
|
+
self.duration_column_name = duration_column_name
|
|
157
|
+
self.note_column_name = note_column_name
|
|
158
|
+
self.columns_needed = [
|
|
159
|
+
mjd_column_name,
|
|
160
|
+
duration_column_name,
|
|
161
|
+
note_column_name,
|
|
162
|
+
]
|
|
163
|
+
self.sim_idxs = defaultdict(list) # pylint: disable=invalid-name
|
|
164
|
+
|
|
165
|
+
def setup_slicer(self, sim_data, maps=None):
|
|
166
|
+
visits = pd.DataFrame(
|
|
167
|
+
sim_data,
|
|
168
|
+
index=pd.Index(np.arange(len(sim_data[self.mjd_column_name])), name="visit_idx"),
|
|
169
|
+
)
|
|
170
|
+
visits.rename(
|
|
171
|
+
columns={
|
|
172
|
+
self.mjd_column_name: "mjd",
|
|
173
|
+
self.duration_column_name: "duration",
|
|
174
|
+
self.note_column_name: "scheduler_note",
|
|
175
|
+
},
|
|
176
|
+
inplace=True,
|
|
177
|
+
)
|
|
178
|
+
# convert to hours
|
|
179
|
+
visits.sort_values("mjd", inplace=True)
|
|
180
|
+
visits["end_mjd"] = visits.mjd + visits.duration / (60 * 60 * 24.0)
|
|
181
|
+
|
|
182
|
+
same_note = visits.scheduler_note == visits.scheduler_note.shift(-1)
|
|
183
|
+
adjacent_times = visits.end_mjd + self.gap_tolerance / 24.0 > visits.mjd.shift(-1)
|
|
184
|
+
visits["sid"] = np.logical_not(np.logical_and(same_note, adjacent_times)).cumsum().shift()
|
|
185
|
+
visits.fillna({"sid": 0}, inplace=True)
|
|
186
|
+
visits["sid"] = visits["sid"].astype(int)
|
|
187
|
+
|
|
188
|
+
blocks = visits.groupby("sid").agg(
|
|
189
|
+
mjd=pd.NamedAgg(column="mjd", aggfunc="min"),
|
|
190
|
+
end_mjd=pd.NamedAgg(column="end_mjd", aggfunc="max"),
|
|
191
|
+
)
|
|
192
|
+
blocks["duration"] = (blocks.end_mjd - blocks.mjd) * 24 * 60 * 60
|
|
193
|
+
|
|
194
|
+
self.nslice = len(blocks)
|
|
195
|
+
self.shape = self.nslice
|
|
196
|
+
self.sim_idxs.update(
|
|
197
|
+
visits.reset_index()[["sid", "visit_idx"]].groupby("sid").agg(list).to_dict()["visit_idx"]
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
self.slice_points["sid"] = blocks.reset_index().sid.values
|
|
201
|
+
self.slice_points["mjd"] = blocks.mjd.values
|
|
202
|
+
self.slice_points["duration"] = blocks.duration.values
|
|
203
|
+
self._run_maps(maps)
|
|
204
|
+
|
|
205
|
+
@wraps(self._slice_sim_data)
|
|
206
|
+
def _slice_sim_data(islice): # pylint: disable=invalid-name
|
|
207
|
+
idxs = self.sim_idxs[islice]
|
|
208
|
+
|
|
209
|
+
try:
|
|
210
|
+
_ = idxs[0]
|
|
211
|
+
except TypeError:
|
|
212
|
+
idxs = [idxs]
|
|
213
|
+
|
|
214
|
+
slice_points = {
|
|
215
|
+
"sid": islice,
|
|
216
|
+
"mjd": self.slice_points["mjd"][islice],
|
|
217
|
+
"duration": self.slice_points["duration"][islice],
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return {"idxs": idxs, "slice_point": slice_points}
|
|
221
|
+
|
|
222
|
+
setattr(self, "_slice_sim_data", _slice_sim_data)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
class VisitIntervalSlicer(TimeIntervalSlicer):
|
|
226
|
+
"""Slices into intervals each of which contain one visit
|
|
227
|
+
|
|
228
|
+
Parameters
|
|
229
|
+
----------
|
|
230
|
+
mjd_column_name : `str`
|
|
231
|
+
Name of column on which to slice, must be in units of days
|
|
232
|
+
duration_column_name : `str`
|
|
233
|
+
Name of column with the duration of each visit (in seconds)
|
|
234
|
+
badval : `float`
|
|
235
|
+
Value to use for bad values in slice
|
|
236
|
+
verbose : `bool`
|
|
237
|
+
Print extra information?
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
def __init__(
|
|
241
|
+
self,
|
|
242
|
+
mjd_column_name="observationStartMJD",
|
|
243
|
+
duration_column_name="visitTime",
|
|
244
|
+
extra_column_names=tuple(),
|
|
245
|
+
badval=np.nan,
|
|
246
|
+
verbose=False,
|
|
247
|
+
):
|
|
248
|
+
super().__init__(verbose=verbose, badval=badval)
|
|
249
|
+
self.mjd_column_name = mjd_column_name
|
|
250
|
+
self.duration_column_name = duration_column_name
|
|
251
|
+
self.extra_column_names = extra_column_names
|
|
252
|
+
self.columns_needed = [mjd_column_name, duration_column_name]
|
|
253
|
+
self.sim_idxs = None # pylint: disable=invalid-name
|
|
254
|
+
|
|
255
|
+
def setup_slicer(self, sim_data, maps=None):
|
|
256
|
+
self.nslice = len(sim_data[self.mjd_column_name])
|
|
257
|
+
self.shape = self.nslice
|
|
258
|
+
|
|
259
|
+
self.sim_idxs = np.argsort(sim_data[self.mjd_column_name])
|
|
260
|
+
self.slice_points["sid"] = np.arange(self.nslice)
|
|
261
|
+
self.slice_points["mjd"] = sim_data[self.mjd_column_name]
|
|
262
|
+
self.slice_points["duration"] = sim_data[self.duration_column_name]
|
|
263
|
+
for column_name in self.extra_column_names:
|
|
264
|
+
self.slice_points[column_name] = sim_data[column_name]
|
|
265
|
+
self._run_maps(maps)
|
|
266
|
+
|
|
267
|
+
@wraps(self._slice_sim_data)
|
|
268
|
+
def _slice_sim_data(islice): # pylint: disable=invalid-name
|
|
269
|
+
idxs = self.sim_idxs[islice]
|
|
270
|
+
slice_points = {
|
|
271
|
+
"sid": [idxs],
|
|
272
|
+
"mjd": self.slice_points["mjd"][islice],
|
|
273
|
+
"duration": self.slice_points["duration"][islice],
|
|
274
|
+
}
|
|
275
|
+
for column_name in self.extra_column_names:
|
|
276
|
+
slice_points[column_name] = self.slice_points[column_name]
|
|
277
|
+
|
|
278
|
+
return {"idxs": idxs, "slice_point": slice_points}
|
|
279
|
+
|
|
280
|
+
setattr(self, "_slice_sim_data", _slice_sim_data)
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
# internal functions & classes
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""UniSlicer - no slicing at all, simply return all data points."""
|
|
2
|
+
|
|
3
|
+
__all__ = ("UniSlicer",)
|
|
4
|
+
|
|
5
|
+
from functools import wraps
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
|
|
9
|
+
from .base_slicer import BaseSlicer
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class UniSlicer(BaseSlicer):
|
|
13
|
+
"""UniSlicer."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, verbose=True, badval=-666):
|
|
16
|
+
"""Instantiate unislicer."""
|
|
17
|
+
super(UniSlicer, self).__init__(verbose=verbose, badval=badval)
|
|
18
|
+
self.nslice = 1
|
|
19
|
+
self.shape = self.nslice
|
|
20
|
+
self.slice_points["sid"] = np.array(
|
|
21
|
+
[
|
|
22
|
+
0,
|
|
23
|
+
],
|
|
24
|
+
int,
|
|
25
|
+
)
|
|
26
|
+
self.plot_funcs = []
|
|
27
|
+
|
|
28
|
+
def setup_slicer(self, sim_data, maps=None):
|
|
29
|
+
"""Use sim_data to set indexes to return."""
|
|
30
|
+
self._run_maps(maps)
|
|
31
|
+
sim_dataCol = sim_data.dtype.names[0]
|
|
32
|
+
self.indices = np.ones(len(sim_data[sim_dataCol]), dtype="bool")
|
|
33
|
+
|
|
34
|
+
@wraps(self._slice_sim_data)
|
|
35
|
+
def _slice_sim_data(islice):
|
|
36
|
+
"""Return all indexes in sim_data."""
|
|
37
|
+
idxs = self.indices
|
|
38
|
+
slice_point = {"sid": islice}
|
|
39
|
+
for key in self.slice_points:
|
|
40
|
+
if len(np.shape(self.slice_points[key])) == 0:
|
|
41
|
+
keyShape = 0
|
|
42
|
+
else:
|
|
43
|
+
keyShape = np.shape(self.slice_points[key])[0]
|
|
44
|
+
if keyShape == self.nslice:
|
|
45
|
+
slice_point[key] = self.slice_points[key][islice]
|
|
46
|
+
else:
|
|
47
|
+
slice_point[key] = self.slice_points[key]
|
|
48
|
+
return {"idxs": idxs, "slice_point": slice_point}
|
|
49
|
+
|
|
50
|
+
setattr(self, "_slice_sim_data", _slice_sim_data)
|
|
51
|
+
|
|
52
|
+
def __eq__(self, other_slicer):
|
|
53
|
+
"""Evaluate if slicers are equivalent."""
|
|
54
|
+
if isinstance(other_slicer, UniSlicer):
|
|
55
|
+
return True
|
|
56
|
+
else:
|
|
57
|
+
return False
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
__all__ = ("UserPointsSlicer",)
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from astropy import units as u
|
|
5
|
+
from astropy.coordinates import SkyCoord
|
|
6
|
+
|
|
7
|
+
from rubin_sim.maf.plots.spatial_plotters import BaseHistogram, BaseSkyMap
|
|
8
|
+
|
|
9
|
+
from .base_spatial_slicer import BaseSpatialSlicer
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class UserPointsSlicer(BaseSpatialSlicer):
|
|
13
|
+
"""A spatial slicer based on a user-provided list of points.
|
|
14
|
+
The data_slices returned are the visit pointings which overlap
|
|
15
|
+
each of these points.
|
|
16
|
+
|
|
17
|
+
Parameters
|
|
18
|
+
----------
|
|
19
|
+
ra : `list` or `numpy.ndarray`
|
|
20
|
+
User-selected RA points, in degrees. Stored internally in radians.
|
|
21
|
+
dec : `list` or `numpy.ndarray`
|
|
22
|
+
User-selected Dec points, in degrees. Stored internally in radians.
|
|
23
|
+
lon_col : `str`, optional
|
|
24
|
+
Name of the longitude (RA equivalent) column in the input data.
|
|
25
|
+
Default fieldRA
|
|
26
|
+
lat_col : `str`, optional
|
|
27
|
+
Name of the latitude (Dec equivalent) column in the input data.
|
|
28
|
+
Default fieldDec
|
|
29
|
+
latLonDeg : `bool`, optional
|
|
30
|
+
Flag indicating whether the lon and lat values will be in
|
|
31
|
+
degrees (True) or radians (False).
|
|
32
|
+
Default True.
|
|
33
|
+
verbose : `bool`, optional
|
|
34
|
+
Flag to indicate whether or not to write additional
|
|
35
|
+
information to stdout during runtime.
|
|
36
|
+
Default True.
|
|
37
|
+
badval : `float`, optional
|
|
38
|
+
Bad value flag, relevant for plotting. Default -666.
|
|
39
|
+
leafsize : `int`, optional
|
|
40
|
+
Leafsize value for kdtree. Default 100.
|
|
41
|
+
radius : `float`, optional
|
|
42
|
+
Radius for matching in the kdtree.
|
|
43
|
+
Equivalent to the radius of the FOV. Degrees.
|
|
44
|
+
Default 2.45.
|
|
45
|
+
use_camera : `bool`, optional
|
|
46
|
+
Flag to indicate whether to use the LSST camera footprint or not.
|
|
47
|
+
Default True.
|
|
48
|
+
camera_radius : `float`, optional
|
|
49
|
+
max_radius for the LsstCameraFootprint (degrees).
|
|
50
|
+
camera_footprint_file : `str`, optional
|
|
51
|
+
Name of the camera footprint map to use.
|
|
52
|
+
Can be None, which will use the default.
|
|
53
|
+
rotSkyPosColName : `str`, optional
|
|
54
|
+
Name of the rotSkyPos column in the input data.
|
|
55
|
+
Only used if use_camera is True.
|
|
56
|
+
Describes the camera orientation compared to the sky.
|
|
57
|
+
Default rotSkyPos.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
def __init__(
|
|
61
|
+
self,
|
|
62
|
+
ra,
|
|
63
|
+
dec,
|
|
64
|
+
lon_col="fieldRA",
|
|
65
|
+
lat_col="fieldDec",
|
|
66
|
+
lat_lon_deg=True,
|
|
67
|
+
verbose=True,
|
|
68
|
+
badval=-666,
|
|
69
|
+
leafsize=100,
|
|
70
|
+
radius=2.45,
|
|
71
|
+
use_camera=True,
|
|
72
|
+
camera_radius=1.94,
|
|
73
|
+
camera_footprint_file=None,
|
|
74
|
+
rot_sky_pos_col_name="rotSkyPos",
|
|
75
|
+
):
|
|
76
|
+
super().__init__(
|
|
77
|
+
lon_col=lon_col,
|
|
78
|
+
lat_col=lat_col,
|
|
79
|
+
lat_lon_deg=lat_lon_deg,
|
|
80
|
+
verbose=verbose,
|
|
81
|
+
badval=badval,
|
|
82
|
+
radius=radius,
|
|
83
|
+
leafsize=leafsize,
|
|
84
|
+
use_camera=use_camera,
|
|
85
|
+
camera_radius=camera_radius,
|
|
86
|
+
camera_footprint_file=camera_footprint_file,
|
|
87
|
+
rot_sky_pos_col_name=rot_sky_pos_col_name,
|
|
88
|
+
)
|
|
89
|
+
# check that ra and dec are iterable,
|
|
90
|
+
# if not, they are probably naked numbers, wrap in list
|
|
91
|
+
if not hasattr(ra, "__iter__"):
|
|
92
|
+
ra = [ra]
|
|
93
|
+
if not hasattr(dec, "__iter__"):
|
|
94
|
+
dec = [dec]
|
|
95
|
+
if len(ra) != len(dec):
|
|
96
|
+
raise ValueError("RA and Dec must be the same length")
|
|
97
|
+
ra = np.radians(ra)
|
|
98
|
+
dec = np.radians(dec)
|
|
99
|
+
self.slice_points["sid"] = np.arange(np.size(ra))
|
|
100
|
+
self.slice_points["ra"] = np.array(ra)
|
|
101
|
+
self.slice_points["dec"] = np.array(dec)
|
|
102
|
+
c = SkyCoord(ra=self.slice_points["ra"] * u.rad, dec=self.slice_points["dec"] * u.rad).transform_to(
|
|
103
|
+
"galactic"
|
|
104
|
+
)
|
|
105
|
+
gall, galb = c.l.rad, c.b.rad
|
|
106
|
+
self.slice_points["gall"] = gall
|
|
107
|
+
self.slice_points["galb"] = galb
|
|
108
|
+
|
|
109
|
+
self.nslice = np.size(ra)
|
|
110
|
+
self.shape = self.nslice
|
|
111
|
+
self.slicer_init = {
|
|
112
|
+
"ra": ra,
|
|
113
|
+
"dec": dec,
|
|
114
|
+
"lon_col": lon_col,
|
|
115
|
+
"lat_col": lat_col,
|
|
116
|
+
"radius": radius,
|
|
117
|
+
}
|
|
118
|
+
self.plot_funcs = [BaseSkyMap, BaseHistogram]
|
|
119
|
+
|
|
120
|
+
def __eq__(self, other_slicer):
|
|
121
|
+
"""Evaluate if two slicers are equivalent."""
|
|
122
|
+
result = False
|
|
123
|
+
# check the slice_points
|
|
124
|
+
for key in other_slicer.slice_points:
|
|
125
|
+
if key in self.slice_points.keys():
|
|
126
|
+
if not np.array_equal(other_slicer.slice_points[key], self.slice_points[key]):
|
|
127
|
+
return False
|
|
128
|
+
else:
|
|
129
|
+
return False
|
|
130
|
+
if isinstance(other_slicer, UserPointsSlicer):
|
|
131
|
+
if other_slicer.nslice == self.nslice:
|
|
132
|
+
if np.array_equal(
|
|
133
|
+
other_slicer.slice_points["ra"], self.slice_points["ra"]
|
|
134
|
+
) and np.array_equal(other_slicer.slice_points["dec"], self.slice_points["dec"]):
|
|
135
|
+
if other_slicer.lon_col == self.lon_col and other_slicer.lat_col == self.lat_col:
|
|
136
|
+
if other_slicer.radius == self.radius:
|
|
137
|
+
if other_slicer.use_camera == self.use_camera:
|
|
138
|
+
if other_slicer.rotSkyPosColName == self.rotSkyPosColName:
|
|
139
|
+
if np.array_equal(other_slicer.shape, self.shape):
|
|
140
|
+
result = True
|
|
141
|
+
return result
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from .base_stacker import *
|
|
2
|
+
from .coord_stackers import *
|
|
3
|
+
from .date_stackers import *
|
|
4
|
+
from .general_stackers import *
|
|
5
|
+
from .get_col_info import *
|
|
6
|
+
from .label_stackers import *
|
|
7
|
+
from .m5_optimal_stacker import *
|
|
8
|
+
from .mo_stackers import *
|
|
9
|
+
from .n_follow_stacker import *
|
|
10
|
+
from .neo_dist_stacker import *
|
|
11
|
+
from .sdss_stackers import *
|
|
12
|
+
from .sn_stacker import *
|
|
13
|
+
from .teff_stacker import *
|