File: h5solutiondata.cpp

package info (click to toggle)
wsclean 3.6-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 16,296 kB
  • sloc: cpp: 129,246; python: 22,066; sh: 360; ansic: 230; makefile: 185
file content (108 lines) | stat: -rw-r--r-- 3,968 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
#include "h5solutiondata.h"

#include <vector>

#include <schaapcommon/h5parm/h5parm.h>
#include <schaapcommon/h5parm/jonesparameters.h>
#include <schaapcommon/h5parm/soltab.h>

#include "../main/settings.h"

namespace wsclean {

H5SolutionData::H5SolutionData(const Settings& settings) : settings_(settings) {
  LoadSolutions();
  LoadGainTypes();
}

void H5SolutionData::LoadSolutions() {
  using schaapcommon::h5parm::SolTab;

  const std::vector<std::string>& solution_files = settings_.facetSolutionFiles;
  const std::vector<std::string>& solution_table_names =
      settings_.facetSolutionTables;

  h5parms_.reserve(solution_files.size());
  first_solutions_.reserve(solution_files.size());
  if (solution_table_names.size() == 2)
    second_solutions_.reserve(solution_files.size());

  for (const std::string& solution_file : solution_files) {
    schaapcommon::h5parm::H5Parm& h5parm =
        h5parms_.emplace_back(solution_file, solution_table_names);

    if (solution_table_names.size() == 1) {
      first_solutions_.emplace_back(&h5parm.GetSolTab(solution_table_names[0]));
    } else {  // Use amplitude as first solution and phase as second solution.
      assert(solution_table_names.size() == 2);
      const std::string kAmplitude = "amplitude";
      const std::string kPhase = "phase";

      const std::array<schaapcommon::h5parm::SolTab*, 2> tables{
          &h5parm.GetSolTab(solution_table_names[0]),
          &h5parm.GetSolTab(solution_table_names[1])};
      const std::array<std::string, 2> types{tables[0]->GetType(),
                                             tables[1]->GetType()};

      if (types[0] == kAmplitude && types[1] == kPhase) {
        first_solutions_.emplace_back(tables[0]);
        second_solutions_.emplace_back(tables[1]);
      } else if (types[0] == kPhase && types[1] == kAmplitude) {
        first_solutions_.emplace_back(tables[1]);
        second_solutions_.emplace_back(tables[0]);
      } else {
        throw std::runtime_error(
            "WSClean expects solution tables with names '" + kAmplitude +
            "' and '" + kPhase + "', but received '" + types[0] + "' and '" +
            types[1] + "'");
      }
    }
  }
}

void H5SolutionData::LoadGainTypes() {
  using schaapcommon::h5parm::GainType;
  using schaapcommon::h5parm::SolTab;

  gain_types_.reserve(h5parms_.size());

  if (second_solutions_.empty()) {
    for (const SolTab* table : first_solutions_) {
      gain_types_.emplace_back(
          schaapcommon::h5parm::JonesParameters::H5ParmTypeStringToGainType(
              table->GetType()));
    }
  } else {
    assert(second_solutions_.size() == first_solutions_.size());

    const std::string kPol = "pol";

    for (size_t i = 0; i < first_solutions_.size(); ++i) {
      const size_t n_amplitude_polarizations =
          first_solutions_[i]->HasAxis(kPol)
              ? first_solutions_[i]->GetAxis(kPol).size
              : 1;
      const size_t n_phase_polarizations =
          second_solutions_[i]->HasAxis(kPol)
              ? second_solutions_[i]->GetAxis(kPol).size
              : 1;

      if (n_amplitude_polarizations == 1 && n_phase_polarizations == 1) {
        gain_types_.emplace_back(GainType::kScalarComplex);
      } else if (n_amplitude_polarizations == 2 && n_phase_polarizations == 2) {
        gain_types_.emplace_back(GainType::kDiagonalComplex);
      } else if (n_amplitude_polarizations == 4 && n_phase_polarizations == 4) {
        gain_types_.emplace_back(GainType::kFullJones);
      } else {
        throw std::runtime_error(
            "Incorrect or mismatching number of polarizations in the "
            "provided amplitude and phase soltabs. The number of polarizations "
            "should both be either 1, 2 or 4, but received " +
            std::to_string(n_amplitude_polarizations) + " for amplitude and " +
            std::to_string(n_phase_polarizations) + " for phase");
      }
    }
  }
}

}  // namespace wsclean