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