PURIFY
Next-generation radio interferometric imaging
utilities.h
Go to the documentation of this file.
1 #ifndef PURIFY_UTILITIES_H
2 #define PURIFY_UTILITIES_H
3 
4 #include "purify/config.h"
5 #include "purify/types.h"
6 #include <fstream>
7 #include <string>
8 #include <type_traits>
9 
10 namespace purify {
11 
12 namespace utilities {
14 t_int sub2ind(const t_int &row, const t_int &col, const t_int &rows, const t_int &cols);
16 std::tuple<t_int, t_int> ind2sub(const t_int &sub, const t_int &cols, const t_int &rows);
18 t_real mod(const t_real &x, const t_real &y);
20 template <class K>
21 typename K::Scalar mean(const K x) {
22  // Calculate mean of vector x
23  return x.array().mean();
24 }
26 template <class K>
27 t_real variance(const K x) {
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 }
33 template <class K>
34 t_real standard_deviation(const K x) {
35  // calculate standard deviation of vector x
36  return std::sqrt(variance(x));
37 }
39 Image<t_complex> convolution_operator(const Image<t_complex> &a, const Image<t_complex> &b);
41 t_real calculate_l2_radius(const t_uint y_size, const t_real &sigma = 0, const t_real &n_sigma = 2.,
42  const std::string distirbution = "chi");
44 t_real SNR_to_standard_deviation(const Vector<t_complex> &y0, const t_real &SNR = 30.);
46 Vector<t_complex> add_noise(const Vector<t_complex> &y, const t_complex &mean,
47  const t_real &standard_deviation);
49 bool file_exists(const std::string &name);
51 std::tuple<t_real, t_real, t_real> fit_fwhm(const Image<t_real> &psf, const t_int &size = 3);
53 t_real median(const Vector<t_real> &input);
55 t_real dynamic_range(const Image<t_complex> &model, const Image<t_complex> &residuals,
56  const t_real &operator_norm = 1);
58 Array<t_complex> init_weights(const Vector<t_real> &u, const Vector<t_real> &v,
59  const Vector<t_complex> &weights, const t_real &oversample_factor,
60  const std::string &weighting_type, const t_real &R,
61  const t_int &ftsizeu, const t_int &ftsizev);
63 template <class T0, class T1>
64 typename std::enable_if<std::is_same<typename T0::Scalar, typename T1::Scalar>::value and
65  T0::IsRowMajor,
66  Vector<typename T0::Scalar>>::type
67 sparse_multiply_matrix(const Eigen::SparseMatrixBase<T0> &M, const Eigen::MatrixBase<T1> &x) {
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 }
80 std::tuple<t_int, t_real> checkpoint_log(const std::string &diagnostic);
82 template <class K, class L>
83 Image<t_complex> parallel_multiply_image(const K &A, const L &B) {
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 }
94 Matrix<t_complex> re_sample_ft_grid(const Matrix<t_complex> &input, const t_real &re_sample_factor);
96 Matrix<t_complex> re_sample_image(const Matrix<t_complex> &input, const t_real &re_sample_ratio);
97 
98 } // namespace utilities
99 } // namespace purify
100 
101 #endif
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
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.
Definition: utilities.cc:246
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.
Definition: utilities.h:67
t_real median(const Vector< t_real > &input)
Return median of real vector.
Definition: utilities.cc:221
std::tuple< t_real, t_real, t_real > fit_fwhm(const Image< t_real > &psf, const t_int &size)
Method to fit Gaussian to PSF.
Definition: utilities.cc:148
t_real variance(const K x)
Calculate variance of vector.
Definition: utilities.h:27
t_real SNR_to_standard_deviation(const Vector< t_complex > &y0, const t_real &SNR)
Converts SNR to RMS noise.
Definition: utilities.cc:101
K::Scalar mean(const K x)
Calculate mean of vector.
Definition: utilities.h:21
Vector< t_complex > add_noise(const Vector< t_complex > &y0, const t_complex &mean, const t_real &standard_deviation)
Add guassian noise to vector.
Definition: utilities.cc:113
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
std::tuple< t_int, t_real > checkpoint_log(const std::string &diagnostic)
Reads a diagnostic file and updates parameters.
Definition: utilities.cc:287
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
Matrix< t_complex > re_sample_image(const Matrix< t_complex > &input, const t_real &re_sample_ratio)
resamples image size
Definition: utilities.cc:365
bool file_exists(const std::string &name)
Test to see if file exists.
Definition: utilities.cc:137
t_real 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: utilities.cc:232
t_real mod(const t_real &x, const t_real &y)
Mod function modified to wrap circularly for negative numbers.
Definition: utilities.cc:41
t_real standard_deviation(const K x)
Calculates the standard deviation of a vector.
Definition: utilities.h:34
Image< t_complex > convolution_operator(const Image< t_complex > &a, const Image< t_complex > &b)
Calculates the convolution between two images.
Definition: utilities.cc:50
t_real 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: utilities.cc:75
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.
Definition: utilities.cc:26
Image< t_complex > parallel_multiply_image(const K &A, const L &B)
Multiply images coefficient-wise using openmp.
Definition: utilities.h:83
Eigen::SparseMatrix< T, Eigen::RowMajor, I > Sparse
A matrix of a given type.
Definition: types.h:40