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;
 
 
   64    WriteAntenna<0>(row, antenna1);
 
 
   68    WriteAntenna<1>(row, antenna2);
 
 
   71  void WritePair(uint64_t row, int32_t antenna1, int32_t antenna2) {
 
   72    WriteAntenna<0>(row, antenna1);
 
   73    WriteAntenna<1>(row, 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)
 
  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);
 
  187    if (rows_in_pattern_ == 0) {
 
  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];
 
  193      if (antenna == kUnsetAntenna)
 
  194        throw std::runtime_error(
 
  195            "Trying to read antenna value that has not been written yet");
 
  198      return data_[row % rows_in_pattern_][AntennaNumber];
 
 
  203    unsigned char data[kHeaderSize];
 
  204    file_.ReadHeader(data);
 
  205    if (!std::equal(data, data + 8, kMagicHeaderTag)) {
 
  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");
 
  210    rows_in_pattern_ = 
reinterpret_cast<uint64_t&
>(data[8]);
 
 
  214    unsigned char data[kHeaderSize];
 
  215    std::copy_n(kMagicHeaderTag, 8, data);
 
  216    reinterpret_cast<uint64_t&
>(data[8]) = rows_in_pattern_;
 
  217    file_.WriteHeader(data);
 
 
  221    data_.resize(file_.NRows());
 
  222    for (uint64_t row = 0; row != data_.size(); ++row) {
 
  223      file_.Read(row, 0, data_[row].data(), 2);
 
 
  232    for (uint64_t row = 0; row != data_.size(); ++row) {
 
  233      file_.Write(row, 0, data_[row].data(), 2);
 
 
  242  constexpr static size_t kHeaderSize = 16;
 
  243  constexpr static const char kMagicHeaderTag[8] = 
"AntPair";
 
  244  constexpr static int32_t kUnsetAntenna = std::numeric_limits<int32_t>::min();
 
  249  uint64_t rows_in_pattern_ = 0;
 
  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)
 
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)
 
const std::string & Filename() const
 
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.