33#include "cr2res_trace.h"
34#include "cr2res_dfs.h"
35#include "cr2res_pfits.h"
39#define WLEN_BEGIN(i) ({char s[20]; sprintf(s, CR2RES_HEADER_WLEN_BEGIN, i); s;})
40#define WLEN_END(i) ({char s[20]; sprintf(s, CR2RES_HEADER_WLEN_END, i); s;})
41#define WLEN_CENY(i) ({char s[20]; sprintf(s, CR2RES_HEADER_WLEN_CENY, i); s;})
47static void test_cr2res_dark_qc_ron(
void);
48static void test_cr2res_qc_obs_nodding_slit_psf(
void);
58#ifdef CR2RES_UNUSED_TESTS
66static cpl_table *create_test_table()
69 cpl_array *array, *slit_fraction, *wave, *wave_err, *slit_a, *slit_b,
71 int poly_order, norders;
72 cpl_propertylist *hdr = cpl_propertylist_new();
73 cpl_propertylist *main_header = cpl_propertylist_new();
81 traces = cpl_table_new(norders);
82 cpl_table_new_column_array(traces, CR2RES_COL_ALL, CPL_TYPE_DOUBLE,
84 cpl_table_new_column_array(traces, CR2RES_COL_UPPER, CPL_TYPE_DOUBLE,
86 cpl_table_new_column_array(traces, CR2RES_COL_LOWER, CPL_TYPE_DOUBLE,
88 cpl_table_new_column(traces, CR2RES_COL_ORDER, CPL_TYPE_INT);
89 cpl_table_new_column(traces, CR2RES_COL_TRACENB, CPL_TYPE_INT);
91 cpl_table_new_column_array(traces, CR2RES_COL_WAVELENGTH, CPL_TYPE_DOUBLE,
93 cpl_table_new_column_array(traces, CR2RES_COL_WAVELENGTH_ERROR,
95 cpl_table_new_column_array(traces, CR2RES_COL_SLIT_CURV_A, CPL_TYPE_DOUBLE,
97 cpl_table_new_column_array(traces, CR2RES_COL_SLIT_CURV_B, CPL_TYPE_DOUBLE,
99 cpl_table_new_column_array(traces, CR2RES_COL_SLIT_CURV_C, CPL_TYPE_DOUBLE,
101 cpl_table_new_column_array(traces, CR2RES_COL_SLIT_FRACTION,
117 double all_1[] = {54.3148, 226.289, 437.881, 660.954, 897.266,
118 1148.31, 1415.88, 1701.85, 1982.59};
119 double all_2[] = {0.00738623, 0.0169145, 0.0172448, 0.0178211,
120 0.0185319, 0.019388, 0.0202877, 0.021292, 0.0111388};
121 double upper_1[] = {110.379, 311.885, 524.126, 747.931, 985.06,
122 1237.01, 1505.34, 1792.03, 2047.88};
123 double upper_2[] = {0.0159501, 0.0167957, 0.0171958, 0.0179547,
124 0.0186544, 0.0193813, 0.0202763, 0.0213662, 8.66878e-05};
125 double lower_1[] = {1.63328, 139.106, 350.398, 572.986, 808.823,
126 1059.39, 1326.43, 1611.65, 1917.3};
127 double lower_2[] = {-8.95809e-05, 0.017396, 0.0170009, 0.0177137,
128 0.0185517, 0.0194215, 0.0202534, 0.0212178, 0.0221835};
129 array = cpl_array_new(poly_order, CPL_TYPE_DOUBLE);
130 slit_fraction = cpl_array_new(3, CPL_TYPE_DOUBLE);
131 cpl_array_set_double(slit_fraction, 0, 0);
132 cpl_array_set_double(slit_fraction, 1, 0.5);
133 cpl_array_set_double(slit_fraction, 2, 1);
134 wave = cpl_array_new(2, CPL_TYPE_DOUBLE);
135 cpl_array_set_double(wave, 0, 9.45e2);
136 cpl_array_set_double(wave, 1, 3.13e-3);
137 wave_err = cpl_array_new(2, CPL_TYPE_DOUBLE);
138 cpl_array_set_double(wave_err, 0, 5e-2);
139 cpl_array_set_double(wave_err, 1, 5e-2);
141 slit_a = cpl_array_new(3, CPL_TYPE_DOUBLE);
142 cpl_array_set(slit_a, 0, 0);
143 cpl_array_set(slit_a, 1, 1);
144 cpl_array_set(slit_a, 2, 0);
145 slit_b = cpl_array_new(3, CPL_TYPE_DOUBLE);
146 cpl_array_set(slit_b, 0, 0);
147 cpl_array_set(slit_b, 1, 0);
148 cpl_array_set(slit_b, 2, 0);
149 slit_c = cpl_array_new(3, CPL_TYPE_DOUBLE);
150 cpl_array_set(slit_c, 0, 0);
151 cpl_array_set(slit_c, 1, 0);
152 cpl_array_set(slit_c, 2, 0);
154 for (
int i = 0; i < norders; i++)
156 cpl_array_set(array, 0, all_1[i]);
157 cpl_array_set(array, 1, all_2[i]);
158 cpl_table_set_array(traces, CR2RES_COL_ALL, i, array);
159 cpl_array_set(array, 0, upper_1[i]);
160 cpl_array_set(array, 1, upper_2[i]);
161 cpl_table_set_array(traces, CR2RES_COL_UPPER, i, array);
162 cpl_array_set(array, 0, lower_1[i]);
163 cpl_array_set(array, 1, lower_2[i]);
164 cpl_table_set_array(traces, CR2RES_COL_LOWER, i, array);
165 cpl_table_set(traces, CR2RES_COL_ORDER, i,
167 cpl_table_set(traces, CR2RES_COL_TRACENB, i, 1);
169 cpl_table_set_array(traces, CR2RES_COL_SLIT_FRACTION, i, slit_fraction);
170 cpl_table_set_array(traces, CR2RES_COL_WAVELENGTH, i, wave);
171 cpl_table_set_array(traces, CR2RES_COL_WAVELENGTH_ERROR, i, wave_err);
172 cpl_table_set_array(traces, CR2RES_COL_SLIT_CURV_A, i, slit_a);
173 cpl_table_set_array(traces, CR2RES_COL_SLIT_CURV_B, i, slit_b);
174 cpl_table_set_array(traces, CR2RES_COL_SLIT_CURV_C, i, slit_c);
178 cpl_propertylist_append_string(hdr, CR2RES_HEADER_EXTNAME, extname);
180 double ceny[] = {1994.0945859223, 1723.67027599362, 1436.61298619847,
181 1168.0222016174, 915.8934665223831, 678.542785839296,
182 454.468576982434, 242.388497032926, 63.5899165277783};
183 double begin[] = {1756.78720770673, 1703.55123171562, 1653.44678372399,
184 1606.20544704616, 1561.58862907265, 1519.38353098961,
185 1479.3997538583, 1441.46642683629, -1};
186 double end[] = {1768.81709603003, 1715.21657796851, 1664.76903155768,
187 1617.2042020846, 1572.2818631378, 1529.78775872867,
188 1489.53018613055, 1451.3371044349, -1};
190 for (
int i = 0; i < 9; i++)
192 cpl_propertylist_append_double(hdr, WLEN_CENY(i), ceny[i]);
193 cpl_propertylist_append_double(hdr, WLEN_BEGIN(i), begin[i]);
194 cpl_propertylist_append_double(hdr, WLEN_END(i), end[i]);
198 cpl_propertylist_append_int(main_header, CR2RES_HEADER_DECKER_POS, CR2RES_DECKER_2_4);
200 cpl_table_save(traces, main_header, hdr,
"TEST_table.fits", CPL_IO_CREATE);
202 cpl_array_delete(array);
203 cpl_array_delete(slit_fraction);
204 cpl_array_delete(wave);
205 cpl_array_delete(wave_err);
206 cpl_array_delete(slit_a);
207 cpl_array_delete(slit_b);
208 cpl_array_delete(slit_c);
210 cpl_propertylist_delete(hdr);
211 cpl_propertylist_delete(main_header);
217#ifdef CR2RES_UNUSED_TESTS
225static cpl_image *create_test_image(
void)
228 cpl_image *trace_ima;
231 traces = create_test_table();
233 cpl_table_delete(traces);
239static void test_cr2res_dark_qc_ron(
void)
241 cpl_image *ima1, *ima2;
242 int hsize, nsamples, ndit;
244 ima1 = cpl_image_new(100, 100, CPL_TYPE_DOUBLE);
245 ima2 = cpl_image_new(100, 100, CPL_TYPE_DOUBLE);
251 for(cpl_size x = 1; x <= 100; x++)
253 for(cpl_size y = 1; y <= 100; y++)
255 cpl_image_set(ima1, x, y, 1);
256 cpl_image_set(ima2, x, y, 1);
261 cpl_test_error(CPL_ERROR_NONE);
263 cpl_image_delete(ima1);
264 cpl_image_delete(ima2);
267static void test_cr2res_qc_obs_nodding_slit_psf()
271 double x0 = nrow / 2;
274 double sigma = nrow / 20;
277 char col1[] =
"01_01_SLIT_FUNC";
278 char col2[] =
"02_01_SLIT_FUNC";
280 cpl_table * slitfu = cpl_table_new(nrow);
281 cpl_table_new_column(slitfu, col1, CPL_TYPE_DOUBLE);
282 cpl_table_new_column(slitfu, col2, CPL_TYPE_DOUBLE);
284 for (cpl_size i = 0; i < nrow; i++)
288 value = A / sqrt(CPL_MATH_2_PI * sigma * sigma) * exp( -(i - x0) *
289 (i - x0) / (2. * sigma * sigma)) + offset;
290 cpl_table_set_double(slitfu, col1, i, value);
291 cpl_table_set_double(slitfu, col2, i, value);
297 cpl_test_abs(fwhm, 2.355 * sigma / 1.02, 0.01);
299 cpl_table_delete(slitfu);
309 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_DEBUG);
311 test_cr2res_dark_qc_ron();
312 test_cr2res_qc_obs_nodding_slit_psf();
314 return cpl_test_end(0);
char * cr2res_io_create_extname(int detector, int data)
Create Extname.
int cr2res_io_convert_order_idx_to_idxp(int order_idx)
Convert the order_idx to the order_idxp.
int main(void)
Run the Unit tests.
double cr2res_dark_qc_ron(const cpl_image *ima1, const cpl_image *ima2, int hsize, int nsamples, int ndit)
The Read Out Noise computation.
double cr2res_qc_obs_slit_psf(const cpl_table *slitfu, int order_idxp, int oversample)
Computes the FWHM of the PSF along the slit for a given order.
cpl_image * cr2res_trace_gen_image(cpl_table *trace, int nx, int ny)
Make an image out of the trace solution.