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 <aocommon/recursivefor.h>
17 
18 #include <schaapcommon/h5parm/h5cache.h>
19 #include <schaapcommon/h5parm/jonesparameters.h>
20 
21 #include "common/ParameterSet.h"
22 
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 initializeInitialSolutionsH5Parm(const common::ParameterSet& parset,
76  const std::string& prefix);
77  void initializeIDG(const common::ParameterSet& parset,
78  const std::string& prefix);
79  void initializePredictSteps(const common::ParameterSet& parset,
80  const std::string& prefix);
81 
82  void setModelNextSteps(Step&, const std::string& direction,
83  const common::ParameterSet& parset,
84  const std::string& prefix) const;
85 
86  void doPrepare();
87 
92  void InitializeSolutions(size_t buffer_index);
93 
95  void WriteSolutions();
96 
100  void SumModels(size_t buffer_index);
101 
104  void ApplySolution(
105  base::DPBuffer& buffer, size_t baseline, size_t channel,
106  const std::vector<std::complex<double>>& channel_block_solutions) const;
107 
113  void CorrectAndSubtractModels(size_t buffer_index);
114 
117  xt::xtensor<std::complex<float>, 3> ReadJonesMatrixFromH5Parm(
118  const base::Direction& direction, double timestamp,
119  schaapcommon::h5parm::GainType gain_type,
120  schaapcommon::h5parm::SolTab* first_soltab,
121  schaapcommon::h5parm::SolTab* second_soltab);
122 
123  ddecal::Settings settings_;
124 
127  std::vector<std::vector<std::unique_ptr<base::DPBuffer>>> input_buffers_;
132  xt::xtensor<bool, 5> original_flags_;
133 
135  double average_time_;
136 
140  std::vector<std::vector<std::vector<casacore::DComplex>>> solutions_;
141  std::vector<size_t> n_iterations_; // Number of iterations taken
142  std::vector<size_t> n_approximating_iterations_;
143 
146  std::vector<std::vector<std::vector<ddecal::ConstraintResult>>>
147  constraint_solutions_;
148 
149  std::unique_ptr<ddecal::SolutionWriter> solution_writer_;
150 
153  size_t requested_solution_interval_;
154  size_t n_solution_intervals_;
156  size_t first_solution_index_;
157  size_t n_channels_;
159  std::vector<std::pair<size_t, size_t>> visibilities_in_interval_;
162  std::vector<size_t> channel_block_start_;
163  std::vector<double> channel_block_frequencies_;
165  std::vector<std::vector<std::string>> patches_per_direction_;
167  std::vector<std::string> direction_names_;
169  std::vector<std::string> reused_direction_names_;
171  std::vector<base::Direction> source_directions_;
172 
174  std::vector<int> antennas1_;
176  std::vector<int> antennas2_;
177  std::vector<double> weights_per_antenna_;
178 
179  UVWFlagger uvw_flag_step_;
181  std::shared_ptr<ResultStep> data_result_step_;
184  std::vector<std::shared_ptr<ModelDataStep>> steps_;
186  std::vector<common::Fields> required_fields_;
189  std::vector<std::shared_ptr<MultiResultStep>> result_steps_;
190 
193  bool store_solution_in_buffer_;
194 
197  std::unique_ptr<schaapcommon::h5parm::H5Parm> initial_solutions_;
198  std::string initial_solutions_h5_parm_name;
199  std::vector<std::string> initial_solutions_table_;
200  std::vector<schaapcommon::h5parm::SolTab> solution_tables_;
201  bool initial_solutions_are_full_jones_;
205  schaapcommon::h5parm::JonesParameters::InterpolationType interpolation_type_;
206  schaapcommon::h5parm::JonesParameters::MissingAntennaBehavior
207  missing_antenna_behavior_;
208  std::vector<schaapcommon::h5parm::GainType> gain_types_;
210 
211  common::NSTimer timer_;
212  common::NSTimer predict_timer_;
213  common::NSTimer solve_timer_;
214  common::NSTimer write_timer_;
215  std::mutex measures_mutex_;
216  std::unique_ptr<ddecal::SolverBase> solver_;
217  std::unique_ptr<std::ofstream> statistics_stream_;
218 };
219 
220 } // namespace steps
221 } // namespace dp3
222 
223 #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:31
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