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

Classes

class  H5Handler
 Purify interface class to handle HDF5 input files. More...
 

Functions

utilities::vis_params read_visibility (const std::string &vis_name, const bool w_term)
 Reads an HDF5 file with u,v visibilities, constructs a vis_params object and returns it. More...
 
utilities::vis_params stochread_visibility (H5Handler &file, const size_t N, const bool w_term)
 Stochastically reads dataset slices from the supplied HDF5-file handler, constructs a vis_params object from them and returns it. More...
 
void write_visibility (const utilities::vis_params &uv_vis, const std::string &h5name, const bool w_term, const size_t chunksize=0)
 Write an HDF5 file with u,v visibilities from a vis_params object. More...
 

Function Documentation

◆ read_visibility()

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

Reads an HDF5 file with u,v visibilities, constructs a vis_params object and returns it.

Note
vis_name: name of input HDF5 file containing [u, v, real(V), imag(V)].

Definition at line 166 of file h5reader.h.

166  {
167  H5Handler vis_file(vis_name);
168  utilities::vis_params uv_vis;
169 
170  std::vector<t_real> utemp = vis_file.read<t_real>("u");
171  uv_vis.u = Eigen::Map<Vector<t_real>>(utemp.data(), utemp.size(), 1);
172 
173  // found that a reflection is needed for the orientation
174  // of the gridded image to be correct
175  std::vector<t_real> vtemp = vis_file.read<t_real>("v");
176  uv_vis.v = -Eigen::Map<Vector<t_real>>(vtemp.data(), vtemp.size(), 1);
177 
178  if (w_term) {
179  std::vector<t_real> wtemp = vis_file.read<t_real>("w");
180  uv_vis.w = Eigen::Map<Vector<t_real>>(wtemp.data(), wtemp.size(), 1);
181  } else {
182  uv_vis.w = Vector<t_real>::Zero(utemp.size());
183  }
184 
185  std::vector<t_real> retemp = vis_file.read<t_real>("re");
186  std::vector<t_real> imtemp = vis_file.read<t_real>("im");
187  std::vector<t_real> sigma = vis_file.read<t_real>("sigma");
188  assert(retemp.size() == imtemp.size());
189 
190  uv_vis.vis = Vector<t_complex>::Zero(retemp.size());
191  uv_vis.weights = Vector<t_complex>::Zero(retemp.size());
192  for (size_t i = 0; i < retemp.size(); ++i) {
193  uv_vis.vis(i) = t_complex(retemp[i], imtemp[i]);
194  uv_vis.weights(i) = 1 / sigma[i];
195  }
196 
197  uv_vis.ra = 0;
198  uv_vis.dec = 0;
199  uv_vis.average_frequency = 0;
200 
201  return uv_vis;
202 }

References purify::utilities::vis_params::average_frequency, purify::utilities::vis_params::dec, purify::utilities::vis_params::ra, purify::H5::H5Handler::read(), 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 purify::utilities::read_visibility().

◆ stochread_visibility()

utilities::vis_params purify::H5::stochread_visibility ( H5Handler file,
const size_t  N,
const bool  w_term 
)

Stochastically reads dataset slices from the supplied HDF5-file handler, constructs a vis_params object from them and returns it.

Definition at line 206 of file h5reader.h.

206  {
207  utilities::vis_params uv_vis;
208 
209  std::vector<t_real> utemp =
210  file.stochread<t_real>("u", N, true); //< shuffle batch starting position
211  uv_vis.u = Eigen::Map<Vector<t_real>>(utemp.data(), utemp.size(), 1);
212 
213  // found that a reflection is needed for the orientation
214  // of the gridded image to be correct
215  std::vector<t_real> vtemp = file.stochread<t_real>("v", N);
216  uv_vis.v = -Eigen::Map<Vector<t_real>>(vtemp.data(), vtemp.size(), 1);
217 
218  if (w_term) {
219  std::vector<t_real> wtemp = file.stochread<t_real>("w", N);
220  uv_vis.w = Eigen::Map<Vector<t_real>>(wtemp.data(), wtemp.size(), 1);
221  } else {
222  uv_vis.w = Vector<t_real>::Zero(utemp.size());
223  }
224 
225  std::vector<t_real> retemp = file.stochread<t_real>("re", N);
226  std::vector<t_real> imtemp = file.stochread<t_real>("im", N);
227  std::vector<t_real> sigma = file.stochread<t_real>("sigma", N);
228 
229  uv_vis.vis = Vector<t_complex>::Zero(retemp.size());
230  uv_vis.weights = Vector<t_complex>::Zero(retemp.size());
231  for (size_t i = 0; i < retemp.size(); ++i) {
232  uv_vis.vis(i) = t_complex(retemp[i], imtemp[i]);
233  uv_vis.weights(i) = 1 / sigma[i];
234  }
235 
236  uv_vis.ra = 0;
237  uv_vis.dec = 0;
238  uv_vis.average_frequency = 0;
239 
240  return uv_vis;
241 }

References purify::utilities::vis_params::average_frequency, purify::utilities::vis_params::dec, purify::utilities::vis_params::ra, purify::H5::H5Handler::stochread(), 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 BENCHMARK_DEFINE_F(), and TEST_CASE().

◆ write_visibility()

void purify::H5::write_visibility ( const utilities::vis_params uv_vis,
const std::string &  h5name,
const bool  w_term,
const size_t  chunksize = 0 
)

Write an HDF5 file with u,v visibilities from a vis_params object.

Definition at line 244 of file h5reader.h.

245  {
246  // Set up HDF5 file
247  HighFive::File h5file(h5name, HighFive::File::OpenOrCreate | HighFive::File::Truncate);
248  // Set up file properties, such as chunking and compression
249  // Note: the I/O is minimised if compression is disabled (obvs)
250  // If using decompressed data is not an option, then the
251  // I/O performance can be optimised by chunking the dataset
252  // in such a way that each MPI rank only has to decompress
253  // its allocated segment (or a subset thereof)
254  HighFive::DataSetCreateProps props;
255  if (uv_vis.u.size()) {
256  if (chunksize > 0) {
257  props.add(HighFive::Chunking(std::vector<hsize_t>{chunksize}));
258  } else {
259  props.add(HighFive::Chunking(std::vector<hsize_t>{static_cast<hsize_t>(uv_vis.u.size())}));
260  }
261  props.add(HighFive::Deflate(9)); // maximal compression
262  }
263  // Create the H5 datasets
264  h5file.createDataSet("u", std::vector<t_real>(uv_vis.u.data(), uv_vis.u.data() + uv_vis.u.size()),
265  props);
266  h5file.createDataSet("v", std::vector<t_real>(uv_vis.v.data(), uv_vis.v.data() + uv_vis.v.size()),
267  props);
268  if (w_term) {
269  h5file.createDataSet(
270  "w", std::vector<t_real>(uv_vis.w.data(), uv_vis.w.data() + uv_vis.w.size()), props);
271  }
272 
273  std::vector<t_real> redata, imdata, sigma;
274  redata.reserve(uv_vis.vis.size());
275  imdata.reserve(uv_vis.vis.size());
276  sigma.reserve(uv_vis.weights.size());
277  for (size_t i = 0; i < uv_vis.vis.size(); ++i) {
278  redata.push_back(uv_vis.vis(i).real());
279  imdata.push_back(uv_vis.vis(i).imag());
280  sigma.push_back(1.0 / uv_vis.weights(i).real());
281  }
282  h5file.createDataSet("re", std::move(redata), props);
283  h5file.createDataSet("im", std::move(imdata), props);
284  h5file.createDataSet("sigma", std::move(imdata), props);
285 }

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 TEST_CASE().