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,170 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Created on Tue Sep 18 13:35:41 2018
|
|
3
|
+
|
|
4
|
+
@author: rstreet
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
__all__ = ("calculate_lsst_field_visibility", "calculate_lsst_field_visibility_fast")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
import astropy.units as u
|
|
11
|
+
import numpy as np
|
|
12
|
+
from astropy.coordinates import AltAz, EarthLocation, SkyCoord, get_sun
|
|
13
|
+
from astropy.time import Time, TimeDelta
|
|
14
|
+
from rubin_scheduler.utils import Site, approx_ra_dec2_alt_az
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def calculate_lsst_field_visibility(
|
|
18
|
+
ra, dec, start_date, end_date, min_alt=30.0, sun_alt_limit=18.0, sample_rate=0.0007, verbose=False
|
|
19
|
+
):
|
|
20
|
+
"""Method to calculate the visibility of a given RA and Dec from LSST
|
|
21
|
+
over the course of a year
|
|
22
|
+
|
|
23
|
+
Adapted from an example in the Astropy docs.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
ra : `float`
|
|
28
|
+
RA in decimal degrees.
|
|
29
|
+
dec : `float`
|
|
30
|
+
Declination in decimal degrees
|
|
31
|
+
start_date : `astropy.time.Time`
|
|
32
|
+
Start date for calculations
|
|
33
|
+
end_date : `astropy.time.Time`
|
|
34
|
+
End date for calculations
|
|
35
|
+
min_alt : `float`, optional
|
|
36
|
+
Minimal altitude for field
|
|
37
|
+
sun_alt_limit : `float`, optional
|
|
38
|
+
Maximum sun altitude to consider for visibility
|
|
39
|
+
sample_rate : `float`, optional
|
|
40
|
+
Time spacing between visibility tests (days)
|
|
41
|
+
verbose : `bool`, optional
|
|
42
|
+
Output extra information, including debugging
|
|
43
|
+
"""
|
|
44
|
+
field = SkyCoord(ra, dec, frame="icrs", unit=(u.deg, u.deg))
|
|
45
|
+
|
|
46
|
+
lsst_site = Site("LSST")
|
|
47
|
+
lsst = EarthLocation(
|
|
48
|
+
lat=lsst_site.latitude * u.deg,
|
|
49
|
+
lon=lsst_site.longitude * u.deg,
|
|
50
|
+
height=lsst_site.height * u.m,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
total_time_visible = 0.0
|
|
54
|
+
|
|
55
|
+
dates = np.arange(start_date, end_date, TimeDelta(1, format="jd", scale="tai"))
|
|
56
|
+
|
|
57
|
+
target_alts = []
|
|
58
|
+
hrs_visible_per_night = []
|
|
59
|
+
hrs_per_night = []
|
|
60
|
+
|
|
61
|
+
for d in dates:
|
|
62
|
+
intervals = np.arange(0.0, 1.0, sample_rate)
|
|
63
|
+
|
|
64
|
+
dt = TimeDelta(intervals, format="jd", scale="tai")
|
|
65
|
+
|
|
66
|
+
ts = d + dt
|
|
67
|
+
|
|
68
|
+
frame = AltAz(obstime=ts, location=lsst)
|
|
69
|
+
|
|
70
|
+
altaz = field.transform_to(frame)
|
|
71
|
+
|
|
72
|
+
alts = np.array((altaz.alt * u.deg).value)
|
|
73
|
+
|
|
74
|
+
idx = np.where(alts >= min_alt)[0]
|
|
75
|
+
|
|
76
|
+
sun_altaz = get_sun(ts).transform_to(frame)
|
|
77
|
+
|
|
78
|
+
sun_alts = np.array((sun_altaz.alt * u.deg).value)
|
|
79
|
+
|
|
80
|
+
jdx = np.where(sun_alts < sun_alt_limit)[0]
|
|
81
|
+
# Hours available in the sun
|
|
82
|
+
hrs_per_night.append(sample_rate * len(sun_alts[jdx]) * 24.0)
|
|
83
|
+
# The indexes where sun down and target above min_alt
|
|
84
|
+
idx = list(set(idx).intersection(set(jdx)))
|
|
85
|
+
# The highest altitude for the target, when the sun is down
|
|
86
|
+
target_alts.append(alts[jdx].max())
|
|
87
|
+
|
|
88
|
+
if len(idx) > 0:
|
|
89
|
+
ts_vis = ts[idx]
|
|
90
|
+
|
|
91
|
+
tvis = sample_rate * len(ts_vis)
|
|
92
|
+
|
|
93
|
+
total_time_visible += tvis
|
|
94
|
+
|
|
95
|
+
if verbose:
|
|
96
|
+
print("Target visible from LSST for " + str(round(tvis * 24.0, 2)) + "hrs on " + d.isot)
|
|
97
|
+
# Hours of visibility of the target on this night
|
|
98
|
+
hrs_visible_per_night.append((tvis * 24.0))
|
|
99
|
+
|
|
100
|
+
else:
|
|
101
|
+
# target_alts.append(-1e5)
|
|
102
|
+
hrs_visible_per_night.append(0.0)
|
|
103
|
+
|
|
104
|
+
if verbose:
|
|
105
|
+
print("Target not visible from LSST on " + d.isot)
|
|
106
|
+
|
|
107
|
+
return np.array(total_time_visible), np.array(hrs_visible_per_night)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def calculate_lsst_field_visibility_fast(
|
|
111
|
+
ra,
|
|
112
|
+
dec,
|
|
113
|
+
start_date,
|
|
114
|
+
end_date,
|
|
115
|
+
min_alt=30.0,
|
|
116
|
+
sun_alt_limit=18.0,
|
|
117
|
+
sample_rate=0.0007,
|
|
118
|
+
):
|
|
119
|
+
"""Method to calculate the visibility of a given RA and Dec from LSST
|
|
120
|
+
over the course of a year
|
|
121
|
+
|
|
122
|
+
Skips astropy calculation of alt/az which is slow and uses
|
|
123
|
+
approximate transform from rubin_scheduler.
|
|
124
|
+
|
|
125
|
+
Parameters
|
|
126
|
+
----------
|
|
127
|
+
ra : `float`
|
|
128
|
+
RA in decimal degrees.
|
|
129
|
+
dec : `float`
|
|
130
|
+
Declination in decimal degrees
|
|
131
|
+
start_date : `astropy.time.Time`
|
|
132
|
+
Start date for calculations
|
|
133
|
+
end_date : `astropy.time.Time`
|
|
134
|
+
End date for calculations
|
|
135
|
+
min_alt : `float`, optional
|
|
136
|
+
Minimal altitude for field
|
|
137
|
+
sun_alt_limit : `float`, optional
|
|
138
|
+
Maximum sun altitude to consider for visibility
|
|
139
|
+
cadence : `float`, optional
|
|
140
|
+
Time spacing between visibility tests (days)
|
|
141
|
+
|
|
142
|
+
Returns
|
|
143
|
+
-------
|
|
144
|
+
tvisible : `float`
|
|
145
|
+
Total time target is visible (days)
|
|
146
|
+
dates_visible : `np.ndarray`, (N,)
|
|
147
|
+
Dates that target is above min_alt and sun is below sun_alt_limit,
|
|
148
|
+
within start_date to end_date.
|
|
149
|
+
"""
|
|
150
|
+
lsst_site = Site("LSST")
|
|
151
|
+
|
|
152
|
+
dates = np.arange(start_date.mjd, end_date.mjd + sample_rate / 2.0, sample_rate)
|
|
153
|
+
|
|
154
|
+
alts, _ = approx_ra_dec2_alt_az(ra, dec, lsst_site.latitude, lsst_site.longitude, dates)
|
|
155
|
+
# where is the target above the minimum altitude
|
|
156
|
+
target_high = np.where(alts >= min_alt)[0]
|
|
157
|
+
|
|
158
|
+
# when is the sun above the sun_alt_limit
|
|
159
|
+
dates = dates[target_high]
|
|
160
|
+
sun_locs = get_sun(Time(dates, format="mjd", scale="utc"))
|
|
161
|
+
sun_alts, _ = approx_ra_dec2_alt_az(
|
|
162
|
+
sun_locs.ra.deg, sun_locs.dec.deg, lsst_site.latitude, lsst_site.longitude, dates
|
|
163
|
+
)
|
|
164
|
+
sun_low = np.where(sun_alts <= sun_alt_limit)[0]
|
|
165
|
+
|
|
166
|
+
dates = dates[sun_low]
|
|
167
|
+
# total amount of time target is visible, in days
|
|
168
|
+
tvisible = len(dates) * sample_rate
|
|
169
|
+
|
|
170
|
+
return tvisible, dates
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
import rubin_sim.maf.metrics as metrics
|
|
4
|
+
from rubin_sim.maf.maf_contrib.lss_obs_strategy.galaxy_counts_metric_extended import (
|
|
5
|
+
GalaxyCountsMetricExtended as GalaxyCountsMetric,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DepthLimitedNumGalMetric(metrics.BaseMetric):
|
|
10
|
+
"""This metric calculates the number of galaxies while accounting for the
|
|
11
|
+
extragalactic footprint.
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
m5_col : `str`, optional
|
|
16
|
+
Name of column for depth in the data. Default: 'fiveSigmaDepth'
|
|
17
|
+
filter_col : `str`, optional
|
|
18
|
+
Name of column for filter in the data. Default: 'filter'
|
|
19
|
+
maps : `list` [`str`], optional
|
|
20
|
+
List of map names. Default: ['DustMap']
|
|
21
|
+
nside : `int`, optional
|
|
22
|
+
HEALpix resolution parameter. Default: 256.
|
|
23
|
+
This should match slicer nside.
|
|
24
|
+
filter_band : `str`, optional
|
|
25
|
+
Filter to use to calculate galaxy counts.
|
|
26
|
+
Any one of 'u', 'g', 'r', 'i', 'z', 'y'. Default: 'i'
|
|
27
|
+
redshiftBin: `str`, optional
|
|
28
|
+
options include '0.<z<0.15', '0.15<z<0.37', '0.37<z<0.66, '0.66<z<1.0',
|
|
29
|
+
'1.0<z<1.5', '1.5<z<2.0', '2.0<z<2.5', '2.5<z<3.0','3.0<z<3.5',
|
|
30
|
+
'3.5<z<4.0', 'all' for no redshift restriction
|
|
31
|
+
(so consider 0.<z<4.0)
|
|
32
|
+
Default: 'all'
|
|
33
|
+
nfilters_needed : `int`, optional
|
|
34
|
+
Number of filters in which to require coverage. Default: 6
|
|
35
|
+
lim_mag_i_ptsrc : `float`, optional
|
|
36
|
+
Point-source limiting mag for the i-band coadded dust-corrected depth.
|
|
37
|
+
Default: 26.0
|
|
38
|
+
lim_ebv : `float`, optional
|
|
39
|
+
Limiting EBV value. Default: 0.2
|
|
40
|
+
|
|
41
|
+
Returns
|
|
42
|
+
-------
|
|
43
|
+
ngal : `float`
|
|
44
|
+
Number of galaxies in healpix if the slice_point passes the
|
|
45
|
+
extragalactic cuts; otherwise self.badval
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
m5_col="fiveSigmaDepth",
|
|
51
|
+
filter_col="band",
|
|
52
|
+
nside=128,
|
|
53
|
+
filter_band="i",
|
|
54
|
+
redshift_bin="all",
|
|
55
|
+
nfilters_needed=6,
|
|
56
|
+
lim_mag_i_ptsrc=26.0,
|
|
57
|
+
lim_ebv=0.2,
|
|
58
|
+
metric_name="DepthLimitedNumGalaxiesMetric",
|
|
59
|
+
units="Galaxy Counts",
|
|
60
|
+
**kwargs,
|
|
61
|
+
):
|
|
62
|
+
self.m5_col = m5_col
|
|
63
|
+
self.filter_col = filter_col
|
|
64
|
+
self.filter_band = filter_band
|
|
65
|
+
# set up the extended source limiting mag
|
|
66
|
+
# galaxies are x2 as seeing: seeing is generally 0.7arcsec
|
|
67
|
+
# and a typical galaxies is 1arcsec
|
|
68
|
+
# => for extended source limiting mag of x, we'd need x + 0.7
|
|
69
|
+
# as the point-source limiting mag;
|
|
70
|
+
# 0.7 comes from $\sqrt{1/2}$;
|
|
71
|
+
# basically have x2 difference in magnitudes between
|
|
72
|
+
# point source and extended source.
|
|
73
|
+
lim_mag_i_extsrc = lim_mag_i_ptsrc - 0.7
|
|
74
|
+
# set up the metric for galaxy counts
|
|
75
|
+
self.galmetric = GalaxyCountsMetric(
|
|
76
|
+
m5_col=self.m5_col,
|
|
77
|
+
nside=nside,
|
|
78
|
+
upper_mag_limit=lim_mag_i_extsrc,
|
|
79
|
+
include_dust_extinction=True,
|
|
80
|
+
filter_band=self.filter_band,
|
|
81
|
+
redshift_bin=redshift_bin,
|
|
82
|
+
cfht_ls_counts=False,
|
|
83
|
+
normalized_mock_catalog_counts=True,
|
|
84
|
+
)
|
|
85
|
+
# set up the metric for extragalactic footprint
|
|
86
|
+
self.eg_metric = metrics.ExgalM5WithCuts(
|
|
87
|
+
m5_col=self.m5_col,
|
|
88
|
+
filter_col=self.filter_col,
|
|
89
|
+
lsst_filter=self.filter_band,
|
|
90
|
+
n_filters=nfilters_needed,
|
|
91
|
+
extinction_cut=lim_ebv,
|
|
92
|
+
depth_cut=lim_mag_i_ptsrc,
|
|
93
|
+
)
|
|
94
|
+
maps = self.eg_metric.maps + self.galmetric.maps
|
|
95
|
+
maps = set(maps)
|
|
96
|
+
super().__init__(
|
|
97
|
+
col=[self.m5_col, self.filter_col], maps=maps, metric_name=metric_name, units=units, **kwargs
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
def run(self, data_slice, slice_point=None):
|
|
101
|
+
# see if this slice_point is in the extragalactic footprint
|
|
102
|
+
pass_egcuts = self.eg_metric.run(data_slice, slice_point=slice_point)
|
|
103
|
+
|
|
104
|
+
if pass_egcuts == self.badval: # failed dust/depth cuts
|
|
105
|
+
return self.badval
|
|
106
|
+
|
|
107
|
+
# Otherwise, find the galaxy counts
|
|
108
|
+
in_filt = np.where(data_slice[self.filter_col] == self.filter_band)[0]
|
|
109
|
+
return self.galmetric.run(data_slice[in_filt], slice_point=slice_point)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Example of a new metric added to the repo.
|
|
2
|
+
# ljones@astro.washington.edu
|
|
3
|
+
|
|
4
|
+
__all__ = ("NightsWithNFiltersMetric",)
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
from rubin_sim.maf.metrics import BaseMetric
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class NightsWithNFiltersMetric(BaseMetric):
|
|
12
|
+
"""Count how many times more than NFilters are used within the same night,
|
|
13
|
+
for this set of visits.
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
n_filters : `int`, optional
|
|
18
|
+
How many filters to look for, within the same night.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, night_col="night", filter_col="filter", n_filters=3, **kwargs):
|
|
22
|
+
"""
|
|
23
|
+
night_col = the name of the column defining the night
|
|
24
|
+
filter_col = the name of the column defining the filter
|
|
25
|
+
n_filters = the minimum desired set of filters used in these visits
|
|
26
|
+
"""
|
|
27
|
+
self.night_col = night_col
|
|
28
|
+
self.filter_col = filter_col
|
|
29
|
+
self.n_filters = n_filters
|
|
30
|
+
super(NightsWithNFiltersMetric, self).__init__(col=[self.night_col, self.filter_col], **kwargs)
|
|
31
|
+
|
|
32
|
+
def run(self, data_slice, slice_point=None):
|
|
33
|
+
count = 0
|
|
34
|
+
unique_nights = np.unique(data_slice[self.night_col])
|
|
35
|
+
for n in unique_nights:
|
|
36
|
+
condition = data_slice[self.night_col] == n
|
|
37
|
+
unique_filters = np.unique(data_slice[self.filter_col][condition])
|
|
38
|
+
if len(unique_filters) > self.n_filters:
|
|
39
|
+
count += 1
|
|
40
|
+
return count
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
__all__ = ("FilterPairTGapsMetric",)
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from ..metrics.base_metric import BaseMetric
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class FilterPairTGapsMetric(BaseMetric):
|
|
9
|
+
"""Figure of merit to measure the coverage the time gaps in same
|
|
10
|
+
and different filter pairs;
|
|
11
|
+
|
|
12
|
+
FoM is defined as sum of Nv / standard deviation after a clip;
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
fltpairs : `list` [`str`], optional
|
|
17
|
+
List of filter pair sets to search for.
|
|
18
|
+
mag_lim : `list` [`float`]
|
|
19
|
+
FiveSigmaDepth threshold each filter,
|
|
20
|
+
default {'u':18, 'g':18, 'r':18, 'i':18, 'z':18, 'y':18}
|
|
21
|
+
bins_same : `np.ndarray`, (N,)
|
|
22
|
+
Bins to get histogram for same-filter pair.
|
|
23
|
+
bins_diff : `np.ndarray`, (N,)
|
|
24
|
+
Bins to get histogram for diff-filter pair.
|
|
25
|
+
nv_clip : `int`, optional
|
|
26
|
+
Number of visits of pairs to clip, std is calculated below nv_clip.
|
|
27
|
+
allgaps : `bool``, optional
|
|
28
|
+
All possible pairs if True, else consider only nearest
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
result : `float`
|
|
33
|
+
sum of fom for all filterpairs,
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
mjd_col="observationStartMJD",
|
|
39
|
+
filter_col="filter",
|
|
40
|
+
m5_col="fiveSigmaDepth",
|
|
41
|
+
fltpairs=[
|
|
42
|
+
"uu",
|
|
43
|
+
"ug",
|
|
44
|
+
"ur",
|
|
45
|
+
"ui",
|
|
46
|
+
"uz",
|
|
47
|
+
"uy",
|
|
48
|
+
"gg",
|
|
49
|
+
"gr",
|
|
50
|
+
"gi",
|
|
51
|
+
"gz",
|
|
52
|
+
"gy",
|
|
53
|
+
"rr",
|
|
54
|
+
"ri",
|
|
55
|
+
"rz",
|
|
56
|
+
"ry",
|
|
57
|
+
"ii",
|
|
58
|
+
"iz",
|
|
59
|
+
"iy",
|
|
60
|
+
"zz",
|
|
61
|
+
"zy",
|
|
62
|
+
"yy",
|
|
63
|
+
],
|
|
64
|
+
mag_lim={"u": 18, "g": 18, "r": 18, "i": 18, "z": 18, "y": 18},
|
|
65
|
+
bins_same=np.logspace(np.log10(5 / 60 / 60 / 24), np.log10(3650), 50),
|
|
66
|
+
bins_diff=np.logspace(np.log10(5 / 60 / 60 / 24), np.log10(2), 50),
|
|
67
|
+
nv_clip={
|
|
68
|
+
"uu": 30,
|
|
69
|
+
"ug": 30,
|
|
70
|
+
"ur": 30,
|
|
71
|
+
"ui": 30,
|
|
72
|
+
"uz": 30,
|
|
73
|
+
"uy": 30,
|
|
74
|
+
"gg": 69,
|
|
75
|
+
"gr": 30,
|
|
76
|
+
"gi": 30,
|
|
77
|
+
"gz": 30,
|
|
78
|
+
"gy": 30,
|
|
79
|
+
"rr": 344,
|
|
80
|
+
"ri": 30,
|
|
81
|
+
"rz": 30,
|
|
82
|
+
"ry": 30,
|
|
83
|
+
"ii": 355,
|
|
84
|
+
"iz": 30,
|
|
85
|
+
"iy": 30,
|
|
86
|
+
"zz": 282,
|
|
87
|
+
"zy": 30,
|
|
88
|
+
"yy": 288,
|
|
89
|
+
},
|
|
90
|
+
allgaps=True,
|
|
91
|
+
**kwargs,
|
|
92
|
+
):
|
|
93
|
+
self.mjd_col = mjd_col
|
|
94
|
+
self.filter_col = filter_col
|
|
95
|
+
self.m5_col = m5_col
|
|
96
|
+
self.fltpairs = fltpairs
|
|
97
|
+
self.mag_lim = mag_lim
|
|
98
|
+
self.bins_same = bins_same
|
|
99
|
+
self.bins_diff = bins_diff
|
|
100
|
+
|
|
101
|
+
self.allgaps = allgaps
|
|
102
|
+
|
|
103
|
+
# number of visits to clip, default from 1/10th of baseline_v2.0 WFD
|
|
104
|
+
self.nv_clip = nv_clip
|
|
105
|
+
|
|
106
|
+
super().__init__(col=[self.mjd_col, self.filter_col, self.m5_col], **kwargs)
|
|
107
|
+
|
|
108
|
+
def _get_d_t(self, data_slice, f0, f1):
|
|
109
|
+
# select
|
|
110
|
+
idx0 = (data_slice[self.filter_col] == f0) & (data_slice[self.m5_col] > self.mag_lim[f0])
|
|
111
|
+
idx1 = (data_slice[self.filter_col] == f1) & (data_slice[self.m5_col] > self.mag_lim[f1])
|
|
112
|
+
|
|
113
|
+
time_col0 = data_slice[self.mjd_col][idx0]
|
|
114
|
+
time_col1 = data_slice[self.mjd_col][idx1]
|
|
115
|
+
|
|
116
|
+
# time_col0 = time_col0.reshape((len(time_col0), 1))
|
|
117
|
+
# time_col1 = time_col1.reshape((len(time_col1), 1))
|
|
118
|
+
|
|
119
|
+
# calculate time gaps matrix
|
|
120
|
+
# diffmat = np.subtract(time_col0, time_col1.T)
|
|
121
|
+
|
|
122
|
+
if self.allgaps:
|
|
123
|
+
# collect all time gaps
|
|
124
|
+
if f0 == f1:
|
|
125
|
+
time_col0 = time_col0.reshape((len(time_col0), 1))
|
|
126
|
+
time_col1 = time_col1.reshape((len(time_col1), 1))
|
|
127
|
+
|
|
128
|
+
diffmat = np.subtract(time_col0, time_col1.T)
|
|
129
|
+
diffmat = np.abs(diffmat)
|
|
130
|
+
# get only triangle part
|
|
131
|
+
dt_tri = np.tril(diffmat, -1)
|
|
132
|
+
d_t = dt_tri[dt_tri != 0] # flatten lower triangle
|
|
133
|
+
else:
|
|
134
|
+
# d_t = diffmat.flatten()
|
|
135
|
+
dtmax = np.max(self.bins_diff)
|
|
136
|
+
# time gaps window for measure color
|
|
137
|
+
d_t = []
|
|
138
|
+
for time_col in time_col0:
|
|
139
|
+
time_col_in_window = time_col1[
|
|
140
|
+
(time_col1 >= (time_col - dtmax)) & (time_col1 <= (time_col + dtmax))
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
d_t.append(np.abs(time_col_in_window - time_col))
|
|
144
|
+
|
|
145
|
+
d_t = np.concatenate(d_t) if len(d_t) > 0 else np.array(d_t)
|
|
146
|
+
else:
|
|
147
|
+
# collect only nearest
|
|
148
|
+
if f0 == f1:
|
|
149
|
+
# get diagonal ones nearest nonzero, offset=1
|
|
150
|
+
# d_t = np.diagonal(diffmat, offset=1)
|
|
151
|
+
d_t = np.diff(time_col0)
|
|
152
|
+
else:
|
|
153
|
+
time_col0 = data_slice[self.mjd_col][idx0]
|
|
154
|
+
time_col1 = data_slice[self.mjd_col][idx1]
|
|
155
|
+
|
|
156
|
+
time_col0 = time_col0.reshape((len(time_col0), 1))
|
|
157
|
+
time_col1 = time_col1.reshape((len(time_col1), 1))
|
|
158
|
+
|
|
159
|
+
# calculate time gaps matrix
|
|
160
|
+
diffmat = np.subtract(time_col0, time_col1.T)
|
|
161
|
+
# get tgaps both left and right
|
|
162
|
+
# keep only negative ones
|
|
163
|
+
masked_ar = np.ma.masked_where(
|
|
164
|
+
diffmat >= 0,
|
|
165
|
+
diffmat,
|
|
166
|
+
)
|
|
167
|
+
left_ar = np.max(masked_ar, axis=1)
|
|
168
|
+
d_t_left = -left_ar.data[~left_ar.mask]
|
|
169
|
+
|
|
170
|
+
# keep only positive ones
|
|
171
|
+
masked_ar = np.ma.masked_where(diffmat <= 0, diffmat)
|
|
172
|
+
right_ar = np.min(masked_ar, axis=1)
|
|
173
|
+
d_t_right = right_ar.data[~right_ar.mask]
|
|
174
|
+
|
|
175
|
+
d_t = np.concatenate([d_t_left.flatten(), d_t_right.flatten()])
|
|
176
|
+
|
|
177
|
+
return d_t
|
|
178
|
+
|
|
179
|
+
def run(self, data_slice, slice_point=None):
|
|
180
|
+
# sort the data_slice in order of time.
|
|
181
|
+
data_slice.sort(order=self.mjd_col)
|
|
182
|
+
|
|
183
|
+
fom_dic = {}
|
|
184
|
+
d_t_dic = {}
|
|
185
|
+
for fltpair in self.fltpairs:
|
|
186
|
+
d_t = self._get_d_t(data_slice, fltpair[0], fltpair[1])
|
|
187
|
+
# calculate FoM
|
|
188
|
+
# cut out at average
|
|
189
|
+
# std below
|
|
190
|
+
# FOM = Nv / std
|
|
191
|
+
|
|
192
|
+
if fltpair[0] == fltpair[1]:
|
|
193
|
+
bins = self.bins_same
|
|
194
|
+
else:
|
|
195
|
+
bins = self.bins_diff
|
|
196
|
+
d_t_dic[fltpair] = d_t
|
|
197
|
+
|
|
198
|
+
hist, _ = np.histogram(d_t, bins=bins)
|
|
199
|
+
|
|
200
|
+
if np.any(hist):
|
|
201
|
+
hist_clip = np.clip(hist, a_min=0, a_max=self.nv_clip[fltpair])
|
|
202
|
+
fom = hist.sum() / hist_clip.std()
|
|
203
|
+
else:
|
|
204
|
+
fom = np.nan
|
|
205
|
+
fom_dic[fltpair] = fom
|
|
206
|
+
# print( fltpair, fom)
|
|
207
|
+
|
|
208
|
+
return np.nansum(list(fom_dic.values()))
|