DP3
PhaseFitter.h
Go to the documentation of this file.
1 // phasefitter.h: Class to perform phase fitting (TEC), allowing phase wraps
2 // Copyright (C) 2020 ASTRON (Netherlands Institute for Radio Astronomy)
3 // SPDX-License-Identifier: GPL-3.0-or-later
4 //
5 
12 #ifndef PHASE_FITTER_H
13 #define PHASE_FITTER_H
14 
15 #include <vector>
16 #include <cmath>
17 #include <cstring>
18 
40 class PhaseFitter {
41  public:
43  : _phases(), _frequencies(), _weights(), _fittingAccuracy(1e-6) {}
44 
51  PhaseFitter(size_t channelCount)
52  : _phases(channelCount, 0.0),
53  _frequencies(channelCount, 0.0),
54  _weights(channelCount, 1.0),
55  _fittingAccuracy(1e-6) {}
56 
65  void Initialize(const std::vector<double>& frequencies) {
66  _phases.assign(frequencies.size(), 0.0);
67  _frequencies = frequencies;
68  _weights.assign(frequencies.size(), 1.0);
69  }
70 
81  double FitDataToTEC2Model(double& alpha, double& beta);
82 
88  double a, b;
89  FitDataToTEC2Model(a, b);
90  }
91 
104  double FitDataToTEC2ModelWithInitialValues(double& alpha, double& beta) {
105  return FitDataToTEC2Model(alpha, beta);
106  }
107 
122  void FitTEC2ModelParameters(double& alpha, double& beta) const;
123 
134  double* PhaseData() { return _phases.data(); }
135 
140  const double* PhaseData() const { return _phases.data(); }
141 
146  const std::vector<double>& GetFrequencies() const { return _frequencies; }
147 
172  double* WeightData() { return _weights.data(); }
173 
178  const double* WeightData() const { return _weights.data(); }
179 
184  size_t Size() const { return _phases.size(); }
185 
191  double FittingAccuracy() const { return _fittingAccuracy; }
192 
197  void SetFittingAccuracy(double newAccuracy) {
198  _fittingAccuracy = newAccuracy;
199  }
200 
209  double TEC2ModelCost(double alpha, double beta) const;
210 
218  static double TEC2ModelFunc(double nu, double alpha, double beta) {
219  return alpha / nu + beta;
220  }
221 
225  double FitDataToTEC1Model(double& alpha);
226 
232  double a;
234  }
235 
243  static double TEC2ModelFuncWrapped(double nu, double alpha, double beta) {
244  return fmod(alpha / nu + beta, 2.0 * M_PI);
245  }
246 
247  double FitDataToTEC1ModelWithInitialValues(double& alpha) {
248  return FitDataToTEC1Model(alpha);
249  }
250 
251  void FitTEC1ModelParameters(double& alpha) const;
252 
260  double TEC1ModelCost(double alpha) const;
261 
267  static double TEC1ModelFuncWrapped(double nu, double alpha) {
268  return fmod(alpha / nu, 2.0 * M_PI);
269  }
270 
271  static double AlphaToTEC(double alpha) { return alpha / -8.44797245e9; }
272 
273  private:
274  std::vector<double> _phases, _frequencies, _weights;
275  double _fittingAccuracy;
276 
277  double fitTEC2ModelBeta(double alpha, double betaEstimate) const;
278  void bruteForceSearchTEC2Model(double& lowerAlpha, double& upperAlpha,
279  double& beta) const;
280  double ternarySearchTEC2ModelAlpha(double startAlpha, double endAlpha,
281  double& beta) const;
282  void fillDataWithTEC2Model(double alpha, double beta);
283  void fillDataWithTEC1Model(double alpha);
284 
285  void bruteForceSearchTEC1Model(double& lowerAlpha, double& upperAlpha) const;
286  double ternarySearchTEC1ModelAlpha(double startAlpha, double endAlpha) const;
287 };
288 
289 #endif
Phase fitter that can force phase solutions over frequency onto a TEC model.
Definition: PhaseFitter.h:40
void SetFittingAccuracy(double newAccuracy)
Definition: PhaseFitter.h:197
PhaseFitter(size_t channelCount)
Definition: PhaseFitter.h:51
double TEC1ModelCost(double alpha) const
double FitDataToTEC1ModelWithInitialValues(double &alpha)
Definition: PhaseFitter.h:247
static double AlphaToTEC(double alpha)
Definition: PhaseFitter.h:271
double FittingAccuracy() const
Definition: PhaseFitter.h:191
const double * WeightData() const
Definition: PhaseFitter.h:178
double FitDataToTEC2Model(double &alpha, double &beta)
void FitTEC2ModelParameters(double &alpha, double &beta) const
double * WeightData()
Definition: PhaseFitter.h:172
double TEC2ModelCost(double alpha, double beta) const
double FitDataToTEC1Model(double &alpha)
void Initialize(const std::vector< double > &frequencies)
Definition: PhaseFitter.h:65
static double TEC2ModelFuncWrapped(double nu, double alpha, double beta)
Definition: PhaseFitter.h:243
PhaseFitter()
Definition: PhaseFitter.h:42
double * PhaseData()
Definition: PhaseFitter.h:134
void FitTEC1ModelParameters(double &alpha) const
void FitDataToTEC2Model()
Definition: PhaseFitter.h:87
size_t Size() const
Definition: PhaseFitter.h:184
static double TEC1ModelFuncWrapped(double nu, double alpha)
Definition: PhaseFitter.h:267
static double TEC2ModelFunc(double nu, double alpha, double beta)
Definition: PhaseFitter.h:218
void FitDataToTEC1Model()
Definition: PhaseFitter.h:231
double FitDataToTEC2ModelWithInitialValues(double &alpha, double &beta)
Definition: PhaseFitter.h:104
const std::vector< double > & GetFrequencies() const
Definition: PhaseFitter.h:146
const double * PhaseData() const
Definition: PhaseFitter.h:140