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,126 @@
|
|
|
1
|
+
__all__ = ("NEODistStacker",)
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from .base_stacker import BaseStacker
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class NEODistStacker(BaseStacker):
|
|
9
|
+
"""
|
|
10
|
+
For each observation, find the max distance to a ~144 km NEO,
|
|
11
|
+
also stack on the x,y position of the object.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
cols_added = ["MaxGeoDist", "NEOHelioX", "NEOHelioY"]
|
|
15
|
+
|
|
16
|
+
def __init__(
|
|
17
|
+
self,
|
|
18
|
+
stepsize=0.001,
|
|
19
|
+
max_dist=3.0,
|
|
20
|
+
min_dist=0.3,
|
|
21
|
+
H=22,
|
|
22
|
+
elong_col="solarElong",
|
|
23
|
+
filter_col="filter",
|
|
24
|
+
sun_az_col="sunAz",
|
|
25
|
+
az_col="azimuth",
|
|
26
|
+
m5_col="fiveSigmaDepth",
|
|
27
|
+
):
|
|
28
|
+
"""
|
|
29
|
+
stepsize: The stepsize to use when solving (in AU)
|
|
30
|
+
max_dist: How far out to try and measure (in AU)
|
|
31
|
+
H: Asteroid magnitude
|
|
32
|
+
|
|
33
|
+
Adds columns:
|
|
34
|
+
MaxGeoDist: Geocentric distance to the NEO
|
|
35
|
+
NEOHelioX: Heliocentric X (with Earth at x,y,z (0,1,0))
|
|
36
|
+
NEOHelioY: Heliocentric Y (with Earth at (0,1,0))
|
|
37
|
+
|
|
38
|
+
Note that both opsim v3 and v4 report solarElongation in degrees.
|
|
39
|
+
"""
|
|
40
|
+
self.units = ["AU", "AU", "AU"]
|
|
41
|
+
# Also grab things needed for the HA stacker
|
|
42
|
+
self.cols_req = [elong_col, filter_col, sun_az_col, az_col, m5_col]
|
|
43
|
+
|
|
44
|
+
self.sun_az_col = sun_az_col
|
|
45
|
+
self.elong_col = elong_col
|
|
46
|
+
self.filter_col = filter_col
|
|
47
|
+
self.az_col = az_col
|
|
48
|
+
self.m5_col = m5_col
|
|
49
|
+
|
|
50
|
+
self.H = H
|
|
51
|
+
# Magic numbers (Ivezic '15, private comm.)that convert an asteroid
|
|
52
|
+
# V-band magnitude to LSST filters:
|
|
53
|
+
# V_5 = m_5 + (adjust value)
|
|
54
|
+
self.limiting_adjust = {
|
|
55
|
+
"u": -2.1,
|
|
56
|
+
"g": -0.5,
|
|
57
|
+
"r": 0.2,
|
|
58
|
+
"i": 0.4,
|
|
59
|
+
"z": 0.6,
|
|
60
|
+
"y": 0.6,
|
|
61
|
+
}
|
|
62
|
+
self.deltas = np.arange(min_dist, max_dist + stepsize, stepsize)
|
|
63
|
+
self.G = 0.15
|
|
64
|
+
|
|
65
|
+
# Magic numbers from http://adsabs.harvard.edu/abs/2002AJ....124.1776J
|
|
66
|
+
self.a1 = 3.33
|
|
67
|
+
self.b1 = 0.63
|
|
68
|
+
self.a2 = 1.87
|
|
69
|
+
self.b2 = 1.22
|
|
70
|
+
|
|
71
|
+
def _run(self, sim_data, cols_present=False):
|
|
72
|
+
if cols_present:
|
|
73
|
+
# This is a pretty rare stacker. Assume we need to rerun
|
|
74
|
+
pass
|
|
75
|
+
elong_rad = np.radians(sim_data[self.elong_col])
|
|
76
|
+
v5 = np.zeros(sim_data.size, dtype=float) + sim_data[self.m5_col]
|
|
77
|
+
for filter_name in self.limiting_adjust:
|
|
78
|
+
fmatch = np.where(sim_data[self.filter_col] == filter_name)
|
|
79
|
+
v5[fmatch] += self.limiting_adjust[filter_name]
|
|
80
|
+
for i, elong in enumerate(elong_rad):
|
|
81
|
+
# Law of cosines:
|
|
82
|
+
# Heliocentric Radius of the object
|
|
83
|
+
R = np.sqrt(1.0 + self.deltas**2 - 2.0 * self.deltas * np.cos(elong))
|
|
84
|
+
# Angle between sun and earth as seen by NEO
|
|
85
|
+
alphas = np.arccos((1.0 - R**2 - self.deltas**2) / (-2.0 * self.deltas * R))
|
|
86
|
+
ta2 = np.tan(alphas / 2.0)
|
|
87
|
+
phi1 = np.exp(-self.a1 * ta2**self.b1)
|
|
88
|
+
phi2 = np.exp(-self.a2 * ta2**self.b2)
|
|
89
|
+
|
|
90
|
+
alpha_term = 2.5 * np.log10((1.0 - self.G) * phi1 + self.G * phi2)
|
|
91
|
+
appmag = self.H + 5.0 * np.log10(R * self.deltas) - alpha_term
|
|
92
|
+
# There can be some local minima/maxima when solving, so
|
|
93
|
+
# need to find the *1st* spot where it is too faint, not the
|
|
94
|
+
# last spot it is bright enough.
|
|
95
|
+
too_faint = np.where(appmag > v5[i])
|
|
96
|
+
|
|
97
|
+
# Check that there is a minimum
|
|
98
|
+
if np.size(too_faint[0]) == 0:
|
|
99
|
+
sim_data["MaxGeoDist"][i] = 0
|
|
100
|
+
else:
|
|
101
|
+
sim_data["MaxGeoDist"][i] = np.min(self.deltas[too_faint])
|
|
102
|
+
|
|
103
|
+
# Make coords in heliocentric
|
|
104
|
+
interior = np.where(elong_rad <= np.pi / 2.0)
|
|
105
|
+
outer = np.where(elong_rad > np.pi / 2.0)
|
|
106
|
+
sim_data["NEOHelioX"][interior] = sim_data["MaxGeoDist"][interior] * np.sin(elong_rad[interior])
|
|
107
|
+
sim_data["NEOHelioY"][interior] = (
|
|
108
|
+
-sim_data["MaxGeoDist"][interior] * np.cos(elong_rad[interior]) + 1.0
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
sim_data["NEOHelioX"][outer] = sim_data["MaxGeoDist"][outer] * np.sin(np.pi - elong_rad[outer])
|
|
112
|
+
sim_data["NEOHelioY"][outer] = sim_data["MaxGeoDist"][outer] * np.cos(np.pi - elong_rad[outer]) + 1.0
|
|
113
|
+
|
|
114
|
+
# Flip the X coord if sun az is negative?
|
|
115
|
+
if sim_data[self.az_col].min() < -np.pi / 2.0:
|
|
116
|
+
halfval = 180.0
|
|
117
|
+
else:
|
|
118
|
+
halfval = np.pi
|
|
119
|
+
flip = np.where(
|
|
120
|
+
((sim_data[self.sun_az_col] > halfval) & (sim_data[self.az_col] > halfval))
|
|
121
|
+
| ((sim_data[self.sun_az_col] < halfval) & (sim_data[self.az_col] > halfval))
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
sim_data["NEOHelioX"][flip] *= -1.0
|
|
125
|
+
|
|
126
|
+
return sim_data
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
__all__ = ("SdssRADecStacker",)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
from .base_stacker import BaseStacker
|
|
7
|
+
from .coord_stackers import wrap_ra
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SdssRADecStacker(BaseStacker):
|
|
11
|
+
"""convert the p1,p2,p3... columns to radians and wrap them"""
|
|
12
|
+
|
|
13
|
+
cols_added = ["RA1", "Dec1", "RA2", "Dec2", "RA3", "Dec3", "RA4", "Dec4"]
|
|
14
|
+
|
|
15
|
+
def __init__(self, pcols=["p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8"]):
|
|
16
|
+
"""The p1,p2 columns represent the corners of chips.
|
|
17
|
+
Could generalize this a bit."""
|
|
18
|
+
self.units = ["rad"] * 8
|
|
19
|
+
self.cols_req = pcols
|
|
20
|
+
|
|
21
|
+
def _run(self, sim_data, cols_present=False):
|
|
22
|
+
if cols_present:
|
|
23
|
+
# Assume this is unusual enough to run that you really mean it.
|
|
24
|
+
pass
|
|
25
|
+
for pcol, newcol in zip(self.cols_req, self.cols_added):
|
|
26
|
+
if newcol[0:2] == "RA":
|
|
27
|
+
sim_data[newcol] = wrap_ra(np.radians(sim_data[pcol]))
|
|
28
|
+
else:
|
|
29
|
+
sim_data[newcol] = np.radians(sim_data[pcol])
|
|
30
|
+
return sim_data
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
__all__ = ("CoaddStacker",)
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from rubin_sim.maf.stackers import BaseStacker
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CoaddStacker(BaseStacker):
|
|
9
|
+
"""Stacker to estimate m5 "coadded" per band and par night
|
|
10
|
+
|
|
11
|
+
Parameters
|
|
12
|
+
----------
|
|
13
|
+
mjd_col : `str`, optional
|
|
14
|
+
Name of the MJD column
|
|
15
|
+
ra_col : `str`, optional
|
|
16
|
+
Name of the RA column
|
|
17
|
+
dec_col : `str`, optional
|
|
18
|
+
Name of the Dec column
|
|
19
|
+
m5_col : `str`, optional
|
|
20
|
+
Name of the m5 column
|
|
21
|
+
filter_col : `str`, optional
|
|
22
|
+
Name of the filter column
|
|
23
|
+
night_col : `str`, optional
|
|
24
|
+
Name of the night column
|
|
25
|
+
num_exposures_col : `str`, optional
|
|
26
|
+
Name of the number of exposures per visit column
|
|
27
|
+
visit_time_col : `str`, optional
|
|
28
|
+
Name of the total visit time column
|
|
29
|
+
visit_exposure_time_col : `str`, optional
|
|
30
|
+
Name of the on-sky exposure time column
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
cols_added = ["coadd"]
|
|
34
|
+
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
mjd_col="observationStartMJD",
|
|
38
|
+
ra_col="fieldRA",
|
|
39
|
+
dec_col="fieldDec",
|
|
40
|
+
m5_col="fiveSigmaDepth",
|
|
41
|
+
filter_col="band",
|
|
42
|
+
night_col="night",
|
|
43
|
+
num_exposures_col="numExposures",
|
|
44
|
+
visit_time_col="visitTime",
|
|
45
|
+
visit_exposure_time_col="visitExposureTime",
|
|
46
|
+
):
|
|
47
|
+
self.cols_req = [
|
|
48
|
+
mjd_col,
|
|
49
|
+
ra_col,
|
|
50
|
+
dec_col,
|
|
51
|
+
m5_col,
|
|
52
|
+
filter_col,
|
|
53
|
+
night_col,
|
|
54
|
+
num_exposures_col,
|
|
55
|
+
visit_time_col,
|
|
56
|
+
visit_exposure_time_col,
|
|
57
|
+
]
|
|
58
|
+
self.ra_col = ra_col
|
|
59
|
+
self.dec_col = dec_col
|
|
60
|
+
self.night_col = night_col
|
|
61
|
+
self.filter_col = filter_col
|
|
62
|
+
self.m5_col = m5_col
|
|
63
|
+
self.num_exposures_col = num_exposures_col
|
|
64
|
+
self.visit_time_col = visit_time_col
|
|
65
|
+
self.visit_exposure_time_col = visit_exposure_time_col
|
|
66
|
+
|
|
67
|
+
self.units = ["int"]
|
|
68
|
+
|
|
69
|
+
def _run(self, sim_data, cols_present=False):
|
|
70
|
+
if cols_present:
|
|
71
|
+
# Column already present in data; assume it is correct
|
|
72
|
+
# and does not need recalculating.
|
|
73
|
+
return sim_data
|
|
74
|
+
self.dtype = sim_data.dtype
|
|
75
|
+
r = []
|
|
76
|
+
for ra, dec, band in np.unique(sim_data[[self.ra_col, self.dec_col, self.filter_col]]):
|
|
77
|
+
idx = np.abs(sim_data[self.ra_col] - ra) < 1.0e-5
|
|
78
|
+
idx &= np.abs(sim_data[self.dec_col] - dec) < 1.0e-5
|
|
79
|
+
idx &= sim_data[self.filter_col] == band
|
|
80
|
+
|
|
81
|
+
sel = sim_data[idx]
|
|
82
|
+
for night in np.unique(sel[self.night_col]):
|
|
83
|
+
idxb = sel[self.night_col] == night
|
|
84
|
+
r.append(tuple(self.fill(sel[idxb])))
|
|
85
|
+
|
|
86
|
+
myarray = np.array(r, dtype=self.dtype)
|
|
87
|
+
return myarray
|
|
88
|
+
|
|
89
|
+
def fill(self, tab):
|
|
90
|
+
"""Estimation of new fields (m5 "coadded" values, ...)
|
|
91
|
+
|
|
92
|
+
Parameters
|
|
93
|
+
---------------
|
|
94
|
+
tab : array of (initial) data
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
Returns
|
|
98
|
+
-----------
|
|
99
|
+
tuple with modified field values:
|
|
100
|
+
- m5Col: "coadded" m5
|
|
101
|
+
- numExposuresCol: sum of numExposuresCol
|
|
102
|
+
- visitTimeCol: sum of visitTimeCol
|
|
103
|
+
- visitExposureTimeCol: sum of visitExposureTimeCol
|
|
104
|
+
- all other input fields except band (Ra, Dec, night) : median(field)
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
r = []
|
|
108
|
+
|
|
109
|
+
for colname in self.dtype.names:
|
|
110
|
+
if colname not in [
|
|
111
|
+
self.m5_col,
|
|
112
|
+
self.num_exposures_col,
|
|
113
|
+
self.visit_time_col,
|
|
114
|
+
self.visit_exposure_time_col,
|
|
115
|
+
self.filter_col,
|
|
116
|
+
]:
|
|
117
|
+
if colname == "coadd":
|
|
118
|
+
r.append(1)
|
|
119
|
+
else:
|
|
120
|
+
if tab[colname].dtype == "object":
|
|
121
|
+
r.append(tab[colname][0])
|
|
122
|
+
else:
|
|
123
|
+
r.append(np.median(tab[colname]))
|
|
124
|
+
if colname == self.m5_col:
|
|
125
|
+
r.append(self.m5_coadd(tab[self.m5_col]))
|
|
126
|
+
if colname in [
|
|
127
|
+
self.num_exposures_col,
|
|
128
|
+
self.visit_time_col,
|
|
129
|
+
self.visit_exposure_time_col,
|
|
130
|
+
]:
|
|
131
|
+
r.append(np.sum(tab[colname]))
|
|
132
|
+
if colname == self.filter_col:
|
|
133
|
+
r.append(np.unique(tab[self.filter_col])[0])
|
|
134
|
+
|
|
135
|
+
return r
|
|
136
|
+
|
|
137
|
+
def m5_coadd(self, m5):
|
|
138
|
+
"""Estimation of "coadded" m5 values based on:
|
|
139
|
+
flux_5sigma = 10**(-0.4*m5)
|
|
140
|
+
sigmas = flux_5sigma/5.
|
|
141
|
+
sigma_tot = 1./sqrt(np.sum(1/sigmas**2))
|
|
142
|
+
flux_tot = 5.*sigma_tot
|
|
143
|
+
|
|
144
|
+
Parameters
|
|
145
|
+
---------------
|
|
146
|
+
m5 : set of m5 (five-sigma depths) values
|
|
147
|
+
|
|
148
|
+
Returns
|
|
149
|
+
-----------
|
|
150
|
+
"coadded" m5 value
|
|
151
|
+
"""
|
|
152
|
+
return 1.25 * np.log10(np.sum(10.0 ** (0.8 * m5)))
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
__all__ = ["TEFF_FIDUCIAL_DEPTH", "TEFF_FIDUCIAL_EXPTIME", "TeffStacker", "compute_teff"]
|
|
2
|
+
|
|
3
|
+
from collections import defaultdict
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
from .base_stacker import BaseStacker
|
|
8
|
+
|
|
9
|
+
# From reference von Karman 500nm zenith seeing of 0.69"
|
|
10
|
+
# median zenith dark seeing from sims_skybrightness_pre
|
|
11
|
+
# airmass = 1
|
|
12
|
+
# 2 "snaps" of 15 seconds each
|
|
13
|
+
# m5_flat_sed sysEngVals from rubin_sim
|
|
14
|
+
# commit 6d03bd49550972e48648503ed60784a4e6775b82 (2021-05-18)
|
|
15
|
+
# These include constants from:
|
|
16
|
+
# https://github.com/lsst-pst/syseng_throughputs/blob/master/notebooks/generate_sims_values.ipynb
|
|
17
|
+
# commit 7abb90951fcbc70d9c4d0c805c55a67224f9069f (2021-05-05)
|
|
18
|
+
# See https://github.com/lsst-sims/smtn-002/blob/master/notebooks/teff_fiducial.ipynb
|
|
19
|
+
|
|
20
|
+
# If we do not recognize the filter, return a nan. The np.array(np.nan).item
|
|
21
|
+
# is a hack to define a function that retruns a nan without defining a useless
|
|
22
|
+
# new function or violating the style guide by using a lambda function.
|
|
23
|
+
TEFF_FIDUCIAL_DEPTH = defaultdict(
|
|
24
|
+
np.array(np.nan).item,
|
|
25
|
+
{
|
|
26
|
+
"u": 23.71,
|
|
27
|
+
"g": 24.67,
|
|
28
|
+
"r": 24.24,
|
|
29
|
+
"i": 23.82,
|
|
30
|
+
"z": 23.21,
|
|
31
|
+
"y": 22.40,
|
|
32
|
+
}.items(),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
TEFF_FIDUCIAL_EXPTIME = 30.0
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def compute_teff(m5_depth, filter_name, exptime=None, fiducial_depth=None, teff_base=None, normed=False):
|
|
39
|
+
"""Compute the effective exposure time for a limiting magnitude.
|
|
40
|
+
|
|
41
|
+
Parameters
|
|
42
|
+
----------
|
|
43
|
+
m5_depth : `float` or `numpy.ndarray`, (N,)
|
|
44
|
+
The five sigma point source limiting magintude.
|
|
45
|
+
filter_name : `str` or `numpy.ndarray`, (N,)
|
|
46
|
+
The name of the filter.
|
|
47
|
+
exptime : `float` or `numpy.ndarray`, (N,)
|
|
48
|
+
The expsore time (seconds), defaults to TEFF_FIDUCIAL_EXPTIME.
|
|
49
|
+
fiducial_depth: `dict` [`str`, `float`]
|
|
50
|
+
A mapping of filter to fiducial depth.
|
|
51
|
+
Defaults to TEFF_FIDUCIAL_DEPTH.
|
|
52
|
+
teff_base : `float`
|
|
53
|
+
The exposure time (in seconds) corresponding to the exposure depth.
|
|
54
|
+
normed : `bool`
|
|
55
|
+
Normalize against the exposure time, such that a value of 1 corresponds
|
|
56
|
+
to the exposure having been taken at fiducial conditions. Defaults
|
|
57
|
+
to False.
|
|
58
|
+
|
|
59
|
+
Returns
|
|
60
|
+
-------
|
|
61
|
+
t_eff : `float`
|
|
62
|
+
Effective expsore time, in seconds (if normed is False) or unitless
|
|
63
|
+
(if normed is true).
|
|
64
|
+
"""
|
|
65
|
+
if fiducial_depth is None:
|
|
66
|
+
fiducial_depth = TEFF_FIDUCIAL_DEPTH
|
|
67
|
+
|
|
68
|
+
if teff_base is None:
|
|
69
|
+
teff_base = TEFF_FIDUCIAL_EXPTIME
|
|
70
|
+
|
|
71
|
+
if exptime is None:
|
|
72
|
+
exptime = TEFF_FIDUCIAL_EXPTIME
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
fiducial_m5_depth = fiducial_depth[filter_name]
|
|
76
|
+
except TypeError:
|
|
77
|
+
# If filter_name is not one value, but an iterable, map it according
|
|
78
|
+
# to fiducial_depth.
|
|
79
|
+
if len(filter_name) != len(m5_depth):
|
|
80
|
+
raise ValueError()
|
|
81
|
+
|
|
82
|
+
fiducial_m5_depth = np.array([fiducial_depth[b] for b in filter_name])
|
|
83
|
+
|
|
84
|
+
t_eff = teff_base * 10.0 ** (0.8 * (m5_depth - fiducial_m5_depth))
|
|
85
|
+
|
|
86
|
+
if normed:
|
|
87
|
+
tau = t_eff / exptime
|
|
88
|
+
return tau
|
|
89
|
+
else:
|
|
90
|
+
return t_eff
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class TeffStacker(BaseStacker):
|
|
94
|
+
"""Add t_eff column corresponding to fiveSigmaDepth.
|
|
95
|
+
|
|
96
|
+
Parameters
|
|
97
|
+
----------
|
|
98
|
+
m5_col : `str` ('fiveSigmaDepth')
|
|
99
|
+
Colum name for the five sigma limiting depth per pointing.
|
|
100
|
+
Defaults to "fiveSigmaDepth".
|
|
101
|
+
filter_col : `str`
|
|
102
|
+
Defaults to "filter"
|
|
103
|
+
exptime_col : `str`
|
|
104
|
+
The column with the exposure time, defaults to
|
|
105
|
+
"visitExposureTime"
|
|
106
|
+
fiducial_depth: `dict` [`str`, `float`]
|
|
107
|
+
A mapping of filter to fiducial depth.
|
|
108
|
+
Defaults to TEFF_FIDUCIAL_DEPTH.
|
|
109
|
+
fiducial_exptime : `float`
|
|
110
|
+
The exposure time (in seconds) corresponding to the exposure depth.
|
|
111
|
+
normed : `bool`
|
|
112
|
+
Normalize to exporuse time.
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
cols_added = ["t_eff"]
|
|
116
|
+
|
|
117
|
+
def __init__(
|
|
118
|
+
self,
|
|
119
|
+
m5_col="fiveSigmaDepth",
|
|
120
|
+
filter_col="band",
|
|
121
|
+
exptime_col="visitExposureTime",
|
|
122
|
+
fiducial_depth=None,
|
|
123
|
+
fiducial_exptime=None,
|
|
124
|
+
normed=False,
|
|
125
|
+
**kwargs,
|
|
126
|
+
):
|
|
127
|
+
self.m5_col = m5_col
|
|
128
|
+
self.filter_col = filter_col
|
|
129
|
+
self.exptime_col = exptime_col
|
|
130
|
+
self.normed = normed
|
|
131
|
+
self.fiducial_depth = TEFF_FIDUCIAL_DEPTH if fiducial_depth is None else fiducial_depth
|
|
132
|
+
self.fiducial_exptime = TEFF_FIDUCIAL_EXPTIME if fiducial_exptime is None else fiducial_exptime
|
|
133
|
+
self.cols_req = [self.m5_col, self.filter_col, self.exptime_col]
|
|
134
|
+
if self.normed and self.exptime_col not in self.cols_req:
|
|
135
|
+
self.cols_req.append(self.exptime_col)
|
|
136
|
+
|
|
137
|
+
self.units = "" if self.normed else "seconds"
|
|
138
|
+
|
|
139
|
+
def _run(self, sim_data, cols_present=False):
|
|
140
|
+
if cols_present:
|
|
141
|
+
# Column already present in data; assume it is correct and does not
|
|
142
|
+
# need recalculating.
|
|
143
|
+
return sim_data
|
|
144
|
+
|
|
145
|
+
sim_data["t_eff"] = compute_teff(
|
|
146
|
+
sim_data[self.m5_col],
|
|
147
|
+
sim_data[self.filter_col],
|
|
148
|
+
sim_data[self.exptime_col],
|
|
149
|
+
self.fiducial_depth,
|
|
150
|
+
self.fiducial_exptime,
|
|
151
|
+
normed=self.normed,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
return sim_data
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
__all__ = ("sigma_slope", "m52snr", "astrom_precision")
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
"""Some simple functions that are useful for astrometry calculations. """
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def sigma_slope(x, sigma_y):
|
|
9
|
+
"""
|
|
10
|
+
Calculate the uncertainty in fitting a line, as
|
|
11
|
+
given by the spread in x values and the uncertainties
|
|
12
|
+
in the y values.
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
x : numpy.ndarray
|
|
17
|
+
The x values of the data
|
|
18
|
+
sigma_y : numpy.ndarray
|
|
19
|
+
The uncertainty in the y values
|
|
20
|
+
|
|
21
|
+
Returns
|
|
22
|
+
-------
|
|
23
|
+
float
|
|
24
|
+
The uncertainty in the line fit
|
|
25
|
+
"""
|
|
26
|
+
w = 1.0 / sigma_y**2
|
|
27
|
+
denom = np.sum(w) * np.sum(w * x**2) - np.sum(w * x) ** 2
|
|
28
|
+
if denom <= 0:
|
|
29
|
+
return np.nan
|
|
30
|
+
else:
|
|
31
|
+
result = np.sqrt(np.sum(w) / denom)
|
|
32
|
+
return result
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def m52snr(m, m5, gamma=0.04):
|
|
36
|
+
"""
|
|
37
|
+
Calculate the SNR for a star of magnitude m in an
|
|
38
|
+
observation with 5-sigma limiting magnitude depth m5.
|
|
39
|
+
Assumes gaussian distribution of photons and might not be
|
|
40
|
+
strictly due in bluer filters. See table 2 and equation 5
|
|
41
|
+
in astroph/0805.2366.
|
|
42
|
+
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
45
|
+
m : `float` or `np.ndarray` (N,)
|
|
46
|
+
The magnitude of the star
|
|
47
|
+
m5 : `float` or `np.ndarray` (N,)
|
|
48
|
+
The m5 limiting magnitude of the observation
|
|
49
|
+
gamma : `float` or None
|
|
50
|
+
The 'gamma' value used when calculating photometric or
|
|
51
|
+
astrometric errors and weighting SNR accordingly.
|
|
52
|
+
See equation 5 of the LSST Overview paper.
|
|
53
|
+
Use "None" to discount the gamma factor completely
|
|
54
|
+
and use standard 5*10^(0.4 * (m5-m)).
|
|
55
|
+
|
|
56
|
+
Returns
|
|
57
|
+
-------
|
|
58
|
+
snr : `float` or `np.ndarray` (N,)
|
|
59
|
+
The SNR
|
|
60
|
+
"""
|
|
61
|
+
# gamma varies per band, but is fairly close to 0.04
|
|
62
|
+
|
|
63
|
+
if gamma is None:
|
|
64
|
+
snr = 5.0 * 10.0 ** (-0.4 * (m - m5))
|
|
65
|
+
else:
|
|
66
|
+
xval = np.power(10, 0.4 * (m - m5))
|
|
67
|
+
snr = 1 / np.sqrt((0.04 - gamma) * xval + gamma * xval * xval)
|
|
68
|
+
return snr
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def astrom_precision(fwhm, snr, systematic_floor=0.00):
|
|
72
|
+
"""
|
|
73
|
+
Calculate the approximate precision of astrometric measurements,
|
|
74
|
+
given a particular seeing and SNR value.
|
|
75
|
+
|
|
76
|
+
Parameters
|
|
77
|
+
----------
|
|
78
|
+
fwhm : `float` or `np.ndarray` (N,)
|
|
79
|
+
The seeing (FWHMgeom) of the observation.
|
|
80
|
+
snr : float` or `np.ndarray` (N,)
|
|
81
|
+
The SNR of the object.
|
|
82
|
+
systematic_floor : `float`
|
|
83
|
+
Systematic noise floor for astrometric error, in arcseconds.
|
|
84
|
+
Default here is 0, for backwards compatibility.
|
|
85
|
+
General Rubin use should be 0.01.
|
|
86
|
+
|
|
87
|
+
Returns
|
|
88
|
+
-------
|
|
89
|
+
astrom_err : `float` or `numpy.ndarray` (N,)
|
|
90
|
+
The astrometric precision, in arcseconds.
|
|
91
|
+
"""
|
|
92
|
+
astrom_err = np.sqrt((fwhm / snr) ** 2 + systematic_floor**2)
|
|
93
|
+
return astrom_err
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from rubin_scheduler.utils import gnomonic_project_tosky
|
|
3
|
+
|
|
4
|
+
# Use the main stack to make a rough array.
|
|
5
|
+
# This code needs an update to work without lsst.sims.
|
|
6
|
+
|
|
7
|
+
if __name__ == "__main__":
|
|
8
|
+
import lsst.sims.utils as simsUtils
|
|
9
|
+
from lsst.obs.lsst import LsstCamMapper
|
|
10
|
+
from lsst.sims.coordUtils import _chipNameFromRaDec
|
|
11
|
+
|
|
12
|
+
mapper = LsstCamMapper()
|
|
13
|
+
camera = mapper.camera
|
|
14
|
+
epoch = 2000.0
|
|
15
|
+
|
|
16
|
+
ra = 0.0
|
|
17
|
+
dec = 0.0
|
|
18
|
+
rot_sky_pos = 0.0
|
|
19
|
+
mjd = 5300.0
|
|
20
|
+
|
|
21
|
+
obs_metadata = simsUtils.ObservationMetaData(
|
|
22
|
+
pointing_ra=np.degrees(ra),
|
|
23
|
+
pointing_dec=np.degrees(dec),
|
|
24
|
+
rot_sky_pos=np.degrees(rot_sky_pos),
|
|
25
|
+
mjd=mjd,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
nside = int(1000)
|
|
29
|
+
# 60k pixels, from 0 to 3.5 degrees
|
|
30
|
+
x_one = np.linspace(-1.75, 1.75, int(nside))
|
|
31
|
+
|
|
32
|
+
# make 2-d x,y arrays
|
|
33
|
+
x_two = np.broadcast_to(x_one, (nside, nside))
|
|
34
|
+
y_two = np.broadcast_to(x_one, (nside, nside)).T
|
|
35
|
+
|
|
36
|
+
result = np.ones((nside, nside), dtype=bool)
|
|
37
|
+
ra_two, dec_two = gnomonic_project_tosky(np.radians(x_two), np.radians(y_two), ra, dec)
|
|
38
|
+
chip_names = _chipNameFromRaDec(
|
|
39
|
+
ra_two.ravel(),
|
|
40
|
+
dec_two.ravel(),
|
|
41
|
+
epoch=epoch,
|
|
42
|
+
camera=camera,
|
|
43
|
+
obs_metadata=obs_metadata,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
chip_names = chip_names.reshape(nside, nside)
|
|
47
|
+
wavefront_names = [
|
|
48
|
+
name
|
|
49
|
+
for name in np.unique(chip_names[np.where(chip_names is not None)])
|
|
50
|
+
if ("SW" in name) | ("R44" in name) | ("R00" in name) | ("R04" in name) | ("R40" in name)
|
|
51
|
+
]
|
|
52
|
+
# If it's on a waverfront sensor, that's false
|
|
53
|
+
for name in wavefront_names:
|
|
54
|
+
result[np.where(chip_names == name)] = False
|
|
55
|
+
# No chipname, that's a false
|
|
56
|
+
result[np.where(chip_names is None)] = False
|
|
57
|
+
|
|
58
|
+
np.savez("fov_map.npz", x=x_one, image=result)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
__all__ = ("get_date_version",)
|
|
2
|
+
|
|
3
|
+
import time
|
|
4
|
+
from importlib import metadata
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def get_date_version():
|
|
8
|
+
"""
|
|
9
|
+
Get today's date and a dictionary with the MAF version information.
|
|
10
|
+
This is written into configuration output files, to help track MAF runs.
|
|
11
|
+
|
|
12
|
+
Returns
|
|
13
|
+
-------
|
|
14
|
+
str, dict
|
|
15
|
+
String with today's date, Dictionary with version information.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
version = metadata.version("rubin_sim")
|
|
19
|
+
# today_date = time.strftime("%x")
|
|
20
|
+
today_date = "-".join([time.strftime(x) for x in ["%Y", "%m", "%d"]])
|
|
21
|
+
version_info = {
|
|
22
|
+
"__version__": version,
|
|
23
|
+
"__repo_version__": None,
|
|
24
|
+
"__fingerprint__": None,
|
|
25
|
+
"__dependency_versions__": None,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return today_date, version_info
|