203 cpl_frame *frm = NULL;
205 cpl_table *res_tbl = NULL;
206 cpl_vector *dit_on = NULL;
207 cpl_vector *dit_of = NULL;
208 cpl_vector *exptime_on = NULL;
209 cpl_vector *exptime_of = NULL;
219 const char *name = NULL;
223 double exptime_ref = 0;
226 non = cpl_frameset_get_size(son);
227 nof = cpl_frameset_get_size(sof);
228 nfr = (non <= nof) ? non : nof;
230 dit_on = cpl_vector_new(nfr);
231 dit_of = cpl_vector_new(nfr);
232 exptime_on = cpl_vector_new(nfr);
233 exptime_of = cpl_vector_new(nfr);
235 for (i = 0; i < nfr; i++) {
236 cpl_propertylist *plist = NULL;
238 frm = cpl_frameset_get_position(son, i);
239 name = cpl_frame_get_filename(frm);
240 plist = cpl_propertylist_load(name, 0);
241 dit_ref = irplib_pfits_get_dit(plist);
242 exptime_ref = (double)irplib_pfits_get_exp_time(plist);
243 cpl_propertylist_delete(plist);
244 cpl_vector_set(dit_on, i, dit_ref);
245 cpl_vector_set(exptime_on, i, exptime_ref);
247 frm = cpl_frameset_get_position(sof, i);
248 name = cpl_frame_get_filename(frm);
249 plist = cpl_propertylist_load(name, 0);
250 dit_ref = irplib_pfits_get_dit(plist);
251 exptime_ref = (double)irplib_pfits_get_exp_time(plist);
252 cpl_propertylist_delete(plist);
253 cpl_vector_set(dit_of, i, dit_ref);
254 cpl_vector_set(exptime_of, i, exptime_ref);
264 res_tbl = cpl_table_new(nfr);
265 cpl_table_new_column(res_tbl,
"adu", CPL_TYPE_DOUBLE);
266 cpl_table_new_column(res_tbl,
"gain", CPL_TYPE_DOUBLE);
268 for (i = 0; i < nfr; i++) {
269 cpl_image *img_on1 = NULL;
270 cpl_image *img_of1 = NULL;
273 frm = cpl_frameset_get_position(son, i);
274 name = cpl_frame_get_filename(frm);
275 img_on1 = cpl_image_load(name, CPL_TYPE_FLOAT, 0, 0);
277 frm = cpl_frameset_get_position(sof, i);
278 name = cpl_frame_get_filename(frm);
279 img_of1 = cpl_image_load(name, CPL_TYPE_FLOAT, 0, 0);
282 dit_ref = cpl_vector_get(dit_on, i);
283 exptime_ref = cpl_vector_get(exptime_on, i);
286 for (m = 0; m < nfr; m++) {
289 double exptime_tmp = 0;
291 frm = cpl_frameset_get_position(son, m);
292 name = cpl_frame_get_filename(frm);
293 dit_tmp = cpl_vector_get(dit_on, m);
294 exptime_tmp = cpl_vector_get(exptime_on, m);
295 if (dit_tmp == dit_ref && exptime_tmp == exptime_ref) {
296 cpl_image *img_on2 = NULL;
297 cpl_image *img_on_dif = NULL;
299 cpl_image *img_of2 = NULL;
300 cpl_image *img_of_dif = NULL;
306 double avg_on_dif = 0;
307 double avg_of_dif = 0;
309 double sig_on_dif = 0;
310 double sig_of_dif = 0;
313 img_on2 = cpl_image_load(name, CPL_TYPE_FLOAT, 0, 0);
314 frm = cpl_frameset_get_position(sof, m);
315 name = cpl_frame_get_filename(frm);
316 img_of2 = cpl_image_load(name, CPL_TYPE_FLOAT, 0, 0);
318 img_on_dif = cpl_image_subtract_create(img_on1, img_on2);
319 img_of_dif = cpl_image_subtract_create(img_of1, img_of2);
321 irplib_get_clean_mean_window(img_on1, llx, lly, urx, ury,
322 kappa, nclip, &avg_on1, &std);
323 irplib_get_clean_mean_window(img_on2, llx, lly, urx, ury,
324 kappa, nclip, &avg_on2, &std);
325 irplib_get_clean_mean_window(img_of1, llx, lly, urx, ury,
326 kappa, nclip, &avg_of1, &std);
327 irplib_get_clean_mean_window(img_of2, llx, lly, urx, ury,
328 kappa, nclip, &avg_of2, &std);
329 irplib_get_clean_mean_window(img_on_dif, llx, lly, urx, ury,
330 kappa, nclip, &avg_on_dif,
332 irplib_get_clean_mean_window(img_of_dif, llx, lly, urx, ury,
333 kappa, nclip, &avg_of_dif,
336 cpl_image_delete(img_on2);
337 cpl_image_delete(img_of2);
338 cpl_image_delete(img_on_dif);
339 cpl_image_delete(img_of_dif);
342 ((avg_on1 + avg_on2) - (avg_of1 + avg_of2)) /
343 ((sig_on_dif * sig_on_dif) - (sig_of_dif * sig_of_dif));
345 cpl_table_set_double(res_tbl,
"gain", m, gain);
346 cpl_table_set_double(res_tbl,
"adu", m,
347 ((avg_on1 + avg_on2) / 2 -
348 (avg_of1 + avg_of2) / 2));
352 cpl_image_delete(img_on1);
353 cpl_image_delete(img_of1);
357 cpl_vector_delete(dit_on);
358 cpl_vector_delete(dit_of);
359 cpl_vector_delete(exptime_on);
360 cpl_vector_delete(exptime_of);
388 cpl_vector *vec_adl = NULL;
389 cpl_vector *vec_dit = NULL;
390 cpl_vector *vec_avg = NULL;
391 cpl_vector *vec_med = NULL;
392 cpl_vector *vec_avg_dit = NULL;
393 cpl_vector *vec_med_dit = NULL;
396 cpl_table *lin_tbl = NULL;
399 non = cpl_frameset_get_size(son);
400 nof = cpl_frameset_get_size(sof);
401 nfr = (non <= nof) ? non : nof;
403 lin_tbl = cpl_table_new(nfr);
404 cpl_table_new_column(lin_tbl,
"med", CPL_TYPE_DOUBLE);
405 cpl_table_new_column(lin_tbl,
"avg", CPL_TYPE_DOUBLE);
406 cpl_table_new_column(lin_tbl,
"med_dit", CPL_TYPE_DOUBLE);
407 cpl_table_new_column(lin_tbl,
"avg_dit", CPL_TYPE_DOUBLE);
408 cpl_table_new_column(lin_tbl,
"dit", CPL_TYPE_DOUBLE);
409 vec_med = cpl_vector_new(nfr);
410 vec_avg = cpl_vector_new(nfr);
411 vec_med_dit = cpl_vector_new(nfr);
412 vec_avg_dit = cpl_vector_new(nfr);
413 vec_dit = cpl_vector_new(nfr);
414 vec_adl = cpl_vector_new(nfr);
415 for (i = 0; i < nfr; i++) {
416 cpl_frame *frm = NULL;
427 const char *name = NULL;
428 cpl_image *img = NULL;
429 cpl_propertylist *plist = NULL;
431 frm = cpl_frameset_get_position(son, i);
432 name = cpl_frame_get_filename(frm);
433 img = cpl_image_load(name, CPL_TYPE_FLOAT, 0, 0);
434 med_on = cpl_image_get_median(img);
435 avg_on = cpl_image_get_mean(img);
436 cpl_image_delete(img);
438 frm = cpl_frameset_get_position(sof, i);
439 name = cpl_frame_get_filename(frm);
440 img = cpl_image_load(name, CPL_TYPE_FLOAT, 0, 0);
441 med_of = cpl_image_get_median(img);
442 avg_of = cpl_image_get_mean(img);
443 cpl_image_delete(img);
444 med = med_on - med_of;
445 avg = avg_on - avg_of;
446 plist = cpl_propertylist_load(name, 0);
447 dit = (double)irplib_pfits_get_dit(plist);
448 cpl_propertylist_delete(plist);
452 cpl_vector_set(vec_dit, i, dit);
453 cpl_vector_set(vec_avg, i, avg);
454 cpl_vector_set(vec_med, i, med);
455 cpl_vector_set(vec_avg_dit, i, avg_dit);
456 cpl_vector_set(vec_med_dit, i, med_dit);
459 cpl_table_set_double(lin_tbl,
"dit", i, dit);
460 cpl_table_set_double(lin_tbl,
"med", i, med);
461 cpl_table_set_double(lin_tbl,
"avg", i, avg);
462 cpl_table_set_double(lin_tbl,
"med_dit", i, med_dit);
463 cpl_table_set_double(lin_tbl,
"avg_dit", i, avg_dit);
465 cpl_table_new_column(lin_tbl,
"adl", CPL_TYPE_DOUBLE);
466 med_dit = cpl_vector_get_mean(vec_med_dit);
469 for (i = 0; i < nfr; i++) {
471 dit = cpl_table_get_double(lin_tbl,
"dit", i, status);
472 cpl_vector_set(vec_adl, i, dit * med_dit);
473 cpl_table_set_double(lin_tbl,
"adl", i, dit * med_dit);
477 cpl_vector_delete(vec_dit);
478 cpl_vector_delete(vec_adl);
479 cpl_vector_delete(vec_avg);
480 cpl_vector_delete(vec_med);
481 cpl_vector_delete(vec_avg_dit);
482 cpl_vector_delete(vec_med_dit);
501 const char *detlin_a,
502 const char *detlin_b,
503 const char *detlin_c)
513 double coeff_1, coeff_2, val;
517 if (!ilist || !detlin_a || !detlin_b || !detlin_c)
521 ima = cpl_image_load(detlin_a, CPL_TYPE_FLOAT, 0, 0);
522 imb = cpl_image_load(detlin_b, CPL_TYPE_FLOAT, 0, 0);
523 imc = cpl_image_load(detlin_c, CPL_TYPE_FLOAT, 0, 0);
524 if (!ima || !imb || !imc) {
525 cpl_msg_error(cpl_func,
"Cannot load the detlin images");
527 cpl_image_delete(ima);
529 cpl_image_delete(imb);
531 cpl_image_delete(imc);
534 pima = cpl_image_get_data_float(ima);
535 pimb = cpl_image_get_data_float(imb);
536 pimc = cpl_image_get_data_float(imc);
539 nx = cpl_image_get_size_x(cpl_imagelist_get(ilist, 0));
540 ny = cpl_image_get_size_y(cpl_imagelist_get(ilist, 0));
541 ni = cpl_imagelist_get_size(ilist);
542 if ((cpl_image_get_size_x(ima) != nx) ||
543 (cpl_image_get_size_x(imb) != nx) ||
544 (cpl_image_get_size_x(imc) != nx) ||
545 (cpl_image_get_size_y(ima) != ny) ||
546 (cpl_image_get_size_y(imb) != ny) ||
547 (cpl_image_get_size_y(imc) != ny)) {
548 cpl_msg_error(cpl_func,
"Incompatible sizes");
549 cpl_image_delete(ima);
550 cpl_image_delete(imb);
551 cpl_image_delete(imc);
556 for (i = 0; i < nx * ny; i++) {
558 if (fabs(pima[i]) < 1e-30) {
559 coeff_1 = coeff_2 = (double)0.0;
562 coeff_1 = (double)pimb[i] / (
double)pima[i];
563 coeff_2 = (double)pimc[i] / (
double)pima[i];
566 for (j = 0; j < ni; j++) {
567 pdata = cpl_image_get_data_float(cpl_imagelist_get(ilist, j));
568 val = (double)pdata[i];
570 (float)(val + coeff_1 * val * val + coeff_2 * val * val * val);
574 cpl_image_delete(ima);
575 cpl_image_delete(imb);
576 cpl_image_delete(imc);
602 cpl_image *dark_image;
603 cpl_msg_info(cpl_func,
"Subtract the dark to the images");
605 if ((dark_image = cpl_image_load(dark, CPL_TYPE_FLOAT, 0, 0)) == NULL) {
606 cpl_msg_error(cpl_func,
"Cannot load the dark %s", dark);
610 if (cpl_imagelist_subtract_image(ilist, dark_image) != CPL_ERROR_NONE) {
611 cpl_msg_error(cpl_func,
"Cannot apply the dark to the images");
612 cpl_image_delete(dark_image);
615 cpl_image_delete(dark_image);
620 cpl_image *flat_image;
621 cpl_msg_info(cpl_func,
"Divide the images by the flatfield");
623 if ((flat_image = cpl_image_load(flat, CPL_TYPE_FLOAT, 0, 0)) == NULL) {
624 cpl_msg_error(cpl_func,
"Cannot load the flat field %s", flat);
628 if (cpl_imagelist_divide_image(ilist, flat_image) != CPL_ERROR_NONE) {
629 cpl_msg_error(cpl_func,
"Cannot apply the flatfield to the images");
630 cpl_image_delete(flat_image);
633 cpl_image_delete(flat_image);
638 cpl_mask *bpm_im_bin;
639 cpl_image *bpm_im_int;
641 cpl_msg_info(cpl_func,
"Correct the bad pixels in the images");
643 if ((bpm_im_int = cpl_image_load(bpm, CPL_TYPE_INT, 0, 0)) == NULL) {
644 cpl_msg_error(cpl_func,
"Cannot load the bad pixel map %s", bpm);
648 bpm_im_bin = cpl_mask_threshold_image_create(bpm_im_int, -0.5, 0.5);
649 cpl_mask_not(bpm_im_bin);
650 cpl_image_delete(bpm_im_int);
652 for (i = 0; i < cpl_imagelist_get_size(ilist); i++) {
653 cpl_image_reject_from_mask(cpl_imagelist_get(ilist, i), bpm_im_bin);
654 if (cpl_detector_interpolate_rejected(
655 cpl_imagelist_get(ilist, i)) != CPL_ERROR_NONE) {
656 cpl_msg_error(cpl_func,
"Cannot clean the bad pixels in obj %d",
658 cpl_mask_delete(bpm_im_bin);
662 cpl_mask_delete(bpm_im_bin);