40 #include "irplib_utils.h"
41 #include "hawki_utils.h"
42 #include "hawki_calib.h"
43 #include "hawki_load.h"
44 #include "hawki_save.h"
45 #include "hawki_pfits.h"
46 #include "hawki_dfs.h"
52 #define NEGLIG_OFF_DIFF 0.1
53 #define SQR(x) ((x)*(x))
59 static int hawki_step_basic_calib_create(cpl_plugin *) ;
60 static int hawki_step_basic_calib_exec(cpl_plugin *) ;
61 static int hawki_step_basic_calib_destroy(cpl_plugin *) ;
62 static int hawki_step_basic_calib(cpl_parameterlist *, cpl_frameset *) ;
64 static int hawki_step_basic_calib_applycal_qc_save
65 (cpl_frameset * raw_target,
66 const cpl_frame * flat,
67 const cpl_frame * dark,
68 const cpl_frame * bpm,
69 const char * filename_postfix,
72 cpl_parameterlist * recipe_parlist,
73 cpl_frameset * recipe_framelist);
74 static void hawki_step_basic_calib_qc(
void);
75 static int hawki_step_basic_calib_save
76 (cpl_imagelist * reduced,
77 const char * filename_postfix,
81 cpl_frameset * used_frameset,
82 cpl_parameterlist * recipe_parlist,
83 cpl_frameset * recipe_framelist);
89 static char hawki_step_basic_calib_description[] =
90 "hawki_step_basic_calib -- hawki basic reduction utility (flat, dark).\n"
91 "The files listed in the Set Of Frames (sof-file) must be tagged:\n"
92 "raw-file.fits "HAWKI_IMG_JITTER_RAW
" or\n"
93 "raw-file.fits "HAWKI_IMG_JITTER_SKY_RAW
" \n"
94 "flat-file.fits "HAWKI_CALPRO_FLAT
" \n"
95 "dark-file.fits "HAWKI_CALPRO_DARK
" \n"
96 "bpm-file.fits "HAWKI_CALPRO_BPM
" \n";
111 int cpl_plugin_get_info(cpl_pluginlist * list)
113 cpl_recipe * recipe = cpl_calloc(1,
sizeof(*recipe)) ;
114 cpl_plugin * plugin = &recipe->interface ;
116 cpl_plugin_init(plugin,
118 HAWKI_BINARY_VERSION,
119 CPL_PLUGIN_TYPE_RECIPE,
120 "hawki_step_basic_calib",
121 "Basic reduction recipe",
122 hawki_step_basic_calib_description,
123 "Cesar Enrique Garcia Dabo",
126 hawki_step_basic_calib_create,
127 hawki_step_basic_calib_exec,
128 hawki_step_basic_calib_destroy) ;
130 cpl_pluginlist_append(list, plugin) ;
145 static int hawki_step_basic_calib_create(cpl_plugin * plugin)
147 cpl_recipe * recipe ;
151 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
152 recipe = (cpl_recipe *)plugin ;
156 recipe->parameters = cpl_parameterlist_new() ;
172 static int hawki_step_basic_calib_exec(cpl_plugin * plugin)
174 cpl_recipe * recipe ;
177 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
178 recipe = (cpl_recipe *)plugin ;
184 return hawki_step_basic_calib(recipe->parameters, recipe->frames) ;
194 static int hawki_step_basic_calib_destroy(cpl_plugin * plugin)
196 cpl_recipe * recipe ;
199 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
200 recipe = (cpl_recipe *)plugin ;
203 cpl_parameterlist_delete(recipe->parameters) ;
215 static int hawki_step_basic_calib(
216 cpl_parameterlist * parlist,
217 cpl_frameset * framelist)
219 const cpl_frame * flat;
220 const cpl_frame * dark;
221 const cpl_frame * bpm;
222 cpl_frameset * objframes ;
223 cpl_frameset * skyframes ;
227 cpl_msg_error(__func__,
"Cannot identify RAW and CALIB frames") ;
232 cpl_msg_info(__func__,
"Identifying calibration data");
233 flat = cpl_frameset_find_const(framelist, HAWKI_CALPRO_FLAT);
234 dark = cpl_frameset_find_const(framelist, HAWKI_CALPRO_DARK);
235 bpm = cpl_frameset_find_const(framelist, HAWKI_CALPRO_BPM);
236 if (flat == NULL && dark == NULL && bpm == NULL)
238 cpl_msg_error(__func__,
"No calibration data provided (%s and/or %s and/or %s)",
239 HAWKI_CALPRO_FLAT, HAWKI_CALPRO_DARK, HAWKI_CALPRO_BPM);
244 cpl_msg_info(__func__,
"Identifying objects and sky data");
248 if (objframes == NULL && skyframes == NULL)
250 cpl_msg_error(__func__,
"Cannot find objs (%s) or sky frames (%s) in the input list",
251 HAWKI_IMG_JITTER_RAW, HAWKI_IMG_JITTER_SKY_RAW);
256 if (objframes != NULL)
258 const char * procat = HAWKI_CALPRO_BASICCALIBRATED;
259 const char * protype = HAWKI_PROTYPE_BASICCALIBRATED;
260 cpl_msg_info(__func__,
"Apply the basic reduction to object frames");
261 hawki_step_basic_calib_applycal_qc_save
262 (objframes, flat, dark, bpm,
"obj", procat, protype,
264 cpl_frameset_delete(objframes);
266 if (skyframes != NULL)
268 const char * procat = HAWKI_CALPRO_SKY_BASICCALIBRATED;
269 const char * protype = HAWKI_PROTYPE_SKY_BASICCALIBRATED;
270 cpl_msg_info(__func__,
"Apply the basic reduction to sky frames");
271 hawki_step_basic_calib_applycal_qc_save
272 (skyframes, flat, dark, bpm,
"sky", procat, protype,
274 cpl_frameset_delete(skyframes);
278 if (cpl_error_get_code())
return -1 ;
293 static int hawki_step_basic_calib_applycal_qc_save
294 (cpl_frameset * raw_target,
295 const cpl_frame * flat,
296 const cpl_frame * dark,
297 const cpl_frame * bpm,
298 const char * filename_postfix,
300 const char * protype,
301 cpl_parameterlist * recipe_parlist,
302 cpl_frameset * recipe_framelist)
304 cpl_imagelist * flat_images;
305 cpl_imagelist * dark_images;
306 cpl_imagelist * bpm_images;
307 cpl_frameset * calib_frameset;
308 cpl_propertylist * plist ;
309 cpl_errorstate error_prevstate = cpl_errorstate_get();
321 cpl_msg_indent_more();
324 calib_frameset = cpl_frameset_new();
327 cpl_msg_info(__func__,
"Loading the calibration data") ;
331 if(flat_images == NULL)
333 cpl_msg_error(__func__,
"Error reading flat") ;
334 cpl_frameset_delete(calib_frameset);
337 cpl_frameset_insert(calib_frameset, cpl_frame_duplicate(flat));
342 if(dark_images == NULL)
344 cpl_msg_error(__func__,
"Error reading dark") ;
345 cpl_imagelist_delete(flat_images);
346 cpl_frameset_delete(calib_frameset);
349 cpl_frameset_insert(calib_frameset, cpl_frame_duplicate(dark));
354 if(bpm_images == NULL)
356 cpl_msg_error(__func__,
"Error reading bpm") ;
357 cpl_imagelist_delete(flat_images);
358 cpl_imagelist_delete(dark_images);
359 cpl_frameset_delete(calib_frameset);
362 cpl_frameset_insert(calib_frameset, cpl_frame_duplicate(bpm));
368 if ((plist=cpl_propertylist_load
369 (cpl_frame_get_filename
370 (cpl_frameset_get_first_const(raw_target)), 0)) == NULL)
372 cpl_msg_error(__func__,
"Cannot get header from frame");
373 cpl_imagelist_delete(flat_images);
374 cpl_imagelist_delete(dark_images);
375 cpl_frameset_delete(calib_frameset);
379 cpl_imagelist_multiply_scalar(dark_images, science_dit);
380 cpl_propertylist_delete(plist);
384 ntarget = cpl_frameset_get_size(raw_target);
385 cpl_msg_info(__func__,
"Looping the science frames: %d frames", ntarget);
386 for( iframe = 0 ; iframe < ntarget ; ++iframe)
389 cpl_frame * target_frame;
390 cpl_imagelist * target_images;
391 cpl_frameset * used_frameset;
392 target_images = NULL;
395 cpl_msg_indent_more();
396 cpl_msg_info(__func__,
"Loading frame %d", iframe+1) ;
397 target_frame = cpl_frameset_get_frame(raw_target, iframe);
398 if(target_frame != NULL)
400 if(target_images == NULL)
402 cpl_msg_error(__func__,
"Error reading frame") ;
403 cpl_imagelist_delete(flat_images);
404 cpl_imagelist_delete(dark_images);
405 cpl_imagelist_delete(bpm_images);
409 used_frameset = cpl_frameset_duplicate(calib_frameset);
410 cpl_frameset_insert(used_frameset, cpl_frame_duplicate(target_frame));
416 cpl_msg_info(__func__,
"Calibrating frame") ;
418 (target_images, flat_images, dark_images, bpm_images) == -1)
420 cpl_msg_error(__func__,
"Cannot calibrate frame") ;
421 cpl_imagelist_delete(flat_images);
422 cpl_imagelist_delete(dark_images);
423 cpl_imagelist_delete(bpm_images);
424 cpl_imagelist_delete(target_images);
425 cpl_frameset_delete(used_frameset);
426 cpl_frameset_delete(calib_frameset);
427 cpl_msg_indent_less() ;
428 cpl_msg_indent_less() ;
433 hawki_step_basic_calib_qc();
436 cpl_msg_info(__func__,
"Save the products") ;
437 if (hawki_step_basic_calib_save
438 (target_images, filename_postfix, procat, protype, iframe,
439 used_frameset, recipe_parlist,
440 recipe_framelist) == -1)
442 cpl_msg_error(__func__,
"Cannot save the products") ;
443 cpl_imagelist_delete(flat_images);
444 cpl_imagelist_delete(dark_images);
445 cpl_imagelist_delete(bpm_images);
446 cpl_imagelist_delete(target_images);
447 cpl_frameset_delete(used_frameset);
448 cpl_frameset_delete(calib_frameset);
449 cpl_msg_indent_less() ;
450 cpl_msg_indent_less() ;
455 cpl_imagelist_delete(target_images);
456 cpl_frameset_delete(used_frameset);
457 cpl_msg_indent_less();
460 cpl_msg_indent_less();
462 cpl_imagelist_delete(flat_images);
463 cpl_imagelist_delete(dark_images);
464 cpl_imagelist_delete(bpm_images);
465 cpl_frameset_delete(calib_frameset);
467 if(!cpl_errorstate_is_equal(error_prevstate))
469 cpl_msg_warning(__func__,
"Probably some data could not be saved. "
470 "Check permisions or disk space");
471 cpl_errorstate_set(CPL_ERROR_NONE);
485 static void hawki_step_basic_calib_qc(
void)
502 static int hawki_step_basic_calib_save
503 (cpl_imagelist * reduced,
504 const char * filename_postfix,
506 const char * protype,
508 cpl_frameset * used_frameset,
509 cpl_parameterlist * recipe_parlist,
510 cpl_frameset * recipe_framelist)
512 const cpl_frame * raw_reference;
513 cpl_propertylist * proplist;
514 cpl_propertylist ** extproplists;
516 cpl_propertylist * inputlist ;
518 const char * recipe_name =
"hawki_step_basic_calib";
522 raw_reference = irplib_frameset_get_first_from_group
523 (used_frameset, CPL_FRAME_GROUP_RAW);
526 cpl_msg_indent_more();
527 proplist = cpl_propertylist_new();
528 inputlist = cpl_propertylist_load_regexp(
529 cpl_frame_get_filename(raw_reference), 0,
530 HAWKI_HEADER_EXT_FORWARD, 0);
531 cpl_propertylist_append(proplist, inputlist);
532 cpl_propertylist_delete(inputlist);
533 extproplists = cpl_malloc(HAWKI_NB_DETECTORS *
sizeof(cpl_propertylist*));
534 for (i=0 ; i<HAWKI_NB_DETECTORS ; i++)
538 (cpl_frame_get_filename(raw_reference), i+1);
541 extproplists[i] = cpl_propertylist_new();
544 inputlist = cpl_propertylist_load_regexp(
545 cpl_frame_get_filename(raw_reference), ext_nb,
546 HAWKI_HEADER_EXT_FORWARD, 0);
547 cpl_propertylist_append(extproplists[i], inputlist);
548 cpl_propertylist_delete(inputlist);
549 inputlist = cpl_propertylist_load_regexp(
550 cpl_frame_get_filename(raw_reference), ext_nb,
551 HAWKI_HEADER_WCS, 0);
552 cpl_propertylist_append(extproplists[i], inputlist);
553 cpl_propertylist_delete(inputlist);
557 snprintf(filename, 256,
"hawki_step_basic_calib_%s%03d.fits",
558 filename_postfix, iserie+1);
566 (
const cpl_propertylist*)proplist,
567 (
const cpl_propertylist**)extproplists,
571 cpl_msg_indent_less();
572 cpl_propertylist_delete(proplist) ;
573 for (i=0 ; i<HAWKI_NB_DETECTORS ; i++)
575 cpl_propertylist_delete(extproplists[i]) ;
577 cpl_free(extproplists) ;