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,425 @@
|
|
|
1
|
+
#
|
|
2
|
+
# LSST Data Management System
|
|
3
|
+
# Copyright 2008, 2009, 2010, 2011, 2012 LSST Corporation.
|
|
4
|
+
#
|
|
5
|
+
# This product includes software developed by the
|
|
6
|
+
# LSST Project (http://www.lsst.org/).
|
|
7
|
+
#
|
|
8
|
+
# This program is free software: you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
#
|
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
# GNU General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the LSST License Statement and
|
|
19
|
+
# the GNU General Public License along with this program. If not,
|
|
20
|
+
# see <http://www.lsstcorp.org/LegalNotices/>.
|
|
21
|
+
#
|
|
22
|
+
|
|
23
|
+
__all__ = ("Bandpass", "rubin_bandpasses")
|
|
24
|
+
|
|
25
|
+
import gzip
|
|
26
|
+
import os
|
|
27
|
+
import warnings
|
|
28
|
+
|
|
29
|
+
import numpy as np
|
|
30
|
+
|
|
31
|
+
try:
|
|
32
|
+
from numpy import trapezoid as trapezoid
|
|
33
|
+
except ImportError:
|
|
34
|
+
from numpy import trapz as trapezoid
|
|
35
|
+
import scipy.interpolate as interpolate
|
|
36
|
+
|
|
37
|
+
from rubin_sim.data import get_data_dir
|
|
38
|
+
|
|
39
|
+
from .physical_parameters import PhysicalParameters
|
|
40
|
+
from .sed import Sed
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def rubin_bandpasses():
|
|
44
|
+
"""Return the standard expected Rubin filter bandpasses."""
|
|
45
|
+
filterlist = ["u", "g", "r", "i", "z", "y"]
|
|
46
|
+
dd = get_data_dir()
|
|
47
|
+
|
|
48
|
+
filter_dict = {}
|
|
49
|
+
for f in filterlist:
|
|
50
|
+
filter_dict[f] = Bandpass()
|
|
51
|
+
filter_dict[f].read_throughput(os.path.join(dd, "throughputs", "baseline", f"total_{f}.dat"))
|
|
52
|
+
return filter_dict
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class Bandpass:
|
|
56
|
+
"""
|
|
57
|
+
Hold and use telescope throughput curves.
|
|
58
|
+
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
wavelen : `np.ndarray`, (N,)
|
|
62
|
+
Wavelength array in nm.
|
|
63
|
+
sb : `np.ndarray`, (N,)
|
|
64
|
+
Throughput array (fraction, 0-1).
|
|
65
|
+
sampling_warning : `float`
|
|
66
|
+
If wavelength sampling lower than this,
|
|
67
|
+
throw a warning because it might provide accurate magnitudes
|
|
68
|
+
due to how magnitudes are calculated in Sed (nm).
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
def __init__(self, wavelen=None, sb=None, sampling_warning=0.2):
|
|
72
|
+
self._phys_params = PhysicalParameters()
|
|
73
|
+
self.sampling_warning = sampling_warning
|
|
74
|
+
self.wavelen = None
|
|
75
|
+
self.sb = None
|
|
76
|
+
self.phi = None
|
|
77
|
+
self.bandpassname = None
|
|
78
|
+
if (wavelen is not None) and (sb is not None):
|
|
79
|
+
self.set_bandpass(wavelen, sb)
|
|
80
|
+
return
|
|
81
|
+
|
|
82
|
+
def set_bandpass(self, wavelen, sb):
|
|
83
|
+
"""
|
|
84
|
+
Populate bandpass data with wavelen/sb arrays.
|
|
85
|
+
|
|
86
|
+
Phi set to None.
|
|
87
|
+
|
|
88
|
+
Parameters
|
|
89
|
+
----------
|
|
90
|
+
wavelen : `np.ndarray`, (N,)
|
|
91
|
+
Wavelength array in nm.
|
|
92
|
+
sb : `np.ndarray`, (N,)
|
|
93
|
+
Throughput array (fraction, 0-1).
|
|
94
|
+
|
|
95
|
+
Raises
|
|
96
|
+
------
|
|
97
|
+
ValueError
|
|
98
|
+
Raised if ``wavelen`` and ``sb`` have different length.
|
|
99
|
+
"""
|
|
100
|
+
# Check data type.
|
|
101
|
+
if (isinstance(wavelen, np.ndarray) is False) or (isinstance(sb, np.ndarray) is False):
|
|
102
|
+
raise ValueError("Wavelen and sb arrays must be numpy arrays.")
|
|
103
|
+
# Check data matches in length.
|
|
104
|
+
if len(wavelen) != len(sb):
|
|
105
|
+
raise ValueError("Wavelen and sb arrays must have the same length.")
|
|
106
|
+
|
|
107
|
+
self.wavelen = np.copy(wavelen)
|
|
108
|
+
self.phi = None
|
|
109
|
+
self.sb = np.copy(sb)
|
|
110
|
+
self.bandpassname = "FromArrays"
|
|
111
|
+
|
|
112
|
+
def imsim_bandpass(self, imsimwavelen=500.0, wavelen_min=300, wavelen_max=1150, wavelen_step=0.1):
|
|
113
|
+
"""
|
|
114
|
+
Populate bandpass data with sb=0 everywhere except at imsimwavelen.
|
|
115
|
+
|
|
116
|
+
Sets wavelen/sb, with grid min/max/step as Parameters.
|
|
117
|
+
"""
|
|
118
|
+
# Set up arrays.
|
|
119
|
+
self.wavelen = np.arange(
|
|
120
|
+
wavelen_min,
|
|
121
|
+
wavelen_max + wavelen_step,
|
|
122
|
+
wavelen_step,
|
|
123
|
+
dtype="float",
|
|
124
|
+
)
|
|
125
|
+
self.phi = None
|
|
126
|
+
# Set sb.
|
|
127
|
+
self.sb = np.zeros(len(self.wavelen), dtype="float")
|
|
128
|
+
self.sb[abs(self.wavelen - imsimwavelen) < wavelen_step / 2.0] = 1.0
|
|
129
|
+
self.bandpassname = "IMSIM"
|
|
130
|
+
|
|
131
|
+
def read_throughput(self, filename):
|
|
132
|
+
"""
|
|
133
|
+
Populate bandpass data with data (wavelen/sb) read from file.
|
|
134
|
+
|
|
135
|
+
Sets wavelen/sb. Does NOT set phi.
|
|
136
|
+
"""
|
|
137
|
+
# Set self values to None in case of file read error.
|
|
138
|
+
self.wavelen = None
|
|
139
|
+
self.phi = None
|
|
140
|
+
self.sb = None
|
|
141
|
+
# Check for filename error.
|
|
142
|
+
# If given list of filenames,
|
|
143
|
+
# pass to (and return from) read_throughputList.
|
|
144
|
+
if isinstance(filename, list):
|
|
145
|
+
warnings.warn(
|
|
146
|
+
"Was given list of files, instead of a single file. Using read_throughputList instead"
|
|
147
|
+
)
|
|
148
|
+
self.read_throughput_list(component_list=filename)
|
|
149
|
+
# Filename is single file, now try to open file and read data.
|
|
150
|
+
try:
|
|
151
|
+
if filename.endswith(".gz"):
|
|
152
|
+
f = gzip.open(filename, "rt")
|
|
153
|
+
else:
|
|
154
|
+
f = open(filename, "r")
|
|
155
|
+
except IOError:
|
|
156
|
+
try:
|
|
157
|
+
if filename.endswith(".gz"):
|
|
158
|
+
f = open(filename[:-3], "r")
|
|
159
|
+
else:
|
|
160
|
+
f = gzip.open(filename + ".gz", "rt")
|
|
161
|
+
except IOError:
|
|
162
|
+
raise IOError("The throughput file %s does not exist" % (filename))
|
|
163
|
+
# The throughput file should have [wavelength(A), throughput(Sb)]
|
|
164
|
+
wavelen = []
|
|
165
|
+
sb = []
|
|
166
|
+
for line in f:
|
|
167
|
+
if line.startswith("#") or line.startswith("$") or line.startswith("!"):
|
|
168
|
+
continue
|
|
169
|
+
values = line.split()
|
|
170
|
+
if len(values) < 2:
|
|
171
|
+
continue
|
|
172
|
+
if (values[0] == "$") or (values[0] == "#") or (values[0] == "!"):
|
|
173
|
+
continue
|
|
174
|
+
wavelen.append(float(values[0]))
|
|
175
|
+
sb.append(float(values[1]))
|
|
176
|
+
f.close()
|
|
177
|
+
self.bandpassname = filename
|
|
178
|
+
# Set up wavelen/sb.
|
|
179
|
+
self.wavelen = np.array(wavelen, dtype="float")
|
|
180
|
+
self.sb = np.array(sb, dtype="float")
|
|
181
|
+
# Check that wavelength is monotonic increasing and
|
|
182
|
+
# non-repeating in wavelength. (Sort on wavelength).
|
|
183
|
+
if len(self.wavelen) != len(np.unique(self.wavelen)):
|
|
184
|
+
raise ValueError("The wavelength values in file %s are non-unique." % (filename))
|
|
185
|
+
# Sort values.
|
|
186
|
+
p = self.wavelen.argsort()
|
|
187
|
+
self.wavelen = self.wavelen[p]
|
|
188
|
+
self.sb = self.sb[p]
|
|
189
|
+
|
|
190
|
+
def read_throughput_list(
|
|
191
|
+
self,
|
|
192
|
+
component_list=(
|
|
193
|
+
"detector.dat",
|
|
194
|
+
"lens1.dat",
|
|
195
|
+
"lens2.dat",
|
|
196
|
+
"lens3.dat",
|
|
197
|
+
"m1.dat",
|
|
198
|
+
"m2.dat",
|
|
199
|
+
"m3.dat",
|
|
200
|
+
"atmos_std.dat",
|
|
201
|
+
),
|
|
202
|
+
root_dir=".",
|
|
203
|
+
wavelen_min=300,
|
|
204
|
+
wavelen_max=1150,
|
|
205
|
+
wavelen_step=0.1,
|
|
206
|
+
):
|
|
207
|
+
"""
|
|
208
|
+
Populate bandpass data by reading from a series of files
|
|
209
|
+
containing wavelen/Sb data.
|
|
210
|
+
|
|
211
|
+
Multiplies throughputs (sb) from each file to give a final
|
|
212
|
+
bandpass throughput.
|
|
213
|
+
Sets wavelen/sb, with grid min/max/step as Parameters.
|
|
214
|
+
Does NOT set phi.
|
|
215
|
+
"""
|
|
216
|
+
# ComponentList = names of files in that directory.
|
|
217
|
+
# A typical component list of all files to build final component list,
|
|
218
|
+
# including filter, might be:
|
|
219
|
+
# ['detector.dat', 'lens1.dat', 'lens2.dat', 'lens3.dat',
|
|
220
|
+
# 'm1.dat', 'm2.dat', 'm3.dat', 'atmos_std.dat', 'ideal_g.dat']
|
|
221
|
+
#
|
|
222
|
+
# Set up wavelen/sb on grid.
|
|
223
|
+
self.wavelen = np.arange(
|
|
224
|
+
wavelen_min,
|
|
225
|
+
wavelen_max + wavelen_step / 2.0,
|
|
226
|
+
wavelen_step,
|
|
227
|
+
dtype="float",
|
|
228
|
+
)
|
|
229
|
+
self.phi = None
|
|
230
|
+
self.sb = np.ones(len(self.wavelen), dtype="float")
|
|
231
|
+
# Set up a temporary bandpass object to hold data from each file.
|
|
232
|
+
tempbandpass = Bandpass()
|
|
233
|
+
for component in component_list:
|
|
234
|
+
# Read data from file.
|
|
235
|
+
with warnings.catch_warnings():
|
|
236
|
+
warnings.simplefilter("ignore")
|
|
237
|
+
tempbandpass.read_throughput(os.path.join(root_dir, component))
|
|
238
|
+
tempbandpass.resample_bandpass(
|
|
239
|
+
wavelen_min=wavelen_min,
|
|
240
|
+
wavelen_max=wavelen_max,
|
|
241
|
+
wavelen_step=wavelen_step,
|
|
242
|
+
)
|
|
243
|
+
# Multiply self by new sb values.
|
|
244
|
+
self.sb = self.sb * tempbandpass.sb
|
|
245
|
+
self.bandpassname = "".join(component_list)
|
|
246
|
+
|
|
247
|
+
def get_bandpass(self):
|
|
248
|
+
wavelen = np.copy(self.wavelen)
|
|
249
|
+
sb = np.copy(self.sb)
|
|
250
|
+
return wavelen, sb
|
|
251
|
+
|
|
252
|
+
# utilities
|
|
253
|
+
|
|
254
|
+
def check_use_self(self, wavelen, sb):
|
|
255
|
+
"""
|
|
256
|
+
Simple utility to check if should be using self.wavelen/sb
|
|
257
|
+
or passed arrays.
|
|
258
|
+
|
|
259
|
+
Useful for other methods in this class.
|
|
260
|
+
Also does data integrity check on wavelen/sb if not self.
|
|
261
|
+
"""
|
|
262
|
+
update_self = False
|
|
263
|
+
if (wavelen is None) or (sb is None):
|
|
264
|
+
# Then one of the arrays was not passed - check if true for both.
|
|
265
|
+
if (wavelen is not None) or (sb is not None):
|
|
266
|
+
# Then only one of the arrays was passed - raise exception.
|
|
267
|
+
raise ValueError("Must either pass *both* wavelen/sb pair, or use self defaults")
|
|
268
|
+
# Okay, neither wavelen or sb was passed in - using self only.
|
|
269
|
+
update_self = True
|
|
270
|
+
else:
|
|
271
|
+
# Both of the arrays were passed in - check their validity.
|
|
272
|
+
if (isinstance(wavelen, np.ndarray) is False) or (isinstance(sb, np.ndarray) is False):
|
|
273
|
+
raise ValueError("Must pass wavelen/sb as numpy arrays")
|
|
274
|
+
if len(wavelen) != len(sb):
|
|
275
|
+
raise ValueError("Must pass equal length wavelen/sb arrays")
|
|
276
|
+
return update_self
|
|
277
|
+
|
|
278
|
+
def resample_bandpass(
|
|
279
|
+
self,
|
|
280
|
+
wavelen=None,
|
|
281
|
+
sb=None,
|
|
282
|
+
wavelen_min=300,
|
|
283
|
+
wavelen_max=1150,
|
|
284
|
+
wavelen_step=0.1,
|
|
285
|
+
):
|
|
286
|
+
"""
|
|
287
|
+
Resamples wavelen/sb (or self.wavelen/sb) onto grid
|
|
288
|
+
defined by min/max/step.
|
|
289
|
+
|
|
290
|
+
Either returns wavelen/sb (if given those arrays) or
|
|
291
|
+
updates wavelen / Sb in self. If updating self, resets phi to None.
|
|
292
|
+
"""
|
|
293
|
+
# Check wavelength limits.
|
|
294
|
+
wavelen_min = wavelen_min
|
|
295
|
+
wavelen_max = wavelen_max
|
|
296
|
+
wavelen_step = wavelen_step
|
|
297
|
+
# Is method acting on self.wavelen/sb or passed in wavelen/sb?
|
|
298
|
+
update_self = (wavelen is None) & (sb is None)
|
|
299
|
+
if update_self:
|
|
300
|
+
wavelen = self.wavelen
|
|
301
|
+
sb = self.sb
|
|
302
|
+
# Now, on with the resampling.
|
|
303
|
+
if (wavelen.min() > wavelen_max) or (wavelen.max() < wavelen_min):
|
|
304
|
+
raise Exception("No overlap between known wavelength range and desired wavelength range.")
|
|
305
|
+
# Set up gridded wavelength.
|
|
306
|
+
wavelen_grid = np.arange(wavelen_min, wavelen_max + wavelen_step / 2.0, wavelen_step, dtype="float")
|
|
307
|
+
# Do the interpolation of wavelen/sb onto the grid.
|
|
308
|
+
# (note wavelen/sb type failures will die here).
|
|
309
|
+
f = interpolate.interp1d(wavelen, sb, fill_value=0, bounds_error=False)
|
|
310
|
+
sb_grid = f(wavelen_grid)
|
|
311
|
+
# Update self values if necessary.
|
|
312
|
+
if update_self:
|
|
313
|
+
self.phi = None
|
|
314
|
+
self.wavelen = wavelen_grid
|
|
315
|
+
self.sb = sb_grid
|
|
316
|
+
return
|
|
317
|
+
return wavelen_grid, sb_grid
|
|
318
|
+
|
|
319
|
+
# more complicated bandpass functions
|
|
320
|
+
|
|
321
|
+
def sb_tophi(self):
|
|
322
|
+
"""
|
|
323
|
+
Calculate and set phi - the normalized system response.
|
|
324
|
+
|
|
325
|
+
This function only updates self.phi.
|
|
326
|
+
"""
|
|
327
|
+
# The definition of phi = (Sb/wavelength)/\int(Sb/wavelength)dlambda.
|
|
328
|
+
self.phi = self.sb / self.wavelen
|
|
329
|
+
# Normalize phi so that the integral of phi is 1.
|
|
330
|
+
norm = trapezoid(self.phi, x=self.wavelen)
|
|
331
|
+
self.phi = self.phi / norm
|
|
332
|
+
return
|
|
333
|
+
|
|
334
|
+
def multiply_throughputs(self, wavelen_other, sb_other):
|
|
335
|
+
"""
|
|
336
|
+
Multiply self.sb by another wavelen/sb pair, return wavelen/sb arrays.
|
|
337
|
+
|
|
338
|
+
The returned arrays will be gridded like this bandpass.
|
|
339
|
+
This method does not affect self.
|
|
340
|
+
"""
|
|
341
|
+
# Resample wavelen_other/sb_other to match this bandpass.
|
|
342
|
+
if not np.all(self.wavelen == wavelen_other):
|
|
343
|
+
wavelen_other, sb_other = self.resample_bandpass(
|
|
344
|
+
wavelen=wavelen_other,
|
|
345
|
+
sb=sb_other,
|
|
346
|
+
wavelen_min=self.wavelen.min(),
|
|
347
|
+
wavelen_max=self.wavelen.max(),
|
|
348
|
+
wavelen_step=self.wavelen[1] - self.wavelen[0],
|
|
349
|
+
)
|
|
350
|
+
# Make new memory copy of wavelen.
|
|
351
|
+
wavelen_new = np.copy(self.wavelen)
|
|
352
|
+
# Calculate new transmission - this is also new memory.
|
|
353
|
+
sb_new = self.sb * sb_other
|
|
354
|
+
return wavelen_new, sb_new
|
|
355
|
+
|
|
356
|
+
def calc_zp_t(self, photometric_parameters):
|
|
357
|
+
"""
|
|
358
|
+
Calculate the instrumental zeropoint for a bandpass.
|
|
359
|
+
|
|
360
|
+
Parameters
|
|
361
|
+
----------
|
|
362
|
+
photometric_parameters : `PhotometricParameters`
|
|
363
|
+
Details about the photometric response of the telescope.
|
|
364
|
+
Defaults to LSST values.
|
|
365
|
+
"""
|
|
366
|
+
# ZP_t is the magnitude of a (F_nu flat) source which produced
|
|
367
|
+
# 1 count per second.
|
|
368
|
+
# This is often also known as the 'instrumental zeropoint'.
|
|
369
|
+
# Set gain to 1 if want to explore photo-electrons rather than adu.
|
|
370
|
+
# The typical LSST exposure time is 15s and this is default here,
|
|
371
|
+
# but typical zp_t definition is for 1s.
|
|
372
|
+
# SED class uses flambda in ergs/cm^2/s/nm, so need effarea in cm^2.
|
|
373
|
+
#
|
|
374
|
+
# Check dlambda value for integral.
|
|
375
|
+
self.wavelen[1] - self.wavelen[0]
|
|
376
|
+
# Set up flat source of arbitrary brightness,
|
|
377
|
+
# but where the units of fnu are Jansky (for AB mag zeropoint = -8.9).
|
|
378
|
+
flatsource = Sed()
|
|
379
|
+
flatsource.set_flat_sed()
|
|
380
|
+
adu = flatsource.calc_adu(self, phot_params=photometric_parameters)
|
|
381
|
+
# Scale fnu so that adu is 1 count/expTime.
|
|
382
|
+
flatsource.fnu = flatsource.fnu * (1 / adu)
|
|
383
|
+
# Now need to calculate AB magnitude of the source with this fnu.
|
|
384
|
+
if self.phi is None:
|
|
385
|
+
self.sb_tophi()
|
|
386
|
+
zp_t = flatsource.calc_mag(self)
|
|
387
|
+
return zp_t
|
|
388
|
+
|
|
389
|
+
def calc_eff_wavelen(self):
|
|
390
|
+
"""
|
|
391
|
+
Calculate effective wavelengths for filters.
|
|
392
|
+
"""
|
|
393
|
+
# This is useful for summary numbers for filters.
|
|
394
|
+
# Calculate effective wavelength of filters.
|
|
395
|
+
if self.phi is None:
|
|
396
|
+
self.sb_tophi()
|
|
397
|
+
effwavelenphi = (self.wavelen * self.phi).sum() / self.phi.sum()
|
|
398
|
+
effwavelensb = (self.wavelen * self.sb).sum() / self.sb.sum()
|
|
399
|
+
return effwavelenphi, effwavelensb
|
|
400
|
+
|
|
401
|
+
def write_throughput(self, filename, print_header=None, write_phi=False):
|
|
402
|
+
"""
|
|
403
|
+
Write throughput to a file.
|
|
404
|
+
"""
|
|
405
|
+
# Useful if you build a throughput up from components
|
|
406
|
+
# and need to record the combined value.
|
|
407
|
+
f = open(filename, "w")
|
|
408
|
+
# Print header.
|
|
409
|
+
if print_header is not None:
|
|
410
|
+
if not print_header.startswith("#"):
|
|
411
|
+
print_header = "#" + print_header
|
|
412
|
+
f.write(print_header)
|
|
413
|
+
if write_phi:
|
|
414
|
+
if self.phi is None:
|
|
415
|
+
self.sb_tophi()
|
|
416
|
+
print("# Wavelength(nm) Throughput(0-1) Phi", file=f)
|
|
417
|
+
else:
|
|
418
|
+
print("# Wavelength(nm) Throughput(0-1)", file=f)
|
|
419
|
+
# Loop through data, printing out to file.
|
|
420
|
+
for i in range(0, len(self.wavelen), 1):
|
|
421
|
+
if write_phi:
|
|
422
|
+
print(self.wavelen[i], self.sb[i], self.phi[i], file=f)
|
|
423
|
+
else:
|
|
424
|
+
print(self.wavelen[i], self.sb[i], file=f)
|
|
425
|
+
f.close()
|