35#include "moo_params.h"
36#include "moo_badpix.h"
37#include "moo_single.h"
39#include "moo_detlist.h"
40#include "moo_remove_crh.h"
68_moo_qual_fromlist(cpl_imagelist *list)
70 cpl_ensure(list, CPL_ERROR_NULL_INPUT, NULL);
72 int size = cpl_imagelist_get_size(list);
73 cpl_ensure(size > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
75 const cpl_image *qimg = cpl_imagelist_get_const(list, 0);
80 int nx = cpl_image_get_size_x(qimg);
81 int ny = cpl_image_get_size_y(qimg);
82 const int *qdata = cpl_image_get_data_int_const(qimg);
84 for (k = 1; k < size; k++) {
85 cpl_image *qimg2 = cpl_imagelist_get(list, k);
86 int *qdata2 = cpl_image_get_data_int(qimg2);
87 for (
int i = 0; i < nx * ny; i++) {
88 if (qdata[i] != qdata2[i]) {
89 cpl_msg_error(
"moo_remove_crh",
90 "QUAL of first frame and %d are not equal",
96 return cpl_image_duplicate(qimg);
100_moo_remove_CRH_collapse_median(hdrl_imagelist *list,
101 cpl_imagelist *quallist,
105 moo_single *single = NULL;
107 cpl_ensure(list != NULL, CPL_ERROR_ILLEGAL_INPUT, NULL);
109 int size = hdrl_imagelist_get_size(list);
112 hdrl_image *res = NULL;
113 cpl_image *contrib = NULL;
114 hdrl_imagelist_collapse_median(list, &res, &contrib);
115 for (j = 0; j < size; j++) {
116 hdrl_imagelist_unset(list, 0);
119 cpl_image *qual = _moo_qual_fromlist(quallist);
124 for (j = 0; j < size; j++) {
125 cpl_imagelist_unset(quallist, 0);
128 cpl_image_delete(contrib);
135_moo_remove_CRH_collapse_mean(hdrl_imagelist *list,
136 cpl_imagelist *quallist,
140 moo_single *single = NULL;
142 cpl_ensure(list != NULL, CPL_ERROR_ILLEGAL_INPUT, NULL);
144 int size = hdrl_imagelist_get_size(list);
147 hdrl_image *res = NULL;
148 cpl_image *contrib = NULL;
149 hdrl_imagelist_collapse_mean(list, &res, &contrib);
151 for (j = 0; j < size; j++) {
152 hdrl_imagelist_unset(list, 0);
155 cpl_image *qual = _moo_qual_fromlist(quallist);
161 for (j = 0; j < size; j++) {
162 cpl_imagelist_unset(quallist, 0);
164 cpl_image_delete(contrib);
190_moo_remove_CRH_collapse_sigclip(hdrl_imagelist *list,
191 cpl_imagelist *quallist,
192 moo_masklist *cosmiclist,
199 cpl_ensure(nbcrh != NULL, CPL_ERROR_ILLEGAL_INPUT, NULL);
200 cpl_ensure(list != NULL, CPL_ERROR_ILLEGAL_INPUT, NULL);
201 cpl_ensure(quallist != NULL, CPL_ERROR_ILLEGAL_INPUT, NULL);
203 moo_single *single = NULL;
206 int size = hdrl_imagelist_get_size(list);
208 float avg_cosmics = 0.0;
211 hdrl_image *res = NULL;
212 cpl_image *rejhigh = NULL;
213 cpl_image *contrib = NULL;
215 int sizex = hdrl_imagelist_get_size_x(list);
216 int sizey = hdrl_imagelist_get_size_y(list);
218 if (cosmiclist != NULL) {
219 for (
int i = 0; i < size; i++) {
221 moo_mask_set(mask, type, num, cpl_mask_new(sizex, sizey));
224 moo_try_check(hdrl_imagelist_collapse_sigclip(list, kappa, kappa, niter,
225 &res, &contrib, NULL,
228#if MOO_DEBUG_REMOVE_CRH
231 char *name = cpl_sprintf(
"contrib_%s.fits", extname);
232 cpl_image_save(contrib, name, CPL_TYPE_INT, NULL, CPL_IO_CREATE);
235 name = cpl_sprintf(
"rejhigh_%s.fits", extname);
236 cpl_image_save(rejhigh, name, CPL_TYPE_DOUBLE, NULL, CPL_IO_CREATE);
240 const double *high_data = cpl_image_get_data_double_const(rejhigh);
242 cpl_image *qual = _moo_qual_fromlist(quallist);
243 for (j = 0; j < sizex * sizey; j++) {
244 if (cosmiclist != NULL) {
245 for (k = 0; k < size; k++) {
246 const hdrl_image *himage =
247 hdrl_imagelist_get_const(list, k);
248 const cpl_image *image = hdrl_image_get_image_const(himage);
249 const double *img_data =
250 cpl_image_get_data_double_const(image);
251 cpl_image *qimg = cpl_imagelist_get(quallist, k);
254 cpl_binary *mdata = cpl_mask_get_data(mask);
255 int *qdata = cpl_image_get_data_int(qimg);
257 double val = img_data[j];
258 double high = high_data[j];
263 mdata[j] = CPL_BINARY_1;
268 for (j = 0; j < size; j++) {
269 hdrl_imagelist_unset(list, 0);
272 avg_cosmics = (float)nbcosmics / (
float)size;
273 cpl_msg_indent_more();
274 if (cosmiclist != NULL) {
276 cpl_msg_info(__func__,
277 "%s: found %d cosmics in total (avg %.1f / frame) ",
278 extname, nbcosmics, avg_cosmics);
280 cpl_msg_indent_less();
286#if MOO_DEBUG_REMOVE_CRH
287 for (j = 0; j < size; j++) {
289 char *name = cpl_sprintf(
"qual_%s_%d.fits", extname, j);
290 cpl_image_save(cpl_imagelist_get(quallist, j), name,
291 CPL_TYPE_INT, NULL, CPL_IO_CREATE);
296 for (j = 0; j < size; j++) {
297 cpl_imagelist_unset(quallist, 0);
301 cpl_image_delete(rejhigh);
302 cpl_image_delete(contrib);
310_moo_remove_CRH_collapse(hdrl_imagelist *list,
311 cpl_imagelist *quallist,
312 moo_masklist *cosmiclist,
313 moo_crh_params *params,
318 moo_single *single = NULL;
321 if (strcmp(params->method, MOO_CRH_METHOD_MEDIAN) == 0) {
322 single = _moo_remove_CRH_collapse_median(list, quallist, type, num);
324 else if (strcmp(params->method, MOO_CRH_METHOD_MEAN) == 0) {
325 single = _moo_remove_CRH_collapse_mean(list, quallist, type, num);
328 single = _moo_remove_CRH_collapse_sigclip(list, quallist, cosmiclist,
329 params->kappa, params->niter,
337_moo_copy_header_kw(cpl_propertylist *res_header,
338 const cpl_propertylist *orig_header)
340 cpl_ensure_code(res_header != NULL, CPL_ERROR_NULL_INPUT);
341 cpl_ensure_code(orig_header != NULL, CPL_ERROR_NULL_INPUT);
343 cpl_propertylist_copy_property_regexp(res_header, orig_header,
"ESO DET *",
345 cpl_propertylist_copy_property_regexp(res_header, orig_header,
"HDU*", 0);
346 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_BUNIT);
347 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_ERRDATA);
348 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_QUALDATA);
349 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CRPIX1);
350 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CRPIX2);
351 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CRVAL1);
352 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CRVAL2);
353 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CTYPE1);
354 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CTYPE2);
355 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CD1_1);
356 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CD1_2);
357 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CUNIT1);
358 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CD2_1);
359 cpl_propertylist_copy_property(res_header, orig_header, MOO_PFITS_CD2_2);
360 return cpl_error_get_code();
364_moo_remove_crh_single(moo_detlist *detlist,
365 moo_masklist *cosmiclist,
369 unsigned int badpix_level,
370 moo_crh_params *params,
374 cpl_error_code status = CPL_ERROR_NONE;
376 moo_single *single = NULL;
383 single = _moo_remove_CRH_collapse(list, qlist, cosmiclist, params, &nbcrh,
385 if (single != NULL) {
386 cpl_propertylist *header = NULL;
388 moo_try_check(header = moo_det_get_single_header(orig_det, type, num),
390 moo_try_check(_moo_copy_header_kw(single->header, header),
" ");
391 *nbcrh_total += nbcrh;
394 moo_det_set_single(res, type, num, single);
395 cpl_imagelist_unwrap(qlist);
396 hdrl_imagelist_unwrap(list);
428 moo_masklist *cosmiclist,
429 moo_crh_params *params)
431 moo_det *dres = NULL;
432 cpl_ensure(detlist != NULL, CPL_ERROR_NULL_INPUT, NULL);
433 cpl_ensure(detlist->size > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
434 cpl_ensure(params != NULL, CPL_ERROR_NULL_INPUT, NULL);
436 cpl_errorstate prestate = cpl_errorstate_get();
438 if (strcmp(params->method, MOO_CRH_METHOD_MEDIAN) == 0) {
439 cpl_msg_info(__func__,
"Computing median of %d frames",
442 else if (strcmp(params->method, MOO_CRH_METHOD_MEAN) == 0) {
443 cpl_msg_info(__func__,
"Computing mean of %d frames",
447 cpl_msg_info(__func__,
"Computing sigma clip of %d frames",
455 dres->primary_header = cpl_propertylist_duplicate(orig_det->primary_header);
456 cpl_propertylist_erase_regexp(dres->primary_header,
"ESO QC FRAME RAW", 0);
458 cpl_errorstate prev_state = cpl_errorstate_get();
461 if (!cpl_errorstate_is_equal(prev_state)) {
462 cpl_msg_info(__func__,
"DET input files do not have a fibre table.");
463 cpl_errorstate_set(prev_state);
467 for (
int num = 1; num <= 2; num++) {
468 moo_try_check(_moo_remove_crh_single(detlist, cosmiclist, orig_det,
470 params, dres, &nbcrh_total),
472 moo_try_check(_moo_remove_crh_single(detlist, cosmiclist, orig_det,
474 params, dres, &nbcrh_total),
476 moo_try_check(_moo_remove_crh_single(detlist, cosmiclist, orig_det,
478 params, dres, &nbcrh_total),
482 if (strcmp(params->method, MOO_CRH_METHOD_SIGCLIP) == 0) {
487 if (!cpl_errorstate_is_equal(prestate)) {
488 cpl_msg_error(__func__,
"Error in remove CRH");
489 cpl_errorstate_dump(prestate, CPL_FALSE, cpl_errorstate_dump_one);
#define MOO_BADPIX_COSMIC_UNREMOVED
moo_det * moo_det_new(void)
Create a new moo_det.
cpl_table * moo_det_get_fibre_table(moo_det *self)
Get the FIBRE TABLE in DET.
void moo_det_delete(moo_det *self)
Delete a moo_det.
const char * moo_detector_get_extname(moo_detector_type type, int ntas)
Get the extension name of a detector.
enum _moo_detector_type_ moo_detector_type
The type code type.
hdrl_imagelist * moo_detlist_get_image(const moo_detlist *self, moo_detector_type type, int num)
Get the all the images of the type part in the detlist.
cpl_error_code moo_detlist_free_single(const moo_detlist *self, moo_detector_type type, int num)
Free the type part for all DET in the detlist.
cpl_imagelist * moo_detlist_get_single_qual(const moo_detlist *self, moo_detector_type type, int num)
Get the type QUAL part for all DET in the detlist.
cpl_error_code moo_detlist_load_single(const moo_detlist *self, moo_detector_type type, int num, int level)
Load the type part for all DET in the detlist.
moo_det * moo_detlist_get(moo_detlist *self, int i)
Get the DET at the position i in the list.
cpl_error_code moo_mask_set(moo_mask *self, moo_detector_type type, int num, cpl_mask *mask)
Set the cpl_mask associated to given type,num.
moo_mask * moo_masklist_get(moo_masklist *self, int i)
Get the MASK at the position i in the list.
cpl_mask * moo_masklist_get_mask(moo_masklist *self, int i, moo_detector_type type, int num)
Get the CPL_MASK at the position i,type,num in the list.
moo_single * moo_single_new(moo_detector_type type, int ntas)
Create a new moo_single.
moo_det * moo_remove_CRH(moo_detlist *detlist, moo_masklist *cosmiclist, moo_crh_params *params)
Remove CRH in single frames or in a combination of multiple frames.
cpl_error_code moo_qc_set_ncrh(cpl_propertylist *plist, int val)
Set the QC.NCRH value.
cpl_error_code moo_qc_set_ncrh_tot(cpl_propertylist *plist, int val)
Set the QC.NCRH.TOT value.
cpl_error_code moo_qc_set_ncrh_avg(cpl_propertylist *plist, float val)
Set the QC.NCRH value.
cpl_error_code moo_qc_set_ncom(cpl_propertylist *plist, int val)
Set the QC.NCOM value.