1#ifndef CASACORE_ANTENNA_PAIR_FILE_H_
2#define CASACORE_ANTENNA_PAIR_FILE_H_
32 source.rows_in_pattern_ = 0;
40 file_ = std::move(rhs.file_);
43 rhs.rows_in_pattern_ = 0;
71 void WritePair(uint64_t row, int32_t antenna1, int32_t antenna2) {
106 sizeof(int32_t) * 2)) {}
125 template <
size_t AntennaNumber>
127 static_assert(AntennaNumber == 0 || AntennaNumber == 1);
129 const bool has_unfinished_row =
131 if (has_unfinished_row) {
132 if (row >=
data_.size())
133 throw std::runtime_error(
134 "Incorrect writing order for AntennaPairFile (in unfinished "
136 std::to_string(row) +
")");
137 const bool is_rewrite = row <
data_.size() - 1 ||
140 if (
data_[row][AntennaNumber] != antenna)
141 throw std::runtime_error(
142 "Antenna " + std::to_string(AntennaNumber) +
" value in row " +
143 std::to_string(row) +
" is rewritten with a different value");
145 data_.back()[AntennaNumber] = antenna;
157 if (row >
data_.size())
158 throw std::runtime_error(
159 "Incorrect writing order for AntennaPairFile (in new pair, row=" +
160 std::to_string(row) +
")");
161 if (row ==
data_.size()) {
162 if constexpr (AntennaNumber == 0)
163 data_.emplace_back(std::array<int32_t, 2>{antenna, kUnsetAntenna});
168 if (
data_[row][AntennaNumber] != antenna)
169 throw std::runtime_error(
170 "Antenna " + std::to_string(AntennaNumber) +
" value in row " +
171 std::to_string(row) +
" is rewritten with a different value");
176 if (pair[AntennaNumber] != antenna)
177 throw std::runtime_error(
178 "Error writing to AntennaPairFile, row " + std::to_string(row) +
179 ": the antenna pairs do not follow a consistent pattern");
183 template <
size_t AntennaNumber>
185 static_assert(AntennaNumber == 0 || AntennaNumber == 1);
188 if (row >=
data_.size())
189 throw std::runtime_error(
190 "Invalid read of antenna pair: requested row is beyond the number "
191 "of written rows, and writing of antenna pattern not finished");
192 antenna =
data_[row][AntennaNumber];
194 throw std::runtime_error(
195 "Trying to read antenna value that has not been written yet");
206 throw std::runtime_error(
207 "The Antenna-pair columnar file header does not have the expected "
208 "tag for antenna columns: the measurement set may be damaged");
222 for (uint64_t row = 0; row !=
data_.size(); ++row) {
232 for (uint64_t row = 0; row !=
data_.size(); ++row) {
244 constexpr static int32_t
kUnsetAntenna = std::numeric_limits<int32_t>::min();
250 std::vector<std::array<int32_t, 2>>
data_;
This class is able to store the combination of ANTENNA1 and ANTENNA2 columns in a compressed manner.
int32_t ReadAntenna1(uint64_t row)
AntennaPairFile & operator=(AntennaPairFile &&rhs)
~AntennaPairFile() noexcept
void WriteAntenna(uint64_t row, int32_t antenna)
static AntennaPairFile OpenExisting(const std::string &filename)
Open an already existing antenna-pair file from disk with the given filename.
int32_t ReadAntenna(uint64_t row)
std::vector< std::array< int32_t, 2 > > data_
uint64_t NRowsInPattern() const
The number of rows that form one repeating pattern.
void WritePair(uint64_t row, int32_t antenna1, int32_t antenna2)
static constexpr const char kMagicHeaderTag[8]
const std::string & Filename() const
static bool HasUnsetAntenna(const std::array< int32_t, 2 > &pair)
static constexpr size_t kHeaderSize
The header: char[8] "AntPair\0" uint64_t rows_per_block.
AntennaPairFile() noexcept=default
AntennaPairFile(const std::string &filename, bool)
Open an existing file from disk.
BufferedColumnarFile file_
static AntennaPairFile CreateNew(const std::string &filename)
Create a new antenna-pair file on disk with the given filename.
AntennaPairFile(const std::string &filename)
Create a new file on disk.
void WriteAntenna1(uint64_t row, int32_t antenna1)
uint64_t rows_in_pattern_
This value remains zero until the repeating pattern was found.
void WriteAntenna2(uint64_t row, int32_t antenna2)
static constexpr int32_t kUnsetAntenna
int32_t ReadAntenna2(uint64_t row)
void ReadHeader(unsigned char *data)
Read an optional extra header to the file.
const std::string & Filename() const
void WriteHeader(const unsigned char *data)
Write an optional extra header to the file.
uint64_t NRows() const
Total number of rows stored in this file.
void Read(uint64_t row, uint64_t column_offset, float *data, uint64_t n)
Read one cell containing an array of floats.
void Write(uint64_t row, uint64_t column_offset, const float *data, uint64_t n)
Write one cell containing an array of floats.
void Close()
Close the file.
this file contains all the compiler specific defines
Define real & complex conjugation for non-complex types and put comparisons into std namespace.