GRAVI Pipeline Reference Manual  0.9.6
gravity_disp.c
1 /* $Id: gravity_disp.c,v 1.29 2015/01/10 09:16:12 nazouaoui Exp $
2  *
3  * This file is part of the GRAVI Pipeline
4  * Copyright (C) 2002,2003 European Southern Observatory
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  */
20 
21 /*
22  * $Author: nazouaoui $
23  * $Date: 2015/01/10 09:16:12 $
24  * $Revision: 1.29 $
25  * $Name: $
26  */
27 
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31 
32 /*-----------------------------------------------------------------------------
33  Includes
34  -----------------------------------------------------------------------------*/
35 
36 #include <cpl.h>
37 #include <stdio.h>
38 #include <string.h>
39 #include <time.h>
40 
41 #include "gravi_data.h"
42 #include "gravi_pfits.h"
43 #include "gravi_dfs.h"
44 
45 #include "gravi_utils.h"
46 
47 #include "gravi_calib.h"
48 #include "gravi_preproc.h"
49 #include "gravi_p2vmred.h"
50 #include "gravi_signal.h"
51 #include "gravi_vis.h"
52 #include "gravi_metrology.h"
53 #include "gravi_disp.h"
54 
55 
56 
57 
58 
59 /*-----------------------------------------------------------------------------
60  Private function prototypes
61  -----------------------------------------------------------------------------*/
62 
63 static int gravity_disp_create(cpl_plugin *);
64 static int gravity_disp_exec(cpl_plugin *);
65 static int gravity_disp_destroy(cpl_plugin *);
66 static int gravity_disp(cpl_frameset *, const cpl_parameterlist *);
67 
68 /*-----------------------------------------------------------------------------
69  Static variables
70  -----------------------------------------------------------------------------*/
71 
72 static char gravity_disp_short[] = "Calibrate the linearity and the dispersion of the differential delay lines.";
73 static char gravity_disp_description[] =
74  "This recipe is associated to the template GRAVI_all_disp. It measure the phases obtained on the internal source at the position of the Argon lines and various stretch of the FDDL. It deduces the linearity model and the dispersion model of the differential delay lines. These models are stored as polynomials versus wavelength.\n"
75  GRAVI_RECIPE_INPUT"\n"
76  GRAVI_FLAT_MAP" : flat calibration (PRO.CATG="GRAVI_FLAT_MAP")\n"
77  GRAVI_BAD_MAP" : badpixel calibration (PRO.CATG="GRAVI_BAD_MAP") \n"
78  GRAVI_WAVE_MAP" : wave calibration (PRO.CATG="GRAVI_WAVE_MAP")\n"
79  GRAVI_P2VM_MAP" : p2vm calibration (PRO.CATG="GRAVI_P2VM_MAP")\n"
80  GRAVI_DARK_MAP" : dark calibration\n"
81  GRAVI_DISP_RAW" >10 : raw dispersion\n"
82  GRAVI_RECIPE_OUTPUT"\n"
83  GRAVI_DISP_MODEL" : dispersion model of FDDL\n"
84  "";
85 
86 /*-----------------------------------------------------------------------------
87  Function code
88  -----------------------------------------------------------------------------*/
89 
90 /*----------------------------------------------------------------------------*/
100 /*----------------------------------------------------------------------------*/
101 int cpl_plugin_get_info(cpl_pluginlist * list)
102 {
103  cpl_recipe * recipe = cpl_calloc(1, sizeof *recipe );
104  cpl_plugin * plugin = &recipe->interface;
105 
106  if (cpl_plugin_init(plugin,
107  CPL_PLUGIN_API,
108  GRAVI_BINARY_VERSION,
109  CPL_PLUGIN_TYPE_RECIPE,
110  "gravity_disp",
111  gravity_disp_short,
112  gravity_disp_description,
113  "Nabih Azouaoui, Vincent Lapeyrere, JB. Le Bouquin",
114  PACKAGE_BUGREPORT,
115  gravi_get_license(),
116  gravity_disp_create,
117  gravity_disp_exec,
118  gravity_disp_destroy)) {
119  cpl_msg_error(cpl_func, "Plugin initialization failed");
120  (void)cpl_error_set_where(cpl_func);
121  return 1;
122  }
123 
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);
127  return 1;
128  }
129 
130  return 0;
131 }
132 
133 /*----------------------------------------------------------------------------*/
141 /*----------------------------------------------------------------------------*/
142 static int gravity_disp_create(cpl_plugin * plugin)
143 {
144  cpl_recipe * recipe;
145  // cpl_parameter * p;
146 
147  /* Do not create the recipe if an error code is already set */
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();
152  }
153 
154  if (plugin == NULL) {
155  cpl_msg_error(cpl_func, "Null plugin");
156  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
157  }
158 
159  /* Verify plugin type */
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);
163  }
164 
165  /* Get the recipe */
166  recipe = (cpl_recipe *)plugin;
167 
168  /* Create the parameters list in the cpl_recipe object */
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);
173  }
174 
175  /* Fill the parameters list */
176  int isCalib = 1;
177 
178  /* Use static names (output_procatg.fits) */
179  gravi_parameter_add_static_name (recipe->parameters);
180 
181  /* Intermediate files */
182  gravi_parameter_add_preproc_file (recipe->parameters);
183  gravi_parameter_add_p2vmred_file (recipe->parameters);
184 
185  /* Snr */
186  gravi_parameter_add_compute_snr (recipe->parameters, isCalib);
187 
188  /* Rejection */
189  gravi_parameter_add_rejection (recipe->parameters, isCalib);
190 
191  /* Parameters for gravi_compute_vis */
192  gravi_parameter_add_compute_vis (recipe->parameters, isCalib);
193 
194  return 0;
195 }
196 
197 /*----------------------------------------------------------------------------*/
203 /*----------------------------------------------------------------------------*/
204 static int gravity_disp_exec(cpl_plugin * plugin)
205 {
206 
207  cpl_recipe * recipe;
208  int recipe_status;
209  cpl_errorstate initial_errorstate = cpl_errorstate_get();
210 
211  /* Return immediately if an error code is already set */
212  if (cpl_error_get_code() != CPL_ERROR_NONE) {
213  cpl_msg_error(cpl_func, "%s():%d: An error is already set: %s",
214  cpl_func, __LINE__, cpl_error_get_where());
215  return (int)cpl_error_get_code();
216  }
217 
218  if (plugin == NULL) {
219  cpl_msg_error(cpl_func, "Null plugin");
220  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
221  }
222 
223  /* Verify plugin type */
224  if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
225  cpl_msg_error(cpl_func, "Plugin is not a recipe");
226  cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
227  }
228 
229  /* Get the recipe */
230  recipe = (cpl_recipe *)plugin;
231 
232  /* Verify parameter and frame lists */
233  if (recipe->parameters == NULL) {
234  cpl_msg_error(cpl_func, "Recipe invoked with NULL parameter list");
235  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
236  }
237  if (recipe->frames == NULL) {
238  cpl_msg_error(cpl_func, "Recipe invoked with NULL frame set");
239  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
240  }
241 
242  /* Invoke the recipe */
243  recipe_status = gravity_disp(recipe->frames, recipe->parameters);
244 
245  /* Ensure DFS-compliance of the products */
246 
247  if (cpl_dfs_update_product_header(recipe->frames)) {
248  if (!recipe_status){
249  recipe_status = (int)cpl_error_get_code();
250  }
251  }
252 
253  if (!cpl_errorstate_is_equal(initial_errorstate)) {
254  /* Dump the error history since recipe execution start.
255  At this point the recipe cannot recover from the error */
256  cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
257  }
258 
259  return recipe_status;
260 }
261 
262 /*----------------------------------------------------------------------------*/
268 /*----------------------------------------------------------------------------*/
269 static int gravity_disp_destroy(cpl_plugin * plugin)
270 {
271  cpl_recipe * recipe;
272 
273  if (plugin == NULL) {
274  cpl_msg_error(cpl_func, "Null plugin");
275  cpl_ensure_code(0, (int)CPL_ERROR_NULL_INPUT);
276  }
277 
278  /* Verify plugin type */
279  if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
280  cpl_msg_error(cpl_func, "Plugin is not a recipe");
281  cpl_ensure_code(0, (int)CPL_ERROR_TYPE_MISMATCH);
282  }
283 
284  /* Get the recipe */
285  recipe = (cpl_recipe *)plugin;
286 
287  cpl_parameterlist_delete(recipe->parameters);
288 
289  return 0;
290 }
291 
292 
293 /*----------------------------------------------------------------------------*/
301 /*----------------------------------------------------------------------------*/
302 static int gravity_disp(cpl_frameset * frameset,
303  const cpl_parameterlist * parlist)
304 {
305  cpl_frameset * disp_frameset=NULL, * darkcalib_frameset=NULL,
306  * dark_frameset=NULL, * wavecalib_frameset=NULL,
307  * badcalib_frameset=NULL, * flatcalib_frameset=NULL, * dispvis_frameset=NULL,
308  * p2vmcalib_frameset=NULL, * wavelampcalib_frameset=NULL, *used_frameset=NULL,
309  * current_frameset=NULL;
310 
311  cpl_frame * frame=NULL;
312 
313  gravi_data * disp_map = NULL, * data = NULL, * dark_map = NULL, * wave_map = NULL,
314  * profile_map = NULL, * badpix_map = NULL, * p2vmred_data = NULL, * preproc_data = NULL,
315  * p2vm_map = NULL, * vis_data = NULL, * tmpvis_data=NULL, * argon_data=NULL;
316 
317  int nb_frame;
318 
319  /* Message */
320  gravity_print_banner ();
321  cpl_msg_set_time_on();
322  cpl_msg_set_component_on();
323  gravi_msg_function_start(1);
324 
325 
326  /* Identify the RAW and CALIB frames in the input frameset */
327  cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
328  cpl_error_get_code()) ;
329 
330  /* Check if a DISP_VIS is already existing */
331  dispvis_frameset = gravi_frameset_extract_dispvis_data (frameset);
332 
333  /* Insert calibration frame into the used frameset */
334  used_frameset = cpl_frameset_new();
335 
336  /* No DISP_VIS, reduce all data */
337  if (cpl_frameset_is_empty (dispvis_frameset)){
338 
339  /* Identify the ARGON, P2VM, DISP, DARK, WAVE, FLAT, BADPIX frames */
340  wavelampcalib_frameset = gravi_frameset_extract_wavelamp_map (frameset);
341  p2vmcalib_frameset = gravi_frameset_extract_p2vm_map (frameset);
342  wavecalib_frameset = gravi_frameset_extract_wave_map (frameset);
343  flatcalib_frameset = gravi_frameset_extract_flat_map (frameset);
344  badcalib_frameset = gravi_frameset_extract_bad_map (frameset);
345 
346  darkcalib_frameset = gravi_frameset_extract_dark_map (frameset);
347  dark_frameset = gravi_frameset_extract_dark_data (frameset);
348 
349  disp_frameset = gravi_frameset_extract_disp_data (frameset);
350 
351  /* Check inputs */
352  if ( cpl_frameset_is_empty(p2vmcalib_frameset) ||
353  cpl_frameset_is_empty(wavecalib_frameset) ||
354  cpl_frameset_is_empty(flatcalib_frameset) ||
355  cpl_frameset_is_empty(badcalib_frameset) ||
356  ( cpl_frameset_is_empty(dark_frameset) &&
357  cpl_frameset_is_empty(darkcalib_frameset) ) ||
358  cpl_frameset_is_empty(disp_frameset) ||
359  cpl_frameset_is_empty(wavelampcalib_frameset) ) {
360 
361  cpl_error_set_message (cpl_func, CPL_ERROR_ILLEGAL_INPUT,
362  "Missing P2VM, DARK, BAD, WAVE, WAVELAMP, FLAT or DISP frames") ;
363  goto cleanup;
364  }
365 
366  /*
367  * Identify the DARK in the input frameset
368  */
369 
370  if (!cpl_frameset_is_empty (dark_frameset)) {
371 
372  frame = cpl_frameset_get_position (dark_frameset, 0);
373  data = gravi_data_load_rawframe (frame, used_frameset);
374  gravi_data_detector_cleanup (data, parlist);
375 
376  /* Compute dark */
377  dark_map = gravi_compute_dark (data);
378  FREE (gravi_data_delete, data);
379 
380  CPLCHECK_CLEAN ("Could not compute the DARK map");
381 
382  /* Save the dark map */
383  gravi_data_save_new (dark_map, frameset, NULL, parlist,
384  NULL, frame, "gravi_single",
385  NULL, GRAVI_DARK_MAP);
386 
387  CPLCHECK_CLEAN ("Could not save the DARK map");
388  }
389  else if (!cpl_frameset_is_empty (darkcalib_frameset)) {
390 
391  frame = cpl_frameset_get_position (darkcalib_frameset, 0);
392  dark_map = gravi_data_load_frame (frame, used_frameset);
393 
394  CPLCHECK_CLEAN ("Could not load the DARK map");
395  }
396  else
397  cpl_msg_error (cpl_func, "There is no DARK in the frame set");
398 
399  /* Identify the BAD in the input frameset */
400  frame = cpl_frameset_get_position (badcalib_frameset, 0);
401  badpix_map = gravi_data_load_frame (frame, used_frameset);
402 
403  /* Identify the FLAT in the input frameset */
404  frame = cpl_frameset_get_position (flatcalib_frameset, 0);
405  profile_map = gravi_data_load_frame (frame, used_frameset);
406 
407  /* Identify the WAVE in the input frameset */
408  frame = cpl_frameset_get_position (wavecalib_frameset, 0);
409  wave_map = gravi_data_load_frame (frame, used_frameset);
410 
411  /* Identify the P2VM in the input frameset */
412  frame = cpl_frameset_get_position (p2vmcalib_frameset, 0);
413  p2vm_map = gravi_data_load_frame (frame, used_frameset);
414 
415  CPLCHECK_CLEAN ("Error while loading the calibration map");
416 
417 
418  /*
419  * Loop on input DISP files
420  */
421 
422  nb_frame = cpl_frameset_get_size (disp_frameset);
423  for (int ivis = 0; ivis < nb_frame; ivis++) {
424  current_frameset = cpl_frameset_duplicate (used_frameset);
425 
426  cpl_msg_info (cpl_func, "*** Processing file %d over %d *** ", ivis+1, nb_frame);
427 
428  frame = cpl_frameset_get_position (disp_frameset, ivis);
429  data = gravi_data_load_rawframe (frame, current_frameset);
430  gravi_data_detector_cleanup (data, parlist);
431 
432  /* Extract spectrum */
433  preproc_data = gravi_extract_spectrum (data, profile_map, dark_map, badpix_map, NULL);
434  CPLCHECK_CLEAN ("Cannot extract spectrum");
435 
436  /* Rescale to common wavelength */
437  gravi_align_spectrum (preproc_data, wave_map, p2vm_map);
438  CPLCHECK_CLEAN ("Cannot re-interpolate spectrum");
439 
440  /* Move extensions from raw_data */
441  gravi_data_move_ext (preproc_data, data, GRAVI_ARRAY_GEOMETRY_EXT);
442  gravi_data_move_ext (preproc_data, data, GRAVI_OPTICAL_TRAIN_EXT);
443  gravi_data_move_ext (preproc_data, data, GRAVI_OPDC_EXT);
444  gravi_data_move_ext (preproc_data, data, GRAVI_FDDL_EXT);
445  gravi_data_move_ext (preproc_data, data, GRAVI_METROLOGY_EXT);
446  CPLCHECK_CLEAN ("Cannot move ext");
447 
448  FREE (gravi_data_delete,data);
449 
450  /* Option save the proproc file */
451  if (gravi_param_get_bool (parlist,"gravity.dfs.preproc-file")) {
452 
453  gravi_data_save_new (preproc_data, frameset, NULL, parlist,
454  current_frameset, frame, "gravity_disp",
455  NULL, GRAVI_PREPROC);
456 
457  CPLCHECK_CLEAN ("Could not save the preproc data");
458  }
459 
460  /* Compute the flux and visibilities for each telescope and
461  * per acquisition with the P2VM applied to preproc_data */
462  p2vmred_data = gravi_compute_p2vmred (preproc_data, p2vm_map, "gravi_single", parlist);
463  CPLCHECK_CLEAN ("Cannot apply p2vm to the preproc data");
464 
465  /* Move extensions and delete preproc */
466  gravi_data_move_ext (p2vmred_data, preproc_data, GRAVI_METROLOGY_EXT);
467  gravi_data_move_ext (p2vmred_data, preproc_data, GRAVI_FDDL_EXT);
468  gravi_data_move_ext (p2vmred_data, preproc_data, GRAVI_OPDC_EXT);
469  FREE (gravi_data_delete, preproc_data);
470  CPLCHECK_CLEAN ("Cannot delete preproc");
471 
472  /* Reduce the OPDC table */
473  gravi_compute_opdc_state (p2vmred_data);
474  CPLCHECK_CLEAN ("Cannot reduce OPDC");
475 
476  /* Reduce the metrology */
477  gravi_metrology_reduce (p2vmred_data);
478  CPLCHECK_CLEAN ("Cannot reduce metrology");
479 
480  /* Compute the SNR_SMT and GDELAY_SMT columns */
481  gravi_compute_snr (p2vmred_data, parlist);
482  CPLCHECK_MSG ("Cannot compute SNR");
483 
484  /* Compute the additional signals for averaging */
485  gravi_compute_signals (p2vmred_data, disp_map, parlist);
486  CPLCHECK_MSG ("Cannot compute signals");
487 
488  /* Compute rejection flags for averaging */
489  gravi_compute_rejection (p2vmred_data, parlist);
490  CPLCHECK_MSG ("Cannot rejection flags signals");
491 
492 
493  /* Visibility and flux are averaged and the followings
494  * are saved in Visibility data in tables VIS, VIS2 and T3 */
495  tmpvis_data = gravi_compute_vis (p2vmred_data, parlist);
496  CPLCHECK_CLEAN ("Cannot average the visibilities");
497 
498  /* Merge with already existing */
499  if (ivis == 0) {
500  vis_data = tmpvis_data; tmpvis_data = NULL;
501  }
502  else {
503  cpl_msg_info (cpl_func,"Merge with previous OI_VIS");
504  gravi_data_append (vis_data, tmpvis_data, 1);
505  FREE (gravi_data_delete, tmpvis_data);
506  }
507  CPLCHECK_CLEAN ("Cannot merge the visibilities");
508 
509  /* Save the P2VMREDUCED */
510  if (gravi_param_get_bool (parlist,"gravity.dfs.p2vmred-file")) {
511 
512  gravi_data_save_new (p2vmred_data, frameset, NULL, parlist,
513  current_frameset, frame, "gravity_disp",
514  NULL, GRAVI_P2VMRED_SINGLE_CALIB);
515 
516  CPLCHECK_CLEAN ("Cannot save the P2VMREDUCED product");
517  }
518 
519  cpl_msg_info (cpl_func,"Free the p2vmreduced");
520  FREE (cpl_frameset_delete, current_frameset);
521  FREE (gravi_data_delete, p2vmred_data);
522  }
523  /* End loop on the input files to reduce */
524 
525  /* Recompute the TIME column from the MJD column
526  * in all OIFITS tables to follow standard */
527  gravi_vis_mjd_to_time (vis_data);
528 
529  /* Identify the WAVELAMP in the input frameset */
530  frame = cpl_frameset_get_position (wavelampcalib_frameset, 0);
531  argon_data = gravi_data_load_frame (frame, used_frameset);
532 
533  /* Duplicate POS_ARGON into the VIS file */
534  gravi_data_copy_ext (vis_data, argon_data, "POS_ARGON");
535 
536  /* Save the output data file based on the first frame of the frameset */
537  cpl_frameset_join (used_frameset, disp_frameset);
538  frame = cpl_frameset_get_position (disp_frameset, 0);
539 
540  gravi_data_save_new (vis_data, frameset, NULL, parlist,
541  used_frameset, frame, "gravity_disp",
542  NULL, GRAVI_DISP_VIS);
543 
544  CPLCHECK_CLEAN("Could not save the VIS_SINGLE product");
545 
546  FREE (gravi_data_delete, profile_map);
547  FREE (gravi_data_delete, dark_map);
548  FREE (gravi_data_delete, wave_map);
549  FREE (gravi_data_delete, badpix_map);
550  FREE (gravi_data_delete, p2vm_map);
551  FREE (cpl_frameset_delete, darkcalib_frameset);
552  FREE (cpl_frameset_delete, wavecalib_frameset);
553  FREE (cpl_frameset_delete, dark_frameset);
554  FREE (cpl_frameset_delete, flatcalib_frameset);
555  FREE (cpl_frameset_delete, badcalib_frameset);
556  FREE (cpl_frameset_delete, p2vmcalib_frameset);
557  FREE (cpl_frameset_delete, wavelampcalib_frameset);
558  }
559  else {
560 
561  /* Load the DIS_VIS already computed */
562  frame = cpl_frameset_get_position (dispvis_frameset, 0);
563  vis_data = gravi_data_load_frame (frame, used_frameset);
564 
565  CPLCHECK_CLEAN ("Cannot load the DISP_VIS file");
566 
567  disp_frameset = cpl_frameset_duplicate (dispvis_frameset);
568  }
569 
570  /*
571  * Compute the dispersion table of a set of disp frames
572  */
573 
574  gravi_disp_cleanup (vis_data);
575 
576  disp_map = gravi_compute_disp (vis_data);
577 
578  CPLCHECK_CLEAN ("Error while computing the disp_map");
579 
580  /* Create product frame */
581  frame = cpl_frameset_get_position (disp_frameset, 0);
582 
583  /* Save the DISP_MODEL */
584  gravi_data_save_new (disp_map, frameset, NULL, parlist,
585  used_frameset, frame, "gravity_disp",
586  NULL, GRAVI_DISP_MODEL);
587 
588  CPLCHECK_CLEAN("Could not save the DISP_MODEL product");
589 
590  /* Deallocation of all variables */
591  goto cleanup;
592 
593 cleanup :
594  cpl_msg_info(cpl_func,"Memory cleanup");
595  FREE (gravi_data_delete, data);
596  FREE (gravi_data_delete, tmpvis_data);
597  FREE (gravi_data_delete, vis_data);
598  FREE (gravi_data_delete, disp_map);
599  FREE (gravi_data_delete, dark_map);
600  FREE (gravi_data_delete, wave_map);
601  FREE (gravi_data_delete, profile_map);
602  FREE (gravi_data_delete, badpix_map);
603  FREE (gravi_data_delete, p2vmred_data);
604  FREE (gravi_data_delete, p2vm_map);
605  FREE (gravi_data_delete, preproc_data);
606  FREE (cpl_frameset_delete, disp_frameset);
607  FREE (cpl_frameset_delete, dispvis_frameset);
608  FREE (cpl_frameset_delete, darkcalib_frameset);
609  FREE (cpl_frameset_delete, dark_frameset);
610  FREE (cpl_frameset_delete, wavecalib_frameset);
611  FREE (cpl_frameset_delete, badcalib_frameset);
612  FREE (cpl_frameset_delete, flatcalib_frameset);
613  FREE (cpl_frameset_delete, p2vmcalib_frameset);
614  FREE (cpl_frameset_delete, wavelampcalib_frameset);
615  FREE (cpl_frameset_delete, used_frameset);
616  FREE (cpl_frameset_delete, current_frameset);
617 
618  gravi_msg_function_exit(1);
619  return (int)cpl_error_get_code();
620 }
621 
622