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,186 @@
|
|
|
1
|
+
__all__ = ("PeriodicStar", "PeriodicStarMetric")
|
|
2
|
+
|
|
3
|
+
import warnings
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
from scipy.optimize import curve_fit
|
|
7
|
+
|
|
8
|
+
from rubin_sim.maf.metrics.base_metric import BaseMetric
|
|
9
|
+
from rubin_sim.maf.utils import m52snr
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PeriodicStar:
|
|
13
|
+
def __init__(self, filternames):
|
|
14
|
+
self.filternames = filternames
|
|
15
|
+
|
|
16
|
+
def __call__(self, t, x0, x1, x2, x3, x4, x5, x6, x7, x8):
|
|
17
|
+
"""Approximate a periodic star as a simple sin wave.
|
|
18
|
+
t: array with "time" in days, and "filter" dtype names.
|
|
19
|
+
x0: Period (days)
|
|
20
|
+
x1: Phase (days)
|
|
21
|
+
x2: Amplitude (mag)
|
|
22
|
+
x3: mean u mag
|
|
23
|
+
x4: mean g mag
|
|
24
|
+
x5: mean r mag
|
|
25
|
+
x6: mean i mag
|
|
26
|
+
x7: mean z mag
|
|
27
|
+
x8: mean y mag
|
|
28
|
+
"""
|
|
29
|
+
filter2index = {"u": 3, "g": 4, "r": 5, "i": 6, "z": 7, "y": 8}
|
|
30
|
+
filter_names = np.unique(self.filternames)
|
|
31
|
+
mags = x2 * np.sin((t + x1) / x0 * 2.0 * np.pi)
|
|
32
|
+
x = [x0, x1, x2, x3, x4, x5, x6, x7, x8]
|
|
33
|
+
for f in filter_names:
|
|
34
|
+
good = np.where(self.filternames == f)
|
|
35
|
+
mags[good] += x[filter2index[f]]
|
|
36
|
+
return mags
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class PeriodicStarMetric(BaseMetric):
|
|
40
|
+
"""At each slice_point, run a Monte Carlo simulation to see how
|
|
41
|
+
well a periodic source can be fit. Assumes a simple sin-wave light-curve,
|
|
42
|
+
and generates Gaussain noise based in the 5-sigma limiting depth
|
|
43
|
+
of each observation.
|
|
44
|
+
|
|
45
|
+
Parameters
|
|
46
|
+
----------
|
|
47
|
+
period : `float`
|
|
48
|
+
The period to check, in days.
|
|
49
|
+
amplitude : `float`
|
|
50
|
+
The amplitude of the sinusoidal light curve, in mags.
|
|
51
|
+
phase : `float`
|
|
52
|
+
The phase of the lightcurve at the time of the first observation.
|
|
53
|
+
n_monte : `int`
|
|
54
|
+
The number of noise realizations to make in the Monte Carlo.
|
|
55
|
+
period_tol : `float`
|
|
56
|
+
The fractional tolerance on the period to require in order for a star
|
|
57
|
+
to be considered well-fit
|
|
58
|
+
amp_tol : `float`
|
|
59
|
+
The fractional tolerance on the amplitude.
|
|
60
|
+
means : `list` [`float`]
|
|
61
|
+
The mean magnitudes in ugrizy of the star.
|
|
62
|
+
mag_tol : `float`
|
|
63
|
+
The mean magnitude tolerance, in magnitudes, for the star to be
|
|
64
|
+
considered well-fit.
|
|
65
|
+
n_bands : `int`
|
|
66
|
+
Number of bands that must be within mag_tol.
|
|
67
|
+
seed : `int`
|
|
68
|
+
Random number seed for the noise realizations.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
def __init__(
|
|
72
|
+
self,
|
|
73
|
+
metric_name="PeriodicStarMetric",
|
|
74
|
+
mjd_col="observationStartMJD",
|
|
75
|
+
m5_col="fiveSigmaDepth",
|
|
76
|
+
filter_col="band",
|
|
77
|
+
period=10.0,
|
|
78
|
+
amplitude=0.5,
|
|
79
|
+
phase=2.0,
|
|
80
|
+
n_monte=1000,
|
|
81
|
+
period_tol=0.05,
|
|
82
|
+
amp_tol=0.10,
|
|
83
|
+
means=[20.0, 20.0, 20.0, 20.0, 20.0, 20.0],
|
|
84
|
+
mag_tol=0.10,
|
|
85
|
+
n_bands=3,
|
|
86
|
+
seed=42,
|
|
87
|
+
**kwargs,
|
|
88
|
+
):
|
|
89
|
+
"""
|
|
90
|
+
period: days (default 10)
|
|
91
|
+
amplitude: mags (default 1)
|
|
92
|
+
n_monte: number of noise realizations to make in the Monte Carlo
|
|
93
|
+
period_tol: fractional tolerance on the period to demand for a star
|
|
94
|
+
to be considered well-fit
|
|
95
|
+
amp_tol: fractional tolerance on the amplitude to demand
|
|
96
|
+
means: mean magnitudes for ugrizy
|
|
97
|
+
mag_tol: Mean magnitude tolerance (mags)
|
|
98
|
+
n_bands: Number of bands that must be within mag_tol
|
|
99
|
+
seed: random number seed
|
|
100
|
+
"""
|
|
101
|
+
self.mjd_col = mjd_col
|
|
102
|
+
self.m5_col = m5_col
|
|
103
|
+
self.filter_col = filter_col
|
|
104
|
+
super(PeriodicStarMetric, self).__init__(
|
|
105
|
+
col=[self.mjd_col, self.m5_col, self.filter_col],
|
|
106
|
+
units="Fraction Detected",
|
|
107
|
+
metric_name=metric_name,
|
|
108
|
+
**kwargs,
|
|
109
|
+
)
|
|
110
|
+
self.period = period
|
|
111
|
+
self.amplitude = amplitude
|
|
112
|
+
self.phase = phase
|
|
113
|
+
self.n_monte = n_monte
|
|
114
|
+
self.period_tol = period_tol
|
|
115
|
+
self.amp_tol = amp_tol
|
|
116
|
+
self.means = np.array(means)
|
|
117
|
+
self.mag_tol = mag_tol
|
|
118
|
+
self.n_bands = n_bands
|
|
119
|
+
np.random.seed(seed)
|
|
120
|
+
self.filter2index = {"u": 3, "g": 4, "r": 5, "i": 6, "z": 7, "y": 8}
|
|
121
|
+
|
|
122
|
+
def run(self, data_slice, slice_point=None):
|
|
123
|
+
# Bail if we don't have enough points
|
|
124
|
+
# (need to fit mean magnitudes in each of the available bands -
|
|
125
|
+
# self.means and for a period, amplitude, and phase)
|
|
126
|
+
if data_slice.size < self.means.size + 3:
|
|
127
|
+
return self.badval
|
|
128
|
+
|
|
129
|
+
# Generate input for true light curve
|
|
130
|
+
t = np.empty(data_slice.size, dtype=list(zip(["time", "filter"], [float, "|U1"])))
|
|
131
|
+
t["time"] = data_slice[self.mjd_col] - data_slice[self.mjd_col].min()
|
|
132
|
+
t["filter"] = data_slice[self.filter_col]
|
|
133
|
+
|
|
134
|
+
# If we are adding a distance modulus to the magnitudes
|
|
135
|
+
if "distMod" in list(slice_point.keys()):
|
|
136
|
+
mags = self.means + slice_point["distMod"]
|
|
137
|
+
else:
|
|
138
|
+
mags = self.means
|
|
139
|
+
true_params = np.append(np.array([self.period, self.phase, self.amplitude]), mags)
|
|
140
|
+
true_obj = PeriodicStar(t["filter"])
|
|
141
|
+
true_lc = true_obj(t["time"], *true_params)
|
|
142
|
+
|
|
143
|
+
# Array to hold the fit results
|
|
144
|
+
fits = np.zeros((self.n_monte, true_params.size), dtype=float)
|
|
145
|
+
for i in np.arange(self.n_monte):
|
|
146
|
+
snr = m52snr(true_lc, data_slice[self.m5_col])
|
|
147
|
+
dmag = 2.5 * np.log10(1.0 + 1.0 / snr)
|
|
148
|
+
noise = np.random.randn(true_lc.size) * dmag
|
|
149
|
+
# Suppress warnings about failing on covariance
|
|
150
|
+
fit_obj = PeriodicStar(t["filter"])
|
|
151
|
+
with warnings.catch_warnings():
|
|
152
|
+
warnings.simplefilter("ignore")
|
|
153
|
+
# If it fails to converge, save values that should fail later
|
|
154
|
+
try:
|
|
155
|
+
parm_vals, pcov = curve_fit(
|
|
156
|
+
fit_obj, t["time"], true_lc + noise, p0=true_params, sigma=dmag
|
|
157
|
+
)
|
|
158
|
+
except RuntimeError:
|
|
159
|
+
parm_vals = true_params * 0 + np.inf
|
|
160
|
+
fits[i, :] = parm_vals
|
|
161
|
+
|
|
162
|
+
# Throw out any magnitude fits if there are no observations
|
|
163
|
+
# in that filter
|
|
164
|
+
ufilters = np.unique(data_slice[self.filter_col])
|
|
165
|
+
if ufilters.size < 9:
|
|
166
|
+
for key in list(self.filter2index.keys()):
|
|
167
|
+
if key not in ufilters:
|
|
168
|
+
fits[:, self.filter2index[key]] = -np.inf
|
|
169
|
+
|
|
170
|
+
# Find the fraction of fits that meet the "well-fit" criteria
|
|
171
|
+
period_frac_err = np.abs((fits[:, 0] - true_params[0]) / true_params[0])
|
|
172
|
+
amp_frac_err = np.abs((fits[:, 2] - true_params[2]) / true_params[2])
|
|
173
|
+
mag_err = np.abs(fits[:, 3:] - true_params[3:])
|
|
174
|
+
n_bands = np.zeros(mag_err.shape, dtype=int)
|
|
175
|
+
n_bands[np.where(mag_err <= self.mag_tol)] = 1
|
|
176
|
+
n_bands = np.sum(n_bands, axis=1)
|
|
177
|
+
n_recovered = np.size(
|
|
178
|
+
np.where(
|
|
179
|
+
(period_frac_err <= self.period_tol)
|
|
180
|
+
& (amp_frac_err <= self.amp_tol)
|
|
181
|
+
& (n_bands >= self.n_bands)
|
|
182
|
+
)[0]
|
|
183
|
+
)
|
|
184
|
+
frac_recovered = float(n_recovered) / self.n_monte
|
|
185
|
+
|
|
186
|
+
return frac_recovered
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
__all__ = ("PeriodicStarModulationMetric",)
|
|
2
|
+
|
|
3
|
+
import random
|
|
4
|
+
import warnings
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
from scipy.optimize import curve_fit
|
|
8
|
+
|
|
9
|
+
from rubin_sim.maf.metrics.base_metric import BaseMetric
|
|
10
|
+
from rubin_sim.maf.utils import m52snr
|
|
11
|
+
|
|
12
|
+
from .periodic_star_metric import PeriodicStar
|
|
13
|
+
|
|
14
|
+
""" This metric is based on the PeriodicStar metric
|
|
15
|
+
It was modified in a way to reproduce attempts to identify
|
|
16
|
+
phase modulation (Blazhko effect) in RR Lyrae stars.
|
|
17
|
+
We are not implementing a period/ phase modulation in the light curve,
|
|
18
|
+
but rather use short baselines (e.g.: 20 days) of observations to test
|
|
19
|
+
how well we can recover the period, phase and amplitude.
|
|
20
|
+
We do this as such an attempt is also useful for other purposes,
|
|
21
|
+
i.e. if we want to test whether we can just recover period, phase
|
|
22
|
+
and amplitude from short baselines at all, without necessarily having
|
|
23
|
+
in mind to look for period/ phase modulations.
|
|
24
|
+
Like in the PeriodicStar metric, the light curve of an RR Lyrae star,
|
|
25
|
+
or a periodic star in general, is approximated as a simple sin wave.
|
|
26
|
+
Other solutions might make use of light curve templates
|
|
27
|
+
to generate light curves.
|
|
28
|
+
Two other modifications we introduced are:
|
|
29
|
+
In contrast to the PeriodicStar metric, we allow for a random phase
|
|
30
|
+
offset to mimic observation starting at random phase.
|
|
31
|
+
Also, we vary the periods and amplitudes within +/- 10 % to allow
|
|
32
|
+
for a more realistic sample of variable stars.
|
|
33
|
+
|
|
34
|
+
This metric is based on the cadence note:
|
|
35
|
+
N. Hernitschek, K. Stassun, LSST Cadence Note:
|
|
36
|
+
"Cadence impacts on reliable classification of standard-candle
|
|
37
|
+
variable stars (2021)"
|
|
38
|
+
https://docushare.lsst.org/docushare/dsweb/Get/Document-37673
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class PeriodicStarModulationMetric(BaseMetric):
|
|
43
|
+
"""Evaluate how well a periodic source can be fit on a short baseline,
|
|
44
|
+
using a Monte Carlo simulation.
|
|
45
|
+
|
|
46
|
+
At each slice_point, run a Monte Carlo simulation to see how well a
|
|
47
|
+
periodic source can be fit.
|
|
48
|
+
Assumes a simple sin-wave light-curve, and generates Gaussain noise
|
|
49
|
+
based in the 5-sigma limiting depth of each observation.
|
|
50
|
+
Light curves are evaluated piecewise to test how well we can recover
|
|
51
|
+
the period, phase and amplitude from shorter baselines.
|
|
52
|
+
We allow for a random phase offset to mimic observation starting
|
|
53
|
+
at random phase. Also, we vary the periods and amplitudes
|
|
54
|
+
within +/- 10 % to allow for a more realistic sample of variable stars.
|
|
55
|
+
|
|
56
|
+
Parameters
|
|
57
|
+
----------
|
|
58
|
+
period : `float`, opt
|
|
59
|
+
days (default 10)
|
|
60
|
+
amplitude : `float`, opt
|
|
61
|
+
mags (default 0.5)
|
|
62
|
+
phase : `float`, opt
|
|
63
|
+
days (default 2.)
|
|
64
|
+
random_phase : `bool`, opt
|
|
65
|
+
a random phase is assigned (default False)
|
|
66
|
+
time_interval : `float`, opt
|
|
67
|
+
days (default 50);
|
|
68
|
+
the interval over which we want to evaluate the light curve
|
|
69
|
+
n_monte : `int`, opt
|
|
70
|
+
number of noise realizations to make in the Monte Carlo (default 1000)
|
|
71
|
+
period_tol : `float`, opt
|
|
72
|
+
fractional tolerance on the period to demand
|
|
73
|
+
for a star to be considered well-fit (default 0.05)
|
|
74
|
+
amp_tol : `float`, opt
|
|
75
|
+
fractional tolerance on the amplitude to demand (default 0.10)
|
|
76
|
+
means : `list` of `float`, opt
|
|
77
|
+
mean magnitudes for ugrizy (default all 20)
|
|
78
|
+
mag_tol : `float`, opt
|
|
79
|
+
Mean magnitude tolerance (mags) (default 0.1)
|
|
80
|
+
n_bands : `int`, opt
|
|
81
|
+
Number of bands that must be within mag_tol (default 3)
|
|
82
|
+
seed : `int`, opt
|
|
83
|
+
random number seed (default 42)
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
def __init__(
|
|
87
|
+
self,
|
|
88
|
+
metric_name="PeriodicStarModulationMetric",
|
|
89
|
+
mjd_col="observationStartMJD",
|
|
90
|
+
m5_col="fiveSigmaDepth",
|
|
91
|
+
filter_col="band",
|
|
92
|
+
period=10.0,
|
|
93
|
+
amplitude=0.5,
|
|
94
|
+
phase=2.0,
|
|
95
|
+
random_phase=False,
|
|
96
|
+
time_interval=50,
|
|
97
|
+
n_monte=1000,
|
|
98
|
+
period_tol=0.05,
|
|
99
|
+
amp_tol=0.10,
|
|
100
|
+
means=[20.0, 20.0, 20.0, 20.0, 20.0, 20.0],
|
|
101
|
+
mag_tol=0.10,
|
|
102
|
+
n_bands=3,
|
|
103
|
+
seed=42,
|
|
104
|
+
**kwargs,
|
|
105
|
+
):
|
|
106
|
+
self.mjd_col = mjd_col
|
|
107
|
+
self.m5_col = m5_col
|
|
108
|
+
self.filter_col = filter_col
|
|
109
|
+
super(PeriodicStarModulationMetric, self).__init__(
|
|
110
|
+
col=[self.mjd_col, self.m5_col, self.filter_col],
|
|
111
|
+
units="Fraction Detected",
|
|
112
|
+
metric_name=metric_name,
|
|
113
|
+
**kwargs,
|
|
114
|
+
)
|
|
115
|
+
self.period = period
|
|
116
|
+
self.amplitude = amplitude
|
|
117
|
+
self.time_interval = time_interval
|
|
118
|
+
if random_phase:
|
|
119
|
+
self.phase = np.nan
|
|
120
|
+
else:
|
|
121
|
+
self.phase = phase
|
|
122
|
+
self.n_monte = n_monte
|
|
123
|
+
self.period_tol = period_tol
|
|
124
|
+
self.amp_tol = amp_tol
|
|
125
|
+
self.means = np.array(means)
|
|
126
|
+
self.mag_tol = mag_tol
|
|
127
|
+
self.n_bands = n_bands
|
|
128
|
+
np.random.seed(seed)
|
|
129
|
+
self.filter2index = {"u": 3, "g": 4, "r": 5, "i": 6, "z": 7, "y": 8}
|
|
130
|
+
|
|
131
|
+
def run(self, data_slice, slice_point=None):
|
|
132
|
+
# Bail if we don't have enough points
|
|
133
|
+
# (need to fit mean magnitudes in each of the available bands
|
|
134
|
+
# - self.means and for a period, amplitude, and phase)
|
|
135
|
+
if data_slice.size < self.means.size + 3:
|
|
136
|
+
return self.badval
|
|
137
|
+
|
|
138
|
+
# Generate input for true light curve
|
|
139
|
+
|
|
140
|
+
lightcurvelength = data_slice.size
|
|
141
|
+
|
|
142
|
+
t = np.empty(lightcurvelength, dtype=list(zip(["time", "filter"], [float, "|U1"])))
|
|
143
|
+
t["time"] = data_slice[self.mjd_col] - data_slice[self.mjd_col].min()
|
|
144
|
+
t["filter"] = data_slice[self.filter_col]
|
|
145
|
+
m5 = data_slice[self.m5_col]
|
|
146
|
+
|
|
147
|
+
lightcurvelength_days = self.time_interval
|
|
148
|
+
|
|
149
|
+
# evaluate light curves piecewise in subruns
|
|
150
|
+
subruns = int(np.max(t["time"]) / lightcurvelength_days)
|
|
151
|
+
|
|
152
|
+
# print('number of subruns: ', subruns)
|
|
153
|
+
frac_recovered_list = []
|
|
154
|
+
|
|
155
|
+
for subrun_idx in range(0, subruns):
|
|
156
|
+
good = (t["time"] >= (lightcurvelength_days * (subrun_idx))) & (
|
|
157
|
+
t["time"] <= (lightcurvelength_days * (subrun_idx + 1))
|
|
158
|
+
)
|
|
159
|
+
t_subrun = t[good]
|
|
160
|
+
m5_subrun = m5[good]
|
|
161
|
+
if t_subrun["time"].size > 0:
|
|
162
|
+
# If we are adding a distance modulus to the magnitudes
|
|
163
|
+
if "distMod" in list(slice_point.keys()):
|
|
164
|
+
mags = self.means + slice_point["distMod"]
|
|
165
|
+
else:
|
|
166
|
+
mags = self.means
|
|
167
|
+
# slightly different periods and amplitudes (+/- 10 %)
|
|
168
|
+
# to mimic true stars. random phase offsets to mimic
|
|
169
|
+
# observation starting at random phase
|
|
170
|
+
true_period = random.uniform(0.9, 1.1) * self.period
|
|
171
|
+
true_amplitude = random.uniform(0.9, 1.1) * self.amplitude
|
|
172
|
+
if np.isnan(self.phase):
|
|
173
|
+
# a random phase (in days) should be assigned
|
|
174
|
+
true_phase = random.uniform(0, 1) * self.period
|
|
175
|
+
else:
|
|
176
|
+
true_phase = self.phase
|
|
177
|
+
|
|
178
|
+
true_params = np.append(np.array([true_period, true_phase, true_amplitude]), mags)
|
|
179
|
+
true_obj = PeriodicStar(t_subrun["filter"])
|
|
180
|
+
true_lc = true_obj(t_subrun["time"], *true_params)
|
|
181
|
+
|
|
182
|
+
# Array to hold the fit results
|
|
183
|
+
fits = np.zeros((self.n_monte, true_params.size), dtype=float)
|
|
184
|
+
for i in np.arange(self.n_monte):
|
|
185
|
+
snr = m52snr(true_lc, m5_subrun)
|
|
186
|
+
dmag = 2.5 * np.log10(1.0 + 1.0 / snr)
|
|
187
|
+
noise = np.random.randn(true_lc.size) * dmag
|
|
188
|
+
# Suppress warnings about failing on covariance
|
|
189
|
+
fit_obj = PeriodicStar(t_subrun["filter"])
|
|
190
|
+
# check if we have enough points
|
|
191
|
+
if np.size(true_params) >= np.size(fit_obj):
|
|
192
|
+
parm_vals = true_params * 0 + np.inf
|
|
193
|
+
else:
|
|
194
|
+
with warnings.catch_warnings():
|
|
195
|
+
warnings.simplefilter("ignore")
|
|
196
|
+
# If it fails to converge,
|
|
197
|
+
# save values that should fail later
|
|
198
|
+
try:
|
|
199
|
+
parm_vals, pcov = curve_fit(
|
|
200
|
+
fit_obj,
|
|
201
|
+
t_subrun["time"],
|
|
202
|
+
true_lc + noise,
|
|
203
|
+
p0=true_params,
|
|
204
|
+
sigma=dmag,
|
|
205
|
+
)
|
|
206
|
+
except RuntimeError:
|
|
207
|
+
parm_vals = true_params * 0 + np.inf
|
|
208
|
+
fits[i, :] = parm_vals
|
|
209
|
+
|
|
210
|
+
# Throw out any magnitude fits if there are no
|
|
211
|
+
# observations in that filter
|
|
212
|
+
ufilters = np.unique(data_slice[self.filter_col])
|
|
213
|
+
if ufilters.size < 9:
|
|
214
|
+
for key in list(self.filter2index.keys()):
|
|
215
|
+
if key not in ufilters:
|
|
216
|
+
fits[:, self.filter2index[key]] = -np.inf
|
|
217
|
+
|
|
218
|
+
# Find the fraction of fits that meet the "well-fit" criteria
|
|
219
|
+
period_frac_err = np.abs((fits[:, 0] - true_params[0]) / true_params[0])
|
|
220
|
+
amp_frac_err = np.abs((fits[:, 2] - true_params[2]) / true_params[2])
|
|
221
|
+
mag_err = np.abs(fits[:, 3:] - true_params[3:])
|
|
222
|
+
n_bands = np.zeros(mag_err.shape, dtype=int)
|
|
223
|
+
n_bands[np.where(mag_err <= self.mag_tol)] = 1
|
|
224
|
+
n_bands = np.sum(n_bands, axis=1)
|
|
225
|
+
n_recovered = np.size(
|
|
226
|
+
np.where(
|
|
227
|
+
(period_frac_err <= self.period_tol)
|
|
228
|
+
& (amp_frac_err <= self.amp_tol)
|
|
229
|
+
& (n_bands >= self.n_bands)
|
|
230
|
+
)[0]
|
|
231
|
+
)
|
|
232
|
+
frac_recovered = float(n_recovered) / self.n_monte
|
|
233
|
+
frac_recovered_list.append(frac_recovered)
|
|
234
|
+
|
|
235
|
+
frac_recovered = np.sum(frac_recovered_list) / (len(frac_recovered_list))
|
|
236
|
+
return frac_recovered
|