File: data.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 (152 lines) | stat: -rw-r--r-- 4,528 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#ifndef LUA_DATA_H
#define LUA_DATA_H

#include "../structures/timefrequencydata.h"
#include "../structures/timefrequencymetadata.h"

#include <algorithm>
#include <utility>
#include <vector>

namespace aoflagger_lua {
class Data {
 public:
  struct Context {
    std::vector<Data*> list;
    Context() = default;

    Context(const Context&) = delete;
    Context& operator=(const Context&) = delete;

    Context(Context&&) = default;
    Context& operator=(Context&&) = default;
  };

  explicit Data(Context& context) : _context(&context), _persistent(false) {
    context.list.emplace_back(this);
  }

  Data(const Data& source)
      : _tfData(source._tfData),
        _metaData(source._metaData),
        _context(source._context),
        _persistent(source._persistent) {
    _context->list.emplace_back(this);
  }

  Data(Data&& source)
      : _tfData(std::move(source._tfData)),
        _metaData(std::move(source._metaData)),
        _context(source._context),
        _persistent(source._persistent) {
    _context->list.emplace_back(this);
  }

  Data(const TimeFrequencyData& tfData, TimeFrequencyMetaDataCPtr metaData,
       Context& context)
      : _tfData(tfData),
        _metaData(metaData),
        _context(&context),
        _persistent(false) {
    context.list.emplace_back(this);
  }

  Data(TimeFrequencyData&& tfData, TimeFrequencyMetaDataCPtr metaData,
       Context& context) noexcept
      : _tfData(std::move(tfData)),
        _metaData(metaData),
        _context(&context),
        _persistent(false) {
    context.list.emplace_back(this);
  }

  ~Data() noexcept {
    // If this object is persistent, it might exist after the context was
    // deleted In that case, we don't update context.
    if (!_persistent) {
      auto iter = std::find(_context->list.begin(), _context->list.end(), this);
      // The list might be cleared already (at the end of the strategy), so make
      // sure the data was found.
      if (iter != _context->list.end()) _context->list.erase(iter);
    }
  }

  Data& operator=(Data&& rhs) {
    _tfData = std::move(rhs._tfData);
    _metaData = std::move(rhs._metaData);
    _context = rhs._context;
    _persistent = rhs._persistent;
    return *this;
  }

  Data operator-(const Data& other) const {
    return Data(TimeFrequencyData::MakeFromDiff(_tfData, other.TFData()),
                _metaData, *_context);
  }

  void clear() {
    _tfData = TimeFrequencyData();
    _metaData.reset();
  }

  void clear_mask() noexcept { _tfData.SetNoMask(); }

  Data convert_to_polarization(aocommon::PolarizationEnum polarization) const {
    return Data(_tfData.Make(polarization), _metaData, *_context);
  }

  Data convert_to_complex(enum TimeFrequencyData::ComplexRepresentation
                              complexRepresentation) const {
    return Data(_tfData.Make(complexRepresentation), _metaData, *_context);
  }

  Data copy() const { return Data(_tfData, _metaData, *_context); }

  void join_mask(const Data& other) { _tfData.JoinMask(other._tfData); }

  Data make_complex() const {
    return Data(_tfData.MakeFromComplexCombination(_tfData, _tfData), _metaData,
                *_context);
  }

  void set_visibilities(const Data& image_data) {
    const TimeFrequencyData& source = image_data._tfData;
    const size_t imageCount = source.ImageCount();
    if (imageCount != _tfData.ImageCount()) {
      std::ostringstream s;
      s << "set_image() was executed with incompatible polarizations: input "
           "had "
        << imageCount << ", destination had " << _tfData.ImageCount();
      throw std::runtime_error(s.str());
    }
    for (size_t i = 0; i != imageCount; ++i)
      _tfData.SetImage(i, source.GetImage(i));
  }

  void set_polarization_data(aocommon::PolarizationEnum polarization,
                             const Data& data) {
    size_t polIndex = _tfData.GetPolarizationIndex(polarization);
    _tfData.SetPolarizationData(polIndex, data._tfData);
  }

  TimeFrequencyData& TFData() noexcept { return _tfData; }
  const TimeFrequencyData& TFData() const noexcept { return _tfData; }

  const TimeFrequencyMetaDataCPtr& MetaData() const noexcept {
    return _metaData;
  }

  Context& GetContext() const { return *_context; }

  bool is_persistent() const { return _persistent; }
  void set_persistent(bool persistent) { _persistent = persistent; }

 private:
  TimeFrequencyData _tfData;
  TimeFrequencyMetaDataCPtr _metaData;
  Context* _context;
  bool _persistent;
};
}  // namespace aoflagger_lua

#endif