31#include "moo_params.h"
32#include "moo_single.h"
33#include "moo_badpix.h"
35#include "moo_ext_single.h"
41#include "moo_fibres_table.h"
57_moo_rebin_fibre_cut_edges(cpl_image *data,
64 cpl_table *result = NULL;
65 cpl_ensure(data != NULL, CPL_ERROR_NULL_INPUT, NULL);
66 cpl_ensure(wdata != NULL, CPL_ERROR_NULL_INPUT, NULL);
67 cpl_ensure(errs != NULL, CPL_ERROR_NULL_INPUT, NULL);
68 cpl_ensure(qual != NULL, CPL_ERROR_NULL_INPUT, NULL);
70 cpl_vector *all_ref_flux = cpl_vector_new_from_image_row(data, numfib);
71 cpl_vector *all_ref_errs = cpl_vector_new_from_image_row(errs, numfib);
72 cpl_vector *all_ref_qual = cpl_vector_new_from_image_row(qual, numfib);
73 cpl_vector *all_ref_wave = cpl_vector_new_from_image_row(wdata, numfib);
76 int nx = cpl_image_get_size_x(data);
77 int ifirst = 0, ilast = nx - 1;
78 for (
int i = 0; i < nx; i++) {
79 int q = (int)cpl_vector_get(all_ref_qual, i);
80 double w = cpl_vector_get(all_ref_wave, i);
81 if ((q & bp) == 0 && !isnan(w)) {
86 for (
int i = nx - 1; i >= 0; i--) {
87 int q = (int)cpl_vector_get(all_ref_qual, i);
88 double w = cpl_vector_get(all_ref_wave, i);
89 if ((q & bp) == 0 && !isnan(w)) {
95 int dsize = ilast - ifirst + 1;
97 result = cpl_table_new(dsize);
98 cpl_table_new_column(result, MOO_REBIN_REFTABLE_WAVE, CPL_TYPE_DOUBLE);
99 cpl_table_new_column(result, MOO_REBIN_REFTABLE_X, CPL_TYPE_DOUBLE);
100 cpl_table_new_column(result, MOO_REBIN_REFTABLE_Y, CPL_TYPE_INT);
101 cpl_table_new_column(result, MOO_REBIN_REFTABLE_FLUX, CPL_TYPE_DOUBLE);
102 cpl_table_new_column(result, MOO_REBIN_REFTABLE_ERR, CPL_TYPE_DOUBLE);
103 cpl_table_new_column(result, MOO_REBIN_REFTABLE_QUAL, CPL_TYPE_INT);
105 for (
int i = ifirst; i <= ilast; i++) {
107 double q = cpl_vector_get(all_ref_qual, i);
108 double f = cpl_vector_get(all_ref_flux, i);
109 double w = cpl_vector_get(all_ref_wave, i);
110 double e = cpl_vector_get(all_ref_errs, i);
112 if (direction == -1) {
115 cpl_table_set(result, MOO_REBIN_REFTABLE_WAVE, it, w);
116 cpl_table_set(result, MOO_REBIN_REFTABLE_X, it, x);
117 cpl_table_set(result, MOO_REBIN_REFTABLE_Y, it, numfib);
118 cpl_table_set(result, MOO_REBIN_REFTABLE_FLUX, it, f);
119 cpl_table_set(result, MOO_REBIN_REFTABLE_ERR, it, e);
120 cpl_table_set(result, MOO_REBIN_REFTABLE_QUAL, it, q);
122 cpl_propertylist *order = cpl_propertylist_new();
123 cpl_propertylist_append_bool(order, MOO_REBIN_REFTABLE_WAVE, CPL_FALSE);
124 cpl_table_sort(result, order);
125 cpl_propertylist_delete(order);
126 cpl_vector_delete(all_ref_wave);
127 cpl_vector_delete(all_ref_flux);
128 cpl_vector_delete(all_ref_errs);
129 cpl_vector_delete(all_ref_qual);
136_moo_rebin_interpolate2(cpl_table *ref_table,
138 cpl_vector *res_wave,
139 cpl_image *rbn_fluxes,
145 int ref_size = cpl_table_get_nrow(ref_table);
146 double *ref_wave_data =
147 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_WAVE);
148 double *ref_pos_data =
149 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_X);
150 int *ref_qual = cpl_table_get_data_int(ref_table, MOO_REBIN_REFTABLE_QUAL);
151 double *ref_flux_data =
152 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_FLUX);
153 double *ref_errs_data =
154 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_ERR);
156 cpl_vector *ref_wave = cpl_vector_wrap(ref_size, ref_wave_data);
157 cpl_vector *ref_pos = cpl_vector_wrap(ref_size, ref_pos_data);
158 cpl_vector *ref_flux = cpl_vector_wrap(ref_size, ref_flux_data);
159 cpl_vector *ref_errs = cpl_vector_wrap(ref_size, ref_errs_data);
162 int res_size = cpl_vector_get_size(res_wave);
163 cpl_vector *res_flux = cpl_vector_new(res_size);
164 cpl_vector *res_errs = cpl_vector_new(res_size);
165 int *res_qual = cpl_calloc(res_size,
sizeof(
int));
167 cpl_bivector *ref_flux_points =
168 cpl_bivector_wrap_vectors(ref_pos, ref_flux);
169 cpl_bivector *res_points = cpl_bivector_wrap_vectors(res_pos, res_flux);
172 cpl_bivector_unwrap_vectors(ref_flux_points);
173 cpl_bivector_unwrap_vectors(res_points);
174 cpl_vector_unwrap(ref_wave);
175 cpl_vector_unwrap(ref_pos);
176 cpl_vector_unwrap(ref_flux);
177 cpl_vector_unwrap(ref_errs);
179 for (
int i = 0; i < res_size; i++) {
180 int rbn_idx = imin + 1 + i;
182 double f = cpl_vector_get(res_flux, i);
183 double e = cpl_vector_get(res_errs, i);
185 cpl_image_set(rbn_fluxes, rbn_idx, rbn_numfib, f);
186 cpl_image_set(rbn_errs, rbn_idx, rbn_numfib, e);
187 cpl_image_set(rbn_qual, rbn_idx, rbn_numfib, q);
190 if (rbn_numfib == 379) {
191 cpl_table *t = cpl_table_new(res_size);
192 cpl_table_new_column(t,
"WAVE", CPL_TYPE_DOUBLE);
193 cpl_table_new_column(t,
"FLUX", CPL_TYPE_DOUBLE);
194 cpl_table_new_column(t,
"FLUX_ERR", CPL_TYPE_DOUBLE);
195 cpl_table_new_column(t,
"BPM", CPL_TYPE_INT);
196 for (
int i = 0; i < res_size; i++) {
198 double w = cpl_vector_get(res_wave, i);
199 double f = cpl_vector_get(res_flux, i);
200 double e = cpl_vector_get(res_errs, i);
202 cpl_table_set_double(t,
"WAVE", i, w);
203 cpl_table_set_double(t,
"FLUX", i, f);
204 cpl_table_set_double(t,
"FLUX_ERR", i, e);
205 cpl_table_set_int(t,
"BPM", i, q);
207 cpl_table_save(t, NULL, NULL,
"interpolate_linear_379_me.fits",
212 cpl_vector_delete(res_flux);
213 cpl_vector_delete(res_errs);
216 return CPL_ERROR_NONE;
220_moo_rebin_sum(cpl_table *ref_table,
223 cpl_vector *res_wave,
224 cpl_image *rbn_fluxes,
230 int ref_size = cpl_table_get_nrow(ref_table);
231 double *ref_wave_data =
232 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_WAVE);
233 double *ref_pos_data =
234 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_X);
235 int *ref_qual = cpl_table_get_data_int(ref_table, MOO_REBIN_REFTABLE_QUAL);
236 double *ref_flux_data =
237 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_FLUX);
238 double *ref_errs_data =
239 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_ERR);
241 cpl_vector *ref_wave = cpl_vector_wrap(ref_size, ref_wave_data);
242 cpl_vector *ref_start = cpl_vector_new(ref_size);
243 cpl_vector *ref_stop = cpl_vector_new(ref_size);
244 cpl_vector *ref_step = cpl_vector_new(ref_size);
246 double w1, w, w2, start, stop;
247 for (
int i = 1; i < ref_size - 1; i++) {
248 w1 = cpl_vector_get(ref_wave, i - 1);
249 w = cpl_vector_get(ref_wave, i);
250 w2 = cpl_vector_get(ref_wave, i + 1);
251 start = w - (w - w1) / 2.;
252 stop = w + (w2 - w) / 2.;
253 cpl_vector_set(ref_start, i, start);
254 cpl_vector_set(ref_stop, i, stop);
255 cpl_vector_set(ref_step, i, step);
258 w = cpl_vector_get(ref_wave, 0);
259 w2 = cpl_vector_get(ref_wave, 1);
260 stop = w - (w2 - w) / 2.;
261 cpl_vector_set(ref_start, 0, w);
262 cpl_vector_set(ref_stop, 0, stop);
263 cpl_vector_set(ref_step, 0, step / 2.);
265 w1 = cpl_vector_get(ref_wave, ref_size - 2);
266 w = cpl_vector_get(ref_wave, ref_size - 1);
267 start = w - (w - w1) / 2.;
268 cpl_vector_set(ref_start, ref_size - 1, w1);
269 cpl_vector_set(ref_stop, ref_size - 1, w);
270 cpl_vector_set(ref_step, ref_size - 1, step / 2.);
272 cpl_vector *ref_pos = cpl_vector_wrap(ref_size, ref_pos_data);
273 cpl_vector *ref_flux = cpl_vector_wrap(ref_size, ref_flux_data);
274 cpl_vector *ref_errs = cpl_vector_wrap(ref_size, ref_errs_data);
276 int res_size = cpl_vector_get_size(res_pos);
277 int first = (int)cpl_vector_get(ref_pos, 0);
280 for (
int i = 0; i < res_size - 1; i++) {
281 double d1 = cpl_vector_get(res_pos, i);
282 double d2 = cpl_vector_get(res_pos, i + 1);
283 double x1 = round(d1);
284 double x2 = round(d2);
286 int ix1 = (int)x1 - first;
287 int ix2 = (int)x2 - first;
297 start = cpl_vector_get(res_wave, i);
298 stop = cpl_vector_get(res_wave, i + 1);
299 den = cpl_vector_get(ref_step, ix1);
300 num = (stop - start) / den;
301 e = cpl_vector_get(ref_errs, ix1) * num;
303 flux = cpl_vector_get(ref_flux, ix1) * num;
306 start = cpl_vector_get(res_wave, i);
307 stop = cpl_vector_get(ref_stop, ix1);
308 den = cpl_vector_get(ref_step, ix1);
309 num = (stop - start) / den;
310 flux += cpl_vector_get(ref_flux, ix1) * num;
311 e = cpl_vector_get(ref_errs, ix1) * cpl_vector_get(ref_errs, ix1) *
317 for (
int j = min; j <= max; j++) {
319 start = cpl_vector_get(ref_start, j);
320 stop = cpl_vector_get(ref_stop, j);
321 den = cpl_vector_get(ref_step, j);
322 num = (stop - start) / den;
323 flux += cpl_vector_get(ref_flux, j) * num;
324 e += cpl_vector_get(ref_errs, j) * cpl_vector_get(ref_errs, j) *
326 w = cpl_vector_get(ref_wave, j);
328 w = cpl_vector_get(ref_wave, ix2);
329 start = cpl_vector_get(ref_start, ix2);
330 stop = cpl_vector_get(res_wave, i + 1);
331 den = cpl_vector_get(ref_step, ix2);
332 num = (stop - start) / den;
333 flux += cpl_vector_get(ref_flux, ix2) * num;
334 e += cpl_vector_get(ref_errs, ix2) * cpl_vector_get(ref_errs, ix2) *
339 int rbn_idx = imin + 1 + i;
341 cpl_image_set(rbn_fluxes, rbn_idx, rbn_numfib, flux);
342 cpl_image_set(rbn_errs, rbn_idx, rbn_numfib, e);
343 cpl_image_set(rbn_qual, rbn_idx, rbn_numfib, q);
346 if (rbn_numfib == 379) {
347 int nx = cpl_image_get_size_x(rbn_fluxes);
348 cpl_table *t = cpl_table_new(res_size - 1);
349 cpl_table_new_column(t,
"WAVE", CPL_TYPE_DOUBLE);
350 cpl_table_new_column(t,
"FLUX", CPL_TYPE_DOUBLE);
351 cpl_table_new_column(t,
"FLUX_ERR", CPL_TYPE_DOUBLE);
352 cpl_table_new_column(t,
"BPM", CPL_TYPE_INT);
353 for (
int i = 0; i < res_size - 1; i++) {
355 w1 = cpl_vector_get(res_wave, i);
356 w2 = cpl_vector_get(res_wave, i + 1);
358 int rbn_idx = imin + 1 + i;
359 double f = cpl_image_get(rbn_fluxes, rbn_idx, rbn_numfib, &rej);
360 double e = cpl_image_get(rbn_errs, rbn_idx, rbn_numfib, &rej);
361 int q = cpl_image_get(rbn_qual, rbn_idx, rbn_numfib, &rej);
362 cpl_table_set_double(t,
"WAVE", i, w);
363 cpl_table_set_double(t,
"FLUX", i, f);
364 cpl_table_set_double(t,
"FLUX_ERR", i, e);
365 cpl_table_set_int(t,
"BPM", i, q);
367 cpl_table_save(t, NULL, NULL,
"integrate_linear_379_me.fits",
372 cpl_vector_unwrap(ref_pos);
373 cpl_vector_unwrap(ref_flux);
374 cpl_vector_unwrap(ref_errs);
376 cpl_vector_unwrap(ref_wave);
377 cpl_vector_delete(ref_start);
378 cpl_vector_delete(ref_stop);
379 cpl_vector_delete(ref_step);
381 return CPL_ERROR_NONE;
385_moo_rebin_fibre(cpl_image *data,
392 cpl_image *rbn_fluxes,
400 cpl_table *ref_table = NULL;
401 cpl_vector *res_wave = NULL;
402 cpl_vector *res_pos = NULL;
403 cpl_bivector *ref_pos_points = NULL;
404 cpl_bivector *res_pos_points = NULL;
407 int rbn_numfib = numfib + fibfirst;
410 _moo_rebin_fibre_cut_edges(data, wmap, errs, qual, numfib, direction);
411 int ref_size = cpl_table_get_nrow(ref_table);
413 cpl_table_get_double(ref_table, MOO_REBIN_REFTABLE_WAVE, 0, &rej);
414 double ref_wmax = cpl_table_get_double(ref_table, MOO_REBIN_REFTABLE_WAVE,
417 int rbn_size = cpl_image_get_size_x(rbn_fluxes);
418 double rbn_wmin = min;
419 double rbn_wmax = min + rbn_size * step;
421 if (ref_wmin < ref_wmax && ref_wmin < rbn_wmax) {
425 imin = (int)ceil((ref_wmin - min) / step);
426 imax = floor((ref_wmax - min) / step);
431 if (imin >= rbn_size) {
437 if (imax >= rbn_size) {
441 for (
int i = 0; i < imin; i++) {
442 cpl_image_set(rbn_fluxes, i + 1, rbn_numfib, NAN);
443 cpl_image_set(rbn_errs, i + 1, rbn_numfib, NAN);
444 cpl_image_set(rbn_qual, i + 1, rbn_numfib,
447 for (
int i = imax; i < rbn_size; i++) {
448 cpl_image_set(rbn_fluxes, i + 1, rbn_numfib, NAN);
449 cpl_image_set(rbn_errs, i + 1, rbn_numfib, NAN);
450 cpl_image_set(rbn_qual, i + 1, rbn_numfib,
454 if (strcmp(method, MOO_REBIN_METHOD_INTERPOLATE) == 0) {
456 int res_size = (imax - imin);
457 res_wave = cpl_vector_new(res_size);
458 res_pos = cpl_vector_new(res_size);
460 for (
int i = 0; i < res_size; i++) {
461 double val1 = min + (imin + i) * step + step / 2.;
462 cpl_vector_set(res_wave, i, val1);
467 int res_size = (imax - imin) + 1;
468 res_wave = cpl_vector_new(res_size);
469 res_pos = cpl_vector_new(res_size);
470 for (
int i = 0; i < res_size; i++) {
471 double val1 = min + (imin + i) * step;
472 cpl_vector_set(res_wave, i, val1);
476 cpl_errorstate prev_state = cpl_errorstate_get();
478 double *ref_wave_data =
479 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_WAVE);
480 double *ref_pos_data =
481 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_X);
482 double *ref_flux_data =
483 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_FLUX);
484 double *ref_errs_data =
485 cpl_table_get_data_double(ref_table, MOO_REBIN_REFTABLE_ERR);
487 cpl_vector *ref_wave = cpl_vector_wrap(ref_size, ref_wave_data);
488 cpl_vector *ref_pos = cpl_vector_wrap(ref_size, ref_pos_data);
489 cpl_vector *ref_flux = cpl_vector_wrap(ref_size, ref_flux_data);
490 cpl_vector *ref_errs = cpl_vector_wrap(ref_size, ref_errs_data);
491 res_pos_points = cpl_bivector_wrap_vectors(res_wave, res_pos);
492 ref_pos_points = cpl_bivector_wrap_vectors(ref_wave, ref_pos);
493 cpl_bivector_interpolate_linear(res_pos_points, ref_pos_points);
494 cpl_bivector_unwrap_vectors(ref_pos_points);
495 cpl_bivector_unwrap_vectors(res_pos_points);
496 cpl_vector_unwrap(ref_wave);
497 cpl_vector_unwrap(ref_pos);
498 cpl_vector_unwrap(ref_flux);
499 cpl_vector_unwrap(ref_errs);
501 if (cpl_errorstate_is_equal(prev_state)) {
502 if (strcmp(method, MOO_REBIN_METHOD_INTERPOLATE) == 0) {
503 _moo_rebin_interpolate2(ref_table, res_pos, res_wave,
504 rbn_fluxes, rbn_errs, rbn_qual, imin,
508 _moo_rebin_sum(ref_table, step, res_pos, res_wave, rbn_fluxes,
509 rbn_errs, rbn_qual, imin, rbn_numfib);
513 cpl_msg_error(
"moo_rebin",
"#%d Invalid monotonicity (%f,%f)",
514 numfib, ref_wmin, ref_wmax);
515 cpl_errorstate_set(prev_state);
516 for (
int i = 0; i < rbn_size; i++) {
517 cpl_image_set(rbn_fluxes, i + 1, rbn_numfib, NAN);
518 cpl_image_set(rbn_errs, i + 1, rbn_numfib, NAN);
519 cpl_image_set(rbn_qual, i + 1, rbn_numfib,
526 int res_size = (imax - imin) + 1;
527 cpl_vector_delete(res_wave);
528 cpl_vector_delete(res_pos);
529 res_wave = cpl_vector_new(res_size);
530 res_pos = cpl_vector_new(res_size);
531 for (
int i = 0; i < res_size; i++) {
532 double val1 = min + (imin + i) * step;
533 cpl_vector_set(res_wave, i, val1);
535 res_pos_points = cpl_bivector_wrap_vectors(res_wave, res_pos);
536 ref_wave = cpl_vector_wrap(ref_size, ref_wave_data);
537 ref_pos = cpl_vector_wrap(ref_size, ref_pos_data);
538 ref_pos_points = cpl_bivector_wrap_vectors(ref_wave, ref_pos);
539 cpl_bivector_interpolate_linear(res_pos_points, ref_pos_points);
540 for (
int i = imin; i < imax; i++) {
542 double pix_lo = cpl_vector_get(res_pos, i - imin);
543 double pix_up = cpl_vector_get(res_pos, i - imin + 1);
544 double pix_size = pix_up - pix_lo;
546 cpl_image_get(rbn_fluxes, rbn_idx, rbn_numfib, &rej);
547 cpl_image_set(rbn_fluxes, rbn_idx, rbn_numfib, flux * pix_size);
548 double err = cpl_image_get(rbn_errs, rbn_idx, rbn_numfib, &rej);
549 cpl_image_set(rbn_errs, rbn_idx, rbn_numfib, err * pix_size);
551 cpl_bivector_unwrap_vectors(ref_pos_points);
552 cpl_bivector_unwrap_vectors(res_pos_points);
553 cpl_vector_unwrap(ref_wave);
554 cpl_vector_unwrap(ref_pos);
558 cpl_msg_error(
"moo_rebin",
559 "#%d Invalid solution (%f,%f) rbn range is '%f,%f)'",
560 numfib, ref_wmin, ref_wmax, rbn_wmin, rbn_wmax);
561 for (
int i = 0; i < rbn_size; i++) {
562 cpl_image_set(rbn_fluxes, i + 1, rbn_numfib, NAN);
563 cpl_image_set(rbn_errs, i + 1, rbn_numfib, NAN);
568 cpl_vector_delete(res_wave);
569 cpl_vector_delete(res_pos);
570 cpl_table_delete(ref_table);
571 return CPL_ERROR_NONE;
595_moo_rbn_compute_wmap_step(cpl_image *wmap,
601 cpl_ensure_code(wmap != NULL, CPL_ERROR_NULL_INPUT);
602 int nx = cpl_image_get_size_x(wmap);
603 int ny = cpl_image_get_size_y(wmap);
605 cpl_image *pixsize = cpl_image_new(nx - 1, ny, CPL_TYPE_DOUBLE);
606 for (
int j = 1; j <= ny; j++) {
607 for (
int i = 1; i < nx - 1; i++) {
608 double diff = cpl_image_get(wmap, i + 1, j, &rej) -
609 cpl_image_get(wmap, i, j, &rej) * direction;
610 cpl_image_set(pixsize, i, j, diff);
615 cpl_image_delete(pixsize);
617 return CPL_ERROR_NONE;
621_moo_rebin_single(moo_rbn_single *rbn,
624 const char *filename,
630 const char **fibnames,
637 double step_min, step_max;
639 cpl_ensure_code(rbn != NULL, CPL_ERROR_NULL_INPUT);
640 cpl_ensure_code(ext != NULL, CPL_ERROR_NULL_INPUT);
641 cpl_ensure_code(wmap != NULL, CPL_ERROR_NULL_INPUT);
642 cpl_ensure_code(filename != NULL, CPL_ERROR_NULL_INPUT);
643 cpl_ensure_code(health != NULL, CPL_ERROR_NULL_INPUT);
645 cpl_errorstate prestate = cpl_errorstate_get();
646 cpl_propertylist_copy_property_regexp(rbn->header, ext->header,
"ESO DET *",
650 _moo_rbn_compute_wmap_step(wmap, &step_min, &step_max, direction);
652 if ((strcmp(method, MOO_REBIN_METHOD_INTEGRATE) == 0) && step < step_min) {
655 "Use method %s with step %f but wavemap step is in range (%f,%f)",
656 method, step, step_min, step_max);
658 else if ((strcmp(method, MOO_REBIN_METHOD_INTERPOLATE) == 0) &&
662 "Use method %s with step %f but wavemap step is in range (%f,%f)",
663 method, step, step_min, step_max);
670 int nb_fibres = cpl_image_get_size_y(data);
672 cpl_image *rbn_fluxes = hdrl_image_get_image(rbn->image);
673 cpl_image *rbn_errs = hdrl_image_get_error(rbn->image);
674 cpl_image *rbn_qual = rbn->qual;
676#pragma omp parallel default(none) \
677 shared(nb_fibres, health, rbn_fluxes, rbn_errs, rbn_qual, step, min, ext, \
678 data, wmap, errs, qual, first, indexes, method, indexrbn, \
679 fibnames, monotonous_tab, conserv_flux, direction)
683 for (
int i = 1; i <= nb_fibres; i++) {
684 int idx = cpl_array_get_cplsize(indexes, i - 1, NULL);
686 const char *fibname = fibnames[idx];
688 indexrbn[idx] = i + first;
690 int monotonous = monotonous_tab[idx];
692 _moo_rebin_fibre(data, wmap, errs, qual, i, step, min,
693 rbn_fluxes, rbn_errs, rbn_qual, first,
694 method, conserv_flux, direction);
699 "skip #%s : no monotonous solution in WAVEMAP",
708 if (!cpl_errorstate_is_equal(prestate)) {
709 cpl_msg_error(__func__,
"Error in rebinning EXT:%s", ext->extname);
710 cpl_errorstate_dump(prestate, CPL_FALSE, cpl_errorstate_dump_one);
712 cpl_errorstate_set(prestate);
714 return CPL_ERROR_NONE;
717static cpl_propertylist *
718_moo_create_primary_header(cpl_propertylist *ext_primary_header)
720 cpl_propertylist *primary_header = NULL;
722 primary_header = cpl_propertylist_new();
723 cpl_propertylist_copy_property(primary_header, ext_primary_header,
725 cpl_propertylist_copy_property(primary_header, ext_primary_header,
727 cpl_propertylist_copy_property_regexp(primary_header, ext_primary_header,
729 cpl_propertylist_copy_property_regexp(primary_header, ext_primary_header,
733 return primary_header;
737_moo_update_single_header(cpl_propertylist *result_header,
743 cpl_error_code status = CPL_ERROR_NONE;
745 cpl_propertylist_append_double(result_header, MOO_PFITS_CRPIX2,
746 MOO_EXT_SINGLE_CRPIX2);
747 cpl_propertylist_append_double(result_header, MOO_PFITS_CRVAL2,
748 MOO_EXT_SINGLE_CRVAL2);
749 cpl_propertylist_append_double(result_header, MOO_PFITS_CD1_2, 0.);
750 cpl_propertylist_append_double(result_header, MOO_PFITS_CD2_1, 0.);
751 cpl_propertylist_append_double(result_header, MOO_PFITS_CD2_2,
752 MOO_EXT_SINGLE_CDELT2);
753 cpl_propertylist_append_string(result_header, MOO_PFITS_CTYPE2,
754 MOO_EXT_SINGLE_CTYPE2);
755 cpl_propertylist_append_string(result_header, MOO_PFITS_BUNIT,
756 MOO_RBN_SINGLE_BUNIT);
785 moo_spectral_format *sformat,
786 moo_rebin_params *params,
787 const char *filename)
789 moo_rbn *result = NULL;
790 const char *monotonous_colnames[] = { MOO_FIBRES_TABLE_MONOTONOUS_RI,
791 MOO_FIBRES_TABLE_MONOTONOUS_YJ,
792 MOO_FIBRES_TABLE_MONOTONOUS_H };
794 cpl_ensure(ext != NULL, CPL_ERROR_NULL_INPUT, NULL);
795 cpl_ensure(wmap != NULL, CPL_ERROR_NULL_INPUT, NULL);
796 cpl_ensure(sformat != NULL, CPL_ERROR_NULL_INPUT, NULL);
797 cpl_ensure(params != NULL, CPL_ERROR_NULL_INPUT, NULL);
798 const char *method = params->method;
799 cpl_ensure(method != NULL, CPL_ERROR_ILLEGAL_INPUT, NULL);
801 cpl_errorstate prestate = cpl_errorstate_get();
805 cpl_ensure(fibres_table != NULL, CPL_ERROR_ILLEGAL_INPUT, NULL);
807 cpl_msg_info(__func__,
"Rebin spectra using method %s flux conservation:%d",
808 method, params->conserv_flux);
815 result->filename = filename;
817 result->primary_header = _moo_create_primary_header(ext->primary_header);
818 cpl_image **maptab = wmap->data;
819 cpl_propertylist **headertab = wmap->data_header;
820 cpl_table *wmap_fibre_table = wmap->fibre_table;
821 cpl_table *rbn_fibre_table = cpl_table_duplicate(fibres_table);
824 result->fibre_table = rbn_fibre_table;
825 cpl_ensure(rbn_fibre_table != NULL, CPL_ERROR_NULL_INPUT, NULL);
826 cpl_array *idx1 = NULL, *idx2 = NULL;
831 " Can't get index from INDEXEXT");
835 cpl_table_get_data_int_const(rbn_fibre_table, MOO_FIBRES_TABLE_HEALTH);
837 cpl_table_get_data_int(rbn_fibre_table, MOO_FIBRES_TABLE_INDEXRBN);
838 const char **fibnames =
839 cpl_table_get_data_string_const(rbn_fibre_table,
840 MOO_FIBRES_TABLE_FIBRE);
842 int nrows = cpl_table_get_nrow(rbn_fibre_table);
843 for (
int i = 0; i < nrows; i++) {
844 const char *fibname = fibnames[i];
845 cpl_table_select_all(wmap_fibre_table);
847 MOO_FIBRES_TABLE_FIBRE, fibname);
848 cpl_array *sel = cpl_table_where_selected(wmap_fibre_table);
850 int idx = cpl_array_get_cplsize(sel, 0, NULL);
851 for (
int j = 0; j < 3; j++) {
852 if (cpl_table_has_column(wmap_fibre_table,
853 monotonous_colnames[j])) {
854 int res = cpl_table_get_int(wmap_fibre_table,
855 monotonous_colnames[j], idx, NULL);
856 cpl_table_set_int(rbn_fibre_table, monotonous_colnames[j], i,
860 cpl_table_set_int(rbn_fibre_table, monotonous_colnames[j], i,
864 cpl_array_delete(sel);
867 cpl_array *idx_tab[] = { idx1, idx2 };
869 int size1 = cpl_array_get_size(idx1);
870 int first_tab[] = { 0, size1 };
872 cpl_msg_indent_more();
874 for (
int j = 0; j < 3; j++) {
877 double step = params->step[j];
879 int nx = floor((wmax - wmin) / step);
880 int ny = cpl_table_get_nrow(rbn_fibre_table);
881 int *monotonous_tab =
882 cpl_table_get_data_int(rbn_fibre_table, monotonous_colnames[j]);
883 _moo_update_single_header(rbn_single->header, j, step, wmin, wmax);
886 for (
int i = 1; i <= 2; i++) {
887 cpl_array *idx = idx_tab[i - 1];
888 int first = first_tab[i - 1];
889 cpl_image *map = maptab[(i - 1) * 3 + j];
890 cpl_propertylist *map_header = headertab[(i - 1) * 3 + j];
891 moo_ext_single *ext_single =
893 if (ext_single != NULL && map != NULL) {
897 "Rebin extension %s with step %f and range [%f,%f]",
900 if (rbn_single->image == NULL) {
901 rbn_single->image = hdrl_image_new(nx, ny);
902 rbn_single->qual = cpl_image_new(nx, ny, CPL_TYPE_INT);
906 double *idata = cpl_image_get_data(img);
907 double *edata = cpl_image_get_data(error);
908 int *qdata = cpl_image_get_data(rbn_single->qual);
909 for (
int k = 0; k < nx * ny; k++) {
915 cpl_propertylist_copy_property(rbn_single->header,
918 moo_spectral_format_info *info =
920 if (cpl_propertylist_has(
921 map_header, MOONS_QC_WAVECAL_MONOTONOUS_SOLUTION)) {
922 int monotonous = cpl_propertylist_get_bool(
923 map_header, MOONS_QC_WAVECAL_MONOTONOUS_SOLUTION);
925 cpl_msg_warning(__func__,
926 "WAVEMAP %s: not monotonous solution "
928 ext_single->extname);
932 _moo_rebin_single(rbn_single, ext_single, map, filename, health,
933 step, wmin, first, indexrbn, fibnames,
934 monotonous_tab, idx, method,
935 params->conserv_flux, info->direction);
941 if (rbn_single->image == NULL) {
949 cpl_msg_indent_less();
951 cpl_array_delete(idx1);
952 cpl_array_delete(idx2);
954 if (!cpl_errorstate_is_equal(prestate)) {
957 cpl_msg_error(__func__,
"Error in rebin for EXT %s", ext->filename);
958 cpl_errorstate_dump(prestate, CPL_FALSE, cpl_errorstate_dump_one);
960 cpl_errorstate_set(prestate);
#define MOO_BADPIX_OUTSIDE_DATA_RANGE
#define MOO_BADPIX_CALIB_DEFECT
const char * moo_detector_get_name(moo_detector_type type)
Get the extension name of a detector.
cpl_image * moo_ext_single_get_qual(moo_ext_single *self)
Get image of qual.
cpl_image * moo_ext_single_get_errs(moo_ext_single *self)
Get image of errs.
cpl_image * moo_ext_single_get_data(moo_ext_single *self)
Get image of data.
moo_ext_single * moo_ext_load_single(moo_ext *self, moo_detector_type type, int num, unsigned int level)
Load the type part in EXT and return it.
cpl_table * moo_ext_get_fibre_table(moo_ext *self)
Get the FIBRE TABLE in EXT.
cpl_array * moo_fibres_table_get_spectro_indexext(cpl_table *table, int num)
get the index of a spectro in the fibre table sort by spetcro,indexext
cpl_error_code moo_fibres_table_add_rebin_cols(cpl_table *table)
add rebin additional columns
cpl_error_code moo_fits_create(const char *filename)
Create a new fits file with empty propertylist.
moo_rbn_single * moo_rbn_single_new(moo_detector_type type)
Create a new moo_rbn_single.
void moo_rbn_single_delete(moo_rbn_single *self)
Delete a moo_rbn_single.
cpl_image * moo_rbn_single_get_data(moo_rbn_single *self)
Get image of data.
cpl_error_code moo_rbn_single_set_wcs1(moo_rbn_single *self, double crpix1, double crval1, double cd1_1, const char *ctype1, const char *cunit1)
Set the WCS1 of the extension.
cpl_image * moo_rbn_single_get_errs(moo_rbn_single *self)
Get image of errs.
void moo_rbn_delete(moo_rbn *self)
Delete a moo_rbn.
cpl_error_code moo_rbn_add_single(moo_rbn *self, moo_detector_type type, moo_rbn_single *single)
Add RBN_SINGLE extension to RBN filename and update moo_rbn structure.
cpl_error_code moo_rbn_add_fibre_table(moo_rbn *self, cpl_table *fibre_table)
Add fibre table to RBN filename and update moo_rbn structure.
moo_rbn * moo_rbn_new(void)
Create a new moo_rbn.
moo_rbn * moo_rebin(moo_ext *ext, moo_map *wmap, moo_spectral_format *sformat, moo_rebin_params *params, const char *filename)
Rebin an EXT spectra in RBN format.
cpl_error_code moo_pfits_set_spec_bin(cpl_propertylist *plist, double val)
Set the SPEC_BIN Keyword.
cpl_error_code moo_pfits_set_wlmin(cpl_propertylist *plist, double val)
Set the WAVELMIN Keyword.
cpl_error_code moo_pfits_append_hduclass_data(cpl_propertylist *plist, moo_detector_type type, int ntas)
Set the HDUCLASS DATA Keyword.
cpl_error_code moo_pfits_set_wlmax(cpl_propertylist *plist, double val)
Set the WAVELMAX Keyword.
cpl_error_code moo_pfits_set_fluxcal(cpl_propertylist *plist, const char *val)
Set the FLUXCAL Keyword.
cpl_error_code moo_qc_set_is_tellcor(cpl_propertylist *plist, cpl_boolean val)
Set the QC.IS.TELLCOR value.
cpl_size moo_table_and_selected_sequal_string(cpl_table *table, const char *name, const char *string)
Select from unselected table rows, by comparing column values with a constant.
cpl_error_code moo_interpolate_linear(cpl_bivector *fout, cpl_vector *fout_errs, int *fout_qual, const cpl_bivector *fref, const cpl_vector *fref_errs, const int *fref_qual)
Linear interpolation of a 1d-function.
cpl_error_code moo_image_get_quartile(cpl_image *image, double *qmin, double *qmax)
compute first and last quartile from an image