PURIFY
Next-generation radio interferometric imaging
operators.cc
Go to the documentation of this file.
1 #include "purify/operators.h"
3 namespace purify {
4 
5 namespace details {
7 Sparse<t_complex> init_gridding_matrix_2d(const Vector<t_real> &u, const Vector<t_real> &v,
8  const Vector<t_complex> &weights, const t_uint &imsizey_,
9  const t_uint &imsizex_, const t_real &oversample_ratio,
10  const std::function<t_real(t_real)> kernelu,
11  const std::function<t_real(t_real)> kernelv,
12  const t_uint Ju /*= 4*/, const t_uint Jv /*= 4*/) {
13  const t_uint ftsizev_ = std::floor(imsizey_ * oversample_ratio);
14  const t_uint ftsizeu_ = std::floor(imsizex_ * oversample_ratio);
15  const t_uint rows = u.size();
16  const t_uint cols = ftsizeu_ * ftsizev_;
17  if (u.size() != v.size())
18  throw std::runtime_error(
19  "Size of u and v vectors are not the same for creating gridding matrix.");
20 
21  Sparse<t_complex> interpolation_matrix(rows, cols);
22  interpolation_matrix.reserve(Vector<t_int>::Constant(rows, Ju * Jv));
23 
24  const t_complex I(0, 1);
25  const t_int ju_max = std::min(Ju, ftsizeu_);
26  const t_int jv_max = std::min(Jv, ftsizev_);
27  // If I collapse this for loop there is a crash when using MPI... Sparse<>::insert() doesn't work
28  // right
29 #pragma omp parallel for
30  for (t_int m = 0; m < rows; ++m) {
31  for (t_int ju = 1; ju < ju_max + 1; ++ju) {
32  for (t_int jv = 1; jv < jv_max + 1; ++jv) {
33  const t_real k_u = std::floor(u(m) - ju_max * 0.5);
34  const t_real k_v = std::floor(v(m) - jv_max * 0.5);
35  const t_uint q = utilities::mod(k_u + ju, ftsizeu_);
36  const t_uint p = utilities::mod(k_v + jv, ftsizev_);
37  const t_uint index = utilities::sub2ind(p, q, ftsizev_, ftsizeu_);
38  interpolation_matrix.insert(m, index) =
39  std::exp(-2 * constant::pi * I * ((k_u + ju) * 0.5 + (k_v + jv) * 0.5)) *
40  kernelu(u(m) - (k_u + ju)) * kernelv(v(m) - (k_v + jv)) * weights(m);
41  }
42  }
43  }
44  return interpolation_matrix;
45 }
46 
47 Image<t_complex> init_correction2d(const t_real &oversample_ratio, const t_uint &imsizey_,
48  const t_uint &imsizex_,
49  const std::function<t_real(t_real)> ftkernelu,
50  const std::function<t_real(t_real)> ftkernelv,
51  const t_real &w_mean, const t_real &cellx, const t_real &celly) {
52  const t_uint ftsizeu_ = std::floor(imsizex_ * oversample_ratio);
53  const t_uint ftsizev_ = std::floor(imsizey_ * oversample_ratio);
54  const t_uint x_start = std::floor(ftsizeu_ * 0.5 - imsizex_ * 0.5);
55  const t_uint y_start = std::floor(ftsizev_ * 0.5 - imsizey_ * 0.5);
56 
57  Array<t_real> range;
58  range.setLinSpaced(std::max(ftsizeu_, ftsizev_), 0.5, std::max(ftsizeu_, ftsizev_) - 0.5);
59  return ((1e0 / range.segment(y_start, imsizey_).unaryExpr(ftkernelv)).matrix() *
60  (1e0 / range.segment(x_start, imsizex_).unaryExpr(ftkernelu)).matrix().transpose())
61  .array() *
62  t_complex(1., 0.) *
63  widefield::generate_chirp(w_mean, cellx, celly, imsizex_, imsizey_).array() * imsizex_ *
64  imsizey_;
65 }
66 
67 } // namespace details
68 } // namespace purify
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
const t_real pi
mathematical constant
Definition: types.h:70
Image< t_complex > init_correction2d(const t_real &oversample_ratio, const t_uint &imsizey_, const t_uint &imsizex_, const std::function< t_real(t_real)> ftkernelu, const std::function< t_real(t_real)> ftkernelv, const t_real &w_mean, const t_real &cellx, const t_real &celly)
Definition: operators.cc:47
Sparse< t_complex > init_gridding_matrix_2d(const Vector< t_real > &u, const Vector< t_real > &v, const Vector< t_complex > &weights, const t_uint &imsizey_, const t_uint &imsizex_, const t_real &oversample_ratio, const std::function< t_real(t_real)> kernelu, const std::function< t_real(t_real)> kernelv, const t_uint Ju, const t_uint Jv)
Construct gridding matrix.
Definition: operators.cc:7
t_int sub2ind(const t_int &row, const t_int &col, const t_int &rows, const t_int &cols)
Converts from subscript to index for matrix.
Definition: utilities.cc:12
t_real mod(const t_real &x, const t_real &y)
Mod function modified to wrap circularly for negative numbers.
Definition: utilities.cc:41
Matrix< t_complex > generate_chirp(const t_real w_rate, const t_real cell_x, const t_real cell_y, const t_uint x_size, const t_uint y_size)
Generates image of chirp.
Eigen::SparseMatrix< T, Eigen::RowMajor, I > Sparse
A matrix of a given type.
Definition: types.h:40