40 #include "gravi_utils.h"
41 #include "gravi_pfits.h"
42 #include "gravi_dfs.h"
43 #include "gravi_calib.h"
44 #include "gravi_vis.h"
45 #include "gravi_data.h"
53 static int gravi_single_create(cpl_plugin *);
54 static int gravi_single_exec(cpl_plugin *);
55 static int gravi_single_destroy(cpl_plugin *);
56 static int gravi_single(cpl_frameset *,
const cpl_parameterlist *);
62 static char gravi_single_description[] =
63 "This recipe is associated to the template GRAVI_single_calib.\n"
64 "Its aim is to reduce the raw interferometric data acquired on calibrator\n"
65 "target and to compute the intrumental visibility. It is used in single mode.\n"
66 "The given output FITS file contain a oi fits file, \n"
67 "the values of the visibility complex, squared visibility and the cloture phase.\n"
68 "their associated tags, e.g."
69 "GRAVI-gravi_single-raw-file.fits " GRAVI_SINGLE_CALIB
" and "
70 GRAVI_SINGLE_SCIENCE
"\n"
71 "and any optional files, e.g.\n"
72 "GRAVI-gravi_single-file.fits " VIS_CALIB
" and " VIS_SCIENCE
"\n"
73 "Additionally, it should describe functionality of the expected output."
91 int cpl_plugin_get_info(cpl_pluginlist * list)
93 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
94 cpl_plugin * plugin = &recipe->interface;
96 if (cpl_plugin_init(plugin,
99 CPL_PLUGIN_TYPE_RECIPE,
101 "This recipe is used to compute the squared visibility",
102 gravi_single_description,
103 "Firstname Lastname",
108 gravi_single_destroy)) {
109 cpl_msg_error(cpl_func,
"Plugin initialization failed");
110 (void)cpl_error_set_where(cpl_func);
114 if (cpl_pluginlist_append(list, plugin)) {
115 cpl_msg_error(cpl_func,
"Error adding plugin to list");
116 (void)cpl_error_set_where(cpl_func);
132 static int gravi_single_create(cpl_plugin * plugin)
138 if (cpl_error_get_code() != CPL_ERROR_NONE) {
139 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
140 cpl_func, __LINE__, cpl_error_get_where());
141 return (
int)cpl_error_get_code();
144 if (plugin == NULL) {
145 cpl_msg_error(cpl_func,
"Null plugin");
146 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
150 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
151 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
152 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
156 recipe = (cpl_recipe *)plugin;
159 recipe->parameters = cpl_parameterlist_new();
160 if (recipe->parameters == NULL) {
161 cpl_msg_error(cpl_func,
"Parameter list allocation failed");
162 cpl_ensure_code(0, (
int)CPL_ERROR_ILLEGAL_OUTPUT);
168 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.readout",
169 CPL_TYPE_DOUBLE,
"the readout error sigma",
"gravi.gravi_all_p2vm", 1);
170 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sigma_readout");
171 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
172 cpl_parameterlist_append(recipe->parameters, p);
175 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.preproc_file",
176 CPL_TYPE_BOOL,
"Save the preproc file",
"gravi.gravi_all_p2vm", FALSE);
177 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"preprocfile");
178 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
179 cpl_parameterlist_append(recipe->parameters, p);
182 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.vis_reduce.vis_correction",
183 CPL_TYPE_BOOL,
"Parameter of corection",
"gravi.gravi_single", FALSE);
184 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"vis_correction");
185 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
186 cpl_parameterlist_append(recipe->parameters, p);
189 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.readoutSC",
190 CPL_TYPE_DOUBLE,
"the readout error sigma SC",
"gravi.gravi_all_p2vm", 1.0);
191 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sigma_readout_SC");
192 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
193 cpl_parameterlist_append(recipe->parameters, p);
196 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.readoutFT",
197 CPL_TYPE_DOUBLE,
"the readout error sigma FT",
"gravi.gravi_all_p2vm", 1.0);
198 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sigma_readout_FT");
199 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
200 cpl_parameterlist_append(recipe->parameters, p);
212 static int gravi_single_exec(cpl_plugin * plugin)
217 cpl_errorstate initial_errorstate = cpl_errorstate_get();
220 if (cpl_error_get_code() != CPL_ERROR_NONE) {
221 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
222 cpl_func, __LINE__, cpl_error_get_where());
223 return (
int)cpl_error_get_code();
226 if (plugin == NULL) {
227 cpl_msg_error(cpl_func,
"Null plugin");
228 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
232 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
233 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
234 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
238 recipe = (cpl_recipe *)plugin;
241 if (recipe->parameters == NULL) {
242 cpl_msg_error(cpl_func,
"Recipe invoked with NULL parameter list");
243 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
245 if (recipe->frames == NULL) {
246 cpl_msg_error(cpl_func,
"Recipe invoked with NULL frame set");
247 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
251 recipe_status = gravi_single(recipe->frames, recipe->parameters);
255 if (cpl_dfs_update_product_header(recipe->frames)) {
257 recipe_status = (int)cpl_error_get_code();
261 if (!cpl_errorstate_is_equal(initial_errorstate)) {
264 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
267 return recipe_status;
277 static int gravi_single_destroy(cpl_plugin * plugin)
281 if (plugin == NULL) {
282 cpl_msg_error(cpl_func,
"Null plugin");
283 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
287 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
288 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
289 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
293 recipe = (cpl_recipe *)plugin;
295 cpl_parameterlist_delete(recipe->parameters);
310 static int gravi_single(cpl_frameset * frameset,
311 const cpl_parameterlist * parlist)
313 cpl_frameset * recipe_frameset, * wave_frameset, * dark_frameset,
314 * darkcalib_frameset, * preproc_frameset, * skyframeset,
315 * gain_frameset, * p2vm_frameset, * badpix_frameset;
316 cpl_propertylist * applist, * primary_hdr, * primary_hdr_dark, * wave_plist
319 cpl_parameterlist * preproc_parlist;
321 const cpl_parameter * p;
323 char * out_dark, * preproc_name;
324 const char * frame_tag, * filename;
325 gravi_data * p2vm_map, * data, * dark_map, * wave_map,
326 * profile_map, * badpix_map;
327 gravi_data ** calib_datas;
328 gravi_data * preproc_data;
329 gravi_data ** raw_data, * p2vm_reduce;
331 dark_map = NULL, wave_map = NULL;
332 int nb_frame, i, j, nwave_ft, nwave_sc;
336 double darkmean, darkrms, wavemin, wavemax;
340 cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
341 cpl_error_get_code()) ;
343 preproc_frameset = gravi_frameset_extract_preproc(frameset);
344 p2vm_frameset = gravi_frameset_extract_p2vm_file(frameset);
345 if (cpl_frameset_is_empty(preproc_frameset)) {
349 recipe_frameset = gravi_frameset_extract_single_data(frameset);
351 darkcalib_frameset = gravi_frameset_extract_dark_file(frameset);
352 wave_frameset = gravi_frameset_extract_wave_file(frameset);
353 dark_frameset = gravi_frameset_extract_dark(frameset);
354 gain_frameset = gravi_frameset_extract_flat_file(frameset);
355 badpix_frameset = gravi_frameset_extract_badpix(frameset);
356 skyframeset = gravi_frameset_extract_sky_data (frameset);
357 if (cpl_frameset_is_empty(recipe_frameset)) {
360 cpl_frameset_delete(darkcalib_frameset);
361 cpl_frameset_delete(wave_frameset);
362 cpl_frameset_delete(dark_frameset);
363 cpl_frameset_delete(gain_frameset);
364 cpl_frameset_delete(p2vm_frameset);
365 cpl_frameset_delete(recipe_frameset);
367 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
368 "No single frame on the frameset") ;
371 if ((cpl_frameset_is_empty(p2vm_frameset)) ||
372 (cpl_frameset_is_empty(wave_frameset)) ||
373 (cpl_frameset_is_empty(gain_frameset))) {
376 cpl_frameset_delete(darkcalib_frameset);
377 cpl_frameset_delete(recipe_frameset);
378 cpl_frameset_delete(wave_frameset);
379 cpl_frameset_delete(dark_frameset);
380 cpl_frameset_delete(gain_frameset);
381 cpl_frameset_delete(p2vm_frameset);
382 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
383 "No p2vm or gain or wave file on the frameset") ;
387 nb_frame = cpl_frameset_get_size(recipe_frameset);
393 if (cpl_frameset_is_empty(skyframeset)) {
395 if (!cpl_frameset_is_empty(dark_frameset)) {
396 frame = cpl_frameset_get_position(dark_frameset, 0);
398 filename = cpl_frame_get_filename(frame);
399 data = gravi_data_load(filename);
400 primary_hdr = gravi_data_get_propertylist(data,
401 GRAVI_PRIMARY_HDR_NAME_EXT);
402 shutter = gravi_shutters_check(primary_hdr);
403 if (!((shutter[0] == 0) && (shutter[1] == 0) && (shutter[2] == 0)
404 && (shutter[3] == 0))){
405 cpl_frameset_delete(darkcalib_frameset);
406 cpl_frameset_delete(dark_frameset);
407 cpl_frameset_delete(wave_frameset);
408 cpl_frameset_delete(gain_frameset);
409 cpl_frameset_delete(p2vm_frameset);
410 cpl_frameset_delete(recipe_frameset);
411 gravi_data_delete(data);
412 return (
int)cpl_error_set_message(cpl_func,
413 CPL_ERROR_ILLEGAL_OUTPUT,
"Shutter problem");
417 cpl_msg_info (NULL,
"This file %s is a dark file",
419 dark_map = gravi_compute_dark(data);
420 if (cpl_error_get_code()) {
421 cpl_frameset_delete(darkcalib_frameset);
422 cpl_frameset_delete(dark_frameset);
423 cpl_frameset_delete(wave_frameset);
424 cpl_frameset_delete(gain_frameset);
425 gravi_data_delete(dark_map);
426 cpl_frameset_delete(p2vm_frameset);
427 cpl_frameset_delete(recipe_frameset);
428 cpl_propertylist_delete(applist);
429 gravi_data_delete(data);
430 return (
int)cpl_error_set_message(cpl_func,
431 CPL_ERROR_ILLEGAL_OUTPUT,
432 "Error while computing the dark_map");
437 primary_hdr_dark = gravi_data_get_propertylist(dark_map,
438 GRAVI_PRIMARY_HDR_NAME_EXT);
439 applist = gravi_propertylist_get_qc (primary_hdr_dark);
442 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG,
447 cpl_propertylist_append_double(applist, QC_MEANDARK, darkmean);
448 cpl_propertylist_append_double(applist, QC_DARKRMS, darkrms);
449 out_dark =
"gravi_final_dark.fits";
451 if (gravi_data_save(dark_map, frameset, out_dark, parlist,
452 dark_frameset, frame,
"gravi_single", applist)
454 cpl_frameset_delete(darkcalib_frameset);
455 cpl_frameset_delete(dark_frameset);
456 cpl_frameset_delete(wave_frameset);
457 cpl_frameset_delete(gain_frameset);
458 gravi_data_delete(dark_map);
459 cpl_frameset_delete(p2vm_frameset);
460 cpl_frameset_delete(recipe_frameset);
461 cpl_propertylist_delete(applist);
462 gravi_data_delete(data);
465 return (
int) cpl_error_set_message(cpl_func,
466 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the dark_map"
467 " on the output file");
469 cpl_propertylist_delete(applist);
472 gravi_data_delete(data);
477 else if (!cpl_frameset_is_empty(darkcalib_frameset)) {
478 frame = cpl_frameset_get_position(darkcalib_frameset, 0);
480 frame_tag = cpl_frame_get_tag(frame) ;
481 filename = cpl_frame_get_filename(frame);
482 cpl_msg_info (NULL,
"This file %s is a dark file already "
483 "computed", filename);
484 dark_map = gravi_data_load(filename);
485 cpl_frameset_insert (dark_frameset, cpl_frame_duplicate (frame));
490 cpl_frameset_delete(darkcalib_frameset);
491 cpl_frameset_delete(p2vm_frameset);
492 cpl_frameset_delete(dark_frameset);
493 cpl_frameset_delete(wave_frameset);
494 cpl_frameset_delete(gain_frameset);
495 gravi_data_delete(dark_map);
496 cpl_frameset_delete(recipe_frameset);
498 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
499 "No dark frames in the frameset");
503 frame = cpl_frameset_get_position(skyframeset, 0);
505 filename = cpl_frame_get_filename(frame);
506 data = gravi_data_load(filename);
507 primary_hdr = gravi_data_get_propertylist(data,
508 GRAVI_PRIMARY_HDR_NAME_EXT);
509 const char * dpr_TYPE = cpl_propertylist_get_string (primary_hdr, DPR_TYPE);
510 if (cpl_error_get_code()){
511 cpl_frameset_delete(darkcalib_frameset);
512 cpl_frameset_delete(dark_frameset);
513 cpl_frameset_delete(wave_frameset);
514 cpl_frameset_delete(gain_frameset);
515 cpl_frameset_delete(p2vm_frameset);
516 cpl_frameset_delete(recipe_frameset);
517 cpl_frameset_delete(skyframeset);
518 gravi_data_delete(data);
519 return (
int)cpl_error_set_message(cpl_func,
520 CPL_ERROR_ILLEGAL_OUTPUT,
"The keyword DPR_CATG is missed");
523 if (strstr (dpr_TYPE,
"SKY") == NULL){
524 cpl_frameset_delete(darkcalib_frameset);
525 cpl_frameset_delete(dark_frameset);
526 cpl_frameset_delete(wave_frameset);
527 cpl_frameset_delete(gain_frameset);
528 cpl_frameset_delete(p2vm_frameset);
529 cpl_frameset_delete(recipe_frameset);
530 cpl_frameset_delete(skyframeset);
531 gravi_data_delete(data);
532 return (
int)cpl_error_set_message(cpl_func,
533 CPL_ERROR_ILLEGAL_OUTPUT,
"The file is not a sky file");
537 cpl_msg_info (NULL,
"This file %s is a sky file",
539 dark_map = gravi_compute_dark(data);
541 gravi_data_delete(data);
542 if (cpl_error_get_code()) {
543 cpl_frameset_delete(darkcalib_frameset);
544 cpl_frameset_delete(dark_frameset);
545 cpl_frameset_delete(wave_frameset);
546 cpl_frameset_delete(gain_frameset);
547 gravi_data_delete(dark_map);
548 cpl_frameset_delete(p2vm_frameset);
549 cpl_frameset_delete(recipe_frameset);
550 cpl_propertylist_delete(applist);
552 return (
int)cpl_error_set_message(cpl_func,
553 CPL_ERROR_ILLEGAL_OUTPUT,
554 "Error while computing the dark_map");
556 cpl_frameset_insert (dark_frameset, cpl_frame_duplicate (frame));
559 primary_hdr_dark = gravi_data_get_propertylist(dark_map,
560 GRAVI_PRIMARY_HDR_NAME_EXT);
561 applist = gravi_propertylist_get_qc (primary_hdr_dark);
564 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG,
569 cpl_propertylist_append_double(applist, QC_MEANDARK, darkmean);
570 cpl_propertylist_append_double(applist, QC_DARKRMS, darkrms);
571 out_dark =
"gravi_final_dark.fits";
573 if (gravi_data_save(dark_map, frameset, out_dark, parlist,
574 skyframeset, frame,
"gravi_single", applist)
576 cpl_frameset_delete(darkcalib_frameset);
577 cpl_frameset_delete(dark_frameset);
578 cpl_frameset_delete(wave_frameset);
579 cpl_frameset_delete(gain_frameset);
580 gravi_data_delete(dark_map);
581 cpl_frameset_delete(p2vm_frameset);
582 cpl_frameset_delete(recipe_frameset);
583 cpl_propertylist_delete(applist);
587 return (
int) cpl_error_set_message(cpl_func,
588 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the dark_map"
589 " on the output file");
591 cpl_propertylist_delete(applist);
594 cpl_frameset_delete(skyframeset);
596 if (!cpl_frameset_is_empty(badpix_frameset)){
597 frame = cpl_frameset_get_position(badpix_frameset, 0);
598 filename = cpl_frame_get_filename(frame);
599 cpl_msg_info (NULL,
"This file %s is a bad pixel map", filename);
601 badpix_map = gravi_data_load(filename);
605 badpix_map = gravi_compute_badpix(dark_map, parlist);
607 if (cpl_error_get_code()) {
608 gravi_data_delete(badpix_map);
609 cpl_frameset_delete(dark_frameset);
610 cpl_frameset_delete(wave_frameset);
611 cpl_frameset_delete(gain_frameset);
612 cpl_frameset_delete(p2vm_frameset);
613 cpl_frameset_delete(darkcalib_frameset);
614 gravi_data_delete(dark_map);
615 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
616 "Error while computing the bad pixel map");
620 bad_primary_hdr = gravi_data_get_propertylist (badpix_map,
621 GRAVI_PRIMARY_HDR_NAME_EXT);
622 applist = gravi_propertylist_get_qc (bad_primary_hdr);
624 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, BAD);
626 frame = cpl_frameset_get_position (dark_frameset, 0);
628 if (gravi_data_save (badpix_map, frameset,
"gravi_bad_map.fits", parlist,
629 dark_frameset, frame,
"gravi_all_flat", applist)
632 gravi_data_delete(badpix_map);
633 cpl_frameset_delete(dark_frameset);
634 cpl_frameset_delete(wave_frameset);
635 cpl_frameset_delete(gain_frameset);
636 cpl_frameset_delete(p2vm_frameset);
637 cpl_frameset_delete(darkcalib_frameset);
638 cpl_frameset_delete(badpix_frameset);
639 gravi_data_delete(dark_map);
640 return (
int) cpl_error_set_message(cpl_func,
641 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the bad pixel map");
643 cpl_propertylist_delete (applist);
648 frame = cpl_frameset_get_position(gain_frameset, 0);
649 filename = cpl_frame_get_filename(frame);
650 cpl_msg_info (NULL,
"This file %s is a flat file already "
651 "computed", filename);
653 profile_map = gravi_data_load(filename);
656 frame = cpl_frameset_get_position(wave_frameset, 0);
657 filename = cpl_frame_get_filename(frame);
658 cpl_msg_info (NULL,
"This file %s is a wave file already "
659 "computed", filename);
660 wave_map = gravi_data_load(filename);
663 if ((wave_map == NULL) || (profile_map == NULL)){
664 cpl_frameset_delete(darkcalib_frameset);
665 cpl_frameset_delete(p2vm_frameset);
666 cpl_frameset_delete(dark_frameset);
667 cpl_frameset_delete(wave_frameset);
668 cpl_frameset_delete(gain_frameset);
669 gravi_data_delete(wave_map);
670 gravi_data_delete(profile_map);
671 gravi_data_delete(badpix_map);
672 cpl_frameset_delete(recipe_frameset);
674 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
675 "No wave frames in the frameset");
679 frame = cpl_frameset_get_position(p2vm_frameset, 0);
680 filename = cpl_frame_get_filename(frame);
681 cpl_msg_info (NULL,
"This file %s is a p2vm file already "
682 "computed", filename);
684 p2vm_map = gravi_data_load (filename);
686 if (cpl_error_get_code()) {
687 cpl_frameset_delete(darkcalib_frameset);
688 cpl_frameset_delete(p2vm_frameset);
689 cpl_frameset_delete(dark_frameset);
690 cpl_frameset_delete(wave_frameset);
691 cpl_frameset_delete(gain_frameset);
692 gravi_data_delete(profile_map);
693 gravi_data_delete(dark_map);
694 gravi_data_delete(wave_map);
695 gravi_data_delete(p2vm_map);
696 cpl_frameset_delete(recipe_frameset);
698 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
699 "Error while loading the p2vm_map");
703 wave_plist = gravi_data_get_propertylist (p2vm_map,
704 GRAVI_IO_WAVELENGTH_SC_EXT);
705 nwave_sc = gravi_pfits_get_nwave (wave_plist);
706 wave_plist = gravi_data_get_propertylist (p2vm_map,
707 GRAVI_IO_WAVELENGTH_FT_EXT);
708 nwave_ft = gravi_pfits_get_nwave (wave_plist);
709 primary_hdr = gravi_data_get_propertylist (wave_map,
710 GRAVI_PRIMARY_HDR_NAME_EXT);
712 if (cpl_error_get_code()) {
713 cpl_frameset_delete(darkcalib_frameset);
714 cpl_frameset_delete(p2vm_frameset);
715 cpl_frameset_delete(dark_frameset);
716 cpl_frameset_delete(wave_frameset);
717 cpl_frameset_delete(gain_frameset);
718 gravi_data_delete(profile_map);
719 gravi_data_delete(dark_map);
720 gravi_data_delete(wave_map);
721 gravi_data_delete(p2vm_map);
722 cpl_frameset_delete(recipe_frameset);
724 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
725 "Missed one the preproc parameters");
728 wavemin = cpl_propertylist_get_double (primary_hdr, QC_MINWAVE_SC);
729 wavemax = cpl_propertylist_get_double (primary_hdr, QC_MAXWAVE_SC);
732 cpl_size nb_par = cpl_parameterlist_get_size (parlist);
734 preproc_parlist = cpl_parameterlist_new ();
735 p = cpl_parameterlist_get_first_const (parlist);
736 for (i = 0; i < nb_par; i ++){
737 cpl_type type = cpl_parameter_get_type (p);
739 case CPL_TYPE_DOUBLE :
740 par = cpl_parameter_new_value(cpl_parameter_get_name (p), type,
741 cpl_parameter_get_help(p),
742 cpl_parameter_get_context(p),
743 cpl_parameter_get_double (p));
746 par = cpl_parameter_new_value(cpl_parameter_get_name (p), type,
747 cpl_parameter_get_help(p),
748 cpl_parameter_get_context(p),
749 cpl_parameter_get_bool (p));
752 par = cpl_parameter_new_value(cpl_parameter_get_name (p), type,
753 cpl_parameter_get_help(p),
754 cpl_parameter_get_context(p),
755 cpl_parameter_get_int (p));
757 case CPL_TYPE_STRING :
758 par = cpl_parameter_new_value(cpl_parameter_get_name (p), type,
759 cpl_parameter_get_help(p),
760 cpl_parameter_get_context(p),
761 cpl_parameter_get_string (p));
764 cpl_msg_warning(cpl_func,
"Type of the parameter is different %s",
765 cpl_type_get_name (type));
770 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
771 cpl_parameter_get_alias (p, CPL_PARAMETER_MODE_CLI));
772 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
773 cpl_parameterlist_append(preproc_parlist, par);
774 p = cpl_parameterlist_get_next_const (parlist);
778 par = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.min_wave",
779 CPL_TYPE_DOUBLE,
"the minimum wavelength",
780 "gravi.gravi_all_p2vm", wavemin + 0.0001);
781 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"lambdamin");
782 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
783 cpl_parameterlist_append(preproc_parlist, par);
786 par = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.max_wave",
787 CPL_TYPE_DOUBLE,
"the maximum wavelength",
788 "gravi.gravi_all_p2vm", wavemax - 0.0001);
789 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"lambdamax");
790 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
791 cpl_parameterlist_append(preproc_parlist, par);
794 par = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.nspectrum_FT",
795 CPL_TYPE_INT,
"the number of the spectral",
796 "gravi.gravi_all_dark", nwave_ft);
797 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"nlambda_ft");
798 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
799 cpl_parameterlist_append(preproc_parlist, par);
802 par = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.nspectrum_SC",
803 CPL_TYPE_INT,
"the number of the spectral",
804 "gravi.gravi_all_dark", nwave_sc);
805 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"nlambda_sc");
806 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
807 cpl_parameterlist_append(preproc_parlist, par);
816 calib_datas = cpl_malloc(4 *
sizeof(gravi_data *));
817 calib_datas[0] = dark_map;
818 calib_datas[1] = wave_map;
819 calib_datas[2] = profile_map;
820 calib_datas[3] = badpix_map;
822 p = cpl_parameterlist_find_const(parlist,
"gravi.gravi_all_p2vm."
823 "preproc_param.preproc_file");
829 oi_vis = gravi_data_new(0);
830 for (i = 0; i < nb_frame; i++){
831 frame = cpl_frameset_get_position (recipe_frameset, i);
832 filename = cpl_frame_get_filename (frame);
834 data = gravi_data_load(filename);
835 primary_hdr = gravi_data_get_propertylist (data,
836 GRAVI_PRIMARY_HDR_NAME_EXT);
839 shutter = gravi_shutters_check(primary_hdr);
841 if ((shutter[0] == 1) && (shutter[1] == 1) &&
842 (shutter[2] == 1) && (shutter[3] == 1)){
843 cpl_msg_info (NULL,
"Calibration of this file %s", filename);
844 preproc_data = gravi_preproc(data, calib_datas, 4, preproc_parlist);
846 gravi_data_delete(data);
848 cpl_frameset_insert (preproc_frameset, cpl_frame_duplicate (frame));
851 gravi_data_delete(data);
855 if (cpl_error_get_code()) {
856 cpl_frameset_delete(darkcalib_frameset);
857 cpl_frameset_delete(p2vm_frameset);
858 cpl_frameset_delete(dark_frameset);
859 cpl_frameset_delete(wave_frameset);
860 cpl_frameset_delete(gain_frameset);
863 gravi_data_delete(preproc_data);
865 cpl_free(preproc_data);
866 cpl_free(calib_datas);
867 gravi_data_delete(profile_map);
868 gravi_data_delete(dark_map);
869 gravi_data_delete(wave_map);
870 gravi_data_delete(badpix_map);
871 gravi_data_delete(p2vm_map);
872 cpl_frameset_delete(recipe_frameset);
874 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
875 "Error while computing the preproc data_map");
879 if (cpl_parameter_get_bool(p)){
880 preproc_name = cpl_sprintf(
"gravi_preproc_%s", filename);
881 cpl_frameset * preproc_frame = cpl_frameset_new ();
882 cpl_frameset_insert (preproc_frame, cpl_frame_duplicate (frame));
884 applist = gravi_propertylist_get_qc (gravi_data_get_propertylist
885 (preproc_data, GRAVI_PRIMARY_HDR_NAME_EXT));
888 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, PREPROC);
892 if (gravi_data_save(preproc_data, frameset, preproc_name, parlist,
893 preproc_frame, frame,
"gravi_single", applist)
895 cpl_frameset_delete(darkcalib_frameset);
896 cpl_frameset_delete(dark_frameset);
897 cpl_frameset_delete(wave_frameset);
898 cpl_frameset_delete(gain_frameset);
899 cpl_free(calib_datas);
900 gravi_data_delete(profile_map);
901 gravi_data_delete(dark_map);
902 gravi_data_delete(wave_map);
903 gravi_data_delete(p2vm_map);
904 cpl_frameset_delete(p2vm_frameset);
905 cpl_frameset_delete(recipe_frameset);
906 cpl_propertylist_delete(applist);
908 gravi_data_delete(preproc_data);
910 cpl_free(preproc_name);
912 return (
int) cpl_error_set_message(cpl_func,
913 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the preproc data"
914 " on the output file");
917 cpl_free(preproc_name);
918 cpl_propertylist_delete (applist);
919 cpl_frameset_delete (preproc_frame);
924 cpl_msg_info (NULL,
"reduce the p2vm of the file %s",
925 cpl_frame_get_filename(frame));
926 p2vm_reduce = gravi_p2vm_reduce (preproc_data, p2vm_map,
"gravi_single");
927 gravi_data_delete(preproc_data);
928 if (cpl_error_get_code()){
929 gravi_data_delete(p2vm_reduce);
930 gravi_data_delete(preproc_data);
931 gravi_data_delete(p2vm_map);
932 cpl_frameset_delete(p2vm_frameset);
933 cpl_frameset_delete(recipe_frameset);
936 return (
int) cpl_error_set_message(cpl_func,
937 CPL_ERROR_ILLEGAL_OUTPUT,
"error while reducing the p2vm");
939 char * p2vm_name = cpl_sprintf(
"single_reduced_%s",
940 cpl_frame_get_filename(frame));
942 gravi_data_save_data(p2vm_reduce, p2vm_name, CPL_IO_CREATE);
950 cpl_msg_info (NULL,
"reduce the visibilities");
951 gravi_vis_reduce (oi_vis, p2vm_reduce, nb_vis, parlist,
"gravi_single");
955 gravi_data_delete(p2vm_reduce);
958 cpl_free(calib_datas);
959 gravi_data_delete(profile_map);
960 gravi_data_delete(dark_map);
961 gravi_data_delete(wave_map);
962 gravi_data_delete(badpix_map);
963 gravi_data_delete(p2vm_map);
964 cpl_parameterlist_delete (preproc_parlist);
965 cpl_frameset_delete(darkcalib_frameset);
966 cpl_frameset_delete(wave_frameset);
967 cpl_frameset_delete(dark_frameset);
968 cpl_frameset_delete(gain_frameset);
969 cpl_frameset_delete(badpix_frameset);
976 recipe_frameset = cpl_frameset_duplicate (preproc_frameset);
977 nb_vis = cpl_frameset_get_size (recipe_frameset);
978 nb_frame = cpl_frameset_get_size(recipe_frameset);
981 frame = cpl_frameset_get_position(p2vm_frameset, 0);
982 filename = cpl_frame_get_filename(frame);
983 cpl_msg_info (NULL,
"This file %s is a p2vm file already "
984 "computed", filename);
986 p2vm_map = gravi_data_load (filename);
994 oi_vis = gravi_data_new(0);
996 for (i = 0; i < nb_frame; i++){
997 frame = cpl_frameset_get_position(preproc_frameset, i);
998 filename = cpl_frame_get_filename(frame);
999 cpl_msg_info (NULL,
"Calibration of this file %s",
1001 preproc_data = gravi_data_load(filename);
1003 cpl_msg_info (NULL,
"reduce the p2vm of the file %s",
1004 cpl_frame_get_filename(frame));
1007 p2vm_reduce = gravi_p2vm_reduce (preproc_data, p2vm_map,
"gravi_single");
1008 gravi_data_delete(preproc_data);
1010 if (cpl_error_get_code()){
1012 gravi_data_delete(p2vm_reduce);
1013 gravi_data_delete(preproc_data);
1015 gravi_data_delete(p2vm_map);
1016 cpl_frameset_delete(p2vm_frameset);
1017 cpl_frameset_delete(recipe_frameset);
1020 return (
int) cpl_error_set_message(cpl_func,
1021 CPL_ERROR_ILLEGAL_OUTPUT,
"error while reducing the p2vm");
1023 char * p2vm_name = cpl_sprintf(
"single_reduced_%s",
1024 cpl_frame_get_filename(frame));
1026 gravi_data_save_data(p2vm_reduce, p2vm_name, CPL_IO_CREATE);
1027 cpl_free(p2vm_name);
1030 cpl_msg_info (NULL,
"reduce the visibilities");
1031 gravi_vis_reduce (oi_vis, p2vm_reduce, i, parlist,
"gravi_single");
1033 gravi_data_delete(p2vm_reduce);
1036 gravi_data_delete(p2vm_map);
1045 frame = cpl_frameset_get_position (recipe_frameset, 0);
1046 frame_tag = cpl_frame_get_tag (frame);
1047 primary_hdr = gravi_data_get_propertylist(oi_vis,
1048 GRAVI_PRIMARY_HDR_NAME_EXT);
1049 applist = gravi_propertylist_get_qc (primary_hdr);
1051 cpl_propertylist_append_int(applist, GRAVI_NIGHT_OBS,
1052 cpl_propertylist_get_int (primary_hdr, GRAVI_NIGHT_OBS));
1053 cpl_propertylist_append_string(applist,
"DATE-OBS",
1054 cpl_propertylist_get_string (primary_hdr,
"DATE-OBS"));
1056 if ((strcmp(frame_tag, GRAVI_SINGLE_CALIB) == 0)) {
1057 filename = cpl_frame_get_filename(
1058 cpl_frameset_get_position (preproc_frameset, 0));
1059 vis_name =
"vis_single_calib.fits";
1060 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, VIS_CALIB);
1062 else if ((strcmp(frame_tag, GRAVI_SINGLE_SCIENCE) == 0)) {
1063 filename = cpl_frame_get_filename(
1064 cpl_frameset_get_position (preproc_frameset, 0));
1065 vis_name =
"vis_single_science.fits";
1066 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, VIS_SCIENCE);
1069 vis_name =
"vis_single_science.fits";
1070 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, VIS_SCIENCE);
1073 if (gravi_data_save(oi_vis, frameset, vis_name, parlist,
1074 recipe_frameset, frame,
"gravi_single", applist)
1077 gravi_data_delete(oi_vis);
1078 cpl_frameset_delete(p2vm_frameset);
1079 cpl_frameset_delete(recipe_frameset);
1080 cpl_propertylist_delete(applist);
1082 return (
int) cpl_error_set_message(cpl_func,
1083 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the oi_vis"
1084 " on the output file");
1087 cpl_propertylist_delete(applist);
1115 gravi_data_delete(oi_vis);
1120 cpl_frameset_delete(p2vm_frameset);
1121 cpl_frameset_delete(recipe_frameset);
1122 cpl_frameset_delete(preproc_frameset);
1125 return (
int)cpl_error_get_code();