PURIFY
Next-generation radio interferometric imaging
purify_fitsio.cc
Go to the documentation of this file.
1 #include "catch2/catch_all.hpp"
2 
3 #include "purify/config.h"
4 #include "purify/types.h"
5 #include "purify/logging.h"
6 
7 #include "purify/directories.h"
8 #include "purify/pfitsio.h"
9 
10 using namespace purify;
11 
12 /*TEST_CASE("Purify fitsio", "[readwrite]") {
13  Image<t_complex> input = pfitsio::read2d(image_filename("M31.fits"));
14  pfitsio::write2d(input.real(), output_filename("fits_output.fits"));
15  Image<t_complex> input2 = pfitsio::read2d(output_filename("fits_output.fits"));
16  CAPTURE(input2);
17  CHECK(input.isApprox(input2, 1e-12));
18 }
19 
20 TEST_CASE("readwrite2dheader", "purify fitsio") {
21  Image<t_complex> input = pfitsio::read2d(image_filename("M31.fits"));
22  pfitsio::header_params header_example;
23  header_example.fits_name = output_filename("fits_output.fits");
24  pfitsio::write2d(input.real(), header_example);
25  Image<t_complex> input2 = pfitsio::read2d(output_filename("fits_output.fits"));
26  CHECK(input.isApprox(input2, 1e-12));
27 }
28 
29 TEST_CASE("readwrite3d", "purify fitsio") {
30  purify::logging::set_level("debug");
31  std::vector<Image<t_complex>> input = pfitsio::read3d(image_filename("cube_example.fits"));
32  CHECK(input.size() == 4);
33  CHECK(input[0].size() == 200 * 200);
34  std::vector<Image<t_real>> input_real;
35  for (int i = 0; i < input.size(); i++) {
36  input_real.push_back(input[i].real());
37  }
38  pfitsio::write3d(input_real, output_filename("cube_output.fits"));
39  std::vector<Image<t_complex>> input2 = pfitsio::read3d(output_filename("cube_output.fits"));
40  for (int i = 0; i < input.size(); i++) {
41  CHECK(input[i].isApprox(input2[i], 1e-12));
42  }
43 }
44 TEST_CASE("readwrite3dheader", "purify fitsio") {
45  std::vector<Image<t_complex>> input = pfitsio::read3d(image_filename("cube_example.fits"));
46  CHECK(input.size() == 4);
47  CHECK(input.at(0).size() == 200 * 200);
48  std::vector<Image<t_real>> input_real;
49  for (int i = 0; i < input.size(); i++) {
50  CAPTURE(input.size());
51  CAPTURE(i);
52  input_real.push_back(input.at(i).real());
53  }
54  pfitsio::header_params header_example;
55  header_example.fits_name = output_filename("cube_output.fits");
56  pfitsio::write3d(input_real, header_example);
57  std::vector<Image<t_complex>> input2 = pfitsio::read3d(output_filename("cube_output.fits"));
58  CAPTURE(input.size());
59  for (int i = 0; i < input.size(); i++) {
60  CAPTURE(i);
61  CHECK(input.at(i).isApprox(input2.at(i), 1e-12));
62  }
63 }
64 TEST_CASE("readwrite3dwith2d", "purify fitsio") {
65  std::vector<Image<t_complex>> input = pfitsio::read3d(image_filename("M31.fits"));
66  CHECK(input.size() == 1);
67  CHECK(input[0].size() == 256 * 256);
68  std::vector<Image<t_real>> input_real;
69  for (int i = 0; i < input.size(); i++) {
70  input_real.push_back(input[i].real());
71  }
72  pfitsio::write3d(input_real, output_filename("2dcube_output.fits"));
73  std::vector<Image<t_complex>> input2 = pfitsio::read3d(output_filename("2dcube_output.fits"));
74  for (int i = 0; i < input.size(); i++) CHECK(input[i].isApprox(input2[i], 1e-12));
75 }
76 TEST_CASE("readwrite3dheaderwith2d", "purify fitsio") {
77  std::vector<Image<t_complex>> input = pfitsio::read3d(image_filename("M31.fits"));
78  CHECK(input.size() == 1);
79  CHECK(input[0].size() == 256 * 256);
80  std::vector<Image<t_real>> input_real;
81  for (int i = 0; i < input.size(); i++) input_real.push_back(input[i].real());
82 
83  pfitsio::header_params header_example;
84  header_example.fits_name = output_filename("2dcube_output.fits");
85  pfitsio::write3d(input_real, header_example);
86  std::vector<Image<t_complex>> input2 = pfitsio::read3d(output_filename("2dcube_output.fits"));
87  for (int i = 0; i < input.size(); i++) CHECK(input[i].isApprox(input2[i], 1e-12));
88 }*/
89 
90 TEST_CASE("header") {
91  const std::string fits_name = "test_image.fits";
92  const t_real mean_frequency = 123; // in MHz
93  const t_real cell_x = 5; // in arcseconds
94  const t_real cell_y = 2; // in arcseconds
95  const t_real ra = 12; // in radians, converted to decimal degrees before write
96  const t_real dec = 98; // in radians, converted to decimal degrees before write
97  const std::string pix_units = "Jy/PIXEL";
98  const t_real channels_total = 2;
99  const t_real channel_width = 11; // in MHz
100  const t_real polarisation = stokes_int.at(stokes::I);
101  const int niters = 10; // number of iterations
102  const bool hasconverged = true; // stating if model has converged
103  const t_real relative_variation = 1e-3;
104  const t_real residual_convergence = 1e-4;
105  const t_real epsilon = 10;
106  pfitsio::header_params header;
107  header.fits_name = fits_name;
108  header.mean_frequency = mean_frequency;
109  header.cell_x = cell_x;
110  header.cell_y = cell_y;
111  header.ra = ra;
112  header.dec = dec;
113  header.pix_units = pix_units;
114  header.channels_total = channels_total;
115  header.channel_width = channel_width;
116  header.polarisation = polarisation;
117  header.niters = niters;
118  header.hasconverged = hasconverged;
119  header.relative_variation = relative_variation;
120  header.residual_convergence = residual_convergence;
121  header.epsilon = epsilon;
122  const auto header_test = pfitsio::header_params(
123  fits_name, pix_units, channels_total, ra, dec, stokes::I, cell_x, cell_y, mean_frequency,
124  channel_width, niters, hasconverged, relative_variation, residual_convergence, epsilon);
125  CHECK(header_test == header);
126  CHECK(header_test == pfitsio::header_params(fits_name, pix_units, channels_total, ra, dec,
127  stokes_string.at("p"), cell_x, cell_y, mean_frequency,
128  channel_width, niters, hasconverged,
129  relative_variation, residual_convergence, epsilon));
130  CHECK_THROWS(header_test == pfitsio::header_params(fits_name, pix_units, channels_total, ra, dec,
131  stokes_string.at("z"), cell_x, cell_y,
132  mean_frequency, channel_width, niters,
133  hasconverged, relative_variation,
134  residual_convergence, epsilon));
135  CHECK(header_test != pfitsio::header_params(fits_name, pix_units, channels_total, ra, dec,
136  stokes::Q, cell_x, cell_y, mean_frequency,
137  channel_width, niters, hasconverged,
138  relative_variation, residual_convergence, epsilon));
139 }
#define CHECK(CONDITION, ERROR)
Definition: casa.cc:6
#define CHECK_THROWS(STATEMENT, ERROR)
Definition: casa.cc:8
const std::map< stokes, t_int > stokes_int
Definition: types.h:45
const std::map< std::string, stokes > stokes_string
Definition: types.h:49
TEST_CASE("header")