41 #include "gravi_data.h" 42 #include "gravi_pfits.h" 43 #include "gravi_dfs.h" 45 #include "gravi_utils.h" 47 #include "gravi_metrology.h" 48 #include "gravi_calib.h" 49 #include "gravi_preproc.h" 50 #include "gravi_wave.h" 51 #include "gravi_p2vm.h" 53 #include "gravi_p2vmred.h" 60 static int gravity_p2vm_create(cpl_plugin *);
61 static int gravity_p2vm_exec(cpl_plugin *);
62 static int gravity_p2vm_destroy(cpl_plugin *);
63 static int gravity_p2vm(cpl_frameset *,
const cpl_parameterlist *);
69 static char gravity_p2vm_short[] =
"Calibrate the instrument bad pixels, wavelength table, interferometric contrast and phase.";
70 static char gravity_p2vm_description[] =
71 "This recipe reduces the internal calibrations. As a special sequence of shutter opening is required, it is advised to always build the SOF with a complete sequence of files obtained within a single execution of the p2vm calibration template. However it is still possible to input a SOF with DARK_RAW only, or DARK_RAW and FLAT_RAW only. It is also possible to input a SOF with some already processed calibration (e.g WAVE).\n" 72 GRAVI_RECIPE_INPUT
"\n" 73 GRAVI_DARK_RAW
" : raw dark, all shutters closed (DPR.TYPE=DARK)\n" 74 GRAVI_FLAT_RAW
" x4 : raw flats, one sutter open (DPR.TYPE=FLAT)\n" 75 GRAVI_P2VM_RAW
" x6 : raw p2vms, two sutters open (DPR.TYPE=P2VM)\n" 76 GRAVI_WAVE_RAW
" : raw wavelength calibration for FT (DPR.TYPE=WAVE)\n" 77 GRAVI_WAVESC_RAW
" : raw wavelength calibration for SC (DPR.TYPE=WAVESC)\n" 78 GRAVI_RECIPE_OUTPUT
"\n" 79 GRAVI_DARK_MAP
" : dark calibration\n" 80 GRAVI_FLAT_MAP
" : flat calibration\n" 81 GRAVI_BAD_MAP
" : badpixel calibration\n" 82 GRAVI_WAVE_MAP
" : wave calibration\n" 83 GRAVI_P2VM_MAP
" : p2vm calibration\n" 101 int cpl_plugin_get_info(cpl_pluginlist * list)
103 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
104 cpl_plugin * plugin = &recipe->interface;
106 if (cpl_plugin_init(plugin,
108 GRAVI_BINARY_VERSION,
109 CPL_PLUGIN_TYPE_RECIPE,
112 gravity_p2vm_description,
113 "Nabih Azouaoui, Vincent Lapeyrere, JB. Le Bouquin",
118 gravity_p2vm_destroy)) {
119 cpl_msg_error(cpl_func,
"Plugin initialization failed");
120 (void)cpl_error_set_where(cpl_func);
124 if (cpl_pluginlist_append(list, plugin)) {
125 cpl_msg_error(cpl_func,
"Error adding plugin to list");
126 (void)cpl_error_set_where(cpl_func);
142 static int gravity_p2vm_create(cpl_plugin * plugin)
148 if (cpl_error_get_code() != CPL_ERROR_NONE) {
149 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
150 cpl_func, __LINE__, cpl_error_get_where());
151 return (
int)cpl_error_get_code();
154 if (plugin == NULL) {
155 cpl_msg_error(cpl_func,
"Null plugin");
156 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
160 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
161 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
162 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
166 recipe = (cpl_recipe *)plugin;
169 recipe->parameters = cpl_parameterlist_new();
170 if (recipe->parameters == NULL) {
171 cpl_msg_error(cpl_func,
"Parameter list allocation failed");
172 cpl_ensure_code(0, (
int)CPL_ERROR_ILLEGAL_OUTPUT);
178 gravi_parameter_add_static_name (recipe->parameters);
181 gravi_parameter_add_debug_file (recipe->parameters);
182 gravi_parameter_add_preproc_file (recipe->parameters);
185 gravi_parameter_add_badpix (recipe->parameters);
188 p = cpl_parameter_new_value (
"gravity.calib.force-badpix-to-zero", CPL_TYPE_BOOL,
189 "Force the badpixel to zero in profile",
190 "gravity.calib", TRUE);
191 cpl_parameter_set_alias (p, CPL_PARAMETER_MODE_CLI,
"force-badpix-to-zero");
192 cpl_parameter_disable (p, CPL_PARAMETER_MODE_ENV);
193 cpl_parameterlist_append (recipe->parameters, p);
196 p = cpl_parameter_new_value (
"gravity.calib.profile-width", CPL_TYPE_INT,
197 "Width of profile in pixel",
199 cpl_parameter_set_alias (p, CPL_PARAMETER_MODE_CLI,
"profile-width");
200 cpl_parameter_disable (p, CPL_PARAMETER_MODE_ENV);
201 cpl_parameterlist_append (recipe->parameters, p);
204 p = cpl_parameter_new_enum (
"gravity.calib.phase-calibration", CPL_TYPE_STRING,
205 "The relative phase of the P2VM are defined by \n " 206 "NONE defines phiA(lbd) at zero for all baselines;\n " 207 "CLOSURE defines phiA(lbd) at zero for baselines (01,02,03);\n " 208 "DISP defines phiA(lbd) to have zero mean and minimum GD for baselines (01,02,03);\n " 209 "FULL defines phiA(lbd) to have zero-GD for baselines (01,02,03)",
210 "gravi.p2vm",
"CLOSURE", 4,
"NONE",
"CLOSURE",
"DISP",
"FULL");
211 cpl_parameter_set_alias (p, CPL_PARAMETER_MODE_CLI,
"phase-calibration");
212 cpl_parameter_disable (p, CPL_PARAMETER_MODE_ENV);
213 cpl_parameterlist_append (recipe->parameters, p);
225 static int gravity_p2vm_exec(cpl_plugin * plugin)
230 cpl_errorstate initial_errorstate = cpl_errorstate_get();
233 if (cpl_error_get_code() != CPL_ERROR_NONE) {
234 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
235 cpl_func, __LINE__, cpl_error_get_where());
236 return (
int)cpl_error_get_code();
239 if (plugin == NULL) {
240 cpl_msg_error(cpl_func,
"Null plugin");
241 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
245 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
246 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
247 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
251 recipe = (cpl_recipe *)plugin;
254 if (recipe->parameters == NULL) {
255 cpl_msg_error(cpl_func,
"Recipe invoked with NULL parameter list");
256 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
258 if (recipe->frames == NULL) {
259 cpl_msg_error(cpl_func,
"Recipe invoked with NULL frame set");
260 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
264 recipe_status = gravity_p2vm(recipe->frames, recipe->parameters);
267 if (cpl_dfs_update_product_header(recipe->frames)) {
268 if (!recipe_status) recipe_status = (int)cpl_error_get_code();
271 if (!cpl_errorstate_is_equal(initial_errorstate)) {
274 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
277 return recipe_status;
287 static int gravity_p2vm_destroy(cpl_plugin * plugin)
291 if (plugin == NULL) {
292 cpl_msg_error(cpl_func,
"Null plugin");
293 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
297 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
298 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
299 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
303 recipe = (cpl_recipe *)plugin;
305 cpl_parameterlist_delete(recipe->parameters);
319 static int gravity_p2vm(cpl_frameset * frameset,
320 const cpl_parameterlist * parlist)
322 cpl_frameset * p2vm_frameset=NULL, * wavecalib_frameset=NULL, * darkcalib_frameset=NULL,
323 * flatcalib_frameset=NULL, * dark_frameset=NULL, * wave_frameset=NULL, * wavesc_frameset=NULL,
324 * badcalib_frameset=NULL, * flat_frameset=NULL, * used_frameset=NULL, * current_frameset=NULL;
326 cpl_frame * frame=NULL, * frame_p2vm=NULL;
328 gravi_data * p2vm_map=NULL, * data=NULL, * dark_map=NULL, * wave_map=NULL,
329 * profile_map=NULL, * badpix_map=NULL, * wave_data=NULL;
330 gravi_data * spectrum_data=NULL;
331 gravi_data * preproc_data=NULL;
332 gravi_data ** raw_data=NULL;
333 gravi_data * p2vmred_data = NULL;
335 int nb_frame, i, nb_frame_gain = 0;
337 cpl_propertylist * met_plist=NULL;
338 int ** valid_trans = cpl_malloc (2 *
sizeof (
int*));
339 int ** valid_CP = cpl_malloc (2 *
sizeof (
int*));
342 for (i = 0 ; i < 2; i++){
343 valid_trans[i] = cpl_calloc (4,
sizeof (
int));
344 valid_CP[i] = cpl_calloc (6,
sizeof (
int));
348 gravity_print_banner ();
349 cpl_msg_set_time_on();
350 cpl_msg_set_component_on();
351 gravi_msg_function_start(1);
355 cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE, cpl_error_get_code()) ;
358 used_frameset = cpl_frameset_new ();
361 dark_frameset = gravi_frameset_extract_dark_data (frameset);
362 darkcalib_frameset = gravi_frameset_extract_dark_map (frameset);
365 flat_frameset = gravi_frameset_extract_flat_data (frameset);
366 flatcalib_frameset = gravi_frameset_extract_flat_map (frameset);
369 badcalib_frameset = gravi_frameset_extract_bad_map (frameset);
372 wave_frameset = gravi_frameset_extract_wave_data (frameset);
373 wavesc_frameset = gravi_frameset_extract_wavesc_data (frameset);
374 wavecalib_frameset = gravi_frameset_extract_wave_map (frameset);
377 p2vm_frameset = gravi_frameset_extract_p2vm_data (frameset);
385 if (!cpl_frameset_is_empty (dark_frameset)) {
386 cpl_msg_info (cpl_func,
" ***** Compute DARK map ***** ");
389 frame = cpl_frameset_get_position (dark_frameset, 0);
390 data = gravi_data_load_rawframe (frame, used_frameset);
391 gravi_data_detector_cleanup (data, parlist);
394 dark_map = gravi_compute_dark (data);
395 FREE (gravi_data_delete, data);
397 CPLCHECK_CLEAN (
"Cannot compute the DARK map");
400 gravi_data_save_new (dark_map, frameset, NULL, parlist,
401 NULL, frame,
"gravity_p2vm",
402 NULL, GRAVI_DARK_MAP);
404 CPLCHECK_CLEAN (
"Could not save the DARK map");
406 else if (!cpl_frameset_is_empty (darkcalib_frameset)) {
407 cpl_msg_info (cpl_func,
" ***** Get DARK map ***** ");
410 frame = cpl_frameset_get_position (darkcalib_frameset, 0);
411 dark_map = gravi_data_load_frame (frame, used_frameset);
413 CPLCHECK_CLEAN (
"Could not load the DARK map");
416 cpl_frameset_insert (dark_frameset, cpl_frame_duplicate (frame));
424 if (!cpl_frameset_is_empty (badcalib_frameset)) {
425 cpl_msg_info (cpl_func,
" ***** Get BAD pixel map ***** ");
428 frame = cpl_frameset_get_position (badcalib_frameset, 0);
429 badpix_map = gravi_data_load_frame (frame, used_frameset);
431 else if (!cpl_frameset_is_empty (dark_frameset) &&
432 !cpl_frameset_is_empty (flat_frameset)) {
433 cpl_msg_info (cpl_func,
" ***** Compute BAD pixel map from DARK and FLAT_RAW ***** ");
436 nb_frame_gain = cpl_frameset_get_size (flat_frameset);
437 raw_data = cpl_calloc (nb_frame_gain,
sizeof(gravi_data *));
440 for (
int i = 0; i < nb_frame_gain; i++) {
441 frame = cpl_frameset_get_position (flat_frameset, i);
442 raw_data[i] = gravi_data_load_rawframe (frame, NULL);
443 gravi_data_detector_cleanup (raw_data[i], parlist);
447 badpix_map = gravi_compute_badpix (dark_map, raw_data,
448 nb_frame_gain, parlist);
450 CPLCHECK_CLEAN(
"Cannot compute the BAD pixel from DARK and FLAT");
453 frame = cpl_frameset_get_position (dark_frameset, 0);
454 gravi_data_save_new (badpix_map, frameset, NULL, parlist,
455 NULL, frame,
"gravity_p2vm",
456 NULL, GRAVI_BAD_MAP);
458 CPLCHECK_CLEAN (
"Could not save the BAD pixel map");
460 FREELOOP (gravi_data_delete, raw_data, nb_frame_gain);
467 if (!cpl_frameset_is_empty(flatcalib_frameset)) {
468 cpl_msg_info (cpl_func,
" ***** Get FLAT map ***** ");
471 frame = cpl_frameset_get_position (flatcalib_frameset, 0);
472 profile_map = gravi_data_load_frame (frame, used_frameset);
474 else if (!cpl_frameset_is_empty (flat_frameset)) {
475 cpl_msg_info (cpl_func,
" ***** Compute FLAT map ***** ");
479 if (!badpix_map || !dark_map) {
480 ERROR_CLEAN (CPL_ERROR_ILLEGAL_INPUT,
"Missing DARK or BAD in frameset");
484 nb_frame_gain = cpl_frameset_get_size (flat_frameset);
485 raw_data = cpl_malloc (nb_frame_gain *
sizeof(gravi_data *));
488 for (i = 0; i < nb_frame_gain; i++) {
489 frame = cpl_frameset_get_position (flat_frameset, i);
490 raw_data[i] = gravi_data_load_rawframe (frame, used_frameset);
491 gravi_data_detector_cleanup (raw_data[i], parlist);
496 profile_map = gravi_compute_profile (raw_data, dark_map, badpix_map, nb_frame_gain, parlist);
497 CPLCHECK_CLEAN (
"Cannot compute the FLAT profile");
500 cpl_propertylist * gain_header;
501 gain_header = gravi_compute_gain (raw_data, nb_frame_gain, dark_map);
502 CPLCHECK_CLEAN (
"Cannot compute the GAIN");
505 cpl_propertylist * profile_header = gravi_data_get_header (profile_map);
506 cpl_propertylist_append (profile_header, gain_header);
507 FREE (cpl_propertylist_delete, gain_header);
510 frame = cpl_frameset_get_position (flat_frameset, 0);
512 gravi_data_save_new (profile_map, frameset, NULL, parlist,
513 used_frameset, frame,
"gravity_p2vm",
514 NULL, GRAVI_FLAT_MAP);
516 CPLCHECK_CLEAN (
"Could not save the FLAT profile_map");
519 FREELOOP (gravi_data_delete, raw_data, nb_frame_gain);
526 if (!cpl_frameset_is_empty (wavecalib_frameset)) {
527 cpl_msg_info (cpl_func,
" ***** Get wave map ***** ");
530 frame = cpl_frameset_get_position (wavecalib_frameset, 0);
531 wave_map = gravi_data_load_frame (frame, used_frameset);
533 else if (!cpl_frameset_is_empty (wave_frameset)) {
534 cpl_msg_info (cpl_func,
" ***** Process the WAVE_RAW ***** ");
537 if ( !badpix_map || !profile_map || !dark_map) {
538 ERROR_CLEAN (CPL_ERROR_ILLEGAL_INPUT,
"Missing DARK, FLAT, or BAD in frameset");
542 wave_map = gravi_data_new (0);
545 frame = cpl_frameset_get_position (wave_frameset, 0);
546 data = gravi_data_load_rawframe (frame, used_frameset);
547 gravi_data_detector_cleanup (data, parlist);
550 cpl_msg_info (cpl_func,
"Compute the P2VM_MET from WAVE_RAW");
551 cpl_table * met_table = gravi_data_get_table (data, GRAVI_METROLOGY_EXT);
552 cpl_table * p2vm_met = gravi_metrology_compute_p2vm (met_table);
555 gravi_data_add_table (wave_map, NULL, GRAVI_P2VM_MET_EXT, p2vm_met);
557 CPLCHECK_CLEAN (
"Cannot compute P2VM_MET");
560 cpl_msg_info (cpl_func,
"Extract SPECTRUM for WAVE_RAW");
561 spectrum_data = gravi_extract_spectrum (data, profile_map, dark_map,
562 badpix_map, NULL, parlist);
564 cpl_msg_info (cpl_func,
"Compute OPDs for WAVE_RAW");
565 gravi_wave_compute_opds (spectrum_data, gravi_data_get_table (data, GRAVI_METROLOGY_EXT),
566 gravi_param_get_bool (parlist,
"gravity.dfs.debug-file"));
567 FREE (gravi_data_delete, data);
569 CPLCHECK_CLEAN (
"Cannot process the WAVE_RAW");
572 gravi_compute_wave (wave_map, spectrum_data, GRAVI_FT);
574 CPLCHECK_CLEAN (
"Cannot compute wave for FT");
577 if (!cpl_frameset_is_empty (wavesc_frameset)) {
579 cpl_msg_info (cpl_func,
"Delete WAVE_RAW data");
580 FREE (gravi_data_delete, spectrum_data);
582 cpl_msg_info (cpl_func,
" ***** Process the WAVESC_RAW ***** ");
585 frame = cpl_frameset_get_position(wavesc_frameset, 0);
586 data = gravi_data_load_rawframe (frame, used_frameset);
587 gravi_data_detector_cleanup (data, parlist);
589 cpl_msg_info (cpl_func,
"Extract SPECTRUM for WAVESC_RAW");
590 spectrum_data = gravi_extract_spectrum (data, profile_map, dark_map,
591 badpix_map, NULL, parlist);
593 cpl_msg_info (cpl_func,
"Compute OPDs for WAVESC_RAW");
594 gravi_wave_compute_opds (spectrum_data, gravi_data_get_table (data, GRAVI_METROLOGY_EXT),
595 gravi_param_get_bool (parlist,
"gravity.dfs.debug-file"));
596 FREE (gravi_data_delete, data);
598 CPLCHECK_CLEAN (
"Cannot process the WAVESC_RAW");
601 cpl_msg_warning (cpl_func,
"No WAVESC_RAW in the SOF:" 602 " SC wavelength will be inaccurate");
606 gravi_compute_wave (wave_map, spectrum_data, GRAVI_SC);
608 CPLCHECK_CLEAN (
"Cannot compute wave for SC");
611 FREE (gravi_data_delete, spectrum_data);
614 gravi_wave_qc (wave_map, profile_map);
617 gravi_data_save_new (wave_map, frameset, NULL, parlist,
618 used_frameset, frame,
"gravity_p2vm",
619 NULL, GRAVI_WAVE_MAP);
621 CPLCHECK_CLEAN (
"Could not save the WAVE map");
629 if ( cpl_frameset_is_empty (p2vm_frameset) ) {
630 cpl_msg_info (cpl_func,
"All RAW data reduced... stop recipe");
635 if ( !badpix_map || !profile_map || !wave_map || !dark_map) {
636 ERROR_CLEAN (CPL_ERROR_ILLEGAL_INPUT,
"Missing DARK, FLAT, BAD, or WAVE in frameset");
640 if ( !cpl_frameset_is_empty (flat_frameset) )
641 cpl_frameset_join (p2vm_frameset, flat_frameset);
643 if ( !cpl_frameset_is_empty (wave_frameset) )
644 cpl_frameset_join (p2vm_frameset, wave_frameset);
647 nb_frame = cpl_frameset_get_size (p2vm_frameset);
650 if (nb_frame != 11) {
651 ERROR_CLEAN (CPL_ERROR_ILLEGAL_INPUT,
"Missing P2VM in frameset");
659 cpl_msg_info (cpl_func,
" ***** Create the P2VM ***** ");
660 p2vm_map = gravi_create_p2vm (wave_map);
661 CPLCHECK_CLEAN (
"Cannot create the P2VM data");
664 for (i = 0; i < nb_frame; i++) {
666 cpl_msg_info (cpl_func,
" ***** file %d over %d ***** ", i+1, nb_frame );
667 current_frameset = cpl_frameset_duplicate (used_frameset);
670 frame = cpl_frameset_get_position (p2vm_frameset, i);
671 cpl_frameset_insert (used_frameset, cpl_frame_duplicate (frame));
672 data = gravi_data_load_rawframe (frame, current_frameset);
673 gravi_data_detector_cleanup (data, parlist);
674 CPLCHECK_CLEAN (
"Cannot load data");
677 cpl_msg_info (cpl_func,
"Shutters: %d-%d-%d-%d",
678 gravi_data_get_shutter (data, 0), gravi_data_get_shutter (data, 1),
679 gravi_data_get_shutter (data, 2), gravi_data_get_shutter (data, 3));
684 if ( frame_p2vm==NULL && gravi_data_check_shutter (data, 1,1,0,0) )
686 cpl_msg_info (cpl_func,
"Use this frame for the P2VM product");
693 if ( gravi_data_check_shutter (data, 1,1,1,1) ) {
696 cpl_msg_info (cpl_func,
"Nothing to be done with the file... yet.");
697 wave_data = data; data = NULL;
699 FREE (cpl_frameset_delete, current_frameset);
705 preproc_data = gravi_extract_spectrum (data, profile_map, dark_map,
706 badpix_map, NULL, parlist);
707 FREE (gravi_data_delete, data);
708 CPLCHECK_CLEAN (
"Cannot extract spectrum");
711 gravi_align_spectrum (preproc_data, wave_map, p2vm_map);
712 CPLCHECK_CLEAN (
"Cannot re-interpolate spectrum");
715 gravi_compute_p2vm (p2vm_map, preproc_data, valid_trans, valid_CP);
716 CPLCHECK_CLEAN(
"Cannot compute the P2VM");
719 if (gravi_param_get_bool (parlist,
"gravity.dfs.preproc-file")) {
721 gravi_data_save_new (preproc_data, frameset, NULL, parlist,
722 current_frameset, frame,
"gravity_p2vm",
723 NULL, GRAVI_PREPROC);
728 FREE (gravi_data_delete,preproc_data);
729 cpl_msg_info(cpl_func,
"Execution time to delete preproc_data : %f s",
730 (clock() - start) / (
double)CLOCKS_PER_SEC);
733 FREE (cpl_frameset_delete, current_frameset);
741 gravi_p2vm_normalisation (p2vm_map, valid_trans, valid_CP);
742 CPLCHECK_CLEAN(
"Cannot normalise the p2vm_map");
750 cpl_msg_info (cpl_func,
" ***** Analyse the WAVE file to calibrate the internal closure and transmission ***** ");
753 preproc_data = gravi_extract_spectrum (wave_data, profile_map, dark_map,
754 badpix_map, NULL, parlist);
755 CPLCHECK_CLEAN (
"Cannot extract spectrum");
758 gravi_align_spectrum (preproc_data, wave_map, p2vm_map);
759 CPLCHECK_CLEAN (
"Cannot re-interpolate spectrum");
762 gravi_data_move_ext (preproc_data, wave_data, GRAVI_ARRAY_GEOMETRY_EXT);
763 gravi_data_move_ext (preproc_data, wave_data, GRAVI_OPTICAL_TRAIN_EXT);
764 FREE (gravi_data_delete, wave_data);
765 CPLCHECK_CLEAN (
"Cannot move ext");
768 p2vmred_data = gravi_compute_p2vmred (preproc_data, p2vm_map,
"gravi_single", parlist);
769 FREE (gravi_data_delete, preproc_data);
770 CPLCHECK_CLEAN (
"Cannot apply p2vm");
773 if (!strcmp (gravi_param_get_string (parlist,
"gravity.calib.phase-calibration"),
"CLOSURE")) {
774 gravi_p2vm_phase_correction (p2vm_map, p2vmred_data, 0);
776 else if (!strcmp (gravi_param_get_string (parlist,
"gravity.calib.phase-calibration"),
"DISP")) {
777 gravi_p2vm_phase_correction (p2vm_map, p2vmred_data, 1);
779 else if (!strcmp (gravi_param_get_string (parlist,
"gravity.calib.phase-calibration"),
"FULL")) {
780 gravi_p2vm_phase_correction (p2vm_map, p2vmred_data, 2);
783 cpl_msg_info (cpl_func,
"P2VM phases are kept to zero (option phase-calibration=NONE)");
785 CPLCHECK_CLEAN (
"Cannot recalibrate the P2VM phases");
788 gravi_p2vm_transmission (p2vm_map, p2vmred_data);
789 FREE (gravi_data_delete, p2vmred_data);
791 CPLCHECK_CLEAN (
"Cannot compute the transmission");
799 gravi_data_save_new (p2vm_map, frameset, NULL, parlist,
800 used_frameset, frame_p2vm,
"gravity_p2vm",
801 NULL, GRAVI_P2VM_MAP);
803 CPLCHECK_CLEAN(
"Could not save the P2VM on the output file");
807 cpl_msg_info (cpl_func,
"Cleanup memory");
809 FREE (cpl_frameset_delete, dark_frameset);
810 FREE (cpl_frameset_delete, darkcalib_frameset);
811 FREE (cpl_frameset_delete, badcalib_frameset);
812 FREE (gravi_data_delete, spectrum_data);
813 FREE (gravi_data_delete, p2vmred_data);
814 FREE (gravi_data_delete, wave_data);
815 FREE (gravi_data_delete, dark_map);
816 FREELOOP (gravi_data_delete, raw_data, nb_frame_gain);
817 FREE (gravi_data_delete, badpix_map);
818 FREE (cpl_propertylist_delete, met_plist);
819 FREE (cpl_frameset_delete, wavecalib_frameset);
820 FREE (cpl_frameset_delete, flatcalib_frameset);
821 FREE (cpl_frameset_delete, flat_frameset);
822 FREE (cpl_frameset_delete, wave_frameset);
823 FREE (cpl_frameset_delete, wavesc_frameset);
824 FREE (cpl_frameset_delete, used_frameset);
825 FREE (gravi_data_delete, data);
826 FREE (gravi_data_delete, preproc_data);
827 FREE (gravi_data_delete, dark_map);
828 FREE (gravi_data_delete, wave_map);
829 FREE (gravi_data_delete, profile_map);
830 FREELOOP (cpl_free, valid_CP, 2);
831 FREELOOP (cpl_free, valid_trans, 2);
832 FREE (gravi_data_delete, p2vm_map);
833 FREE (cpl_frameset_delete, p2vm_frameset);
834 FREE (cpl_frameset_delete, current_frameset);
837 CPLCHECK_INT (
"Could not cleanup memory");
839 gravi_msg_function_exit(1);
840 return (
int)cpl_error_get_code();