File: memorybaselinereader.h

package info (click to toggle)
aoflagger 3.4.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,960 kB
  • sloc: cpp: 83,076; python: 10,187; sh: 260; makefile: 178
file content (90 lines) | stat: -rw-r--r-- 2,508 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
#ifndef MEMORY_BASELINE_READER_H
#define MEMORY_BASELINE_READER_H

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

#include "../structures/antennainfo.h"

#include "baselinereader.h"

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

class MemoryBaselineReader final : public BaselineReader {
 public:
  explicit MemoryBaselineReader(const std::string& msFile)
      : BaselineReader(msFile), _isRead(false), _areFlagsChanged(false) {}

  ~MemoryBaselineReader() {
    if (_areFlagsChanged) {
      WriteToMs();
    }
  }

  void PrepareReadWrite(ProgressListener& progress) override;

  void PerformReadRequests(class ProgressListener& progress) 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 full mem reader can not write data back to file: use the indirect "
        "reader");
  }

  static bool IsEnoughMemoryAvailable(uint64_t size);

  size_t GetMinRecommendedBufferSize(size_t /*threadCount*/) override {
    return 1;
  }
  size_t GetMaxRecommendedBufferSize(size_t /*threadCount*/) override {
    return 2;
  }

  bool IsModified() const override { return _areFlagsChanged; }

  void WriteToMs() override;

 private:
  void readSet(class ProgressListener& progress);
  void clear();

  bool _isRead, _areFlagsChanged;

  class BaselineID {
   public:
    BaselineID(unsigned a1, unsigned a2, unsigned _spw, unsigned seqId)
        : antenna1(a1), antenna2(a2), spw(_spw), sequenceId(seqId) {
      if (antenna1 > antenna2) std::swap(antenna1, antenna2);
    }
    unsigned antenna1, antenna2, spw, sequenceId;

    bool operator<(const BaselineID& other) const {
      if (antenna1 < other.antenna1) {
        return true;
      } else if (antenna1 == other.antenna1) {
        if (antenna2 < other.antenna2) {
          return true;
        } else if (antenna2 == other.antenna2) {
          if (spw < other.spw)
            return true;
          else if (spw == other.spw)
            return sequenceId < other.sequenceId;
        }
      }
      return false;
    }
  };

  std::map<BaselineID, std::unique_ptr<BaselineReader::Result>> _baselines;
};

#endif  // MEMORY_BASELINE_READER_H