1 #ifndef PURIFY_CASACORE_H
2 #define PURIFY_CASACORE_H
4 #include "purify/config.h"
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>
17 #include <sopt/utilities.h>
23 Matrix<T>
table_column(::casacore::Table
const &table, std::string
const &column,
24 std::string
const &filter =
"");
40 tables_(std::make_shared<std::map<std::string, ::casacore::Table>>()){};
44 std::string
const &
filename()
const {
return filename_; }
49 ::casacore::Table
const &
table(std::string
const &name =
"")
const;
54 std::string
const &tabname =
"")
const {
55 return get_column<T, ::casacore::ScalarColumn>(col, tabname);
60 std::string
const &tabname =
"")
const {
61 return get_column<T, ::casacore::ArrayColumn>(col, tabname);
64 void clear() { tables_ = std::make_shared<std::map<std::string, ::casacore::Table>>(); }
68 Matrix<T>
column(std::string
const &
column, std::string
const &filter =
"")
const {
69 return table_column<T>(this->
table(), column, filter);
73 std::size_t
size()
const;
76 const_iterator
begin(std::string
const &filter =
"")
const;
78 const_iterator
end(std::string
const &filter =
"")
const;
82 ChannelWrapper
operator[](std::tuple<t_uint, std::string>
const &i)
const;
86 Direction::Scalar
right_ascension(t_real tolerance = 1e-8, std::string
const &filter =
"")
const {
90 Direction::Scalar
declination(t_real tolerance = 1e-8, std::string
const &filter =
"")
const {
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};
102 std::string filename_;
105 std::shared_ptr<std::map<std::string, ::casacore::Table>> tables_;
111 auto const col = ::casacore::ArrayColumn<C>(taql.table(),
"R");
112 auto const data_column = col.getColumn();
113 auto const shape = col.shape(0);
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);
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);
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);
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>();
143 #define PURIFY_MACRO(NAME, TYPE) \
144 case ::casacore::TpArray##NAME: \
145 return details::get_taql_array<::casacore::TYPE>(taql_table).template cast<T>();
153 throw std::runtime_error(
"Array type is not handled");
154 return Matrix<T>::Zero(0, 1);
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);
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>();
180 #define PURIFY_MACRO(NAME, TYPE) \
181 case ::casacore::TpArray##NAME: \
182 return details::get_taql_array<::casacore::TYPE>(taql_table).template cast<T>();
197 throw std::runtime_error(
"Array type is not handled");
198 return Matrix<T>::Zero(0, 1);
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>());
214 : ms_(ms), filter_(filter), channel_(
channel) {}
218 #define PURIFY_MACRO(NAME, INDEX) \
220 Vector<t_real> raw_##NAME() const { \
221 return table_column<t_real>(ms_.table(), "UVW[" #INDEX "]", filter()); \
224 Vector<t_real> lambda_##NAME() const { \
225 return (raw_##NAME().array() * frequencies().array()).matrix() / constant::c; \
251 #define PURIFY_MACRO(NAME) \
253 Vector<t_complex> NAME(std::string const &col = "DATA") const { \
254 return ms_.column<t_complex>(stokes(#NAME, index(col)), filter()); \
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")), \
281 Vector<t_real>
frequencies()
const {
return joined_spectral_window(
"CHAN_FREQ"); }
283 Vector<t_real>
width()
const {
return joined_spectral_window(
"CHAN_WIDTH"); }
286 return joined_spectral_window(
"EFFECTIVE_BW");
289 Vector<t_real>
resolution()
const {
return joined_spectral_window(
"RESOLUTION"); }
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;
303 Vector<t_real> raw_spectral_window(std::string
const &
column)
const;
305 Vector<t_real> joined_spectral_window(std::string
const &
column)
const;
310 std::string
const filter_;
319 typedef std::shared_ptr<value_type const>
pointer;
327 wrapper_(new
value_type(channel_, ms_, filter_)){};
350 return &ms_.
table() == &
c.ms_.table();
356 std::string
const filter_;
357 std::shared_ptr<value_type> wrapper_;
361 const std::vector<t_int> &channels = std::vector<t_int>(),
362 std::string
const &filter =
"");
366 const std::vector<t_int> &channels = std::vector<t_int>(),
367 std::string
const &filter =
"");
371 const std::vector<t_int> &channels,
372 std::string
const &filter);
376 const std::vector<t_int> &channels = std::vector<t_int>(),
377 std::string
const &filter =
"");
381 const std::vector<t_int> &channels);
385 const t_int &channel_width = 1,
386 std::string
const &filter =
"");
390 return c.operator+(n);
394 return c.operator-(n);
#define PURIFY_MACRO(NAME, TYPE)
Vector< t_int > field_ids() const
FIELD_ID from table MAIN.
Direction::Scalar declination(t_real tolerance=1e-8) const
Direction::Scalar right_ascension(t_real tolerance=1e-8) const
Sigma
Possible locations for SIGMA.
Vector< t_real > resolution() const
Effective spectral resolution for each valid measurement.
Direction direction(t_real tolerance=1e-8) const
Direction (RA, DEC) in radian.
Vector< t_real > effective_noise_bandwidth() const
Effective noise band-width width for each valid measurement.
Vector< t_real > raw_frequencies() const
Frequencies from SPECTRAL_WINDOW for a this channel.
Vector< t_int > data_desc_id() const
DATA_DESC_ID from table MAIN.
t_uint size() const
Number of rows in a channel.
ChannelWrapper(t_uint channel, MeasurementSet const &ms, std::string const &filter="")
Vector< t_real > width() const
Channel width for each valid measurement.
t_uint channel() const
Channel this object is associated with.
bool is_valid() const
Check if channel has any data.
Vector< t_real > frequencies() const
Frequencies for each valid measurement.
const_iterator operator-(difference_type n) const
bool operator<=(const_iterator const &c) const
value_type const & reference
bool operator!=(const_iterator const &c) const
const_iterator(t_int channel, MeasurementSet const &ms, std::string const &filter="")
MeasurementSet::ChannelWrapper value_type
Convenience wrapper to access values associated with a single channel.
reference operator*() const
const_iterator & operator+=(difference_type n)
const_iterator & operator++()
pointer operator->() const
const_iterator operator+(difference_type n) const
std::shared_ptr< value_type const > pointer
bool operator>(const_iterator const &c) const
bool same_measurement_set(const_iterator const &c) const
True if iterating over the same measurement set.
bool operator>=(const_iterator const &c) const
bool operator<(const_iterator const &c) const
const_iterator & operator-=(difference_type n)
bool operator==(const_iterator const &c) const
Interface around measurement sets.
MeasurementSet(std::string const filename)
Constructs the interface around a given measurement set.
::casacore::ScalarColumn< T > scalar_column(std::string const &col, std::string const &tabname="") const
Gets scalar column from table.
Direction::Scalar right_ascension(t_real tolerance=1e-8, std::string const &filter="") const
Right ascention in radians.
std::string const & filename() const
Filename of the measurement set.
const_iterator end(std::string const &filter="") const
Iterates over channels.
::casacore::ArrayColumn< T > array_column(std::string const &col, std::string const &tabname="") const
Gets array column from table.
::casacore::Table const & table(std::string const &name="") const
Gets table or subtable.
ChannelWrapper operator[](t_uint i) const
Returns wrapper over specific channel.
Direction direction(t_real tolerance=1e-8, std::string const &filter="") const
Direction (RA, DEC) in radians.
static std::string const default_filter
Default filter specifying which data to accept.
Eigen::Array< t_real, 2, 1 > Direction
Type for (RA, DEC) direction.
Direction::Scalar declination(t_real tolerance=1e-8, std::string const &filter="") const
Declination in radians.
void clear()
Clear memory.
const_iterator begin(std::string const &filter="") const
Iterates over channels.
MeasurementSet(MeasurementSet const &c)
Shallow measurement set copy.
std::size_t size() const
Number of channels in the measurement set.
Matrix< T > column(std::string const &column, std::string const &filter="") const
Data from a column.
const std::vector< t_real > u
data for u coordinate
const std::vector< t_real > v
data for v coordinate
Matrix< C > get_taql_scalar(::casacore::TaQLResult const &taql)
Matrix< T > table_column(::casacore::Table const &table, std::string const &column, std::string const &filter, std::integral_constant< bool, true > const &)
Matrix< C > get_taql_array(::casacore::TaQLResult const &taql)
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.
Matrix< T > table_column(::casacore::Table const &table, std::string const &column, std::string const &filter="")
MeasurementSet::const_iterator operator-(MeasurementSet::const_iterator::difference_type n, MeasurementSet::const_iterator const &c)
MeasurementSet::const_iterator operator+(MeasurementSet::const_iterator::difference_type n, MeasurementSet::const_iterator const &c)
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.
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.
const t_real c
speed of light in vacuum