PURIFY
Next-generation radio interferometric imaging
Classes | Enumerations | Functions
purify::utilities Namespace Reference

Classes

struct  vis_params
 

Enumerations

enum class  vis_source { measurements , simulation }
 
enum class  vis_units { lambda , radians , pixels }
 

Functions

void regroup (vis_params &uv_params, std::vector< t_int > const &groups_, const t_int max_groups)
 
void regroup (vis_params &uv_params, std::vector< t_int > &image_index, std::vector< t_int > const &groups_, const t_int max_groups)
 
vis_params regroup_and_scatter (vis_params const &params, std::vector< t_int > const &groups, sopt::mpi::Communicator const &comm)
 
std::tuple< vis_params, std::vector< t_int > > regroup_and_all_to_all (vis_params const &params, const std::vector< t_int > &image_index, std::vector< t_int > const &groups, sopt::mpi::Communicator const &comm)
 
vis_params regroup_and_all_to_all (vis_params const &params, std::vector< t_int > const &groups, sopt::mpi::Communicator const &comm)
 
vis_params all_to_all_visibilities (vis_params const &params, std::vector< t_int > const &sizes, sopt::mpi::Communicator const &comm)
 
vis_params scatter_visibilities (vis_params const &params, std::vector< t_int > const &sizes, sopt::mpi::Communicator const &comm)
 
vis_params scatter_visibilities (sopt::mpi::Communicator const &comm)
 
utilities::vis_params distribute_params (utilities::vis_params const &params, sopt::mpi::Communicator const &comm)
 
utilities::vis_params set_cell_size (const sopt::mpi::Communicator &comm, utilities::vis_params const &uv_vis, const t_real &cell_x, const t_real &cell_y)
 
utilities::vis_params w_stacking (utilities::vis_params const &params, sopt::mpi::Communicator const &comm, const t_int iters, const std::function< t_real(t_real)> &cost, const t_real k_means_rel_diff)
 
std::tuple< utilities::vis_params, std::vector< t_int >, std::vector< t_real > > w_stacking_with_all_to_all (utilities::vis_params const &params, const t_real du, const t_int min_support, const t_int max_support, sopt::mpi::Communicator const &comm, const t_int iters, const t_real fill_relaxation, const std::function< t_real(t_real)> &cost, const t_real k_means_rel_diff)
 
template<class T >
t_real step_size (T const &vis, const std::shared_ptr< sopt::LinearTransform< T > const > &measurements, const std::shared_ptr< sopt::LinearTransform< T > const > &wavelets, const t_uint sara_size)
 Calculate step size using MPI (does not include factor of 1e-3) More...
 
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. More...
 
std::tuple< t_int, t_int > ind2sub (const t_int &sub, const t_int &cols, const t_int &rows)
 Converts from index to subscript for matrix. More...
 
t_real mod (const t_real &x, const t_real &y)
 Mod function modified to wrap circularly for negative numbers. More...
 
Image< t_complex > convolution_operator (const Image< t_complex > &a, const Image< t_complex > &b)
 Calculates the convolution between two images. More...
 
t_real calculate_l2_radius (const t_uint y_size, const t_real &sigma=0, const t_real &n_sigma=2., const std::string distirbution="chi")
 A function that calculates the l2 ball radius for sopt. More...
 
t_real SNR_to_standard_deviation (const Vector< t_complex > &y0, const t_real &SNR=30.)
 Converts SNR to RMS noise. More...
 
Vector< t_complex > add_noise (const Vector< t_complex > &y, const t_complex &mean, const t_real &standard_deviation)
 Add guassian noise to vector. More...
 
bool file_exists (const std::string &name)
 Test to see if file exists. More...
 
std::tuple< t_real, t_real, t_real > fit_fwhm (const Image< t_real > &psf, const t_int &size=3)
 Method to fit Gaussian to PSF. More...
 
t_real median (const Vector< t_real > &input)
 Return median of real vector. More...
 
t_real dynamic_range (const Image< t_complex > &model, const Image< t_complex > &residuals, const t_real &operator_norm=1)
 Calculate the dynamic range between the model and residuals. More...
 
Array< t_complex > init_weights (const Vector< t_real > &u, const Vector< t_real > &v, const Vector< t_complex > &weights, const t_real &oversample_factor, const std::string &weighting_type, const t_real &R, const t_int &ftsizeu, const t_int &ftsizev)
 Calculate weightings. More...
 
std::tuple< t_int, t_real > checkpoint_log (const std::string &diagnostic)
 Reads a diagnostic file and updates parameters. More...
 
Matrix< t_complex > re_sample_ft_grid (const Matrix< t_complex > &input, const t_real &re_sample_factor)
 zero pads ft grid for image up sampling and downsampling More...
 
Matrix< t_complex > re_sample_image (const Matrix< t_complex > &input, const t_real &re_sample_ratio)
 resamples image size More...
 
template<class K >
K::Scalar mean (const K x)
 Calculate mean of vector. More...
 
template<class K >
t_real variance (const K x)
 Calculate variance of vector. More...
 
template<class K >
t_real standard_deviation (const K x)
 Calculates the standard deviation of a vector. More...
 
template<class T0 , class T1 >
std::enable_if< std::is_same< typename T0::Scalar, typename T1::Scalar >::value and T0::IsRowMajor, Vector< typename T0::Scalar > >::type sparse_multiply_matrix (const Eigen::SparseMatrixBase< T0 > &M, const Eigen::MatrixBase< T1 > &x)
 Parallel multiplication with a sparse matrix and vector. More...
 
template<class K , class L >
Image< t_complex > parallel_multiply_image (const K &A, const L &B)
 Multiply images coefficient-wise using openmp. More...
 
bool has_suffix (const std::string &str, const std::string &suff)
 
Matrix< t_real > generate_antennas (const t_uint N, const t_real scale)
 Generate guassianly distributed (sigma = scale) antenna positions. More...
 
utilities::vis_params antenna_to_coverage (const Matrix< t_real > &B, const t_real frequency, const t_real times, const t_real theta_ra, const t_real phi_dec, const t_real latitude)
 Provided antenna positions generate a coverage for a fixed frequency a fixed time. More...
 
utilities::vis_params antenna_to_coverage (const Matrix< t_real > &B, const t_real frequency, const std::vector< t_real > &times, const t_real theta_ra, const t_real phi_dec, const t_real latitude)
 Provided antenna positions generate a coverage for a fixed frequency for mulitple times. More...
 
utilities::vis_params antenna_to_coverage (const Matrix< t_real > &B, const std::vector< t_real > &frequencies, const t_real times, const t_real theta_ra, const t_real phi_dec, const t_real latitude)
 Provided antenna positions generate a coverage for multiple frequency a fixed time. More...
 
utilities::vis_params antenna_to_coverage (const Matrix< t_real > &B, const std::vector< t_real > &frequencies, const std::vector< t_real > times, const t_real theta_ra, const t_real phi_dec, const t_real latitude)
 
Matrix< t_real > read_ant_positions (const std::string &pos_name)
 Read in a text file of antenna positions into a matrix [x, y ,z]. More...
 
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=0)
 Generates a random visibility coverage. More...
 
utilities::vis_params read_visibility (const std::vector< std::string > &names, const bool w_term=false)
 Read visibility files from name of vector. More...
 
utilities::vis_params read_visibility (const std::string &vis_name2, const utilities::vis_params &u1)
 Reads in two visibility files. More...
 
t_real streamtoreal (std::ifstream &stream)
 Reading reals from visibility file (including nan's and inf's) More...
 
utilities::vis_params read_visibility_csv (const std::string &vis_name, const bool w_term=false)
 Reads in visibility csv file. More...
 
utilities::vis_params read_visibility (const std::string &vis_name, const bool w_term=false)
 Reads in visibility file. More...
 
void write_visibility (const utilities::vis_params &uv_vis, const std::string &file_name, const bool w_term=false)
 Writes visibilities to txt. More...
 
utilities::vis_params set_cell_size (const utilities::vis_params &uv_vis, const t_real &max_u, const t_real &max_v, const t_real &input_cell_size_u, const t_real &input_cell_size_v)
 
utilities::vis_params set_cell_size (const utilities::vis_params &uv_vis, const t_real &cell_size_u=0, const t_real &cell_size_v=0)
 Scales visibilities to a given pixel size in arcseconds. More...
 
utilities::vis_params uv_scale (const utilities::vis_params &uv_vis, const t_int &ftsizeu, const t_int &ftsizev)
 scales the visibilities to units of pixels More...
 
utilities::vis_params convert_to_pixels (const utilities::vis_params &uv_vis, const t_real cell_x, const t_real cell_y, const t_real imsizex, const t_real imsizey, const t_real oversample_ratio)
 Converts u and v coordaintes to units of pixels. More...
 
utilities::vis_params conjugate_w (const utilities::vis_params &uv_vis)
 reflects visibilities into the w >= 0 domain More...
 
template<class T >
calculate_rotated_u (const T &u, const T &v, const T &w, const t_real alpha, const t_real beta, const t_real gamma)
 calculate the rotated u from euler angles in zyz and starting coordinates (u, v, w) More...
 
template<class T >
calculate_rotated_v (const T &u, const T &v, const T &w, const t_real alpha, const t_real beta, const t_real gamma)
 calculate the rotated v from euler angles in zyz and starting coordinates (u, v, w) More...
 
template<class T >
calculate_rotated_w (const T &u, const T &v, const T &w, const t_real alpha, const t_real beta, const t_real gamma)
 calculate the rotated w from euler angles in zyz and starting coordinates (u, v, w) More...
 
template<class T >
utilities::vis_params antenna_to_coverage (const t_uint N, const t_real scale, const T &frequency)
 
utilities::vis_params antenna_to_coverage (const t_uint N)
 Using guassianly distributed (sigma = pi) antenna positions generate a coverage. More...
 
template<class F >
utilities::vis_params antenna_to_coverage_general (const Matrix< t_real > &B, const std::vector< t_real > &frequencies, const std::vector< t_real > &times, const F &position_angle_RA_function, const F &position_angle_DEC_function, const t_real latitude)
 
template<class T , class K >
utilities::vis_params antenna_to_coverage (const Vector< t_real > &x, const Vector< t_real > &y, const Vector< t_real > &z, const T &frequencies, const K &times, const t_real theta_ra, const t_real phi_dec, const t_real latitude)
 Provided antenna positions generate a coverage. More...
 
template<class T , class K >
utilities::vis_params read_ant_positions_to_coverage (const std::string &pos_name, const T &frequencies, const K &times, const t_real theta_ra, const t_real phi_dec, const t_real latitude)
 
vis_params sort_by_w (const vis_params &uv_data)
 Sort visibilities to be from w_max to w_min. More...
 
template<typename T >
t_real w_lambert (T x, const t_real &relative_difference)
 Calculate W Lambert function. More...
 
template<typename T >
t_real w_lambert (const T &x, const t_real &relative_difference=1e-8)
 

Enumeration Type Documentation

◆ vis_source

Enumerator
measurements 
simulation 

Definition at line 13 of file uvw_utilities.h.

◆ vis_units

Enumerator
lambda 
radians 
pixels 

Definition at line 14 of file uvw_utilities.h.

Function Documentation

◆ add_noise()

Vector< t_complex > purify::utilities::add_noise ( const Vector< t_complex > &  y0,
const t_complex &  mean,
const t_real &  standard_deviation 
)

Add guassian noise to vector.

Definition at line 113 of file utilities.cc.

114  {
115  /*
116  Adds complex valued Gaussian noise to vector
117  y0:: vector before noise
118  mean:: complex valued mean of noise
119  standard_deviation:: rms of noise
120  */
121  auto sample = [&mean, &standard_deviation](t_complex x) {
122  std::random_device rd_real;
123  std::random_device rd_imag;
124  std::mt19937_64 rng_real(rd_real());
125  std::mt19937_64 rng_imag(rd_imag());
126  static std::normal_distribution<t_real> normal_dist_real(std::real(mean), standard_deviation);
127  static std::normal_distribution<t_real> normal_dist_imag(std::imag(mean), standard_deviation);
128  t_complex I(0, 1.);
129  return normal_dist_real(rng_real) + I * normal_dist_imag(rng_imag);
130  };
131 
132  auto noise = Vector<t_complex>::Zero(y0.size()).unaryExpr(sample);
133 
134  return y0 + noise;
135 }
K::Scalar mean(const K x)
Calculate mean of vector.
Definition: utilities.h:21
t_real standard_deviation(const K x)
Calculates the standard deviation of a vector.
Definition: utilities.h:34

References purify::I, mean(), and standard_deviation().

Referenced by b_utilities::dirty_measurements(), dirty_visibilities(), getInputData(), and main().

◆ all_to_all_visibilities()

vis_params purify::utilities::all_to_all_visibilities ( vis_params const &  params,
std::vector< t_int > const &  sizes,
sopt::mpi::Communicator const &  comm 
)

Definition at line 122 of file mpi_utilities.cc.

123  {
124  if (comm.size() == 1) return params;
125  vis_params result;
126  result.u = comm.all_to_allv(params.u, sizes);
127  result.v = comm.all_to_allv(params.v, sizes);
128  result.w = comm.all_to_allv(params.w, sizes);
129  result.vis = comm.all_to_allv(params.vis, sizes);
130  result.weights = comm.all_to_allv(params.weights, sizes);
131  result.units = static_cast<utilities::vis_units>(comm.broadcast(static_cast<int>(params.units)));
132  result.ra = comm.broadcast(params.ra);
133  result.dec = comm.broadcast(params.dec);
134  result.average_frequency = comm.broadcast(params.average_frequency);
135  return result;
136 }

References purify::utilities::vis_params::average_frequency, purify::utilities::vis_params::dec, purify::utilities::vis_params::ra, purify::utilities::vis_params::u, purify::utilities::vis_params::units, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, purify::utilities::vis_params::w, and purify::utilities::vis_params::weights.

Referenced by regroup_and_all_to_all().

◆ antenna_to_coverage() [1/7]

utilities::vis_params purify::utilities::antenna_to_coverage ( const Matrix< t_real > &  B,
const std::vector< t_real > &  frequencies,
const std::vector< t_real >  times,
const t_real  theta_ra,
const t_real  phi_dec,
const t_real  latitude 
)

Provided antenna positions generate a coverage for multiple frequencies for multiple times for earth rotation synthesis

Definition at line 65 of file uvw_utilities.cc.

68  {
69  auto const position_angle_RA_function = [theta_ra](const t_real t) -> t_real {
70  return theta_ra + constant::omega_e * t;
71  };
72  auto const position_angle_DEC_function = [phi_dec](const t_real t) -> t_real { return phi_dec; };
73  return antenna_to_coverage_general<std::function<t_real(t_real)>>(
74  B, frequencies, times, position_angle_RA_function, position_angle_DEC_function, latitude);
75 }
const t_real omega_e
angular velocity of the earth rad/s
Definition: types.h:74
utilities::vis_params antenna_to_coverage_general(const Matrix< t_real > &B, const std::vector< t_real > &frequencies, const std::vector< t_real > &times, const F &position_angle_RA_function, const F &position_angle_DEC_function, const t_real latitude)

References antenna_to_coverage_general(), and purify::constant::omega_e.

◆ antenna_to_coverage() [2/7]

utilities::vis_params purify::utilities::antenna_to_coverage ( const Matrix< t_real > &  B,
const std::vector< t_real > &  frequency,
const t_real  times,
const t_real  theta_ra,
const t_real  phi_dec,
const t_real  latitude 
)

Provided antenna positions generate a coverage for multiple frequency a fixed time.

Definition at line 57 of file uvw_utilities.cc.

60  {
61  return antenna_to_coverage(B, frequency, std::vector<t_real>(1, times), theta_ra, phi_dec,
62  latitude);
63 }
utilities::vis_params antenna_to_coverage(const Matrix< t_real > &B, const std::vector< t_real > &frequencies, const std::vector< t_real > times, const t_real theta_ra, const t_real phi_dec, const t_real latitude)

References antenna_to_coverage().

◆ antenna_to_coverage() [3/7]

utilities::vis_params purify::utilities::antenna_to_coverage ( const Matrix< t_real > &  B,
const t_real  frequency,
const std::vector< t_real > &  times,
const t_real  theta_ra,
const t_real  phi_dec,
const t_real  latitude 
)

Provided antenna positions generate a coverage for a fixed frequency for mulitple times.

Definition at line 50 of file uvw_utilities.cc.

52  {
53  return antenna_to_coverage(B, std::vector<t_real>(1, frequency), times, theta_ra, phi_dec,
54  latitude);
55 }

References antenna_to_coverage().

◆ antenna_to_coverage() [4/7]

utilities::vis_params purify::utilities::antenna_to_coverage ( const Matrix< t_real > &  B,
const t_real  frequency,
const t_real  times,
const t_real  theta_ra,
const t_real  phi_dec,
const t_real  latitude 
)

Provided antenna positions generate a coverage for a fixed frequency a fixed time.

Definition at line 43 of file uvw_utilities.cc.

45  {
46  return antenna_to_coverage(B, std::vector<t_real>(1, frequency), std::vector<t_real>(1, times),
47  theta_ra, phi_dec, latitude);
48 }

Referenced by antenna_to_coverage(), read_ant_positions_to_coverage(), and TEST_CASE().

◆ antenna_to_coverage() [5/7]

utilities::vis_params purify::utilities::antenna_to_coverage ( const t_uint  N)

Using guassianly distributed (sigma = pi) antenna positions generate a coverage.

◆ antenna_to_coverage() [6/7]

template<class T >
utilities::vis_params purify::utilities::antenna_to_coverage ( const t_uint  N,
const t_real  scale,
const T &  frequency 
)

Definition at line 92 of file uvw_utilities.h.

92  {
93  return antenna_to_coverage(generate_antennas(N, scale), frequency, 0., 0., 0., 0.);
94 }
Matrix< t_real > generate_antennas(const t_uint N, const t_real scale)
Generate guassianly distributed (sigma = scale) antenna positions.
utilities::vis_params antenna_to_coverage(const Vector< t_real > &x, const Vector< t_real > &y, const Vector< t_real > &z, const T &frequencies, const K &times, const t_real theta_ra, const t_real phi_dec, const t_real latitude)
Provided antenna positions generate a coverage.

References antenna_to_coverage(), and generate_antennas().

◆ antenna_to_coverage() [7/7]

template<class T , class K >
utilities::vis_params purify::utilities::antenna_to_coverage ( const Vector< t_real > &  x,
const Vector< t_real > &  y,
const Vector< t_real > &  z,
const T &  frequencies,
const K &  times,
const t_real  theta_ra,
const t_real  phi_dec,
const t_real  latitude 
)

Provided antenna positions generate a coverage.

Definition at line 166 of file uvw_utilities.h.

169  {
170  if (x.size() != y.size()) throw std::runtime_error("x and y positions are not the same amount.");
171  if (x.size() != z.size()) throw std::runtime_error("x and z positions are not the same amount.");
172  Matrix<t_real> B(x.size(), 3);
173  B.col(0) = x;
174  B.col(1) = y;
175  B.col(2) = z;
176  return antenna_to_coverage(B, frequencies, times, theta_ra, phi_dec, latitude);
177 }

References antenna_to_coverage().

◆ antenna_to_coverage_general()

template<class F >
utilities::vis_params purify::utilities::antenna_to_coverage_general ( const Matrix< t_real > &  B,
const std::vector< t_real > &  frequencies,
const std::vector< t_real > &  times,
const F &  position_angle_RA_function,
const F &  position_angle_DEC_function,
const t_real  latitude 
)

Provided antenna positions generate a coverage for multiple frequencies for multiple times at different pointings

Definition at line 119 of file uvw_utilities.h.

124  {
125  if (B.cols() != 3) throw std::runtime_error("Antennae coordinates are not 3D vectors.");
126  const t_uint M = B.rows() * (B.rows() - 1) / 2;
127  const t_uint chans = frequencies.size();
128  const t_uint time_samples = times.size();
129  Vector<t_real> u = Vector<t_real>::Zero(M * chans * time_samples);
130  Vector<t_real> v = Vector<t_real>::Zero(M * chans * time_samples);
131  Vector<t_real> w = Vector<t_real>::Zero(M * chans * time_samples);
132  Vector<t_complex> weights = Vector<t_complex>::Ones(M * chans * time_samples);
133  Vector<t_complex> vis = Vector<t_complex>::Ones(M * chans * time_samples);
134  t_uint m = 0;
135  for (t_uint i = 0; i < B.rows(); i++) {
136  for (t_uint j = i + 1; j < B.rows(); j++) {
137  const Vector<t_real> r = (B.row(i) - B.row(j));
138  for (t_int k = 0; k < chans; k++) {
139  for (t_int t = 0; t < time_samples; t++) {
140  const t_int index = m + M * (k + chans * t);
142  r(0), r(1), r(2), position_angle_RA_function(times.at(t)),
143  position_angle_DEC_function(times.at(t)) - latitude, 0.) *
144  frequencies.at(k) / constant::c;
146  r(0), r(1), r(2), position_angle_RA_function(times.at(t)),
147  position_angle_DEC_function(times.at(t)) - latitude, 0.) *
148  frequencies.at(k) / constant::c;
150  r(0), r(1), r(2), position_angle_RA_function(times.at(t)),
151  position_angle_DEC_function(times.at(t)) - latitude, 0.) *
152  frequencies.at(k) / constant::c;
153  }
154  }
155  m++;
156  }
157  }
158  if (M != m)
159  throw std::runtime_error(
160  "Number of created baselines does not match expected baseline number N * (N - 1) / 2.");
161  utilities::vis_params coverage(u, v, w, vis, weights, utilities::vis_units::lambda);
162  return coverage;
163 };
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 c
speed of light in vacuum
Definition: types.h:72
T calculate_rotated_v(const T &u, const T &v, const T &w, const t_real alpha, const t_real beta, const t_real gamma)
calculate the rotated v from euler angles in zyz and starting coordinates (u, v, w)
Definition: uvw_utilities.h:69
T calculate_rotated_u(const T &u, const T &v, const T &w, const t_real alpha, const t_real beta, const t_real gamma)
calculate the rotated u from euler angles in zyz and starting coordinates (u, v, w)
Definition: uvw_utilities.h:59
T calculate_rotated_w(const T &u, const T &v, const T &w, const t_real alpha, const t_real beta, const t_real gamma)
calculate the rotated w from euler angles in zyz and starting coordinates (u, v, w)
Definition: uvw_utilities.h:79

References purify::constant::c, calculate_rotated_u(), calculate_rotated_v(), calculate_rotated_w(), lambda, operators_test::u, and operators_test::v.

Referenced by antenna_to_coverage().

◆ calculate_l2_radius()

t_real purify::utilities::calculate_l2_radius ( const t_uint  y_size,
const t_real &  sigma,
const t_real &  n_sigma,
const std::string  distirbution 
)

A function that calculates the l2 ball radius for sopt.

Definition at line 75 of file utilities.cc.

76  {
77  /*
78  Calculates the epsilon, the radius of the l2_ball in sopt
79  y:: vector for the l2 ball
80  */
81  if (distirbution == "chi^2") {
82  if (sigma == 0) {
83  return std::sqrt(2 * y_size + n_sigma * std::sqrt(4 * y_size));
84  }
85  return std::sqrt(2 * y_size + n_sigma * std::sqrt(4 * y_size)) * sigma;
86  }
87  if (distirbution == "chi") {
88  auto alpha =
89  1. / (8 * y_size) - 1. / (128 * y_size * y_size); // series expansion for gamma relation
90  auto mean = std::sqrt(2) * std::sqrt(y_size) *
91  (1 - alpha); // using Gamma(k+1/2)/Gamma(k) asymptotic formula
92  auto standard_deviation = std::sqrt(2 * y_size * alpha * (2 - alpha));
93  if (sigma == 0) {
94  return mean + n_sigma * standard_deviation;
95  }
96  return (mean + n_sigma * standard_deviation) * sigma;
97  }
98 
99  return 1.;
100 }

References mean(), and standard_deviation().

Referenced by main(), padmm(), padmm_factory(), TEST_CASE(), and b_utilities::updateMeasurements().

◆ calculate_rotated_u()

template<class T >
T purify::utilities::calculate_rotated_u ( const T &  u,
const T &  v,
const T &  w,
const t_real  alpha,
const t_real  beta,
const t_real  gamma 
)

calculate the rotated u from euler angles in zyz and starting coordinates (u, v, w)

Definition at line 59 of file uvw_utilities.h.

60  {
61  return u * (std::cos(alpha) * std::cos(beta) * std::cos(gamma) -
62  std::sin(alpha) * std::sin(gamma)) +
63  v * (-std::cos(alpha) * std::cos(beta) * std::sin(gamma) -
64  std::sin(alpha) * std::cos(gamma)) +
65  w * std::cos(alpha) * std::sin(beta);
66 }

References operators_test::u, and operators_test::v.

Referenced by antenna_to_coverage_general(), and TEST_CASE().

◆ calculate_rotated_v()

template<class T >
T purify::utilities::calculate_rotated_v ( const T &  u,
const T &  v,
const T &  w,
const t_real  alpha,
const t_real  beta,
const t_real  gamma 
)

calculate the rotated v from euler angles in zyz and starting coordinates (u, v, w)

Definition at line 69 of file uvw_utilities.h.

70  {
71  return u * (std::sin(alpha) * std::cos(beta) * std::cos(gamma) +
72  std::cos(alpha) * std::sin(gamma)) +
73  v * (-std::sin(alpha) * std::cos(beta) * std::sin(gamma) +
74  std::cos(alpha) * std::cos(gamma)) +
75  w * std::sin(alpha) * std::sin(beta);
76 }

References operators_test::u, and operators_test::v.

Referenced by antenna_to_coverage_general(), and TEST_CASE().

◆ calculate_rotated_w()

template<class T >
T purify::utilities::calculate_rotated_w ( const T &  u,
const T &  v,
const T &  w,
const t_real  alpha,
const t_real  beta,
const t_real  gamma 
)

calculate the rotated w from euler angles in zyz and starting coordinates (u, v, w)

Definition at line 79 of file uvw_utilities.h.

80  {
81  return u * (-std::sin(beta) * std::cos(gamma)) + v * (std::sin(beta) * std::sin(gamma)) +
82  w * std::cos(beta);
83 }

References operators_test::u, and operators_test::v.

Referenced by antenna_to_coverage_general(), and TEST_CASE().

◆ checkpoint_log()

std::tuple< t_int, t_real > purify::utilities::checkpoint_log ( const std::string &  diagnostic)

Reads a diagnostic file and updates parameters.

Definition at line 287 of file utilities.cc.

287  {
288  // reads a log file and returns the latest parameters
289  if (!utilities::file_exists(diagnostic)) return std::make_tuple(0, 0);
290 
291  t_int iters = 0;
292  t_real gamma = 0;
293  std::ifstream log_file(diagnostic);
294  std::string entry;
295  std::string s;
296 
297  std::getline(log_file, s);
298 
299  while (log_file) {
300  if (!std::getline(log_file, s)) break;
301  std::istringstream ss(s);
302  std::getline(ss, entry, ' ');
303  iters = std::floor(std::stod(entry));
304  std::getline(ss, entry, ' ');
305  gamma = std::stod(entry);
306  }
307  log_file.close();
308  return std::make_tuple(iters, gamma);
309 }
bool file_exists(const std::string &name)
Test to see if file exists.
Definition: utilities.cc:137

References file_exists().

◆ conjugate_w()

utilities::vis_params purify::utilities::conjugate_w ( const utilities::vis_params uv_vis)

reflects visibilities into the w >= 0 domain

Definition at line 352 of file uvw_utilities.cc.

352  {
353  utilities::vis_params output = uv_vis;
354 #pragma omp parallel for
355  for (t_uint i = 0; i < output.size(); i++) {
356  if (uv_vis.w(i) < 0) {
357  output.w(i) = -uv_vis.w(i);
358  output.v(i) = -uv_vis.v(i);
359  output.u(i) = -uv_vis.u(i);
360  output.vis(i) = std::conj(uv_vis.vis(i));
361  }
362  assert(output.w(i) >= 0);
363  }
364  return output;
365 }

References purify::utilities::vis_params::size(), purify::utilities::vis_params::u, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, and purify::utilities::vis_params::w.

Referenced by getInputData(), main(), and TEST_CASE().

◆ convert_to_pixels()

utilities::vis_params purify::utilities::convert_to_pixels ( const utilities::vis_params uv_vis,
const t_real  cell_x,
const t_real  cell_y,
const t_real  imsizex,
const t_real  imsizey,
const t_real  oversample_ratio 
)

Converts u and v coordaintes to units of pixels.

Definition at line 332 of file uvw_utilities.cc.

334  {
335  t_real du = 1;
336  t_real dv = 1;
337  if (uv_vis.units == utilities::vis_units::lambda) {
338  du = widefield::pixel_to_lambda(cell_x, imsizex, oversample_ratio);
339  dv = widefield::pixel_to_lambda(cell_y, imsizey, oversample_ratio);
340  }
341  if (uv_vis.units == utilities::vis_units::radians) {
342  du = constant::pi / std::floor(imsizex * oversample_ratio);
343  dv = constant::pi / std::floor(imsizey * oversample_ratio);
344  }
345  auto out = uv_vis;
346  out.u = uv_vis.u / du;
347  out.v = uv_vis.v / dv;
348  out.units = utilities::vis_units::pixels;
349  return out;
350 }
const t_real pi
mathematical constant
Definition: types.h:70
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

References lambda, purify::constant::pi, purify::widefield::pixel_to_lambda(), pixels, radians, purify::utilities::vis_params::u, purify::utilities::vis_params::units, and purify::utilities::vis_params::v.

Referenced by purify::measurementoperator::init_degrid_operator_2d().

◆ convolution_operator()

Image< t_complex > purify::utilities::convolution_operator ( const Image< t_complex > &  a,
const Image< t_complex > &  b 
)

Calculates the convolution between two images.

Definition at line 50 of file utilities.cc.

50  {
51  /*
52  returns the convolution of images a with images b
53  a:: vector a, which is shifted
54  b:: vector b, which is fixed
55  */
56 
57  // size of a image
58  t_int a_y = a.rows();
59  t_int a_x = a.cols();
60  // size of b image
61  t_int b_y = b.rows();
62  t_int b_x = b.cols();
63 
64  Image<t_complex> output = Image<t_complex>::Zero(a_y + b_y, a_x + b_x);
65 
66  for (t_int l = 0; l < b.cols(); ++l) {
67  for (t_int k = 0; k < b.rows(); ++k) {
68  output(k, l) = (a * b.block(k, l, a_y, a_x)).sum();
69  }
70  }
71 
72  return output;
73 }

◆ distribute_params()

utilities::vis_params purify::utilities::distribute_params ( utilities::vis_params const &  params,
sopt::mpi::Communicator const &  comm 
)

Definition at line 176 of file mpi_utilities.cc.

177  {
178  if (comm.is_root() and comm.size() > 1) {
179  auto const order = distribute::distribute_measurements(params, comm, distribute::plan::radial);
180  return utilities::regroup_and_scatter(params, order, comm);
181  } else if (comm.size() > 1)
182  return utilities::scatter_visibilities(comm);
183  return params;
184 }
std::vector< t_int > distribute_measurements(Vector< t_real > const &u, Vector< t_real > const &v, Vector< t_real > const &w, t_int const number_of_nodes, distribute::plan const distribution_plan, t_int const &grid_size)
Distribute visiblities into groups.
Definition: distribute.cc:6
vis_params scatter_visibilities(sopt::mpi::Communicator const &comm)
vis_params regroup_and_scatter(vis_params const &params, std::vector< t_int > const &groups, sopt::mpi::Communicator const &comm)

References purify::distribute::distribute_measurements(), purify::distribute::radial, regroup_and_scatter(), and scatter_visibilities().

◆ dynamic_range()

t_real purify::utilities::dynamic_range ( const Image< t_complex > &  model,
const Image< t_complex > &  residuals,
const t_real &  operator_norm 
)

Calculate the dynamic range between the model and residuals.

Definition at line 232 of file utilities.cc.

233  {
234  /*
235  Returns value of noise rms given a measurement vector and signal to noise ratio
236  y0:: complex valued vector before noise added
237  SNR:: signal to noise ratio
238 
239  This calculation follows Carrillo et al. (2014), PURIFY a new approach to radio interferometric
240  imaging
241  */
242  return std::sqrt(model.size()) * (operator_norm * operator_norm) / residuals.matrix().norm() *
243  model.cwiseAbs().maxCoeff();
244 }

◆ file_exists()

bool purify::utilities::file_exists ( const std::string &  name)

Test to see if file exists.

Definition at line 137 of file utilities.cc.

137  {
138  /*
139  Checks if a file exists
140  name:: path of file checked for existance.
141 
142  returns true if exists and false if not exists
143  */
144  struct stat buffer;
145  return (stat(name.c_str(), &buffer) == 0);
146 }

Referenced by checkpoint_log(), and TEST_CASE().

◆ fit_fwhm()

std::tuple< t_real, t_real, t_real > purify::utilities::fit_fwhm ( const Image< t_real > &  psf,
const t_int &  size 
)

Method to fit Gaussian to PSF.

Definition at line 148 of file utilities.cc.

148  {
149  /*
150  Find FWHM of point spread function, using least squares.
151 
152  psf:: point spread function, assumed to be normalised.
153 
154  The method assumes that you have sampled at least
155  3 pixels across the beam.
156  */
157 
158  t_int x0 = std::floor(psf.cols() * 0.5);
159  t_int y0 = std::floor(psf.rows() * 0.5);
160 
161  // finding patch
162  Image<t_real> patch =
163  psf.block(std::floor(y0 - size * 0.5) + 1, std::floor(x0 - size * 0.5) + 1, size, size);
164  PURIFY_LOW_LOG("Fitting to Patch");
165 
166  // finding values for least squares
167 
168  std::vector<t_tripletList> entries;
169  t_int total_entries = 0;
170 
171  for (t_int i = 0; i < patch.cols(); ++i) {
172  for (t_int j = 0; j < patch.rows(); ++j) {
173  entries.emplace_back(j, i, std::log(patch(j, i)));
174  total_entries++;
175  }
176  }
177  Matrix<t_real> A = Matrix<t_real>::Zero(total_entries, 4);
178  Vector<t_real> q = Vector<t_real>::Zero(total_entries);
179  // putting values into a vector and matrix for least squares
180  for (t_int i = 0; i < total_entries; ++i) {
181  t_real x = entries.at(i).col() - size * 0.5 + 0.5;
182  t_real y = entries.at(i).row() - size * 0.5 + 0.5;
183  A(i, 0) = static_cast<t_real>(x * x); // x^2
184  A(i, 1) = static_cast<t_real>(x * y); // x * y
185  A(i, 2) = static_cast<t_real>(y * y); // y^2
186  q(i) = std::real(entries.at(i).value());
187  }
188  // least squares fitting
189  const auto solution =
190  static_cast<Vector<t_real>>(A.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(q));
191  t_real const a = -solution(0);
192  t_real const b = +solution(1) * 0.5;
193  t_real const c = -solution(2);
194  // parameters of Gaussian
195  t_real theta = std::atan2(b, std::sqrt(std::pow(2 * b, 2) + std::pow(c - a, 2)) +
196  (c - a) * 0.5); // some relatively complicated trig identity to
197  // go from tan(2theta) to tan(theta).
198  t_real t = 0.;
199  t_real s = 0.;
200  if (std::abs(b) < 1e-13) {
201  t = a;
202  s = c;
203  theta = 0;
204  } else {
205  t = (a + c - 2 * b / std::sin(2 * theta)) * 0.5;
206  s = (a + c + 2 * b / std::sin(2 * theta)) * 0.5;
207  }
208 
209  t_real const sigma_x = std::sqrt(1 / (2 * t));
210  t_real const sigma_y = std::sqrt(1 / (2 * s));
211 
212  std::tuple<t_real, t_real, t_real> fit_parameters;
213 
214  // fit for the beam rms, used for FWHM
215  std::get<0>(fit_parameters) = sigma_x;
216  std::get<1>(fit_parameters) = sigma_y;
217  std::get<2>(fit_parameters) = theta; // because 2*theta is periodic with pi.
218  return fit_parameters;
219 }
#define PURIFY_LOW_LOG(...)
Low priority message.
Definition: logging.h:207

References purify::constant::c, and PURIFY_LOW_LOG.

Referenced by TEST_CASE().

◆ generate_antennas()

Matrix< t_real > purify::utilities::generate_antennas ( const t_uint  N,
const t_real  scale 
)

Generate guassianly distributed (sigma = scale) antenna positions.

Definition at line 19 of file uvw_utilities.cc.

19  {
20  Matrix<t_real> B = Matrix<t_real>::Zero(N, 3);
21  const t_real mean = 0;
22  const t_real standard_deviation = scale;
23  auto sample = [&mean, &standard_deviation]() {
24  std::random_device rd;
25  std::mt19937_64 rng(rd());
26  t_real output = 4 * standard_deviation + mean;
27  static std::normal_distribution<> normal_dist(mean, standard_deviation);
28  // ensures that all sample points are within bounds
29  while (std::abs(output - mean) > 3 * standard_deviation) {
30  output = normal_dist(rng);
31  }
32  if (output != output) PURIFY_DEBUG("New random-sample density: {}", output);
33  return output;
34  };
35  for (t_uint i = 0; i < N; i++) {
36  B(i, 0) = sample();
37  B(i, 1) = sample();
38  B(i, 2) = sample();
39  }
40  return B * scale;
41 }
#define PURIFY_DEBUG(...)
\macro Output some debugging
Definition: logging.h:197

References mean(), PURIFY_DEBUG, and standard_deviation().

Referenced by antenna_to_coverage(), and TEST_CASE().

◆ has_suffix()

bool purify::utilities::has_suffix ( const std::string &  str,
const std::string &  suff 
)

Definition at line 15 of file uvw_utilities.cc.

15  {
16  return str.size() >= suff.size() && str.compare(str.size() - suff.size(), suff.size(), suff) == 0;
17 }

Referenced by read_visibility().

◆ ind2sub()

std::tuple< t_int, t_int > purify::utilities::ind2sub ( const t_int &  sub,
const t_int &  cols,
const t_int &  rows 
)

Converts from index to subscript for matrix.

Definition at line 26 of file utilities.cc.

26  {
27  /*
28  Converts index of a matrix to (row, column). This does the same as the matlab funciton sub2ind,
29  converts subscript to index.
30 
31  sub:: subscript of entry in matrix
32  cols:: number of columns for matrix
33  rows:: number of rows for matrix
34  row:: output row of matrix
35  col:: output column of matrix
36 
37  */
38  return std::make_tuple<t_int, t_int>(std::floor((sub - (sub % cols)) / cols), sub % cols);
39 }

Referenced by purify::wproj_utilities::row_wise_convolution(), and purify::wproj_utilities::row_wise_sparse_convolution().

◆ init_weights()

Array< t_complex > purify::utilities::init_weights ( const Vector< t_real > &  u,
const Vector< t_real > &  v,
const Vector< t_complex > &  weights,
const t_real &  oversample_factor,
const std::string &  weighting_type,
const t_real &  R,
const t_int &  ftsizeu,
const t_int &  ftsizev 
)

Calculate weightings.

Definition at line 246 of file utilities.cc.

249  {
250  /*
251  Calculate the weights to be applied to the visibilities in the measurement operator.
252  It does none, whiten, natural, uniform, and robust.
253  */
254  if (weighting_type == "none") return weights.array() * 0 + 1.;
255  if (weighting_type == "natural" or weighting_type == "whiten") return weights;
256  Vector<t_complex> out_weights(weights.size());
257  if ((weighting_type == "uniform") or (weighting_type == "robust")) {
258  t_real scale =
259  1. / oversample_factor; // scale for fov, controlling the region of sidelobe supression
260  Matrix<t_complex> gridded_weights = Matrix<t_complex>::Zero(ftsizev, ftsizeu);
261  for (t_int i = 0; i < weights.size(); ++i) {
262  t_int q = utilities::mod(floor(u(i) * scale), ftsizeu);
263  t_int p = utilities::mod(floor(v(i) * scale), ftsizev);
264  gridded_weights(p, q) += 1 * 1; // I get better results assuming all the weights are the
265  // same. It looks like miriad does this as well.
266  }
267  t_complex const sum_weights = (weights.array() * weights.array()).sum();
268  t_complex const sum_grid_weights2 = (gridded_weights.array() * gridded_weights.array()).sum();
269  t_complex const robust_scale =
270  sum_weights / sum_grid_weights2 * 25. *
271  std::pow(10, -2 * R); // Following standard formula, a bit different from miriad.
272  gridded_weights = gridded_weights.array().sqrt();
273  for (t_int i = 0; i < weights.size(); ++i) {
274  t_int q = utilities::mod(floor(u(i) * scale), ftsizeu);
275  t_int p = utilities::mod(floor(v(i) * scale), ftsizev);
276  if (weighting_type == "uniform") out_weights(i) = weights(i) / gridded_weights(p, q);
277  if (weighting_type == "robust") {
278  out_weights(i) = weights(i) / std::sqrt(1. + robust_scale * gridded_weights(p, q) *
279  gridded_weights(p, q));
280  }
281  }
282  } else
283  throw std::runtime_error("Wrong weighting type, " + weighting_type + " not recognised.");
284  return out_weights;
285 }
t_real mod(const t_real &x, const t_real &y)
Mod function modified to wrap circularly for negative numbers.
Definition: utilities.cc:41

References mod(), operators_test::u, and operators_test::v.

◆ mean()

template<class K >
K::Scalar purify::utilities::mean ( const K  x)

Calculate mean of vector.

Definition at line 21 of file utilities.h.

21  {
22  // Calculate mean of vector x
23  return x.array().mean();
24 }

Referenced by add_noise(), calculate_l2_radius(), generate_antennas(), random_sample_density(), and TEST_CASE().

◆ median()

t_real purify::utilities::median ( const Vector< t_real > &  input)

Return median of real vector.

Definition at line 221 of file utilities.cc.

221  {
222  // Finds the median of a real vector x
223  auto size = input.size();
224  Vector<t_real> x(size);
225  std::copy(input.data(), input.data() + size, x.data());
226  std::sort(x.data(), x.data() + size);
227  if (std::floor(size / 2) - std::ceil(size / 2) == 0)
228  return 0.5 * (x(int(std::floor(size / 2) - 1)) + x(int(std::floor(size / 2))));
229  return x(int(std::ceil(size / 2)));
230 }

Referenced by TEST_CASE().

◆ mod()

t_real purify::utilities::mod ( const t_real &  x,
const t_real &  y 
)

Mod function modified to wrap circularly for negative numbers.

Definition at line 41 of file utilities.cc.

41  {
42  /*
43  returns x % y, and warps circularly around y for negative values.
44  */
45  t_real r = std::fmod(x, y);
46  if (r < 0) r = y + r;
47  return r;
48 }

Referenced by purify::widefield::estimate_sample_density(), purify::details::init_gridding_matrix_2d(), purify::operators::init_on_the_fly_gridding_matrix_2d(), init_weights(), purify::wproj_utilities::row_wise_convolution(), purify::wproj_utilities::row_wise_sparse_convolution(), purify::widefield::sample_density_weights(), and TEST_CASE().

◆ parallel_multiply_image()

template<class K , class L >
Image<t_complex> purify::utilities::parallel_multiply_image ( const K &  A,
const L &  B 
)

Multiply images coefficient-wise using openmp.

Definition at line 83 of file utilities.h.

83  {
84  const t_int rows = A.rows();
85  const t_int cols = A.cols();
86  Image<t_complex> C = Matrix<t_complex>::Zero(rows, cols);
87 
88 #pragma omp simd collapse(2)
89  for (t_int i = 0; i < cols; ++i)
90  for (t_int j = 0; j < rows; ++j) C(j, i) = A(j, i) * B(j, i);
91  return C;
92 }

◆ random_sample_density()

utilities::vis_params purify::utilities::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.

Definition at line 104 of file uvw_utilities.cc.

105  {
106  /*
107  Generates a random sampling density for visibility coverage
108  vis_num:: number of visibilities
109  mean:: mean of distribution
110  standard_deviation:: standard deviation of distirbution
111  */
112  auto sample = [&mean, &standard_deviation]() {
113  std::random_device rd;
114  std::mt19937_64 rng(rd());
115  t_real output = 4 * standard_deviation + mean;
116  static std::normal_distribution<> normal_dist(mean, standard_deviation);
117  // ensures that all sample points are within bounds
118  while (std::abs(output - mean) > 3 * standard_deviation) {
119  output = normal_dist(rng);
120  }
121  if (output != output) PURIFY_DEBUG("New random-sample density: {}", output);
122  return output;
123  };
124 
125  utilities::vis_params uv_vis;
126  uv_vis.u = Vector<t_real>::Zero(vis_num);
127  uv_vis.v = Vector<t_real>::Zero(vis_num);
128  uv_vis.w = Vector<t_real>::Zero(vis_num);
129  // #pragma omp parallel for
130  for (t_uint i = 0; i < vis_num; i++) {
131  uv_vis.u(i) = sample();
132  uv_vis.v(i) = sample();
133  uv_vis.w(i) = sample();
134  }
135  uv_vis.w = uv_vis.w / standard_deviation * rms_w;
136  uv_vis.weights = Vector<t_complex>::Constant(vis_num, 1);
137  uv_vis.vis = Vector<t_complex>::Constant(vis_num, 1);
138  uv_vis.ra = 0;
139  uv_vis.dec = 0;
140  uv_vis.average_frequency = 0;
141  return uv_vis;
142 }

References purify::utilities::vis_params::average_frequency, purify::utilities::vis_params::dec, mean(), PURIFY_DEBUG, purify::utilities::vis_params::ra, standard_deviation(), purify::utilities::vis_params::u, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, purify::utilities::vis_params::w, and purify::utilities::vis_params::weights.

Referenced by dirty_visibilities(), getInputData(), main(), b_utilities::random_measurements(), GridOperatorFixture::SetUp(), DegridOperatorFixture::SetUp(), and TEST_CASE().

◆ re_sample_ft_grid()

Matrix< t_complex > purify::utilities::re_sample_ft_grid ( const Matrix< t_complex > &  input,
const t_real &  re_sample_ratio 
)

zero pads ft grid for image up sampling and downsampling

Definition at line 311 of file utilities.cc.

311  {
312  /*
313  up samples image using by zero padding the fft
314 
315  input:: fft to be upsampled, with zero frequency at (0,0) of the matrix.
316 
317  */
318  if (re_sample_ratio == 1) return input;
319 
320  // sets up dimensions for old image
321  t_int old_x_centre_floor = std::floor(input.cols() * 0.5);
322  t_int old_y_centre_floor = std::floor(input.rows() * 0.5);
323  // need ceilling in case image is of odd dimension
324  t_int old_x_centre_ceil = std::ceil(input.cols() * 0.5);
325  t_int old_y_centre_ceil = std::ceil(input.rows() * 0.5);
326 
327  // sets up dimensions for new image
328  t_int new_x = std::floor(input.cols() * re_sample_ratio);
329  t_int new_y = std::floor(input.rows() * re_sample_ratio);
330 
331  t_int new_x_centre_floor = std::floor(new_x * 0.5);
332  t_int new_y_centre_floor = std::floor(new_y * 0.5);
333  // need ceilling in case image is of odd dimension
334  t_int new_x_centre_ceil = std::ceil(new_x * 0.5);
335  t_int new_y_centre_ceil = std::ceil(new_y * 0.5);
336 
337  Matrix<t_complex> output = Matrix<t_complex>::Zero(new_y, new_x);
338 
339  t_int box_dim_x;
340  t_int box_dim_y;
341 
342  // now have to move each quadrant into new grid
343  box_dim_x = std::min(old_x_centre_ceil, new_x_centre_ceil);
344  box_dim_y = std::min(old_y_centre_ceil, new_y_centre_ceil);
345  //(0, 0)
346  output.bottomLeftCorner(box_dim_y, box_dim_x) = input.bottomLeftCorner(box_dim_y, box_dim_x);
347 
348  box_dim_x = std::min(old_x_centre_ceil, new_x_centre_ceil);
349  box_dim_y = std::min(old_y_centre_floor, new_y_centre_floor);
350  //(y0, 0)
351  output.topLeftCorner(box_dim_y, box_dim_x) = input.topLeftCorner(box_dim_y, box_dim_x);
352 
353  box_dim_x = std::min(old_x_centre_floor, new_x_centre_floor);
354  box_dim_y = std::min(old_y_centre_ceil, new_y_centre_ceil);
355  //(0, x0)
356  output.bottomRightCorner(box_dim_y, box_dim_x) = input.bottomRightCorner(box_dim_y, box_dim_x);
357 
358  box_dim_x = std::min(old_x_centre_floor, new_x_centre_floor);
359  box_dim_y = std::min(old_y_centre_floor, new_y_centre_floor);
360  //(y0, x0)
361  output.topRightCorner(box_dim_y, box_dim_x) = input.topRightCorner(box_dim_y, box_dim_x);
362 
363  return output;
364 }

Referenced by re_sample_image().

◆ re_sample_image()

Matrix< t_complex > purify::utilities::re_sample_image ( const Matrix< t_complex > &  input,
const t_real &  re_sample_ratio 
)

resamples image size

Definition at line 365 of file utilities.cc.

365  {
366  const auto ft_plan = operators::fftw_plan::estimate;
367  auto fft =
368  purify::operators::init_FFT_2d<Vector<t_complex>>(input.rows(), input.cols(), 1., ft_plan);
369  Vector<t_complex> ft_grid = Vector<t_complex>::Zero(input.size());
370  std::get<0>(fft)(ft_grid, Vector<t_complex>::Map(input.data(), input.size()));
371  Matrix<t_complex> const new_ft_grid = utilities::re_sample_ft_grid(
372  Matrix<t_complex>::Map(ft_grid.data(), input.rows(), input.cols()), re_sample_ratio);
373  Vector<t_complex> output = Vector<t_complex>::Zero(input.size());
374  fft = purify::operators::init_FFT_2d<Vector<t_complex>>(new_ft_grid.rows(), new_ft_grid.cols(),
375  1., ft_plan);
376  std::get<1>(fft)(output, Vector<t_complex>::Map(new_ft_grid.data(), new_ft_grid.size()));
377  return Matrix<t_complex>::Map(output.data(), new_ft_grid.rows(), new_ft_grid.cols()) *
378  re_sample_ratio;
379 }
Matrix< t_complex > re_sample_ft_grid(const Matrix< t_complex > &input, const t_real &re_sample_ratio)
zero pads ft grid for image up sampling and downsampling
Definition: utilities.cc:311

References purify::operators::estimate, and re_sample_ft_grid().

◆ read_ant_positions()

Matrix< t_real > purify::utilities::read_ant_positions ( const std::string &  pos_name)

Read in a text file of antenna positions into a matrix [x, y ,z].

Definition at line 77 of file uvw_utilities.cc.

77  {
78  /*
79  Reads an csv file with x, y, z (meters) and returns the vectors as a matrix (x, y, z) cols.
80 
81  vis_name:: name of input text file containing [x, y, z] (separated by ' ').
82  */
83  std::ifstream pos_file(pos_name);
84  pos_file.precision(13);
85  t_int row = 0;
86  std::string line;
87  // counts size of pos file
88  while (std::getline(pos_file, line)) ++row;
89  if (row < 1) throw std::runtime_error("No positions in the file: " + pos_name);
90  Matrix<t_real> B = Matrix<t_real>::Zero(row, 3);
91 
92  pos_file.clear();
93  pos_file.seekg(0);
94  // reads in vis file
95  for (row = 0; row < B.rows(); ++row) {
96  B(row, 0) = streamtoreal(pos_file);
97  B(row, 1) = streamtoreal(pos_file);
98  B(row, 2) = streamtoreal(pos_file);
99  }
100 
101  return B;
102 }
t_real streamtoreal(std::ifstream &stream)
Reading reals from visibility file (including nan's and inf's)

References streamtoreal().

Referenced by read_ant_positions_to_coverage(), and TEST_CASE().

◆ read_ant_positions_to_coverage()

template<class T , class K >
utilities::vis_params purify::utilities::read_ant_positions_to_coverage ( const std::string &  pos_name,
const T &  frequencies,
const K &  times,
const t_real  theta_ra,
const t_real  phi_dec,
const t_real  latitude 
)

Read in a text file of antenna positions into a matrix [x, y ,z] and generate coverage for frequencies

Definition at line 183 of file uvw_utilities.h.

186  {
187  return antenna_to_coverage(read_ant_positions(pos_name), frequencies, times, theta_ra, phi_dec,
188  latitude);
189 }
Matrix< t_real > read_ant_positions(const std::string &pos_name)
Read in a text file of antenna positions into a matrix [x, y ,z].

References antenna_to_coverage(), and read_ant_positions().

Referenced by main(), and TEST_CASE().

◆ read_visibility() [1/3]

utilities::vis_params purify::utilities::read_visibility ( const std::string &  vis_name,
const bool  w_term 
)

Reads in visibility file.

Definition at line 236 of file uvw_utilities.cc.

236  {
237 #ifdef PURIFY_H5
238  if (has_suffix(vis_name, ".h5")) return H5::read_visibility(vis_name, w_term);
239 #endif
240  return read_visibility_csv(vis_name, w_term);
241 }
bool has_suffix(const std::string &str, const std::string &suff)
utilities::vis_params read_visibility(const std::string &vis_name, const bool w_term)
Reads in visibility file.
utilities::vis_params read_visibility_csv(const std::string &vis_name, const bool w_term)
Reads in visibility csv file.

References has_suffix(), purify::H5::read_visibility(), and read_visibility_csv().

◆ read_visibility() [2/3]

utilities::vis_params purify::utilities::read_visibility ( const std::string &  vis_name2,
const utilities::vis_params uv1 
)

Reads in two visibility files.

Definition at line 150 of file uvw_utilities.cc.

151  {
152  const bool w_term = not uv1.w.isZero(0);
153 
154  const auto uv2 = read_visibility(vis_name2, w_term);
155  utilities::vis_params uv;
156  uv.u = Vector<t_real>::Zero(uv1.size() + uv2.size());
157  uv.v = Vector<t_real>::Zero(uv1.size() + uv2.size());
158  uv.w = Vector<t_real>::Zero(uv1.size() + uv2.size());
159  uv.vis = Vector<t_complex>::Zero(uv1.size() + uv2.size());
160  uv.weights = Vector<t_complex>::Zero(uv1.size() + uv2.size());
161  uv.u.segment(0, uv1.size()) = uv1.u;
162  uv.v.segment(0, uv1.size()) = uv1.v;
163  uv.w.segment(0, uv1.size()) = uv1.w;
164  uv.vis.segment(0, uv1.size()) = uv1.vis;
165  uv.weights.segment(0, uv1.size()) = uv1.weights;
166  uv.u.segment(uv1.size(), uv2.size()) = uv2.u;
167  uv.v.segment(uv1.size(), uv2.size()) = uv2.v;
168  uv.w.segment(uv1.size(), uv2.size()) = uv2.w;
169  uv.vis.segment(uv1.size(), uv2.size()) = uv2.vis;
170  uv.weights.segment(uv1.size(), uv2.size()) = uv2.weights;
171  return uv;
172 }

References read_visibility(), purify::utilities::vis_params::size(), purify::utilities::vis_params::u, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, purify::utilities::vis_params::w, and purify::utilities::vis_params::weights.

◆ read_visibility() [3/3]

utilities::vis_params purify::utilities::read_visibility ( const std::vector< std::string > &  names,
const bool  w_term 
)

Read visibility files from name of vector.

Definition at line 144 of file uvw_utilities.cc.

144  {
145  utilities::vis_params output = read_visibility(names.at(0), w_term);
146  if (names.size() == 1) return output;
147  for (int i = 1; i < names.size(); i++) output = read_visibility(names.at(i), output);
148  return output;
149 }

Referenced by dirty_visibilities(), main(), b_utilities::random_measurements(), purify::read_measurements::read_measurements(), read_visibility(), and TEST_CASE().

◆ read_visibility_csv()

utilities::vis_params purify::utilities::read_visibility_csv ( const std::string &  vis_name,
const bool  w_term 
)

Reads in visibility csv file.

Definition at line 181 of file uvw_utilities.cc.

181  {
182  /*
183  Reads an csv file with u, v, visibilities and returns the vectors.
184 
185  vis_name:: name of input text file containing [u, v, real(V), imag(V)] (separated by ' ').
186  */
187  std::ifstream vis_file(vis_name);
188  if (vis_file) {
189  PURIFY_LOW_LOG("File {} successfully opened", vis_name);
190  } else {
191  throw std::runtime_error("Could not open file " + vis_name);
192  }
193  vis_file.precision(13);
194  t_int row = 0;
195  std::string line;
196  // counts size of vis file
197  while (std::getline(vis_file, line)) ++row;
198  Vector<t_real> utemp = Vector<t_real>::Zero(row);
199  Vector<t_real> vtemp = Vector<t_real>::Zero(row);
200  Vector<t_real> wtemp = Vector<t_real>::Zero(row);
201  Vector<t_complex> vistemp = Vector<t_complex>::Zero(row);
202  Vector<t_complex> weightstemp = Vector<t_complex>::Zero(row);
203 
204  vis_file.clear();
205  vis_file.seekg(0);
206  // reads in vis file
207  t_real real;
208  t_real imag;
209  t_real entry;
210  for (row = 0; row < vistemp.size(); ++row) {
211  utemp(row) = streamtoreal(vis_file);
212  vtemp(row) = streamtoreal(vis_file);
213  if (w_term) {
214  wtemp(row) = streamtoreal(vis_file);
215  }
216  real = streamtoreal(vis_file);
217  imag = streamtoreal(vis_file);
218  entry = streamtoreal(vis_file);
219  vistemp(row) = t_complex(real, imag);
220  weightstemp(row) = 1 / entry;
221  }
222  utilities::vis_params uv_vis;
223  uv_vis.u = utemp;
224  uv_vis.v = -vtemp; // found that a reflection is needed for the orientation of the gridded image
225  // to be correct
226  uv_vis.w = wtemp;
227  uv_vis.vis = vistemp;
228  uv_vis.weights = weightstemp;
229  uv_vis.ra = 0;
230  uv_vis.dec = 0;
231  uv_vis.average_frequency = 0;
232 
233  return uv_vis;
234 }

References purify::utilities::vis_params::average_frequency, purify::utilities::vis_params::dec, PURIFY_LOW_LOG, purify::utilities::vis_params::ra, streamtoreal(), purify::utilities::vis_params::u, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, purify::utilities::vis_params::w, and purify::utilities::vis_params::weights.

Referenced by read_visibility().

◆ regroup() [1/2]

void purify::utilities::regroup ( vis_params uv_params,
std::vector< t_int > &  image_index,
std::vector< t_int > const &  groups_,
const t_int  max_groups 
)

Definition at line 14 of file mpi_utilities.cc.

15  {
16  std::vector<t_int> groups = groups_;
17  // Figure out size of each group
18  std::map<t_int, t_int> sizes;
19  for (auto g = 0; g < max_groups; g++) sizes[g] = 0;
20  for (auto const &group : groups) ++sizes[group];
21 
22  std::map<t_int, t_int> indices, ends;
23  auto i = 0;
24  for (auto const &item : sizes) {
25  indices[item.first] = i;
26  i += item.second;
27  ends[item.first] = i;
28  }
29  const auto minmax = std::minmax_element(ends.begin(), ends.end());
30  if (std::get<1>(*std::get<0>(minmax)) < 0)
31  throw std::runtime_error("segment end " + std::to_string(std::get<1>(*std::get<0>(minmax))) +
32  " less than 0. Not a valid end.");
33  if (std::get<1>(*std::get<1>(minmax)) > uv_params.size())
34  throw std::runtime_error("segment end " + std::to_string(std::get<1>(*std::get<1>(minmax))) +
35  " larger than data vector " +
36  std::to_string(static_cast<t_int>(uv_params.size())) +
37  ". End not valid.");
38 
39  auto const expected = [&ends](t_int i) {
40  t_int j = 0;
41  for (auto const end : ends) {
42  if (i < end.second) return j;
43  ++j;
44  }
45  return j;
46  };
47 
48  i = 0;
49  while (i < uv_params.u.size()) {
50  auto const expected_proc = expected(i);
51  if (groups[i] == expected_proc) {
52  ++i;
53  continue;
54  }
55  auto &swapper = indices[groups[i]];
56  if (groups[swapper] == expected(swapper)) {
57  ++swapper;
58  continue;
59  }
60  if (swapper >= uv_params.u.size())
61  throw std::runtime_error("regroup (groups, " + std::to_string(groups[swapper]) + ", " +
62  std::to_string(groups[i]) + ") index out of bounds " +
63  std::to_string(i) + " " + std::to_string(swapper) +
64  " >= " + std::to_string(uv_params.u.size()));
65  std::swap(groups[i], groups[swapper]);
66  std::swap(uv_params.u(i), uv_params.u(swapper));
67  std::swap(uv_params.v(i), uv_params.v(swapper));
68  std::swap(uv_params.w(i), uv_params.w(swapper));
69  std::swap(uv_params.vis(i), uv_params.vis(swapper));
70  std::swap(uv_params.weights(i), uv_params.weights(swapper));
71  std::swap(image_index[i], image_index[swapper]);
72 
73  ++swapper;
74  }
75 }

References purify::utilities::vis_params::size(), purify::utilities::vis_params::u, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, purify::utilities::vis_params::w, and purify::utilities::vis_params::weights.

◆ regroup() [2/2]

void purify::utilities::regroup ( vis_params uv_params,
std::vector< t_int > const &  groups_,
const t_int  max_groups 
)

Definition at line 9 of file mpi_utilities.cc.

9  {
10  std::vector<t_int> image_index(uv_params.size(), 0);
11  regroup(uv_params, image_index, groups_, max_groups);
12 }
void regroup(vis_params &uv_params, std::vector< t_int > &image_index, std::vector< t_int > const &groups_, const t_int max_groups)

References purify::utilities::vis_params::size().

Referenced by regroup_and_all_to_all(), regroup_and_scatter(), and TEST_CASE().

◆ regroup_and_all_to_all() [1/2]

std::tuple<vis_params, std::vector<t_int> > purify::utilities::regroup_and_all_to_all ( vis_params const &  params,
const std::vector< t_int > &  image_index,
std::vector< t_int > const &  groups,
sopt::mpi::Communicator const &  comm 
)

Definition at line 94 of file mpi_utilities.cc.

96  {
97  if (comm.size() == 1) return std::make_tuple(params, image_index);
98  vis_params copy = params;
99  std::vector<t_int> index_copy(image_index.size());
100  std::copy(image_index.begin(), image_index.end(), index_copy.begin());
101  regroup(copy, index_copy, groups, comm.size());
102 
103  std::vector<t_int> sizes(comm.size());
104  std::fill(sizes.begin(), sizes.end(), 0);
105  for (const t_int &group : groups) {
106  if (group >= static_cast<t_int>(comm.size())) {
107  throw std::out_of_range("groups should go from 0 to comm.size()-1");
108  }
109  ++sizes[group];
110  }
111 
112  return std::make_tuple(all_to_all_visibilities(copy, sizes, comm),
113  comm.all_to_allv(index_copy, sizes));
114 }
vis_params all_to_all_visibilities(vis_params const &params, std::vector< t_int > const &sizes, sopt::mpi::Communicator const &comm)

References all_to_all_visibilities(), regroup(), and purify::utilities::vis_params::size().

Referenced by regroup_and_all_to_all(), TEST_CASE(), w_stacking(), and w_stacking_with_all_to_all().

◆ regroup_and_all_to_all() [2/2]

vis_params purify::utilities::regroup_and_all_to_all ( vis_params const &  params,
std::vector< t_int > const &  groups,
sopt::mpi::Communicator const &  comm 
)

Definition at line 116 of file mpi_utilities.cc.

117  {
118  return std::get<0>(
119  regroup_and_all_to_all(params, std::vector<t_int>(params.size(), 0), groups, comm));
120 }
vis_params regroup_and_all_to_all(vis_params const &params, std::vector< t_int > const &groups, sopt::mpi::Communicator const &comm)

References regroup_and_all_to_all(), and purify::utilities::vis_params::size().

◆ regroup_and_scatter()

vis_params purify::utilities::regroup_and_scatter ( vis_params const &  params,
std::vector< t_int > const &  groups,
sopt::mpi::Communicator const &  comm 
)

Definition at line 77 of file mpi_utilities.cc.

78  {
79  if (comm.size() == 1) return params;
80  if (comm.rank() != comm.root_id()) return scatter_visibilities(comm);
81 
82  std::vector<t_int> sizes(comm.size());
83  std::fill(sizes.begin(), sizes.end(), 0);
84  for (auto const &group : groups) {
85  if (group > static_cast<t_int>(comm.size()))
86  throw std::out_of_range("groups should go from 0 to comm.size()");
87  ++sizes[group];
88  }
89 
90  vis_params copy = params;
91  regroup(copy, groups, comm.size());
92  return scatter_visibilities(copy, sizes, comm);
93 }

References regroup(), scatter_visibilities(), and purify::utilities::vis_params::size().

Referenced by dirty_visibilities(), distribute_params(), and TEST_CASE().

◆ scatter_visibilities() [1/2]

vis_params purify::utilities::scatter_visibilities ( sopt::mpi::Communicator const &  comm)

Definition at line 156 of file mpi_utilities.cc.

156  {
157  if (comm.is_root())
158  throw std::runtime_error("The root node should call the *other* scatter_visibilities function");
159 
160  auto const local_size = comm.scatter_one<t_int>();
161  vis_params result;
162  result.u = comm.scatterv<decltype(result.u)::Scalar>(local_size);
163  result.v = comm.scatterv<decltype(result.v)::Scalar>(local_size);
164  result.w = comm.scatterv<decltype(result.w)::Scalar>(local_size);
165  result.vis = comm.scatterv<decltype(result.vis)::Scalar>(local_size);
166  result.weights = comm.scatterv<decltype(result.weights)::Scalar>(local_size);
167  result.units = static_cast<utilities::vis_units>(
168  comm.broadcast<std::remove_const<decltype(static_cast<int>(result.units))>::type>());
169  result.ra = comm.broadcast<std::remove_const<decltype(result.ra)>::type>();
170  result.dec = comm.broadcast<std::remove_const<decltype(result.dec)>::type>();
171  result.average_frequency =
172  comm.broadcast<std::remove_const<decltype(result.average_frequency)>::type>();
173  return result;
174 }

References purify::utilities::vis_params::u.

◆ scatter_visibilities() [2/2]

vis_params purify::utilities::scatter_visibilities ( vis_params const &  params,
std::vector< t_int > const &  sizes,
sopt::mpi::Communicator const &  comm 
)

Definition at line 137 of file mpi_utilities.cc.

138  {
139  if (comm.size() == 1) return params;
140  if (not comm.is_root()) return scatter_visibilities(comm);
141 
142  comm.scatter_one(sizes);
143  vis_params result;
144  result.u = comm.scatterv(params.u, sizes);
145  result.v = comm.scatterv(params.v, sizes);
146  result.w = comm.scatterv(params.w, sizes);
147  result.vis = comm.scatterv(params.vis, sizes);
148  result.weights = comm.scatterv(params.weights, sizes);
149  result.units = static_cast<utilities::vis_units>(comm.broadcast(static_cast<int>(params.units)));
150  result.ra = comm.broadcast(params.ra);
151  result.dec = comm.broadcast(params.dec);
152  result.average_frequency = comm.broadcast(params.average_frequency);
153  return result;
154 }

References purify::utilities::vis_params::average_frequency, purify::utilities::vis_params::dec, purify::utilities::vis_params::ra, purify::utilities::vis_params::u, purify::utilities::vis_params::units, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, purify::utilities::vis_params::w, and purify::utilities::vis_params::weights.

Referenced by dirty_visibilities(), distribute_params(), regroup_and_scatter(), and TEST_CASE().

◆ set_cell_size() [1/3]

utilities::vis_params purify::utilities::set_cell_size ( const sopt::mpi::Communicator &  comm,
utilities::vis_params const &  uv_vis,
const t_real &  cell_x,
const t_real &  cell_y 
)

Definition at line 186 of file mpi_utilities.cc.

188  {
189  if (comm.size() == 1) return utilities::set_cell_size(uv_vis, cell_x, cell_y);
190 
191  const t_real max_u = comm.all_reduce<t_real>(uv_vis.u.array().cwiseAbs().maxCoeff(), MPI_MAX);
192  const t_real max_v = comm.all_reduce<t_real>(uv_vis.v.array().cwiseAbs().maxCoeff(), MPI_MAX);
193  return utilities::set_cell_size(uv_vis, max_u, max_v, cell_x, cell_y);
194 }
utilities::vis_params set_cell_size(const sopt::mpi::Communicator &comm, utilities::vis_params const &uv_vis, const t_real &cell_x, const t_real &cell_y)

References purify::utilities::vis_params::u, and purify::utilities::vis_params::v.

Referenced by set_cell_size(), and TEST_CASE().

◆ set_cell_size() [2/3]

utilities::vis_params purify::utilities::set_cell_size ( const utilities::vis_params uv_vis,
const t_real &  cell_size_u,
const t_real &  cell_size_v 
)

Scales visibilities to a given pixel size in arcseconds.

Definition at line 304 of file uvw_utilities.cc.

305  {
306  const t_real max_u = std::sqrt((uv_vis.u.array() * uv_vis.u.array()).maxCoeff());
307  const t_real max_v = std::sqrt((uv_vis.v.array() * uv_vis.v.array()).maxCoeff());
308  return set_cell_size(uv_vis, max_u, max_v, cell_size_u, cell_size_v);
309 }
utilities::vis_params set_cell_size(const utilities::vis_params &uv_vis, const t_real &cell_size_u, const t_real &cell_size_v)
Scales visibilities to a given pixel size in arcseconds.

References set_cell_size(), purify::utilities::vis_params::u, and purify::utilities::vis_params::v.

◆ set_cell_size() [3/3]

utilities::vis_params purify::utilities::set_cell_size ( const utilities::vis_params uv_vis,
const t_real &  max_u,
const t_real &  max_v,
const t_real &  input_cell_size_u,
const t_real &  input_cell_size_v 
)

Definition at line 261 of file uvw_utilities.cc.

263  {
264  /*
265  Converts the units of visibilities to units of 2 * pi, while scaling for the size of a pixel
266  (cell_size)
267 
268  uv_vis:: visibilities
269  cell_size:: size of a pixel in arcseconds
270  */
271 
272  utilities::vis_params scaled_vis = uv_vis;
273  t_real cell_size_u = input_cell_size_u;
274  t_real cell_size_v = input_cell_size_v;
275  if (cell_size_u == 0 and cell_size_v == 0) {
276  cell_size_u = (180 * 3600) / max_u / constant::pi / 3; // Calculate cell size if not given one
277 
278  cell_size_v = (180 * 3600) / max_v / constant::pi / 3; // Calculate cell size if not given one
279  // PURIFY_MEDIUM_LOG("PSF has a FWHM of {} by {} arcseconds", cell_size_u * 3, cell_size_v * 3);
280  }
281  if (cell_size_v == 0) {
282  cell_size_v = cell_size_u;
283  }
284 
285  PURIFY_MEDIUM_LOG("Using a pixel size of {} by {} arcseconds", cell_size_u, cell_size_v);
286  t_real scale_factor_u = 1;
287  t_real scale_factor_v = 1;
288  if (uv_vis.units == utilities::vis_units::lambda) {
289  scale_factor_u = 180 * 3600 / cell_size_u / constant::pi;
290  scale_factor_v = 180 * 3600 / cell_size_v / constant::pi;
291  scaled_vis.w = uv_vis.w;
292  }
293  if (uv_vis.units == utilities::vis_units::radians) {
294  scale_factor_u = 180 * 3600 / constant::pi;
295  scale_factor_v = 180 * 3600 / constant::pi;
296  scaled_vis.w = uv_vis.w;
297  }
298  scaled_vis.u = uv_vis.u / scale_factor_u * 2 * constant::pi;
299  scaled_vis.v = uv_vis.v / scale_factor_v * 2 * constant::pi;
300 
301  scaled_vis.units = utilities::vis_units::radians;
302  return scaled_vis;
303 }
#define PURIFY_MEDIUM_LOG(...)
Medium priority message.
Definition: logging.h:205

References lambda, purify::constant::pi, PURIFY_MEDIUM_LOG, radians, purify::utilities::vis_params::u, purify::utilities::vis_params::units, purify::utilities::vis_params::v, and purify::utilities::vis_params::w.

◆ SNR_to_standard_deviation()

t_real purify::utilities::SNR_to_standard_deviation ( const Vector< t_complex > &  y0,
const t_real &  SNR 
)

Converts SNR to RMS noise.

Definition at line 101 of file utilities.cc.

101  {
102  /*
103  Returns value of noise rms given a measurement vector and signal to noise ratio
104  y0:: complex valued vector before noise added
105  SNR:: signal to noise ratio
106 
107  This calculation follows Carrillo et al. (2014), PURIFY a new approach to radio interferometric
108  imaging but we have assumed that rms noise is for the real and imaginary parts
109  */
110  return y0.stableNorm() / std::sqrt(2 * y0.size()) * std::pow(10.0, -(SNR / 20.0));
111 }

Referenced by b_utilities::dirty_measurements(), dirty_visibilities(), getInputData(), and main().

◆ sort_by_w()

vis_params purify::utilities::sort_by_w ( const vis_params uv_data)

Sort visibilities to be from w_max to w_min.

Definition at line 5 of file wproj_utilities.cc.

5  {
6  vis_params output = uv_data;
7  std::vector<t_uint> ind;
8  for (t_uint i = 0; i < uv_data.size(); i++) ind.push_back(i);
9  std::sort(ind.begin(), ind.end(),
10  [&](const t_uint a, const t_uint b) { return uv_data.w(a) < uv_data.w(b); });
11  for (t_uint i = 0; i < uv_data.size(); i++) {
12  output.u(i) = uv_data.u(ind.at(i));
13  output.v(i) = uv_data.v(ind.at(i));
14  output.w(i) = uv_data.w(ind.at(i));
15  output.weights(i) = uv_data.weights(ind.at(i));
16  output.vis(i) = uv_data.vis(ind.at(i));
17  }
18  return output;
19 }

References purify::utilities::vis_params::size(), purify::utilities::vis_params::u, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, purify::utilities::vis_params::w, and purify::utilities::vis_params::weights.

◆ sparse_multiply_matrix()

template<class T0 , class T1 >
std::enable_if<std::is_same<typename T0::Scalar, typename T1::Scalar>::value and T0::IsRowMajor, Vector<typename T0::Scalar> >::type purify::utilities::sparse_multiply_matrix ( const Eigen::SparseMatrixBase< T0 > &  M,
const Eigen::MatrixBase< T1 > &  x 
)

Parallel multiplication with a sparse matrix and vector.

Definition at line 67 of file utilities.h.

67  {
68  assert(M.cols() == x.size());
69  Vector<typename T0::Scalar> y = Vector<typename T0::Scalar>::Zero(M.rows());
70  auto const &derived = M.derived();
71 // parallel sparse matrix multiplication with vector.
72 #pragma omp parallel for
73  // #pragma omp simd
74  for (t_int k = 0; k < M.outerSize(); ++k)
75  for (typename Sparse<typename T0::Scalar>::InnerIterator it(derived, k); it; ++it)
76  y(k) += it.value() * x(it.index());
77  return y;
78 }

Referenced by purify::operators::init_gridding_matrix_2d(), and TEST_CASE().

◆ standard_deviation()

template<class K >
t_real purify::utilities::standard_deviation ( const K  x)

Calculates the standard deviation of a vector.

Definition at line 34 of file utilities.h.

34  {
35  // calculate standard deviation of vector x
36  return std::sqrt(variance(x));
37 }
t_real variance(const K x)
Calculate variance of vector.
Definition: utilities.h:27

References variance().

Referenced by add_noise(), calculate_l2_radius(), generate_antennas(), and random_sample_density().

◆ step_size()

template<class T >
t_real purify::utilities::step_size ( T const &  vis,
const std::shared_ptr< sopt::LinearTransform< T > const > &  measurements,
const std::shared_ptr< sopt::LinearTransform< T > const > &  wavelets,
const t_uint  sara_size 
)

Calculate step size using MPI (does not include factor of 1e-3)

Parameters
[in]visVector of measurement data
[in]measurementsShared pointer to measurement linear operator
[in]waveletsShared pointer to SARA wavelet linear operator
[in]sara_sizeSize of sara dictionary of MPI node.

Please use this function to calculate the step size for PADMM, Forward Backward, etc. Especially when using MPI.

Note
There is an issue with using the adjoint wavelet transform of the SARA basis. When there are more nodes than wavelets, there will be nodes with an empty Vector<T> of wavelet coefficients. This can cause some functions to break, like .maxCoeff().

Definition at line 79 of file mpi_utilities.h.

81  {
82  // measurement operator may use different number of nodes than wavelet operator
83  // so needs to be done separately
84  const T dimage = measurements->adjoint() * vis;
85  return (sara_size > 0) ? (wavelets->adjoint() * dimage).cwiseAbs().maxCoeff() : 0.;
86 };

References measurements.

Referenced by purify::factory::fb_factory(), purify::factory::padmm_factory(), padmm_factory(), and purify::factory::primaldual_factory().

◆ streamtoreal()

t_real purify::utilities::streamtoreal ( std::ifstream &  stream)

Reading reals from visibility file (including nan's and inf's)

Definition at line 175 of file uvw_utilities.cc.

175  {
176  std::string input;
177  stream >> input;
178  return std::stod(input);
179 }

Referenced by read_ant_positions(), and read_visibility_csv().

◆ sub2ind()

t_int purify::utilities::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 at line 12 of file utilities.cc.

12  {
13  /*
14  Converts (row, column) of a matrix to a single index. This does the same as the matlab funciton
15  sub2ind, converts subscript to index.
16  Though order of cols and rows is probably transposed.
17 
18  row:: row of matrix (y)
19  col:: column of matrix (x)
20  cols:: number of columns for matrix
21  rows:: number of rows for matrix
22  */
23  return row * cols + col;
24 }

Referenced by purify::details::init_gridding_matrix_2d(), purify::operators::init_on_the_fly_gridding_matrix_2d(), purify::operators::init_zero_padding_2d(), purify::wproj_utilities::row_wise_convolution(), and purify::wproj_utilities::row_wise_sparse_convolution().

◆ uv_scale()

utilities::vis_params purify::utilities::uv_scale ( const utilities::vis_params uv_vis,
const t_int &  sizex,
const t_int &  sizey 
)

scales the visibilities to units of pixels

Definition at line 311 of file uvw_utilities.cc.

312  {
313  /*
314  scales the uv coordinates from being in units of 2 * pi to units of pixels.
315  */
316  utilities::vis_params scaled_vis;
317  scaled_vis.u = uv_vis.u / (2 * constant::pi) * sizex;
318  scaled_vis.v = uv_vis.v / (2 * constant::pi) * sizey;
319  scaled_vis.vis = uv_vis.vis;
320  scaled_vis.weights = uv_vis.weights;
321  for (t_int i = 0; i < uv_vis.u.size(); ++i) {
322  // scaled_vis.u(i) = utilities::mod(scaled_vis.u(i), sizex);
323  // scaled_vis.v(i) = utilities::mod(scaled_vis.v(i), sizey);
324  }
325  scaled_vis.w = uv_vis.w;
326  scaled_vis.units = utilities::vis_units::pixels;
327  scaled_vis.ra = uv_vis.ra;
328  scaled_vis.dec = uv_vis.dec;
329  scaled_vis.average_frequency = uv_vis.average_frequency;
330  return scaled_vis;
331 }

References purify::utilities::vis_params::average_frequency, purify::utilities::vis_params::dec, purify::constant::pi, pixels, purify::utilities::vis_params::ra, purify::utilities::vis_params::u, purify::utilities::vis_params::units, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, purify::utilities::vis_params::w, and purify::utilities::vis_params::weights.

Referenced by TEST_CASE().

◆ variance()

template<class K >
t_real purify::utilities::variance ( const K  x)

Calculate variance of vector.

Definition at line 27 of file utilities.h.

27  {
28  // calculate variance of vector x
29  const Matrix<typename K::Scalar> q = (x.array() - x.array().mean()).matrix();
30  return std::real((q.adjoint() * q)(0) / static_cast<t_real>(q.size() - 1));
31 }

Referenced by standard_deviation(), and TEST_CASE().

◆ w_lambert() [1/2]

template<typename T >
t_real purify::utilities::w_lambert ( const T &  x,
const t_real &  relative_difference = 1e-8 
)

Definition at line 292 of file wproj_utilities.h.

292  {
293  if (std::is_integral<T>::value) return w_lambert<t_real>(x, relative_difference);
294  T z = T(x);
295  T diff = T(1e4 * relative_difference);
296  if (x < -1 / std::exp(1)) throw std::runtime_error("Out of bounds for W lambert function!");
297  while (std::abs(diff) > relative_difference) {
298  const T f = z * std::exp(z) - x;
299  const T w = z - f / (std::exp(z) * (z + 1) - f * (z + 2) / (2 * z + 2));
300  diff = w - z;
301  z = w;
302  }
303  return z;
304 }

◆ w_lambert() [2/2]

template<typename T >
t_real purify::utilities::w_lambert ( x,
const t_real &  relative_difference 
)

Calculate W Lambert function.

◆ w_stacking()

utilities::vis_params purify::utilities::w_stacking ( utilities::vis_params const &  params,
sopt::mpi::Communicator const &  comm,
const t_int  iters,
const std::function< t_real(t_real)> &  cost,
const t_real  k_means_rel_diff 
)

Definition at line 195 of file mpi_utilities.cc.

198  {
199  const std::vector<t_int> image_index = std::get<0>(
200  distribute::kmeans_algo(params.w, comm.size(), iters, comm, cost, k_means_rel_diff));
201  return utilities::regroup_and_all_to_all(params, image_index, comm);
202 }
std::tuple< std::vector< t_int >, std::vector< t_real > > kmeans_algo(const Vector< t_real > &w, const t_int number_of_nodes, const t_int iters, const std::function< t_real(t_real)> &cost, const t_real rel_diff)
patition w terms using k-means
Definition: distribute.cc:103

References purify::distribute::kmeans_algo(), regroup_and_all_to_all(), and purify::utilities::vis_params::w.

Referenced by purify::operators::base_degrid_operator_2d(), getInputData(), purify::measurementoperator::init_degrid_operator_2d(), main(), and DegridOperatorCtorFixturePar::SetUp().

◆ w_stacking_with_all_to_all()

std::tuple<utilities::vis_params, std::vector<t_int>, std::vector<t_real> > purify::utilities::w_stacking_with_all_to_all ( utilities::vis_params const &  params,
const t_real  du,
const t_int  min_support,
const t_int  max_support,
sopt::mpi::Communicator const &  comm,
const t_int  iters,
const t_real  fill_relaxation,
const std::function< t_real(t_real)> &  cost,
const t_real  k_means_rel_diff 
)

Definition at line 204 of file mpi_utilities.cc.

208  {
209  const auto kmeans =
210  distribute::kmeans_algo(params.w, comm.size(), iters, comm, cost, k_means_rel_diff);
211  const std::vector<t_real> &w_stacks = std::get<1>(kmeans);
212  const std::vector<t_int> groups = distribute::w_support(
213  params.w, std::get<0>(kmeans), w_stacks, du, min_support, max_support, fill_relaxation, comm);
214  utilities::vis_params outdata;
215  std::vector<t_int> image_index;
216  std::tie(outdata, image_index) =
217  utilities::regroup_and_all_to_all(params, std::get<0>(kmeans), groups, comm);
218  return std::tuple<utilities::vis_params, std::vector<t_int>, std::vector<t_real>>(
219  outdata, image_index, w_stacks);
220 }
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

References purify::distribute::kmeans_algo(), regroup_and_all_to_all(), purify::utilities::vis_params::w, and purify::widefield::w_support().

Referenced by getInputData(), main(), DegridOperatorCtorFixturePar::SetUp(), and TEST_CASE().

◆ write_visibility()

void purify::utilities::write_visibility ( const utilities::vis_params uv_vis,
const std::string &  file_name,
const bool  w_term 
)

Writes visibilities to txt.

Definition at line 243 of file uvw_utilities.cc.

244  {
245  /*
246  writes visibilities to output text file (currently ignores w-component)
247  uv_vis:: input uv data
248  file_name:: name of output text file
249  */
250  std::ofstream out(file_name);
251  out.precision(13);
252  for (t_int i = 0; i < uv_vis.u.size(); ++i) {
253  out << uv_vis.u(i) << " " << -uv_vis.v(i) << " ";
254  if (w_term) out << uv_vis.w(i) << " ";
255  out << std::real(uv_vis.vis(i)) << " " << std::imag(uv_vis.vis(i)) << " "
256  << 1. / std::real(uv_vis.weights(i)) << std::endl;
257  }
258  out.close();
259 }

References purify::utilities::vis_params::u, purify::utilities::vis_params::v, purify::utilities::vis_params::vis, purify::utilities::vis_params::w, and purify::utilities::vis_params::weights.

Referenced by main(), padmm(), b_utilities::random_measurements(), and TEST_CASE().