PURIFY
Next-generation radio interferometric imaging
image_wproj_chirp.cc
Go to the documentation of this file.
1 #include "purify/config.h"
2 #include "purify/types.h"
3 #include "purify/directories.h"
4 #include "purify/logging.h"
5 #include "purify/operators.h"
6 #include "purify/pfitsio.h"
7 #include "purify/utilities.h"
10 #include <sopt/power_method.h>
11 
12 using namespace purify;
13 
14 int main(int nargs, char const **args) {
15 #define ARGS_MACRO(NAME, ARGN, VALUE, TYPE) \
16  auto const NAME = \
17  static_cast<TYPE>((nargs > ARGN) ? std::stod(static_cast<std::string>(args[ARGN])) : VALUE);
18 
19  ARGS_MACRO(w, 1, 10, t_real)
20  ARGS_MACRO(imsize, 2, 256, t_uint)
21  ARGS_MACRO(cell, 3, 2400, t_real)
22  ARGS_MACRO(Jw_max, 4, 0, t_uint)
23  ARGS_MACRO(radial, 5, true, bool)
24 #undef ARGS_MACRO
26  // Gridding example
27  auto const oversample_ratio = 2;
28  auto const power_iters = 100;
29  auto const power_tol = 1e-5;
30  auto const Ju = 4;
31  auto const Jv = 4;
32  auto const imsizex = imsize;
33  auto const imsizey = imsize;
34  const t_real wval = w;
35  const t_int Jw =
36  (Jw_max > 0) ? Jw_max
38  w, widefield::pixel_to_lambda(cell, imsize, oversample_ratio), Ju, 1200);
39  const std::string suffix =
40  "_" + std::to_string(static_cast<int>(wval)) + "_" +
41  std::to_string(static_cast<int>(imsize)) + "_" + std::to_string(static_cast<int>(cell)) +
42  "_" + std::to_string(static_cast<int>(Jw)) + "_" + ((radial) ? "radial" : "2d");
43 
44  auto const kernel = "kb";
45 
46  t_uint const number_of_pixels = imsizex * imsizey;
47  t_uint const number_of_vis = std::floor(number_of_pixels * 2);
48  // Generating random uv(w) coverage
49  t_real const sigma_m = constant::pi / 3;
50  auto uv_vis = utilities::random_sample_density(1, 0, sigma_m);
51  uv_vis.u *= 0.;
52  uv_vis.v *= 0.;
53  uv_vis.w = Vector<t_real>::Constant(1, wval);
54  uv_vis.units = utilities::vis_units::radians;
55  Image<t_complex> chirp = details::init_correction2d(
56  2, imsizey, imsizex, [](t_real) { return 1.; }, [](t_real) { return 1.; }, wval, cell, cell);
57 
58  auto header =
59  pfitsio::header_params("", " ", 1, 0, 0, stokes::I, cell, cell, 0, 1, 0, 0, 0, 0, 0);
60  header.fits_name = "chirp_real_" + std::to_string(static_cast<int>(wval)) + "_" +
61  std::to_string(static_cast<int>(imsize)) + "_" +
62  std::to_string(static_cast<int>(cell)) + ".fits";
63  pfitsio::write2d(chirp.real(), header);
64  header.fits_name = "chirp_imag_" + std::to_string(static_cast<int>(wval)) + "_" +
65  std::to_string(static_cast<int>(imsize)) + "_" +
66  std::to_string(static_cast<int>(cell)) + ".fits";
67  pfitsio::write2d(chirp.imag(), header);
68  const auto measure_opw = std::get<2>(sopt::algorithm::normalise_operator<Vector<t_complex>>(
70  uv_vis, imsizey, imsizex, cell, cell, oversample_ratio,
71  kernels::kernel_from_string.at(kernel), Ju, Jw, false, 1e-6, 1e-6,
73  power_iters, power_tol, Vector<t_complex>::Random(imsizex * imsizey)));
74  Vector<t_complex> const measurements =
75  (measure_opw->adjoint() * Vector<t_complex>::Constant(1, 1)).conjugate();
76  t_uint max_pos = 0;
77  measurements.array().real().maxCoeff(&max_pos);
78  Image<t_complex> out =
79  Image<t_complex>::Map(measurements.data(), imsizey, imsizex) * std::sqrt(imsizex * imsizey);
80  header.fits_name = "wproj_real" + suffix + ".fits";
81  pfitsio::write2d(out.real(), header);
82  header.fits_name = "wproj_imag" + suffix + ".fits";
83  pfitsio::write2d(out.imag(), header);
84  header.fits_name = "diff_real" + suffix + ".fits";
85  pfitsio::write2d(2 * (chirp - out).real() / (chirp.real().abs() + out.real().abs()).array(),
86  header);
87  header.fits_name = "diff_imag" + suffix + ".fits";
88  pfitsio::write2d(2 * (chirp - out).imag() / (chirp.imag().abs() + out.imag().abs()).array(),
89  header);
90 }
#define ARGS_MACRO(NAME, ARGN, VALUE, TYPE)
int main(int nargs, char const **args)
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
const std::map< std::string, kernel > kernel_from_string
Definition: kernels.h:16
void set_level(const std::string &level)
Method to set the logging level of the default Log object.
Definition: logging.h:137
std::shared_ptr< sopt::LinearTransform< T > > init_degrid_operator_2d(const Vector< t_real > &u, const Vector< t_real > &v, const Vector< t_real > &w, const Vector< t_complex > &weights, const t_uint &imsizey, const t_uint &imsizex, const t_real &oversample_ratio=2, const kernels::kernel kernel=kernels::kernel::kb, const t_uint Ju=4, const t_uint Jv=4, const bool w_stacking=false, const t_real &cellx=1, const t_real &celly=1)
Returns linear transform that is the standard degridding operator.
Definition: operators.h:608
void write2d(const Image< t_real > &eigen_image, const pfitsio::header_params &header, const bool &overwrite)
Write image to fits file.
Definition: pfitsio.cc:30
utilities::vis_params random_sample_density(const t_int vis_num, const t_real mean, const t_real standard_deviation, const t_real rms_w)
Generates a random visibility coverage.
t_int w_support(const t_real w, const t_real du, const t_int min, const t_int max)
estimate support size of w given u resolution du
t_real pixel_to_lambda(const t_real cell, const t_uint imsize, const t_real oversample_ratio)
return factors to convert between arcsecond pixel size image space and lambda for uv space