DP3
DDECal.h
Go to the documentation of this file.
1 // DDECal.h: DP3 step class to calibrate direction dependent gains
2 // Copyright (C) 2023 ASTRON (Netherlands Institute for Radio Astronomy)
3 // SPDX-License-Identifier: GPL-3.0-or-later
4 
8 
9 #ifndef DP3_STEPS_DDECAL_H_
10 #define DP3_STEPS_DDECAL_H_
11 
12 #include <fstream>
13 #include <string>
14 #include <vector>
15 
16 #include <schaapcommon/h5parm/jonesparameters.h>
17 #include <schaapcommon/h5parm/soltab.h>
18 #include <schaapcommon/threading/recursivefor.h>
19 
20 #include "common/ParameterSet.h"
21 
23 #include "ddecal/Settings.h"
24 #include "ddecal/SolutionWriter.h"
27 
28 #include "MultiResultStep.h"
29 #include "ResultStep.h"
30 #include "UVWFlagger.h"
31 
32 namespace dp3 {
33 namespace steps {
34 
36 class DDECal : public Step {
37  public:
40  DDECal(const common::ParameterSet& parameterSet, const std::string& prefix);
41 
42  common::Fields getRequiredFields() const override {
44  }
45 
46  common::Fields getProvidedFields() const override {
47  return (settings_.subtract ||
48  (settings_.only_predict && !settings_.keep_model_data))
49  ? kDataField
50  : common::Fields();
51  }
52 
53  bool process(std::unique_ptr<base::DPBuffer> buffer) override;
54 
55  void checkMinimumVisibilities(size_t bufferIndex);
56 
57  void flagChannelBlock(size_t cbIndex, size_t bufferIndex);
58 
60  void doSolve();
61 
63  void finish() override;
64 
65  void updateInfo(const base::DPInfo&) override;
66 
67  void show(std::ostream&) const override;
68 
69  void showTimings(std::ostream&, double duration) const override;
70 
71  private:
72  void initializeColumnReaders(const common::ParameterSet&,
73  const std::string& prefix);
74  void initializeModelReuse();
75  void initializeIDG(const common::ParameterSet& parset,
76  const std::string& prefix);
77  void initializePredictSteps(const common::ParameterSet& parset,
78  const std::string& prefix);
79 
80  void setModelNextSteps(Step&, const std::string& direction,
81  const common::ParameterSet& parset,
82  const std::string& prefix) const;
83 
84  void doPrepare();
85 
90  void InitializeSolutions(size_t buffer_index);
91 
93  void WriteSolutions();
94 
98  void SumModels(size_t buffer_index);
99 
102  void ApplySolution(
103  base::DPBuffer& buffer, size_t baseline, size_t channel,
104  const std::vector<std::complex<double>>& channel_block_solutions) const;
105 
111  void CorrectAndSubtractModels(size_t buffer_index);
112 
115  xt::xtensor<std::complex<float>, 3> ReadJonesMatrixFromH5Parm(
116  const base::Direction& direction, double timestamp,
117  schaapcommon::h5parm::GainType gain_type,
118  schaapcommon::h5parm::SolTab* first_soltab,
119  schaapcommon::h5parm::SolTab* second_soltab);
120 
121  ddecal::Settings settings_;
122 
125  std::vector<std::vector<std::unique_ptr<base::DPBuffer>>> input_buffers_;
130  xt::xtensor<bool, 5> original_flags_;
131 
133  double average_time_;
134 
138  std::vector<std::vector<std::vector<casacore::DComplex>>> solutions_;
139  std::vector<size_t> n_iterations_; // Number of iterations taken
140  std::vector<size_t> n_approximating_iterations_;
141 
144  std::vector<std::vector<std::vector<ddecal::ConstraintResult>>>
145  constraint_solutions_;
146 
147  std::unique_ptr<ddecal::SolutionWriter> solution_writer_;
148  ddecal::InitialSolutions initial_solutions_;
149 
152  size_t requested_solution_interval_;
153  size_t n_solution_intervals_;
155  size_t first_solution_index_;
156  size_t n_channels_;
158  std::vector<std::pair<size_t, size_t>> visibilities_in_interval_;
161  std::vector<size_t> channel_block_start_;
162  std::vector<double> channel_block_frequencies_;
164  std::vector<std::vector<std::string>> patches_per_direction_;
166  std::vector<std::string> direction_names_;
168  std::vector<std::string> reused_direction_names_;
170  std::vector<base::Direction> source_directions_;
171 
173  std::vector<int> antennas1_;
175  std::vector<int> antennas2_;
176  std::vector<double> weights_per_antenna_;
177 
178  UVWFlagger uvw_flag_step_;
180  std::shared_ptr<ResultStep> data_result_step_;
183  std::vector<std::shared_ptr<ModelDataStep>> steps_;
185  std::vector<common::Fields> required_fields_;
188  std::vector<std::shared_ptr<MultiResultStep>> result_steps_;
189 
192  bool store_solution_in_buffer_;
193 
194  common::NSTimer timer_;
195  common::NSTimer predict_timer_;
196  common::NSTimer solve_timer_;
197  common::NSTimer write_timer_;
198  std::mutex measures_mutex_;
199  std::unique_ptr<ddecal::SolverBase> solver_;
200  std::unique_ptr<std::ofstream> statistics_stream_;
201 };
202 
203 } // namespace steps
204 } // namespace dp3
205 
206 #endif
DP3 step class to flag data on UVW coordinates.
Buffer holding the data of a timeslot/band.
Definition: DPBuffer.h:92
General info about DP3 data processing attributes like averaging.
Definition: DPInfo.h:35
Definition: Fields.h:16
Implements a map of Key-Value pairs.
Definition: ParameterSet.h:28
Definition: InitialSolutions.h:20
This class is a Step class to calibrate (direction dependent) gains.
Definition: DDECal.h:36
void checkMinimumVisibilities(size_t bufferIndex)
bool process(std::unique_ptr< base::DPBuffer > buffer) override
void showTimings(std::ostream &, double duration) const override
void doSolve()
Call the actual solver (called once per solution interval)
void flagChannelBlock(size_t cbIndex, size_t bufferIndex)
void updateInfo(const base::DPInfo &) override
common::Fields getRequiredFields() const override
Get the fields required by the current step.
Definition: DDECal.h:42
void finish() override
Finish the processing of this step and subsequent steps.
DDECal(const common::ParameterSet &parameterSet, const std::string &prefix)
void show(std::ostream &) const override
Show the step parameters.
common::Fields getProvidedFields() const override
Definition: DDECal.h:46
Abstract base class for a DP3 step.
Definition: Step.h:52
static constexpr dp3::common::Fields kWeightsField
Definition: Step.h:64
static constexpr dp3::common::Fields kUvwField
Definition: Step.h:66
static constexpr dp3::common::Fields kDataField
Definition: Step.h:60
static constexpr dp3::common::Fields kFlagsField
Definition: Step.h:62
DP3 step class to flag data on UVW coordinates.
Definition: UVWFlagger.h:38
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53
A direction on the celestial sphere.
Definition: Direction.h:15
This struct parses the DDECal parset settings and stores them.
Definition: Settings.h:33
const bool only_predict
Definition: Settings.h:140
const bool subtract
Definition: Settings.h:141
const bool keep_model_data
Definition: Settings.h:142