File: directbaselinereader.h

package info (click to toggle)
aoflagger 3.5.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,000 kB
  • sloc: cpp: 67,891; python: 497; sh: 242; makefile: 22
file content (99 lines) | stat: -rw-r--r-- 3,507 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#ifndef DIRECTBASELINEREADER_H
#define DIRECTBASELINEREADER_H

#include <map>
#include <vector>
#include <stdexcept>

#include "baselinereader.h"

#include "../structures/antennainfo.h"
#include "../structures/image2d.h"
#include "../structures/mask2d.h"
#include "../structures/msmetadata.h"

class DirectBaselineReader final : public BaselineReader {
 public:
  explicit DirectBaselineReader(const std::string& msFile);

  bool IsModified() const override { return false; }

  void WriteToMs() override {}

  void PrepareReadWrite(ProgressListener&) override {}

  void PerformReadRequests(class ProgressListener& listener) override;
  void PerformFlagWriteRequests() override;
  void PerformDataWriteTask(
      [[maybe_unused]] std::vector<Image2DCPtr> realImages,
      [[maybe_unused]] std::vector<Image2DCPtr> imaginaryImages,
      [[maybe_unused]] size_t antenna1, [[maybe_unused]] size_t antenna2,
      [[maybe_unused]] size_t spectralWindow,
      [[maybe_unused]] size_t sequenceId) override {
    throw std::runtime_error(
        "The direct baseline reader can not write data back to file: use the "
        "indirect reader");
  }
  std::vector<UVW> ReadUVW(unsigned antenna1, unsigned antenna2,
                           unsigned spectralWindow, unsigned sequenceId);

 private:
  class BaselineCacheIndex {
   public:
    BaselineCacheIndex() {}
    BaselineCacheIndex(const BaselineCacheIndex& source)
        : antenna1(source.antenna1),
          antenna2(source.antenna2),
          spectralWindow(source.spectralWindow),
          sequenceId(source.sequenceId) {}
    bool operator==(const BaselineCacheIndex& rhs) const {
      return antenna1 == rhs.antenna1 && antenna2 == rhs.antenna2 &&
             spectralWindow == rhs.spectralWindow &&
             sequenceId == rhs.sequenceId;
    }
    bool operator<(const BaselineCacheIndex& rhs) const {
      if (antenna1 < rhs.antenna1) {
        return true;
      } else if (antenna1 == rhs.antenna1) {
        if (antenna2 < rhs.antenna2) {
          return true;
        } else if (antenna2 == rhs.antenna2) {
          if (spectralWindow < rhs.spectralWindow)
            return true;
          else if (spectralWindow == rhs.spectralWindow)
            return sequenceId < rhs.sequenceId;
        }
      }
      return false;
    }

    size_t antenna1, antenna2, spectralWindow, sequenceId;
  };

  struct BaselineCacheValue {
    std::vector<size_t> rows;
  };

  void initBaselineCache();

  void addRequestRows(ReadRequest request, size_t requestIndex,
                      std::vector<std::pair<size_t, size_t>>& rows);
  void addRequestRows(FlagWriteRequest request, size_t requestIndex,
                      std::vector<std::pair<size_t, size_t>>& rows);
  void addRowToBaselineCache(size_t antenna1, size_t antenna2,
                             size_t spectralWindow, size_t sequenceId,
                             size_t row);
  void readUVWData();

  void readTimeData(size_t requestIndex, size_t xOffset, size_t frequencyCount,
                    const casacore::Array<casacore::Complex>& data);
  void readTimeFlags(size_t requestIndex, size_t xOffset, size_t frequencyCount,
                     const casacore::Array<bool>& flag);
  void readWeights(size_t requestIndex, size_t xOffset, size_t frequencyCount,
                   const casacore::Array<float>& weight);

  std::map<BaselineCacheIndex, BaselineCacheValue> _baselineCache;
  casacore::MeasurementSet _ms;
};

#endif  // DIRECTBASELINEREADER_H