2 #include <boost/filesystem.hpp>
3 #include <casacore/ms/MeasurementSets/MeasurementSet.h>
4 #include <casacore/tables/TaQL/TableParse.h>
5 #include <casacore/tables/Tables/ArrColDesc.h>
6 #include <casacore/tables/Tables/ArrayColumn.h>
7 #include <casacore/tables/Tables/ColumnDesc.h>
8 #include <casacore/tables/Tables/ScaColDesc.h>
9 #include <casacore/tables/Tables/ScalarColumn.h>
10 #include <casacore/tables/Tables/SetupNewTab.h>
11 #include <casacore/tables/Tables/TableColumn.h>
12 #include "purify/directories.h"
17 #include "catch2/catch_all.hpp"
18 namespace casa = casacore;
22 casa::TableDesc simpleDesc = casa::MS::requiredTableDesc();
24 casa::SetupNewTable newTab(
"simpleTab", simpleDesc, casa::Table::New);
26 casa::MeasurementSet simpleMS(newTab);
30 simpleMS.createDefaultSubtables(casa::Table::New);
33 casa::TableColumn feed(simpleMS, casa::MS::columnName(casa::MS::FEED1));
38 feed.putScalar(rownr, 1);
40 casa::ArrayColumn<casa::Double> antpos(simpleMS.antenna(),
41 casa::MSAntenna::columnName(casa::MSAntenna::POSITION));
42 simpleMS.antenna().addRow();
43 casa::Array<casa::Double> position(casa::IPosition(1, 3));
44 position(casa::IPosition(1, 0)) = 1.;
45 position(casa::IPosition(1, 1)) = 2.;
46 position(casa::IPosition(1, 2)) = 3.;
47 antpos.put(0, position);
53 : path_(boost::filesystem::unique_path(boost::filesystem::temp_directory_path() /
54 "%%%%-%%%%-%%%%-%%%%.ms")) {}
56 if (boost::filesystem::exists(
path())) boost::filesystem::remove_all(
path());
58 boost::filesystem::path
const &
path()
const {
return path_; }
61 boost::filesystem::path path_;
67 casa::TableDesc simpleDesc = casa::MS::requiredTableDesc();
68 casa::SetupNewTable newTab(
path().
string(), simpleDesc, casa::Table::New);
69 ms_.reset(
new casa::MeasurementSet(newTab));
70 ms_->createDefaultSubtables(casa::Table::New);
72 casa::MeasurementSet
const &
operator*()
const {
return *ms_; }
75 casa::MeasurementSet
const *
operator->()
const {
return ms_.get(); }
79 std::unique_ptr<casa::MeasurementSet> ms_;
90 auto const ms = pc::MeasurementSet(
test_file);
91 SECTION(
"Check channel validity") {
92 CHECK(pc::MeasurementSet::const_iterator::value_type(0, ms).is_valid());
93 CHECK(pc::MeasurementSet::const_iterator::value_type(4, ms).is_valid());
98 auto const channel = pc::MeasurementSet::const_iterator::value_type(11, ms);
99 REQUIRE(channel.size() == 20541);
100 auto const u = channel.raw_u();
101 REQUIRE(
u.size() == 20541);
102 CHECK(std::abs(
u[0] - 3889.46519177759410013095475733280181884765625) < 1e-8);
103 CHECK(std::abs(
u[3360] - 683.2842475491) < 1e-8);
104 auto const v = channel.raw_v();
105 REQUIRE(
v.size() == 20541);
106 CHECK(std::abs(
v[0] - 1346.20383349449502929928712546825408935546875) < 1e-8);
107 CHECK(std::abs(
v[3360] + 785.8117311632) < 1e-8);
108 auto const w = channel.raw_w();
109 REQUIRE(w.size() == 20541);
110 CHECK(std::abs(w[0] - 1663.30025165469896819558925926685333251953125) < 1e-8);
111 CHECK(std::abs(w[3360] + 970.3123979733) < 1e-8);
114 SECTION(
"Raw frequencies") {
115 auto const f0 = pc::MeasurementSet::const_iterator::value_type(0, ms).raw_frequencies();
116 CHECK(f0.size() == 1);
117 CHECK(std::abs(f0(0) - 1431999959.500274181365966796875) < 1e-1);
119 auto const f11 = pc::MeasurementSet::const_iterator::value_type(11, ms).raw_frequencies();
120 CHECK(f11.size() == 1);
121 CHECK(std::abs(f11(0) - 1343999961.9890842437744140625) < 1e-1);
124 SECTION(
"data desc id") {
125 REQUIRE(pc::MeasurementSet::const_iterator::value_type(0, ms).data_desc_id().size() == 20490);
126 REQUIRE(pc::MeasurementSet::const_iterator::value_type(4, ms).data_desc_id().size() == 20606);
131 auto const I = pc::MeasurementSet::const_iterator::value_type(11, ms).I();
132 REQUIRE(
I.size() == 20541);
133 CHECK(std::abs(
I(0) - t_complex(0.1666463911533, -0.05232101678848)) < 1e-12);
134 CHECK(std::abs(
I(10) - t_complex(0.1421023607254, -0.04858251661062)) < 1e-12);
136 REQUIRE(pc::MeasurementSet::const_iterator::value_type(0, ms).
I().size() == 20490);
141 auto const wI = pc::MeasurementSet::const_iterator::value_type(11, ms).wI();
142 REQUIRE(wI.size() == 20541);
143 CAPTURE(wI.head(5).transpose());
144 CHECK(wI.isApprox(0.5 * purify::Vector<t_real>::Ones(wI.size())));
147 SECTION(
"frequencies") {
149 auto const f = pc::MeasurementSet::const_iterator::value_type(11, ms).frequencies();
150 REQUIRE(f.size() == 20541);
151 CHECK(std::abs(f(0) - 1343999961.989) < 1e-0);
152 CHECK(std::abs(f(1680) - 1343999961.989) < 1e-0);
153 CHECK(std::abs(f(3360) - 1343999961.989) < 1e-0);
154 CHECK(std::abs(f(5040) - 1343999961.989) < 1e-0);
161 REQUIRE(channel.is_valid());
162 auto const I = channel.I();
163 REQUIRE(
I.size() == 20490);
164 CHECK(std::abs(
I(0) - t_complex(-0.01469034608454, -0.00434834882617)) < 1e-12);
165 CHECK(std::abs(
I(10) - t_complex(-0.09461227059364, -0.01139064785093)) < 1e-12);
169 std::vector<int>
const valids{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
171 auto i_channel = ms.begin();
172 auto const i_end = ms.end();
173 for (; i_channel < i_end; i_channel += 5) {
174 CHECK(i_channel->channel() < 13);
175 bool const is_valid =
176 std::find(valids.begin(), valids.end(), i_channel->channel()) != valids.end();
177 CHECK(is_valid == i_channel->is_valid());
183 auto const direction = ms.direction();
184 auto const right_ascension = ms.right_ascension();
185 auto const declination = ms.declination();
186 CHECK(std::abs(right_ascension - 0.934273294000000031900299291010014712810516357421875) < 1e-8);
187 CHECK(std::abs(declination + 0.68069387400000003207622967238421551883220672607421875) < 1e-8);
188 CHECK(std::abs(direction[0] - 0.934273294000000031900299291010014712810516357421875) < 1e-8);
189 CHECK(std::abs(direction[1] + 0.68069387400000003207622967238421551883220672607421875) < 1e-8);
#define CHECK(CONDITION, ERROR)
casa::MeasurementSet * operator->()
casa::MeasurementSet const & operator*() const
casa::MeasurementSet & operator*()
casa::MeasurementSet const * operator->() const
boost::filesystem::path const & path() const
Interface around measurement sets.
const std::vector< t_real > u
data for u coordinate
const std::vector< t_real > v
data for v coordinate
std::string atca_filename(std::string const &filename)
Specific atca data.
const std::string test_file