DP3
Flagger.h
Go to the documentation of this file.
1 // Copyright (C) 2023 ASTRON (Netherlands Institute for Radio Astronomy)
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 
4 #ifndef DP3_ANTENNAFLAGGER_FLAGGER_H_
5 #define DP3_ANTENNAFLAGGER_FLAGGER_H_
6 
7 #include <complex>
8 #include <vector>
9 
10 #include "base/DPBuffer.h"
11 
13 #include "common/Timer.h"
14 
15 namespace dp3 {
16 namespace antennaflagger {
17 
18 /*
19  * AntennaFlagger uses statistics to find bad antennas for a visibility data
20  * set. It is based on the following Python reference code:
21  * https://github.com/transientskp/A12_pipeline/blob/master/pyscripts/calc_antflags.py
22  * and comprises four main steps:
23  * 1) Compute standard deviation and sum of squares for every baseline and
24  * correlation seperately. These statistics are integrated over frequency
25  * (channels).
26  * 2) Group the statistics per antenna by integrating over all baselines where
27  * a particular antenna is involved. These statistics are stored as class
28  * members.
29  * 3) Query these statistics to find outlier antennas.
30  * 4) Query these statistics to find outlier stations.
31  */
32 class Flagger {
33  public:
34  Flagger(size_t n_stations, size_t n_antennas_per_station, size_t n_channels,
35  size_t n_correlations)
36  : n_stations_(n_stations),
37  n_antennas_per_station_(n_antennas_per_station),
38  n_channels_(n_channels),
39  n_correlations_(n_correlations),
40  n_antennas_(n_stations * n_antennas_per_station),
41  n_baselines_(common::ComputeNBaselines(n_antennas_)) {}
42 
55  common::BaselineOrder baseline_order);
56 
65  xt::xtensor<int, 1> FindBadAntennas(float sigma, int max_iterations);
66 
76  xt::xtensor<int, 1> FindBadStations(float sigma, int max_iterations);
77 
84  static xt::xtensor<std::complex<float>, 2> ComputeStatsStdDev(
85  const dp3::base::DPBuffer::DataType& data);
86 
93  static xt::xtensor<std::complex<float>, 2> ComputeStatsSumSquare(
94  const dp3::base::DPBuffer::DataType& data);
95 
104  static xt::xtensor<std::complex<float>, 3> GroupStats(
105  size_t n_stations, size_t n_antennas_per_station,
106  const xt::xtensor<std::complex<float>, 2>& stats_baseline,
107  common::BaselineOrder baseline_order);
108 
118  static xt::xtensor<int, 2> ComputeAntennaFlags(
119  float sigma, int max_iterations,
120  const xt::xtensor<std::complex<float>, 3>& stats);
121 
132  static xt::xtensor<int, 2> ComputeStationFlags(
133  float sigma, int max_iterations,
134  const xt::xtensor<std::complex<float>, 3>& stats);
135 
136  private:
137  // Helper function
138  void AssertStatsComputed() const;
139 
140  // Constants
141  const size_t n_stations_;
142  const size_t n_antennas_per_station_;
143  const size_t n_channels_;
144  const size_t n_correlations_;
145 
146  // Derived constants
147  const size_t n_antennas_;
148  const size_t n_baselines_;
149 
150  // Timings
151  common::NSTimer compute_statistics_timer_;
152  common::NSTimer find_bad_antennas_timer_;
153  common::NSTimer find_bad_stations_timer_;
154 
155  // Data
156  xt::xtensor<std::complex<float>, 3> stats_antenna_stddev_;
157  xt::xtensor<std::complex<float>, 3> stats_antenna_sum_square_;
158 };
159 
160 } // namespace antennaflagger
161 } // namespace dp3
162 
163 #endif // DP3_ANTENNAFLAGGER_FLAGGER_H_
Buffer holding the data of a timeslot/band.
Definition: Flagger.h:32
void ComputeStats(const dp3::base::DPBuffer::DataType &data, common::BaselineOrder baseline_order)
static xt::xtensor< int, 2 > ComputeAntennaFlags(float sigma, int max_iterations, const xt::xtensor< std::complex< float >, 3 > &stats)
xt::xtensor< int, 1 > FindBadStations(float sigma, int max_iterations)
static xt::xtensor< std::complex< float >, 2 > ComputeStatsStdDev(const dp3::base::DPBuffer::DataType &data)
static xt::xtensor< std::complex< float >, 3 > GroupStats(size_t n_stations, size_t n_antennas_per_station, const xt::xtensor< std::complex< float >, 2 > &stats_baseline, common::BaselineOrder baseline_order)
static xt::xtensor< int, 2 > ComputeStationFlags(float sigma, int max_iterations, const xt::xtensor< std::complex< float >, 3 > &stats)
Flagger(size_t n_stations, size_t n_antennas_per_station, size_t n_channels, size_t n_correlations)
Definition: Flagger.h:34
static xt::xtensor< std::complex< float >, 2 > ComputeStatsSumSquare(const dp3::base::DPBuffer::DataType &data)
xt::xtensor< int, 1 > FindBadAntennas(float sigma, int max_iterations)
aocommon::xt::UTensor< std::complex< float >, 3 > DataType
Definition: DPBuffer.h:95
size_t ComputeNBaselines(size_t n_antennas)
Definition: baseline_indices.h:68
BaselineOrder
Definition: baseline_indices.h:63
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53