File: observationinfo.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 (93 lines) | stat: -rw-r--r-- 3,570 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
#include "observationinfo.h"

#include <casacore/measures/Measures/MDirection.h>
#include <casacore/measures/Measures/MCDirection.h>
#include <casacore/measures/Measures/MEpoch.h>
#include <casacore/measures/Measures/MPosition.h>
#include <casacore/measures/Measures/MCPosition.h>
#include <casacore/measures/TableMeasures/ScalarMeasColumn.h>
#include <casacore/tables/Tables/TableRecord.h>

#include <aocommon/io/serialostream.h>
#include <aocommon/io/serialistream.h>

#include "../structures/msselection.h"

namespace wsclean {

void ObservationInfo::Serialize(aocommon::SerialOStream& stream) const {
  stream.Double(phaseCentreRA)
      .Double(phaseCentreDec)
      .String(telescopeName)
      .String(observer)
      .String(fieldName);
}

void ObservationInfo::Unserialize(aocommon::SerialIStream& stream) {
  stream.Double(phaseCentreRA)
      .Double(phaseCentreDec)
      .String(telescopeName)
      .String(observer)
      .String(fieldName);
}

ObservationInfo ReadObservationInfo(casacore::MeasurementSet& ms,
                                    size_t fieldId) {
  ObservationInfo obsInfo;

  casacore::MSAntenna aTable = ms.antenna();
  size_t antennaCount = aTable.nrow();
  if (antennaCount == 0) throw std::runtime_error("No antennae in set");
  casacore::MPosition::ScalarColumn antPosColumn(
      aTable, aTable.columnName(casacore::MSAntennaEnums::POSITION));
  casacore::MPosition ant1Pos = antPosColumn(0);

  size_t fieldRow =
      (fieldId == schaapcommon::reordering::MSSelection::kAllFields) ? 0
                                                                     : fieldId;
  casacore::MEpoch::ScalarColumn timeColumn(
      ms, ms.columnName(casacore::MSMainEnums::TIME));
  casacore::MSField fTable(ms.field());
  casacore::MDirection::ScalarColumn phaseDirColumn(
      fTable, fTable.columnName(casacore::MSFieldEnums::PHASE_DIR));
  casacore::MDirection phaseDir = phaseDirColumn(fieldRow);
  casacore::MEpoch curtime = timeColumn(0);
  casacore::MeasFrame frame(ant1Pos, curtime);
  casacore::MDirection::Ref j2000Ref(casacore::MDirection::J2000, frame);
  casacore::MDirection j2000 =
      casacore::MDirection::Convert(phaseDir, j2000Ref)();
  casacore::Vector<casacore::Double> j2000Val = j2000.getValue().get();

  obsInfo.phaseCentreRA = j2000Val[0];
  obsInfo.phaseCentreDec = j2000Val[1];

  if (fTable.keywordSet().isDefined("WSCLEAN_DL") ||
      fTable.keywordSet().isDefined("WSCLEAN_DM")) {
    throw std::runtime_error(
        "This measurement was processed with chgcentre to have a shifted phase "
        "centre. \n"
        "This kind of shifting has been directly implemented in wsclean. "
        "Because of this,\n"
        "the chgcentre approach is no longer supported. Use chgcentre to undo "
        "the shift\n"
        "and use wsclean's -shift parameter.\n");
  }

  casacore::MSObservation oTable = ms.observation();
  size_t obsCount = oTable.nrow();
  if (obsCount == 0) throw std::runtime_error("No observations in set");
  casacore::ScalarColumn<casacore::String> telescopeNameColumn(
      oTable, oTable.columnName(casacore::MSObservation::TELESCOPE_NAME));
  casacore::ScalarColumn<casacore::String> observerColumn(
      oTable, oTable.columnName(casacore::MSObservation::OBSERVER));
  obsInfo.telescopeName = telescopeNameColumn(0);
  obsInfo.observer = observerColumn(0);

  casacore::ScalarColumn<casacore::String> fieldNameColumn(
      fTable, fTable.columnName(casacore::MSField::NAME));
  obsInfo.fieldName = fieldNameColumn(fieldRow);

  return obsInfo;
}

}  // namespace wsclean