DP3
RotationConstraint.h
Go to the documentation of this file.
1 // Copyright (C) 2020 ASTRON (Netherlands Institute for Radio Astronomy)
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 
4 #ifndef DP3_DDECAL_ROTATION_CONSTRAINT_H_
5 #define DP3_DDECAL_ROTATION_CONSTRAINT_H_
6 
7 #include "Constraint.h"
8 
9 #include <vector>
10 #include <ostream>
11 
12 namespace dp3::ddecal {
13 
14 class RotationConstraint final : public Constraint {
15  public:
16  RotationConstraint() = default;
17 
18  void Apply(SolutionSpan& solutions, double time) override;
19 
20  void Initialize(size_t n_antennas,
21  const std::vector<uint32_t>& solutions_per_direction,
22  const std::vector<double>& frequencies) override;
23 
24  void SetWeights(const std::vector<double>& weights) override;
25 
26  std::vector<ConstraintResult> GetResult() const override { return results_; }
27 
28  /* Compute the rotation from a 2x2 full jones solution */
29  static double FitRotation(const std::complex<double>* data) {
30  // Convert to circular
31  const dcomplex i(0, 1.);
32 
33  const dcomplex ll = data[0] + data[3] + i * (data[2] - data[1]);
34  const dcomplex rr = data[0] + data[3] + i * (data[1] - data[2]);
35  const double angle = 0.5 * (std::arg(ll) - std::arg(rr));
36 
37  return angle;
38  }
39 
40  static void SetRotation(std::complex<double>* data, double angle) {
41  data[0] = std::cos(angle);
42  data[1] = -std::sin(angle);
43  data[2] = -data[1];
44  data[3] = data[0];
45  }
46 
47  private:
48  std::vector<ConstraintResult> results_;
49 };
50 
51 } // namespace dp3::ddecal
52 
53 #endif
This class is the base class for classes that implement a constraint on calibration solutions....
Definition: Constraint.h:27
std::complex< double > dcomplex
Definition: Constraint.h:29
Definition: RotationConstraint.h:14
static void SetRotation(std::complex< double > *data, double angle)
Definition: RotationConstraint.h:40
void SetWeights(const std::vector< double > &weights) override
std::vector< ConstraintResult > GetResult() const override
Definition: RotationConstraint.h:26
void Initialize(size_t n_antennas, const std::vector< uint32_t > &solutions_per_direction, const std::vector< double > &frequencies) override
static double FitRotation(const std::complex< double > *data)
Definition: RotationConstraint.h:29
void Apply(SolutionSpan &solutions, double time) override
Definition: AmplitudeOnlyConstraint.h:12
aocommon::xt::Span< std::complex< double >, 4 > SolutionSpan
Definition: Solutions.h:20