PURIFY
Next-generation radio interferometric imaging
casacore.h
Go to the documentation of this file.
1 #ifndef PURIFY_CASACORE_H
2 #define PURIFY_CASACORE_H
3 
4 #include "purify/config.h"
5 #include "purify/types.h"
6 #include <exception>
7 #include <map>
8 #include <memory>
9 #include <string>
10 #include <type_traits>
11 #include <casacore/ms/MeasurementSets/MeasurementSet.h>
12 #include <casacore/tables/TaQL/TableParse.h>
13 #include <casacore/tables/Tables/ArrayColumn.h>
14 #include <casacore/tables/Tables/ScalarColumn.h>
15 #include <casacore/tables/Tables/Table.h>
16 #include "purify/uvw_utilities.h"
17 #include <sopt/utilities.h>
18 
19 namespace purify {
20 namespace casa {
21 
22 template <class T>
23 Matrix<T> table_column(::casacore::Table const &table, std::string const &column,
24  std::string const &filter = "");
25 
28  public:
30  class const_iterator;
31  class ChannelWrapper;
33  static std::string const default_filter;
35  typedef Eigen::Array<t_real, 2, 1> Direction;
36 
38  MeasurementSet(std::string const filename)
39  : filename_(filename),
40  tables_(std::make_shared<std::map<std::string, ::casacore::Table>>()){};
42  MeasurementSet(MeasurementSet const &c) : filename_(c.filename_), tables_(c.tables_){};
44  std::string const &filename() const { return filename_; }
46  MeasurementSet &filename(std::string const &filename);
47 
49  ::casacore::Table const &table(std::string const &name = "") const;
50 
52  template <class T>
53  ::casacore::ScalarColumn<T> scalar_column(std::string const &col,
54  std::string const &tabname = "") const {
55  return get_column<T, ::casacore::ScalarColumn>(col, tabname);
56  }
58  template <class T>
59  ::casacore::ArrayColumn<T> array_column(std::string const &col,
60  std::string const &tabname = "") const {
61  return get_column<T, ::casacore::ArrayColumn>(col, tabname);
62  }
64  void clear() { tables_ = std::make_shared<std::map<std::string, ::casacore::Table>>(); }
65 
67  template <class T>
68  Matrix<T> column(std::string const &column, std::string const &filter = "") const {
69  return table_column<T>(this->table(), column, filter);
70  }
71 
73  std::size_t size() const;
74 
76  const_iterator begin(std::string const &filter = "") const;
78  const_iterator end(std::string const &filter = "") const;
80  ChannelWrapper operator[](t_uint i) const;
82  ChannelWrapper operator[](std::tuple<t_uint, std::string> const &i) const;
84  Direction direction(t_real tolerance = 1e-8, std::string const &filter = "") const;
86  Direction::Scalar right_ascension(t_real tolerance = 1e-8, std::string const &filter = "") const {
87  return direction(tolerance, filter)(0);
88  }
90  Direction::Scalar declination(t_real tolerance = 1e-8, std::string const &filter = "") const {
91  return direction(tolerance, filter)(1);
92  }
93 
94  private:
96  template <class T, template <class> class TYPE>
97  TYPE<T> get_column(std::string const &col, std::string const &tabname) const {
98  return {table(tabname), col};
99  }
100 
102  std::string filename_;
103 
105  std::shared_ptr<std::map<std::string, ::casacore::Table>> tables_;
106 };
107 
108 namespace details {
109 template <class C>
110 Matrix<C> get_taql_array(::casacore::TaQLResult const &taql) {
111  auto const col = ::casacore::ArrayColumn<C>(taql.table(), "R");
112  auto const data_column = col.getColumn();
113  auto const shape = col.shape(0);
114  auto nsize =
115  std::accumulate(shape.begin(), shape.end(), 1, [](ssize_t a, ssize_t b) { return a * b; });
116  typedef Eigen::Matrix<C, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> Matrix;
117  return Matrix::Map(data_column.data(), col.nrow(), nsize);
118 }
119 template <class C>
120 Matrix<C> get_taql_scalar(::casacore::TaQLResult const &taql) {
121  auto const col = ::casacore::ScalarColumn<C>(taql.table(), "R");
122  auto const data_column = col.getColumn();
123  typedef Eigen::Matrix<C, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> Matrix;
124  return Matrix::Map(data_column.data(), col.nrow(), 1);
125 }
126 
127 template <class T>
128 Matrix<T> table_column(::casacore::Table const &table, std::string const &column,
129  std::string const &filter, std::integral_constant<bool, true> const &) {
130  if (table.nrow() == 0) return Matrix<T>::Zero(0, 1);
131  auto const taql_table = ::casacore::tableCommand(
132  "USING STYLE PYTHON SELECT " + column + " as R FROM $1 " + filter, table);
133  auto const vtable = taql_table.table();
134  if (vtable.nrow() == 0) return Matrix<T>(0, 1);
135 
136  switch (vtable.tableDesc().columnDesc("R").trueDataType()) {
137 #define PURIFY_MACRO(NAME, TYPE) \
138  case ::casacore::Tp##NAME: \
139  return details::get_taql_scalar<::casacore::TYPE>(taql_table).template cast<T>();
140  PURIFY_MACRO(Complex, Complex);
141  PURIFY_MACRO(DComplex, DComplex);
142 #undef PURIFY_MACRO
143 #define PURIFY_MACRO(NAME, TYPE) \
144  case ::casacore::TpArray##NAME: \
145  return details::get_taql_array<::casacore::TYPE>(taql_table).template cast<T>();
146  PURIFY_MACRO(Complex, Complex);
147  PURIFY_MACRO(DComplex, DComplex);
148 #undef PURIFY_MACRO
149  default:
150  break;
151  }
152 
153  throw std::runtime_error("Array type is not handled");
154  return Matrix<T>::Zero(0, 1);
155 }
156 
157 template <class T>
158 Matrix<T> table_column(::casacore::Table const &table, std::string const &column,
159  std::string const &filter, std::integral_constant<bool, false> const &) {
160  if (table.nrow() == 0) return Matrix<T>::Zero(0, 1);
161  auto const taql_table = ::casacore::tableCommand(
162  "USING STYLE PYTHON SELECT " + column + " as R FROM $1 " + filter, table);
163  auto const vtable = taql_table.table();
164  if (vtable.nrow() == 0) return Matrix<T>(0, 1);
165 
166  switch (vtable.tableDesc().columnDesc("R").trueDataType()) {
167 #define PURIFY_MACRO(NAME, TYPE) \
168  case ::casacore::Tp##NAME: \
169  return details::get_taql_scalar<::casacore::TYPE>(taql_table).template cast<T>();
170  PURIFY_MACRO(Bool, Bool);
171  PURIFY_MACRO(Char, Char);
172  PURIFY_MACRO(UChar, uChar);
173  PURIFY_MACRO(Short, Short);
174  PURIFY_MACRO(UShort, uShort);
175  PURIFY_MACRO(Int, Int);
176  PURIFY_MACRO(UInt, uInt);
177  PURIFY_MACRO(Float, Float);
178  PURIFY_MACRO(Double, Double);
179 #undef PURIFY_MACRO
180 #define PURIFY_MACRO(NAME, TYPE) \
181  case ::casacore::TpArray##NAME: \
182  return details::get_taql_array<::casacore::TYPE>(taql_table).template cast<T>();
183  PURIFY_MACRO(Bool, Bool);
184  PURIFY_MACRO(Char, Char);
185  PURIFY_MACRO(UChar, uChar);
186  PURIFY_MACRO(Short, Short);
187  PURIFY_MACRO(UShort, uShort);
188  PURIFY_MACRO(Int, Int);
189  PURIFY_MACRO(UInt, uInt);
190  PURIFY_MACRO(Float, Float);
191  PURIFY_MACRO(Double, Double);
192 #undef PURIFY_MACRO
193  default:
194  break;
195  }
196 
197  throw std::runtime_error("Array type is not handled");
198  return Matrix<T>::Zero(0, 1);
199 }
200 } // namespace details
201 
202 template <class T>
203 Matrix<T> table_column(::casacore::Table const &table, std::string const &column,
204  std::string const &filter) {
205  return details::table_column<T>(table, column, filter,
206  std::integral_constant<bool, sopt::is_complex<T>::value>());
207 }
208 
210  public:
212  enum class Sigma { OVERALL, SPECTRUM };
213  ChannelWrapper(t_uint channel, MeasurementSet const &ms, std::string const &filter = "")
214  : ms_(ms), filter_(filter), channel_(channel) {}
215 
217  t_uint channel() const { return channel_; }
218 #define PURIFY_MACRO(NAME, INDEX) \
219  \
220  Vector<t_real> raw_##NAME() const { \
221  return table_column<t_real>(ms_.table(), "UVW[" #INDEX "]", filter()); \
222  } \
223  \
224  Vector<t_real> lambda_##NAME() const { \
225  return (raw_##NAME().array() * frequencies().array()).matrix() / constant::c; \
226  }
230 #undef PURIFY_MACRO
232  t_uint size() const;
233 
235  Vector<t_int> field_ids() const { return ms_.column<t_int>("FIELD_ID", filter()); }
237  Vector<t_int> data_desc_id() const { return ms_.column<t_int>("DATA_DESC_ID", filter()); }
238 
240  Direction direction(t_real tolerance = 1e-8) const { return ms_.direction(tolerance, filter()); }
241  Direction::Scalar right_ascension(t_real tolerance = 1e-8) const {
242  return ms_.right_ascension(tolerance, filter());
243  }
244  Direction::Scalar declination(t_real tolerance = 1e-8) const {
245  return ms_.declination(tolerance, filter());
246  }
247 
249  Vector<t_real> raw_frequencies() const { return raw_spectral_window("CHAN_FREQ"); }
250 
251 #define PURIFY_MACRO(NAME) \
252  \
253  Vector<t_complex> NAME(std::string const &col = "DATA") const { \
254  return ms_.column<t_complex>(stokes(#NAME, index(col)), filter()); \
255  } \
256  \
257  Vector<t_real> w##NAME(Sigma const &col = Sigma::OVERALL) const { \
258  return table_column<t_real>( \
259  ms_.table(), stokes(#NAME, col == Sigma::OVERALL ? "SIGMA" : index("SIGMA_SPECTRUM")), \
260  filter()); \
261  }
262  // Stokes parameters
267  // Circular correlations
272  // Linear correlations
277 
278 #undef PURIFY_MACRO
279 
281  Vector<t_real> frequencies() const { return joined_spectral_window("CHAN_FREQ"); }
283  Vector<t_real> width() const { return joined_spectral_window("CHAN_WIDTH"); }
285  Vector<t_real> effective_noise_bandwidth() const {
286  return joined_spectral_window("EFFECTIVE_BW");
287  }
289  Vector<t_real> resolution() const { return joined_spectral_window("RESOLUTION"); }
290 
292  bool is_valid() const;
293 
294  protected:
296  std::string filter() const;
298  std::string index(std::string const &variable = "") const;
300  std::string stokes(std::string const &pol, std::string const &column = "DATA") const;
301 
303  Vector<t_real> raw_spectral_window(std::string const &column) const;
305  Vector<t_real> joined_spectral_window(std::string const &column) const;
306 
308  MeasurementSet ms_;
310  std::string const filter_;
312  t_uint channel_;
313 };
314 
316  public:
319  typedef std::shared_ptr<value_type const> pointer;
320  typedef value_type const &reference;
321  typedef t_int difference_type;
322 
323  const_iterator(t_int channel, MeasurementSet const &ms, std::string const &filter = "")
324  : channel_(channel),
325  ms_(ms),
326  filter_(filter),
327  wrapper_(new value_type(channel_, ms_, filter_)){};
328 
329  pointer operator->() const { return wrapper_; }
330  reference operator*() const { return *wrapper_; }
336  return const_iterator(channel_ + n, ms_, filter_);
337  }
339  return const_iterator(channel_ - n, ms_, filter_);
340  }
341  bool operator>(const_iterator const &c) const;
342  bool operator>=(const_iterator const &c) const;
343  bool operator<(const_iterator const &c) const { return not operator>=(c); }
344  bool operator<=(const_iterator const &c) const { return not operator>(c); }
345  bool operator==(const_iterator const &c) const;
346  bool operator!=(const_iterator const &c) const { return not operator==(c); }
347 
349  bool same_measurement_set(const_iterator const &c) const {
350  return &ms_.table() == &c.ms_.table();
351  }
352 
353  protected:
354  difference_type channel_;
355  MeasurementSet ms_;
356  std::string const filter_;
357  std::shared_ptr<value_type> wrapper_;
358 };
360 utilities::vis_params read_measurementset(std::string const &filename, const stokes pol = stokes::I,
361  const std::vector<t_int> &channels = std::vector<t_int>(),
362  std::string const &filter = "");
365  const stokes pol = stokes::I,
366  const std::vector<t_int> &channels = std::vector<t_int>(),
367  std::string const &filter = "");
369 utilities::vis_params read_measurementset(std::string const &filename,
370  const utilities::vis_params &uv1, const stokes pol,
371  const std::vector<t_int> &channels,
372  std::string const &filter);
374 utilities::vis_params read_measurementset(std::vector<std::string> const &filename,
375  const stokes pol = stokes::I,
376  const std::vector<t_int> &channels = std::vector<t_int>(),
377  std::string const &filter = "");
378 
380 t_real average_frequency(const purify::casa::MeasurementSet &ms_file, std::string const &filter,
381  const std::vector<t_int> &channels);
383 std::vector<utilities::vis_params> read_measurementset_channels(std::string const &filename,
384  const stokes pol = stokes::I,
385  const t_int &channel_width = 1,
386  std::string const &filter = "");
387 
390  return c.operator+(n);
391 }
394  return c.operator-(n);
395 }
396 } // namespace casa
397 } // namespace purify
398 
399 #endif
#define PURIFY_MACRO(NAME, TYPE)
Definition: casacore.h:251
Vector< t_int > field_ids() const
FIELD_ID from table MAIN.
Definition: casacore.h:235
Direction::Scalar declination(t_real tolerance=1e-8) const
Definition: casacore.h:244
Direction::Scalar right_ascension(t_real tolerance=1e-8) const
Definition: casacore.h:241
Sigma
Possible locations for SIGMA.
Definition: casacore.h:212
Vector< t_real > resolution() const
Effective spectral resolution for each valid measurement.
Definition: casacore.h:289
Direction direction(t_real tolerance=1e-8) const
Direction (RA, DEC) in radian.
Definition: casacore.h:240
Vector< t_real > effective_noise_bandwidth() const
Effective noise band-width width for each valid measurement.
Definition: casacore.h:285
Vector< t_real > raw_frequencies() const
Frequencies from SPECTRAL_WINDOW for a this channel.
Definition: casacore.h:249
Vector< t_int > data_desc_id() const
DATA_DESC_ID from table MAIN.
Definition: casacore.h:237
t_uint size() const
Number of rows in a channel.
Definition: casacore.cc:368
ChannelWrapper(t_uint channel, MeasurementSet const &ms, std::string const &filter="")
Definition: casacore.h:213
Vector< t_real > width() const
Channel width for each valid measurement.
Definition: casacore.h:283
t_uint channel() const
Channel this object is associated with.
Definition: casacore.h:217
bool is_valid() const
Check if channel has any data.
Definition: casacore.cc:80
Vector< t_real > frequencies() const
Frequencies for each valid measurement.
Definition: casacore.h:281
const_iterator operator-(difference_type n) const
Definition: casacore.h:338
bool operator<=(const_iterator const &c) const
Definition: casacore.h:344
bool operator!=(const_iterator const &c) const
Definition: casacore.h:346
const_iterator(t_int channel, MeasurementSet const &ms, std::string const &filter="")
Definition: casacore.h:323
MeasurementSet::ChannelWrapper value_type
Convenience wrapper to access values associated with a single channel.
Definition: casacore.h:318
const_iterator & operator+=(difference_type n)
Definition: casacore.cc:379
const_iterator operator+(difference_type n) const
Definition: casacore.h:335
std::shared_ptr< value_type const > pointer
Definition: casacore.h:319
bool operator>(const_iterator const &c) const
Definition: casacore.cc:384
bool same_measurement_set(const_iterator const &c) const
True if iterating over the same measurement set.
Definition: casacore.h:349
bool operator>=(const_iterator const &c) const
Definition: casacore.cc:390
bool operator<(const_iterator const &c) const
Definition: casacore.h:343
const_iterator & operator-=(difference_type n)
Definition: casacore.h:334
bool operator==(const_iterator const &c) const
Definition: casacore.cc:141
Interface around measurement sets.
Definition: casacore.h:27
MeasurementSet(std::string const filename)
Constructs the interface around a given measurement set.
Definition: casacore.h:38
::casacore::ScalarColumn< T > scalar_column(std::string const &col, std::string const &tabname="") const
Gets scalar column from table.
Definition: casacore.h:53
Direction::Scalar right_ascension(t_real tolerance=1e-8, std::string const &filter="") const
Right ascention in radians.
Definition: casacore.h:86
std::string const & filename() const
Filename of the measurement set.
Definition: casacore.h:44
const_iterator end(std::string const &filter="") const
Iterates over channels.
Definition: casacore.cc:40
::casacore::ArrayColumn< T > array_column(std::string const &col, std::string const &tabname="") const
Gets array column from table.
Definition: casacore.h:59
::casacore::Table const & table(std::string const &name="") const
Gets table or subtable.
Definition: casacore.cc:18
ChannelWrapper operator[](t_uint i) const
Returns wrapper over specific channel.
Definition: casacore.cc:43
Direction direction(t_real tolerance=1e-8, std::string const &filter="") const
Direction (RA, DEC) in radians.
Definition: casacore.cc:102
static std::string const default_filter
Default filter specifying which data to accept.
Definition: casacore.h:31
Eigen::Array< t_real, 2, 1 > Direction
Type for (RA, DEC) direction.
Definition: casacore.h:35
Direction::Scalar declination(t_real tolerance=1e-8, std::string const &filter="") const
Declination in radians.
Definition: casacore.h:90
void clear()
Clear memory.
Definition: casacore.h:64
const_iterator begin(std::string const &filter="") const
Iterates over channels.
Definition: casacore.cc:37
MeasurementSet(MeasurementSet const &c)
Shallow measurement set copy.
Definition: casacore.h:42
std::size_t size() const
Number of channels in the measurement set.
Definition: casacore.cc:27
Matrix< T > column(std::string const &column, std::string const &filter="") const
Data from a column.
Definition: casacore.h:68
const std::vector< t_real > u
data for u coordinate
Definition: operators.cc:18
const std::vector< t_real > v
data for v coordinate
Definition: operators.cc:20
Matrix< C > get_taql_scalar(::casacore::TaQLResult const &taql)
Definition: casacore.h:120
Matrix< T > table_column(::casacore::Table const &table, std::string const &column, std::string const &filter, std::integral_constant< bool, true > const &)
Definition: casacore.h:128
Matrix< C > get_taql_array(::casacore::TaQLResult const &taql)
Definition: casacore.h:110
t_real average_frequency(const purify::casa::MeasurementSet &ms_file, std::string const &filter, const std::vector< t_int > &channels)
Return average frequency over channels.
Definition: casacore.cc:353
Matrix< T > table_column(::casacore::Table const &table, std::string const &column, std::string const &filter="")
Definition: casacore.h:203
MeasurementSet::const_iterator operator-(MeasurementSet::const_iterator::difference_type n, MeasurementSet::const_iterator const &c)
Definition: casacore.h:392
MeasurementSet::const_iterator operator+(MeasurementSet::const_iterator::difference_type n, MeasurementSet::const_iterator const &c)
Definition: casacore.h:388
utilities::vis_params read_measurementset(std::string const &filename, const stokes polarization, const std::vector< t_int > &channels_input, std::string const &filter)
Read measurement set into vis_params structure.
Definition: casacore.cc:147
std::vector< utilities::vis_params > read_measurementset_channels(std::string const &filename, const stokes pol, const t_int &channel_width, std::string const &filter)
Read meassurement set into a vector of vis_params.
Definition: casacore.cc:332
const t_real c
speed of light in vacuum
Definition: types.h:72
stokes
Definition: types.h:44