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,119 @@
|
|
|
1
|
+
__all__ = ["NoOffset", "OffsetSNR", "BaseOffset"]
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from ..maf.utils.astrometry_utils import m52snr
|
|
6
|
+
|
|
7
|
+
# from lsst.sims.selfcal.clouds.Arma import ArmaSf, Clouds
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BaseOffset:
|
|
11
|
+
"""Base class for how to make offset classes"""
|
|
12
|
+
|
|
13
|
+
def __init__(self, **kwargs):
|
|
14
|
+
self.newkey = "dmag_keyname"
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
def __call__(self, stars, visit, **kwargs):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class NoOffset(BaseOffset):
|
|
22
|
+
def __init__(self):
|
|
23
|
+
"""Make no changes to the mags"""
|
|
24
|
+
self.newkey = "dmag_zero"
|
|
25
|
+
|
|
26
|
+
def __call__(self, stars, visits, **kwargs):
|
|
27
|
+
dmag = np.zeros(stars.size, dtype=list(zip([self.newkey], [float])))
|
|
28
|
+
return dmag
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class OffsetSys(BaseOffset):
|
|
32
|
+
def __init__(self, error_sys=0.003):
|
|
33
|
+
"""Systematic error floor for photometry"""
|
|
34
|
+
self.error_sys = error_sys
|
|
35
|
+
self.newkey = "dmag_sys"
|
|
36
|
+
|
|
37
|
+
def __call__(self, stars, visits, **kwargs):
|
|
38
|
+
nstars = np.size(stars)
|
|
39
|
+
dmag = np.random.randn(nstars) * self.error_sys
|
|
40
|
+
return dmag
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class OffsetClouds(BaseOffset):
|
|
44
|
+
"""Offset based on cloud structure.
|
|
45
|
+
Not used, as not fully implemented in this version (ArmaSf).
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, sampling=256, fov=3.5):
|
|
49
|
+
self.fov = fov
|
|
50
|
+
self.newkey = "dmag_cloud"
|
|
51
|
+
# self.SF = ArmaSf()
|
|
52
|
+
self.SF = None
|
|
53
|
+
# self.cloud = Clouds()
|
|
54
|
+
self.cloud = None
|
|
55
|
+
|
|
56
|
+
def __call__(self, stars, visits, **kwargs):
|
|
57
|
+
# XXX-Double check extinction is close to the Opsim transparency
|
|
58
|
+
extinc_mags = visits["transparency"]
|
|
59
|
+
if extinc_mags != 0.0:
|
|
60
|
+
sf_theta, sf_sf = self.SF.CloudSf(500.0, 300.0, 5.0, extinc_mags, 0.55)
|
|
61
|
+
# Call the Clouds
|
|
62
|
+
self.cloud.makeCloudImage(sf_theta, sf_sf, extinc_mags, fov=self.fov)
|
|
63
|
+
# Interpolate clouds to correct position.
|
|
64
|
+
# Nearest neighbor for speed?
|
|
65
|
+
nim = self.cloud.cloudimage[0, :].size
|
|
66
|
+
# calc position in cloud image of each star
|
|
67
|
+
starx_interp = (np.degrees(stars["x"]) + self.fov / 2.0) * 3600.0 / self.cloud.pixscale
|
|
68
|
+
stary_interp = (np.degrees(stars["y"]) + self.fov / 2.0) * 3600.0 / self.cloud.pixscale
|
|
69
|
+
|
|
70
|
+
# Round off position and make it an int
|
|
71
|
+
starx_interp = np.round(starx_interp).astype(int)
|
|
72
|
+
stary_interp = np.round(stary_interp).astype(int)
|
|
73
|
+
|
|
74
|
+
# Handle any stars that are out of the field for some reason
|
|
75
|
+
starx_interp[np.where(starx_interp < 0)] = 0
|
|
76
|
+
starx_interp[np.where(starx_interp > nim - 1)] = nim - 1
|
|
77
|
+
stary_interp[np.where(stary_interp < 0)] = 0
|
|
78
|
+
stary_interp[np.where(stary_interp > nim - 1)] = nim - 1
|
|
79
|
+
|
|
80
|
+
dmag = self.cloud.cloudimage[starx_interp, stary_interp]
|
|
81
|
+
else:
|
|
82
|
+
dmag = np.zeros(stars.size)
|
|
83
|
+
return dmag
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class OffsetSNR(BaseOffset):
|
|
87
|
+
"""Generate offsets based on the 5-sigma limiting depth of an observation
|
|
88
|
+
and the brightness of the star.
|
|
89
|
+
|
|
90
|
+
Note that this takes into account previous offsets that have been applied
|
|
91
|
+
(so run this after things like vignetting).
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def __init__(self, lsst_filter="r"):
|
|
95
|
+
self.lsst_filter = lsst_filter
|
|
96
|
+
self.newkey = "dmag_snr"
|
|
97
|
+
|
|
98
|
+
def calc_mag_errors(self, magnitudes, m5, err_only=False):
|
|
99
|
+
""" """
|
|
100
|
+
snr = m52snr(magnitudes, m5)
|
|
101
|
+
# via good old https://www.eso.org/~ohainaut/ccd/sn.html
|
|
102
|
+
magnitude_errors = 2.5 * np.log10(1.0 + 1.0 / snr)
|
|
103
|
+
if err_only:
|
|
104
|
+
dmag = magnitude_errors
|
|
105
|
+
else:
|
|
106
|
+
dmag = np.random.randn(len(magnitudes)) * magnitude_errors
|
|
107
|
+
return dmag
|
|
108
|
+
|
|
109
|
+
def __call__(self, stars, visit, dmags=None):
|
|
110
|
+
if dmags is None:
|
|
111
|
+
dmags = {}
|
|
112
|
+
temp_mag = stars[self.lsst_filter + "mag"].copy()
|
|
113
|
+
# calc what magnitude the star has when it hits the silicon.
|
|
114
|
+
# Thus we compute the SNR noise
|
|
115
|
+
# AFTER things like cloud extinction and vignetting.
|
|
116
|
+
for key in list(dmags.keys()):
|
|
117
|
+
temp_mag = temp_mag + dmags[key]
|
|
118
|
+
dmag = self.calc_mag_errors(temp_mag, visit["fiveSigmaDepth"])
|
|
119
|
+
return dmag
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
__all__ = ("LsqrSolver",)
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from scipy.sparse import coo_matrix
|
|
5
|
+
from scipy.sparse.linalg import lsqr
|
|
6
|
+
|
|
7
|
+
# Modified from /astro/store/scratch/tmp/yoachim/Research/LSST/Parallel_Solver
|
|
8
|
+
# and then from https://github.com/lsst-sims/legacy_sims_selfcal
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class LsqrSolver:
|
|
12
|
+
"""
|
|
13
|
+
Class to solve self-calibration
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
observations : `np.array`
|
|
18
|
+
A numpy array of the observations.
|
|
19
|
+
Should have columns id, patch_id, observed_mag, mag_uncert.
|
|
20
|
+
atol : `float`
|
|
21
|
+
Tolerance passed to lsqr.
|
|
22
|
+
btol : `float`
|
|
23
|
+
Tolerance passed to lsqr.
|
|
24
|
+
iter_lim : `int`
|
|
25
|
+
Iteration limit passed to lsqr.
|
|
26
|
+
show : `bool`
|
|
27
|
+
Should the lsqr solver print some iteration logs (False).
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(
|
|
31
|
+
self,
|
|
32
|
+
observations,
|
|
33
|
+
atol=1e-8,
|
|
34
|
+
btol=1e-8,
|
|
35
|
+
iter_lim=None,
|
|
36
|
+
show=False,
|
|
37
|
+
):
|
|
38
|
+
self.atol = atol
|
|
39
|
+
self.btol = btol
|
|
40
|
+
self.iter_lim = iter_lim
|
|
41
|
+
self.observations = observations
|
|
42
|
+
self.show = show
|
|
43
|
+
|
|
44
|
+
def run(self):
|
|
45
|
+
"""clean data, solve matrix, write solution out."""
|
|
46
|
+
self.clean_data()
|
|
47
|
+
self.solve_matrix()
|
|
48
|
+
|
|
49
|
+
def clean_data(self):
|
|
50
|
+
"""
|
|
51
|
+
Remove observations that can't contribute to a solution.
|
|
52
|
+
Index remaining stars and patches so they are continuous.
|
|
53
|
+
"""
|
|
54
|
+
n_start = 1.0
|
|
55
|
+
n_end = 0.0
|
|
56
|
+
while n_start != n_end:
|
|
57
|
+
n_start = self.observations.size
|
|
58
|
+
self.observations.sort(order="id")
|
|
59
|
+
# Remove observations if the star was only observed once
|
|
60
|
+
good = np.where(
|
|
61
|
+
(self.observations["id"] - np.roll(self.observations["id"], 1))
|
|
62
|
+
* (self.observations["id"] - np.roll(self.observations["id"], -1))
|
|
63
|
+
== 0
|
|
64
|
+
)
|
|
65
|
+
self.observations = self.observations[good]
|
|
66
|
+
|
|
67
|
+
# Remove patches with only one star
|
|
68
|
+
self.observations.sort(order="patch_id")
|
|
69
|
+
|
|
70
|
+
good = np.where(
|
|
71
|
+
(self.observations["patch_id"] - np.roll(self.observations["patch_id"], 1))
|
|
72
|
+
* (self.observations["patch_id"] - np.roll(self.observations["patch_id"], -1))
|
|
73
|
+
== 0
|
|
74
|
+
)
|
|
75
|
+
self.observations = self.observations[good]
|
|
76
|
+
n_end = self.observations.size
|
|
77
|
+
|
|
78
|
+
self.observations.sort(order="patch_id")
|
|
79
|
+
|
|
80
|
+
self.patches = np.unique(self.observations["patch_id"])
|
|
81
|
+
n_patches = np.size(self.patches)
|
|
82
|
+
self.n_patches = n_patches
|
|
83
|
+
self.n_patches = n_patches
|
|
84
|
+
patches_index = np.arange(n_patches)
|
|
85
|
+
left = np.searchsorted(self.observations["patch_id"], self.patches)
|
|
86
|
+
right = np.searchsorted(self.observations["patch_id"], self.patches, side="right")
|
|
87
|
+
for i in range(np.size(left)):
|
|
88
|
+
self.observations["patch_id"][left[i] : right[i]] = patches_index[i]
|
|
89
|
+
|
|
90
|
+
# Convert id to continuous running index to keep matrix
|
|
91
|
+
# as small as possible
|
|
92
|
+
self.observations.sort(order="id")
|
|
93
|
+
|
|
94
|
+
self.stars = np.unique(self.observations["id"])
|
|
95
|
+
n_stars = np.size(self.stars)
|
|
96
|
+
self.n_stars = np.size(self.stars)
|
|
97
|
+
stars_index = np.arange(1, n_stars + 1)
|
|
98
|
+
left = np.searchsorted(self.observations["id"], self.stars)
|
|
99
|
+
right = np.searchsorted(self.observations["id"], self.stars, side="right")
|
|
100
|
+
for i in range(np.size(left)):
|
|
101
|
+
self.observations["id"][left[i] : right[i]] = stars_index[i]
|
|
102
|
+
|
|
103
|
+
def solve_matrix(self):
|
|
104
|
+
n_obs = np.size(self.observations)
|
|
105
|
+
# construct sparse matrix
|
|
106
|
+
# A = lil_matrix((nPatches+nStars,np.size(observations['patch_id'])))
|
|
107
|
+
row = np.arange(n_obs)
|
|
108
|
+
row = np.append(row, row)
|
|
109
|
+
col = np.append(
|
|
110
|
+
self.observations["patch_id"],
|
|
111
|
+
self.observations["id"] + np.max(self.observations["patch_id"]),
|
|
112
|
+
)
|
|
113
|
+
# data = np.append(np.ones(nObs),1./observations['mag_uncert'])
|
|
114
|
+
data = 1.0 / self.observations["mag_uncert"]
|
|
115
|
+
data = np.append(data, data)
|
|
116
|
+
# maybe do this in place earlier?
|
|
117
|
+
# then just delete parts of observations earlier to save total memory
|
|
118
|
+
b = self.observations["observed_mag"] / self.observations["mag_uncert"]
|
|
119
|
+
|
|
120
|
+
# blast away data now that we have the matrix constructed
|
|
121
|
+
del self.observations
|
|
122
|
+
|
|
123
|
+
A = coo_matrix((data, (row, col)), shape=(n_obs, self.n_patches + self.n_stars))
|
|
124
|
+
A = A.tocsr()
|
|
125
|
+
# solve Ax = b
|
|
126
|
+
self.solution = lsqr(A, b, show=self.show, atol=self.atol, btol=self.btol, iter_lim=self.iter_lim)
|
|
127
|
+
|
|
128
|
+
def return_solution(self):
|
|
129
|
+
"""
|
|
130
|
+
Returns
|
|
131
|
+
-------
|
|
132
|
+
patches, stars: `np.array`, `np.array`
|
|
133
|
+
Two arrays containing patch zeropoints and star best-fit mags.
|
|
134
|
+
"""
|
|
135
|
+
patches = np.empty(self.patches.size, dtype=list(zip(["patch_id", "zp"], [int, float])))
|
|
136
|
+
patches["patch_id"] = self.patches
|
|
137
|
+
patches["zp"] = self.solution[0][0 : self.n_patches]
|
|
138
|
+
|
|
139
|
+
stars = np.empty(self.stars.size, dtype=list(zip(["id", "fit_mag"], [int, float])))
|
|
140
|
+
stars["id"] = self.stars # should match the input ID.
|
|
141
|
+
stars["fit_mag"] = self.solution[0][self.n_patches :]
|
|
142
|
+
|
|
143
|
+
return patches, stars
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
__all__ = ("stars_project", "assign_patches")
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from rubin_scheduler.utils import gnomonic_project_toxy
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def stars_project(stars, visit):
|
|
8
|
+
"""
|
|
9
|
+
Project the stars to x,y plane for a given visit.
|
|
10
|
+
"""
|
|
11
|
+
xtemp, ytemp = gnomonic_project_toxy(
|
|
12
|
+
np.radians(stars["ra"]),
|
|
13
|
+
np.radians(stars["decl"]),
|
|
14
|
+
np.radians(visit["ra"]),
|
|
15
|
+
np.radians(visit["dec"]),
|
|
16
|
+
)
|
|
17
|
+
# Rotate the field using the visit rotSkyPos.
|
|
18
|
+
# Hope I got that sign right...
|
|
19
|
+
sin_rot = np.sin(np.radians(visit["rotSkyPos"]))
|
|
20
|
+
cos_rot = np.cos(np.radians(visit["rotSkyPos"]))
|
|
21
|
+
stars["x"] = cos_rot * xtemp + sin_rot * ytemp
|
|
22
|
+
stars["y"] = -1.0 * sin_rot * xtemp + cos_rot * ytemp
|
|
23
|
+
|
|
24
|
+
stars["radius"] = (stars["x"] ** 2 + stars["y"] ** 2) ** 0.5
|
|
25
|
+
return stars
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def assign_patches(stars, visit, n_patches=16, radius_fov=1.8):
|
|
29
|
+
"""
|
|
30
|
+
Assign PatchIDs to everything.
|
|
31
|
+
Assume that stars have already been projected to x,y
|
|
32
|
+
"""
|
|
33
|
+
maxx, maxy = gnomonic_project_toxy(0.0, np.radians(radius_fov), 0.0, 0.0)
|
|
34
|
+
nsides = n_patches**0.5
|
|
35
|
+
|
|
36
|
+
# This should move all coords to 0 < x < nsides-1
|
|
37
|
+
px = np.floor((stars["x"] + maxy) / (2.0 * maxy) * nsides)
|
|
38
|
+
py = np.floor((stars["y"] + maxy) / (2.0 * maxy) * nsides)
|
|
39
|
+
|
|
40
|
+
stars["sub_patch"] = px + py * nsides
|
|
41
|
+
stars["patch_id"] = stars["sub_patch"] + visit["observationId"] * n_patches
|
|
42
|
+
return stars
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import importlib.util
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from .make_snapshot import *
|
|
5
|
+
|
|
6
|
+
HAVE_LSST_RESOURCES = importlib.util.find_spec("lsst") and importlib.util.find_spec("lsst.resources")
|
|
7
|
+
if HAVE_LSST_RESOURCES:
|
|
8
|
+
from .sim_archive import * # isort:skip
|
|
9
|
+
from .prenight import *
|
|
10
|
+
from .prenightindex import *
|
|
11
|
+
from .vseqarchive import *
|
|
12
|
+
from .vseqmetadata import *
|
|
13
|
+
else:
|
|
14
|
+
logging.error("rubin_sim.sim_archive requires lsst.resources.")
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
import re
|
|
4
|
+
import sys
|
|
5
|
+
from functools import lru_cache
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"get_conda_packages",
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@lru_cache(maxsize=1)
|
|
13
|
+
def get_conda_packages() -> dict[str, str]:
|
|
14
|
+
"""Get products and their versions from the conda environment.
|
|
15
|
+
|
|
16
|
+
Returns
|
|
17
|
+
-------
|
|
18
|
+
packages : `dict`
|
|
19
|
+
Keys (type `str`) are product names; values (type `str`) are their
|
|
20
|
+
versions.
|
|
21
|
+
|
|
22
|
+
Notes
|
|
23
|
+
-----
|
|
24
|
+
Returns empty result if a conda environment is not in use or can not
|
|
25
|
+
be queried.
|
|
26
|
+
"""
|
|
27
|
+
if "CONDA_PREFIX" not in os.environ:
|
|
28
|
+
return {}
|
|
29
|
+
|
|
30
|
+
# conda list is very slow. Ten times faster to scan the directory
|
|
31
|
+
# directly. This will only find conda packages and not pip installed
|
|
32
|
+
# packages.
|
|
33
|
+
meta_path = os.path.join(os.environ["CONDA_PREFIX"], "conda-meta")
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
filenames = os.scandir(path=meta_path)
|
|
37
|
+
except FileNotFoundError:
|
|
38
|
+
return {}
|
|
39
|
+
|
|
40
|
+
packages = {}
|
|
41
|
+
for filename in filenames:
|
|
42
|
+
if not filename.name.endswith(".json"):
|
|
43
|
+
continue
|
|
44
|
+
with open(filename) as f:
|
|
45
|
+
try:
|
|
46
|
+
data = json.load(f)
|
|
47
|
+
except ValueError:
|
|
48
|
+
continue
|
|
49
|
+
try:
|
|
50
|
+
packages[data["name"]] = data["version"]
|
|
51
|
+
except KeyError:
|
|
52
|
+
continue
|
|
53
|
+
|
|
54
|
+
packages = dict(sorted(packages.items()))
|
|
55
|
+
|
|
56
|
+
# Try to work out the conda environment name and include it as a fake
|
|
57
|
+
# package. The "obvious" way of running "conda info --json" does give
|
|
58
|
+
# access to the active_prefix but takes about 2 seconds to run.
|
|
59
|
+
# As a compromise look for the env name in the path to the python
|
|
60
|
+
# executable
|
|
61
|
+
match = re.search(r"/envs/(.*?)/bin/", sys.executable)
|
|
62
|
+
if match:
|
|
63
|
+
packages["conda_env"] = match.group(1)
|
|
64
|
+
|
|
65
|
+
return packages
|