DP3
ApplyBeam.h
Go to the documentation of this file.
1 // ApplyBeam.h: DP3 step class to ApplyBeam visibilities from a source model
2 // Copyright (C) 2022 ASTRON (Netherlands Institute for Radio Astronomy)
3 // SPDX-License-Identifier: GPL-3.0-or-later
4 
8 
9 #ifndef DP3_STEPS_APPLYBEAM_H_
10 #define DP3_STEPS_APPLYBEAM_H_
11 
12 #include "InputStep.h"
13 
14 #include "base/DPBuffer.h"
15 
16 #include <barrier>
17 
18 #include <EveryBeam/telescope/telescope.h>
19 
20 #include <aocommon/matrix2x2.h>
21 #include <aocommon/xt/utensor.h>
22 
23 #include <casacore/casa/Arrays/Cube.h>
24 #include <casacore/measures/Measures/MDirection.h>
25 
26 #include "common/ParameterSet.h"
27 
28 namespace dp3 {
29 namespace steps {
30 
32 size_t ComputeBeam(const base::DPInfo& info, double time,
33  const everybeam::vector3r_t& srcdir,
34  const everybeam::telescope::Telescope* telescope,
35  aocommon::MC2x2* beam_values, bool invert,
36  everybeam::BeamMode mode, std::mutex* mutex,
37  const std::vector<size_t>& skip_station_indices);
38 
40 size_t ComputeArrayFactor(const base::DPInfo& info, double time,
41  const everybeam::vector3r_t& srcdir,
42  const everybeam::telescope::Telescope* telescope,
43  std::complex<double>* beam_values, bool invert,
44  std::mutex* mutex,
45  const std::vector<size_t>& skip_station_indices);
46 
58  const base::DPInfo& info, size_t n_stations,
59  const aocommon::xt::UTensor<std::complex<double>, 3>& data,
60  aocommon::xt::UTensor<std::complex<double>, 3>& model_data,
61  const aocommon::MC2x2* beam_values);
62 
77  const base::DPInfo& info, size_t n_stations,
78  const aocommon::xt::UTensor<std::complex<double>, 3>& data,
79  aocommon::xt::UTensor<std::complex<double>, 3>& model_data,
80  const std::complex<double>* beam_values);
81 
83 
87 
88 class ApplyBeam final : public Step {
89  public:
92  ApplyBeam(const common::ParameterSet&, const std::string& prefix,
93  bool substep = false);
94 
95  common::Fields getRequiredFields() const override {
96  common::Fields fields = kDataField;
97  if (itsUpdateWeights) fields |= kWeightsField;
98  return fields;
99  }
100 
102  common::Fields fields = kDataField;
103  if (itsUpdateWeights) fields |= kWeightsField;
104  return fields;
105  }
106 
107  bool process(std::unique_ptr<base::DPBuffer> buffer) override {
108  if (use_model_data_) {
109  return ProcessModelData(std::move(buffer));
110  } else {
111  return ProcessData(std::move(buffer));
112  }
113  }
114 
116  void finish() override;
117 
119  void updateInfo(const base::DPInfo&) override;
120 
122  void show(std::ostream&) const override;
123 
125  void showTimings(std::ostream&, double duration) const override;
126 
127  bool invert() { return itsInvert; }
128 
136  const base::DPInfo& info, double time, std::complex<double>* data0,
137  float* weight0, const everybeam::vector3r_t& srcdir,
138  const everybeam::telescope::Telescope* telescope,
139  aocommon::MC2x2* beam_values,
140  const std::pair<size_t, size_t>& baseline_range,
141  const std::pair<size_t, size_t>& station_range, std::barrier<>& barrier,
142  bool invert, everybeam::BeamMode mode, bool do_update_weights = false,
143  std::mutex* mutex = nullptr,
144  const std::vector<size_t>& skip_station_indices = std::vector<size_t>());
145 
150  const base::DPInfo& info, double time, std::complex<double>* data0,
151  const everybeam::vector3r_t& srcdir,
152  const everybeam::telescope::Telescope* telescope,
153  std::complex<double>* beam_values,
154  const std::pair<size_t, size_t>& baseline_range,
155  const std::pair<size_t, size_t>& station_range, std::barrier<>& barrier,
156  bool invert, everybeam::BeamMode mode, std::mutex* mutex = nullptr,
157  const std::vector<size_t>& skip_station_indices = std::vector<size_t>());
158 
159  private:
160  everybeam::vector3r_t dir2Itrf(const casacore::MDirection& dir,
161  casacore::MDirection::Convert& measConverter);
162  bool ProcessData(std::unique_ptr<base::DPBuffer> buffer);
163  bool ProcessModelData(std::unique_ptr<base::DPBuffer> buffer);
164 
165  string itsName;
166  bool itsInvert;
167  bool itsUpdateWeights;
168  std::vector<std::string> itsDirectionStr;
169  casacore::MDirection itsDirection;
170  bool itsUseChannelFreq;
171  std::vector<std::string> itsSkipStationNames;
172  std::vector<size_t> itsSkipStationIndices;
173  everybeam::BeamMode itsMode;
174  everybeam::ElementResponseModel itsElementResponseModel;
175  std::string coefficients_path_;
176 
180  casacore::MDirection itsDirectionAtStart;
181  everybeam::BeamMode itsModeAtStart = everybeam::BeamMode::kNone;
183 
184  unsigned int itsDebugLevel;
185 
188  std::unique_ptr<everybeam::telescope::Telescope> telescope_;
189  casacore::MeasFrame measure_frame_;
190  casacore::MDirection::Convert measure_converter_;
191  std::vector<aocommon::MC2x2> beam_values_;
192  std::vector<size_t> ant_to_msindex_;
193  bool use_model_data_;
195 
196  common::NSTimer itsTimer;
197 };
198 
199 } // namespace steps
200 } // namespace dp3
201 
202 #endif
Buffer holding the data of a timeslot/band.
Abstract base class for a Step generating input.
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
DP3 step class to ApplyBeam visibilities from a source model.
Definition: ApplyBeam.h:88
void showTimings(std::ostream &, double duration) const override
Show the timings.
bool process(std::unique_ptr< base::DPBuffer > buffer) override
Definition: ApplyBeam.h:107
static void ApplyBaselineBasedBeam(const base::DPInfo &info, double time, std::complex< double > *data0, float *weight0, const everybeam::vector3r_t &srcdir, const everybeam::telescope::Telescope *telescope, aocommon::MC2x2 *beam_values, const std::pair< size_t, size_t > &baseline_range, const std::pair< size_t, size_t > &station_range, std::barrier<> &barrier, bool invert, everybeam::BeamMode mode, bool do_update_weights=false, std::mutex *mutex=nullptr, const std::vector< size_t > &skip_station_indices=std::vector< size_t >())
bool invert()
Definition: ApplyBeam.h:127
common::Fields getRequiredFields() const override
Get the fields required by the current step.
Definition: ApplyBeam.h:95
common::Fields getProvidedFields() const override
Definition: ApplyBeam.h:101
void updateInfo(const base::DPInfo &) override
Update the general info.
static void ApplyBaselineBasedArrayFactor(const base::DPInfo &info, double time, std::complex< double > *data0, const everybeam::vector3r_t &srcdir, const everybeam::telescope::Telescope *telescope, std::complex< double > *beam_values, const std::pair< size_t, size_t > &baseline_range, const std::pair< size_t, size_t > &station_range, std::barrier<> &barrier, bool invert, everybeam::BeamMode mode, std::mutex *mutex=nullptr, const std::vector< size_t > &skip_station_indices=std::vector< size_t >())
ApplyBeam(const common::ParameterSet &, const std::string &prefix, bool substep=false)
void show(std::ostream &) const override
Show the step parameters.
void finish() override
Finish the processing of this step and subsequent steps.
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 kDataField
Definition: Step.h:60
void ApplyArrayFactorAndAdd(const base::DPInfo &info, size_t n_stations, const aocommon::xt::UTensor< std::complex< double >, 3 > &data, aocommon::xt::UTensor< std::complex< double >, 3 > &model_data, const std::complex< double > *beam_values)
size_t ComputeArrayFactor(const base::DPInfo &info, double time, const everybeam::vector3r_t &srcdir, const everybeam::telescope::Telescope *telescope, std::complex< double > *beam_values, bool invert, std::mutex *mutex, const std::vector< size_t > &skip_station_indices)
Computes the array factor scalar values.
size_t ComputeBeam(const base::DPInfo &info, double time, const everybeam::vector3r_t &srcdir, const everybeam::telescope::Telescope *telescope, aocommon::MC2x2 *beam_values, bool invert, everybeam::BeamMode mode, std::mutex *mutex, const std::vector< size_t > &skip_station_indices)
Computes full 2x2 Jones beam matrices using EveryBeam.
void ApplyBeamToDataAndAdd(const base::DPInfo &info, size_t n_stations, const aocommon::xt::UTensor< std::complex< double >, 3 > &data, aocommon::xt::UTensor< std::complex< double >, 3 > &model_data, const aocommon::MC2x2 *beam_values)
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53