41 #include "gravi_data.h" 42 #include "gravi_pfits.h" 43 #include "gravi_dfs.h" 45 #include "gravi_utils.h" 47 #include "gravi_calib.h" 48 #include "gravi_p2vmred.h" 49 #include "gravi_eop.h" 50 #include "gravi_metrology.h" 52 #include "gravi_signal.h" 53 #include "gravi_vis.h" 56 #include "gravi_preproc.h" 62 static int gravity_vis_create(cpl_plugin *);
63 static int gravity_vis_exec(cpl_plugin *);
64 static int gravity_vis_destroy(cpl_plugin *);
65 static int gravity_vis(cpl_frameset *,
const cpl_parameterlist *);
70 static char gravity_vis_short[] =
"Compute the visibilities from raw observation of OBJECT.";
71 static char gravity_vis_description[] =
72 "This recipe is associated to the observing template. Its reduces the raw data acquired on calibrator or science targets and computes the uncalibrated visibilities, saved in an OIFITS file. If several OBJECT are provided, the recipe will reduce all of them and merge the resulting data into a single OIFITS. If several SKY_RAW are provided, the recipe reduces the first OBJECT with the first SKY. Then each new OBJECT with the next SKY. When the number of sky is reached, the recipe loops back to first sky (so if the number of SKYs is larger than the number of OBJECTs, the last SKY won't be used). The recipe will reduce the data even if no SKY or no DARK is provided. However this will lead to wrong estimate of the visibility and square visibility of the object. If the DIAMETER_CAT is not provided, the recipe will use the diameter provided in the header to compute the transfer function QC parameters." 74 "The tag in the DO category can be SINGLE/DUAL and CAL/SCI. They should reflect the mode (SINGLE or DUAL) and the DPR.CATG of the observation (SCIENCE or CALIB). The tag in the PRO.CATG category will be SINGLE/DUAL and CAL/SCI depending on the input tag.\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 (PRO.CATG="GRAVI_DARK_MAP
")\n" 81 GRAVI_SINGLE_SCIENCE_RAW
" : raw object (DPR.TYPE=OBJECT,SINGLE)\n" 82 GRAVI_SINGLE_SKY_RAW
" : raw sky (DPR.TYPE=SKY,SINGLE)\n" 83 GRAVI_DISP_MODEL
" (opt) : fiber dispersion model (PRO.CATG="GRAVI_DISP_MODEL
")\n" 84 GRAVI_DIAMETER_CAT
" (opt) : catalog of diameter (PRO.CATG="GRAVI_DIAMETER_CAT
")\n" 85 GRAVI_RECIPE_OUTPUT
"\n" 86 GRAVI_VIS_SINGLE_SCIENCE
" : OIFITS with uncalibrated visibilities\n" 87 GRAVI_SINGLE_SKY_MAP
" (opt) : sky map\n" 88 GRAVI_P2VMRED_SINGLE_SCIENCE
" (opt) : intermediate product\n" 89 GRAVI_SPECTRUM
" (opt) : intermediate product\n" 90 GRAVI_PREPROC
" (opt) : intermediate product\n" 108 int cpl_plugin_get_info(cpl_pluginlist * list)
110 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
111 cpl_plugin * plugin = &recipe->interface;
113 if (cpl_plugin_init(plugin,
115 GRAVI_BINARY_VERSION,
116 CPL_PLUGIN_TYPE_RECIPE,
119 gravity_vis_description,
120 "Nabih Azouaoui, Vincent Lapeyrere, JB. Le Bouquin",
125 gravity_vis_destroy)) {
126 cpl_msg_error(cpl_func,
"Plugin initialization failed");
127 (void)cpl_error_set_where(cpl_func);
131 if (cpl_pluginlist_append(list, plugin)) {
132 cpl_msg_error(cpl_func,
"Error adding plugin to list");
133 (void)cpl_error_set_where(cpl_func);
149 static int gravity_vis_create(cpl_plugin * plugin)
155 if (cpl_error_get_code() != CPL_ERROR_NONE) {
156 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
157 cpl_func, __LINE__, cpl_error_get_where());
158 return (
int)cpl_error_get_code();
161 if (plugin == NULL) {
162 cpl_msg_error(cpl_func,
"Null plugin");
163 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
167 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
168 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
169 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
173 recipe = (cpl_recipe *)plugin;
176 recipe->parameters = cpl_parameterlist_new();
177 if (recipe->parameters == NULL) {
178 cpl_msg_error(cpl_func,
"Parameter list allocation failed");
179 cpl_ensure_code(0, (
int)CPL_ERROR_ILLEGAL_OUTPUT);
186 gravi_parameter_add_static_name (recipe->parameters);
189 gravi_parameter_add_biassub_file (recipe->parameters);
190 gravi_parameter_add_spectrum_file (recipe->parameters);
191 gravi_parameter_add_preproc_file (recipe->parameters);
192 gravi_parameter_add_p2vmred_file (recipe->parameters);
193 gravi_parameter_add_astro_file (recipe->parameters);
196 gravi_parameter_add_average_vis (recipe->parameters);
199 gravi_parameter_add_biasmethod (recipe->parameters);
202 gravi_parameter_add_extract (recipe->parameters);
205 gravi_parameter_add_compute_snr (recipe->parameters, isCalib);
208 gravi_parameter_add_rejection (recipe->parameters, isCalib);
211 gravi_parameter_add_compute_vis (recipe->parameters, isCalib);
214 p = cpl_parameter_new_value (
"gravity.vis.flat-flux", CPL_TYPE_BOOL,
215 "Flat the OI_FLUX with instrument transmission recorded in the\n" 216 " input P2VM calibration map. Thus flux is the spectrum recorded\n" 217 " at the detector (FALSE); or the spectrum at the instrument entrance (TRUE).",
218 "gravity.vis", FALSE);
219 cpl_parameter_set_alias (p, CPL_PARAMETER_MODE_CLI,
"flat-flux");
220 cpl_parameter_disable (p, CPL_PARAMETER_MODE_ENV);
221 cpl_parameterlist_append (recipe->parameters, p);
224 p = cpl_parameter_new_value (
"gravity.preproc.average-sky", CPL_TYPE_BOOL,
225 "Average the SKYs into a master SKY. If FALSE, the recipe loops\n " 226 "over the SKY to reduce each OBJECT with a different SKY",
227 "gravity.preproc", FALSE);
228 cpl_parameter_set_alias (p, CPL_PARAMETER_MODE_CLI,
"average-sky");
229 cpl_parameter_disable (p, CPL_PARAMETER_MODE_ENV);
230 cpl_parameterlist_append (recipe->parameters, p);
242 static int gravity_vis_exec(cpl_plugin * plugin)
247 cpl_errorstate initial_errorstate = cpl_errorstate_get();
251 if (cpl_error_get_code() != CPL_ERROR_NONE) {
252 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
253 cpl_func, __LINE__, cpl_error_get_where());
254 return (
int)cpl_error_get_code();
257 if (plugin == NULL) {
258 cpl_msg_error(cpl_func,
"Null plugin");
259 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
263 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
264 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
265 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
269 recipe = (cpl_recipe *)plugin;
272 if (recipe->parameters == NULL) {
273 cpl_msg_error(cpl_func,
"Recipe invoked with NULL parameter list");
274 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
276 if (recipe->frames == NULL) {
277 cpl_msg_error(cpl_func,
"Recipe invoked with NULL frame set");
278 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
282 recipe_status = gravity_vis(recipe->frames, recipe->parameters);
285 if (cpl_dfs_update_product_header(recipe->frames)) {
287 recipe_status = (int)cpl_error_get_code();
291 if (!cpl_errorstate_is_equal(initial_errorstate)) {
294 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
297 return recipe_status;
307 static int gravity_vis_destroy(cpl_plugin * plugin)
311 if (plugin == NULL) {
312 cpl_msg_error(cpl_func,
"Null plugin");
313 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
317 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
318 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
319 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
323 recipe = (cpl_recipe *)plugin;
325 cpl_parameterlist_delete(recipe->parameters);
340 static int gravity_vis(cpl_frameset * frameset,
341 const cpl_parameterlist * parlist)
343 cpl_frameset * recipe_frameset=NULL, * wavecalib_frameset=NULL, * dark_frameset=NULL,
344 * darkcalib_frameset=NULL, * sky_frameset=NULL, * flatcalib_frameset=NULL, * p2vmcalib_frameset=NULL,
345 * badcalib_frameset=NULL, *used_frameset=NULL, * current_frameset=NULL, * dispcalib_frameset=NULL,
346 * diamcat_frameset = NULL, *eop_frameset = NULL;
348 cpl_frame * frame=NULL;
350 const char * frame_tag=NULL;
351 char * proCatg = NULL, * mode=NULL, * redCatg = NULL, * skyCatg = NULL;
353 gravi_data * p2vm_map=NULL, * data=NULL, * wave_map=NULL, * dark_map=NULL,
354 * profile_map=NULL, * badpix_map=NULL, * preproc_data=NULL, * p2vmred_data=NULL, * tmpvis_data=NULL,
355 * vis_data=NULL, * disp_map=NULL, * diamcat_data=NULL, *eop_map=NULL;
356 gravi_data ** sky_maps = NULL;
358 int nb_frame, nb_sky, isky;
361 gravity_print_banner ();
362 cpl_msg_set_time_on();
363 cpl_msg_set_component_on();
364 gravi_msg_function_start(1);
366 cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
367 cpl_error_get_code()) ;
370 p2vmcalib_frameset = gravi_frameset_extract_p2vm_map (frameset);
371 darkcalib_frameset = gravi_frameset_extract_dark_map (frameset);
372 wavecalib_frameset = gravi_frameset_extract_wave_map (frameset);
373 dark_frameset = gravi_frameset_extract_dark_data (frameset);
374 flatcalib_frameset = gravi_frameset_extract_flat_map (frameset);
375 badcalib_frameset = gravi_frameset_extract_bad_map (frameset);
376 dispcalib_frameset = gravi_frameset_extract_disp_map (frameset);
377 diamcat_frameset = gravi_frameset_extract_diamcat_map (frameset);
378 eop_frameset = gravi_frameset_extract_eop_map (frameset);
380 recipe_frameset = gravi_frameset_extract_fringe_data (frameset);
381 sky_frameset = gravi_frameset_extract_sky_data (frameset);
385 if ( cpl_frameset_get_size (p2vmcalib_frameset) !=1 ||
386 cpl_frameset_get_size (wavecalib_frameset) !=1 ||
387 cpl_frameset_get_size (flatcalib_frameset) !=1 ||
388 cpl_frameset_get_size (badcalib_frameset) != 1 ||
389 cpl_frameset_get_size (recipe_frameset) < 1 ||
390 (cpl_frameset_is_empty (dark_frameset) &&
391 cpl_frameset_is_empty (darkcalib_frameset) &&
392 cpl_frameset_is_empty (sky_frameset)) ) {
393 cpl_error_set_message (cpl_func, CPL_ERROR_ILLEGAL_INPUT,
394 "Illegal number of P2VM, FLAT, WAVE, BAD, DARK or SKY, OBJECT file on the frameset");
399 used_frameset = cpl_frameset_new();
405 if (!cpl_frameset_is_empty (dark_frameset)) {
407 frame = cpl_frameset_get_position (dark_frameset, 0);
408 data = gravi_data_load_rawframe (frame, used_frameset);
409 gravi_data_detector_cleanup (data, parlist);
412 dark_map = gravi_compute_dark (data);
413 FREE (gravi_data_delete, data);
415 CPLCHECK_CLEAN (
"Could not compute the DARK map");
418 gravi_data_save_new (dark_map, frameset, NULL, parlist,
419 NULL, frame,
"gravity_vis",
420 NULL, GRAVI_DARK_MAP);
422 CPLCHECK_CLEAN (
"Could not save the DARK map");
424 else if (!cpl_frameset_is_empty (darkcalib_frameset)) {
426 frame = cpl_frameset_get_position (darkcalib_frameset, 0);
427 dark_map = gravi_data_load_frame (frame, used_frameset);
429 CPLCHECK_CLEAN (
"Could not load the DARK map");
432 cpl_msg_info (cpl_func,
"There is no DARK in the frame set");
435 frame = cpl_frameset_get_position (badcalib_frameset, 0);
436 badpix_map = gravi_data_load_frame (frame, used_frameset);
439 frame = cpl_frameset_get_position (flatcalib_frameset, 0);
440 profile_map = gravi_data_load_frame (frame, used_frameset);
443 frame = cpl_frameset_get_position (wavecalib_frameset, 0);
444 wave_map = gravi_data_load_frame (frame, used_frameset);
447 frame = cpl_frameset_get_position (p2vmcalib_frameset, 0);
448 p2vm_map = gravi_data_load_frame (frame, used_frameset);
451 if (!cpl_frameset_is_empty (dispcalib_frameset)) {
452 frame = cpl_frameset_get_position (dispcalib_frameset, 0);
453 disp_map = gravi_data_load_frame (frame, used_frameset);
456 cpl_msg_info (cpl_func,
"There is no DISP_MODEL in the frameset");
459 if ( !cpl_frameset_is_empty (eop_frameset) ) {
460 frame = cpl_frameset_get_position (eop_frameset, 0);
461 eop_map = gravi_data_load_frame (frame, used_frameset);
464 cpl_msg_info (cpl_func,
"There is no EOP_PARAM in the frameset");
467 if ( !cpl_frameset_is_empty (diamcat_frameset) ) {
468 frame = cpl_frameset_get_position (diamcat_frameset, 0);
469 diamcat_data = gravi_data_load_frame (frame, used_frameset);
472 cpl_msg_info (cpl_func,
"There is no DIAMETER_CAT in the frameset");
475 CPLCHECK_CLEAN (
"Error while loading the calibration maps");
481 frame_tag = cpl_frame_get_tag (cpl_frameset_get_position (recipe_frameset, 0));
483 if ((strcmp(frame_tag, GRAVI_DUAL_CALIB_RAW) == 0)) {
484 redCatg = cpl_sprintf (GRAVI_P2VMRED_DUAL_CALIB);
485 proCatg = cpl_sprintf (GRAVI_VIS_DUAL_CALIB);
486 skyCatg = cpl_sprintf (GRAVI_DUAL_SKY_MAP);
487 mode = cpl_sprintf (
"gravi_dual");
489 else if ((strcmp(frame_tag, GRAVI_DUAL_SCIENCE_RAW) == 0)) {
490 redCatg = cpl_sprintf (GRAVI_P2VMRED_DUAL_SCIENCE);
491 proCatg = cpl_sprintf (GRAVI_VIS_DUAL_SCIENCE);
492 skyCatg = cpl_sprintf (GRAVI_DUAL_SKY_MAP);
493 mode = cpl_sprintf (
"gravi_dual");
495 else if ((strcmp(frame_tag, GRAVI_SINGLE_CALIB_RAW) == 0)) {
496 redCatg = cpl_sprintf (GRAVI_P2VMRED_SINGLE_CALIB);
497 proCatg = cpl_sprintf (GRAVI_VIS_SINGLE_CALIB);
498 skyCatg = cpl_sprintf (GRAVI_SINGLE_SKY_MAP);
499 mode = cpl_sprintf (
"gravi_single");
501 else if ((strcmp(frame_tag, GRAVI_SINGLE_SCIENCE_RAW) == 0)) {
502 redCatg = cpl_sprintf (GRAVI_P2VMRED_SINGLE_SCIENCE);
503 proCatg = cpl_sprintf (GRAVI_VIS_SINGLE_SCIENCE);
504 skyCatg = cpl_sprintf (GRAVI_SINGLE_SKY_MAP);
505 mode = cpl_sprintf (
"gravi_single");
508 cpl_error_set_message (cpl_func, CPL_ERROR_ILLEGAL_INPUT,
509 "Cannot recognize the input DO.CATG");
513 cpl_msg_info (cpl_func,
"Mode of the first frame is: %s (will be used for all frames)", mode);
518 int averageSky = gravi_param_get_bool (parlist,
"gravity.preproc.average-sky");
523 nb_sky = cpl_frameset_get_size (sky_frameset);
524 sky_maps = cpl_calloc (CPL_MAX(nb_sky,1),
sizeof(gravi_data*));
526 for (
int isky = 0; isky < nb_sky; isky++){
529 cpl_msg_info (cpl_func,
" ***** SKY %d over %d ***** ", isky+1, nb_sky);
530 frame = cpl_frameset_get_position (sky_frameset, isky);
531 data = gravi_data_load_rawframe (frame, used_frameset);
532 gravi_data_detector_cleanup (data, parlist);
535 sky_maps[isky] = gravi_compute_dark (data);
536 FREE (gravi_data_delete, data);
538 CPLCHECK_CLEAN (
"Error while computing the sky_map");
541 if (averageSky == 0) {
542 gravi_data_save_new (sky_maps[isky], frameset, NULL, parlist,
543 NULL, frame,
"gravity_vis",
545 CPLCHECK_CLEAN (
"Could not save the sky");
553 if (averageSky == 1) {
554 cpl_msg_info (cpl_func,
"Do a MASTER SKY from the %d skys", nb_sky);
556 gravi_data * msky_map;
557 msky_map = gravi_average_dark (sky_maps, nb_sky);
558 CPLCHECK_CLEAN (
"Cannot do master sky");
560 gravi_data_save_new (msky_map, frameset, NULL, parlist, sky_frameset,
561 cpl_frameset_get_position (sky_frameset, 0),
562 "gravity_vis", NULL, skyCatg);
563 CPLCHECK_CLEAN (
"Cannot save master sky");
566 cpl_frameset_join (used_frameset, sky_frameset);
567 for (
int isky = 0; isky < nb_sky; isky++)
568 FREE (gravi_data_delete, sky_maps[isky]);
569 sky_maps[0] = msky_map;
577 nb_frame = cpl_frameset_get_size (recipe_frameset);
579 for (
int ivis = 0; ivis < nb_frame; ivis++){
580 current_frameset = cpl_frameset_duplicate (used_frameset);
582 cpl_msg_info (cpl_func,
" ***** OBJECT %d over %d ***** ", ivis+1, nb_frame);
587 isky = nb_sky>0 ? ivis % nb_sky : 0;
591 cpl_msg_info (cpl_func,
"There is no SKY in the frameset");
593 else if (averageSky) {
595 cpl_msg_info (cpl_func,
"Use MASTER SKY (already reduced)");
599 cpl_msg_info (cpl_func,
"Use SKY %i over %i (already reduced)", isky+1, nb_sky);
600 frame = cpl_frameset_get_position (sky_frameset, isky);
603 cpl_frameset_insert (current_frameset, cpl_frame_duplicate (frame));
610 frame = cpl_frameset_get_position (recipe_frameset, ivis);
611 data = gravi_data_load_rawframe (frame, current_frameset);
612 gravi_data_detector_cleanup (data, parlist);
615 if (gravi_param_get_bool (parlist,
"gravity.dfs.bias-subtracted-file")) {
617 gravi_data_save_new (data, frameset, NULL, parlist,
618 current_frameset, frame,
"gravity_vis",
619 NULL,
"BIAS_SUBTRACTED");
621 CPLCHECK_CLEAN (
"Cannot save the BIAS_SUBTRACTED product");
626 if ( !gravi_data_check_shutter_open (data) ) {
627 cpl_msg_warning (cpl_func,
"Shutter problem in the OBJECT");
631 preproc_data = gravi_extract_spectrum (data, profile_map, dark_map, badpix_map,
632 sky_maps[isky], parlist);
633 CPLCHECK_CLEAN (
"Cannot extract spectrum");
636 if (gravi_param_get_bool (parlist,
"gravity.dfs.spectrum-file")) {
637 gravi_data_save_new (preproc_data, frameset, NULL, parlist,
638 current_frameset, frame,
"gravity_vis",
639 NULL, GRAVI_SPECTRUM);
640 CPLCHECK_CLEAN (
"Cannot save the SPECTRUM product");
644 gravi_align_spectrum (preproc_data, wave_map, p2vm_map);
645 CPLCHECK_CLEAN (
"Cannot re-interpolate spectrum");
648 if (gravi_param_get_bool (parlist,
"gravity.dfs.preproc-file")) {
649 gravi_data_save_new (preproc_data, frameset, NULL, parlist,
650 current_frameset, frame,
"gravity_vis",
651 NULL, GRAVI_PREPROC);
652 CPLCHECK_CLEAN (
"Cannot save the PREPROC product");
656 gravi_data_move_ext (preproc_data, data, GRAVI_ARRAY_GEOMETRY_EXT);
657 gravi_data_move_ext (preproc_data, data, GRAVI_OPTICAL_TRAIN_EXT);
658 gravi_data_move_ext (preproc_data, data, GRAVI_OPDC_EXT);
659 gravi_data_move_ext (preproc_data, data, GRAVI_FDDL_EXT);
660 gravi_data_move_ext (preproc_data, data, GRAVI_METROLOGY_EXT);
661 FREE (gravi_data_delete, data);
662 CPLCHECK_CLEAN (
"Cannot move ext");
666 p2vmred_data = gravi_compute_p2vmred (preproc_data, p2vm_map, mode, parlist);
667 CPLCHECK_CLEAN (
"Cannot apply p2vm to the preproc data");
670 gravi_data_move_ext (p2vmred_data, preproc_data, GRAVI_METROLOGY_EXT);
671 gravi_data_move_ext (p2vmred_data, preproc_data, GRAVI_FDDL_EXT);
672 gravi_data_move_ext (p2vmred_data, preproc_data, GRAVI_OPDC_EXT);
673 FREE (gravi_data_delete, preproc_data);
674 CPLCHECK_CLEAN (
"Cannot delete preproc");
677 gravi_compute_opdc_state (p2vmred_data);
678 CPLCHECK_CLEAN (
"Cannot reduce OPDC");
681 gravi_metrology_reduce (p2vmred_data);
682 CPLCHECK_CLEAN (
"Cannot reduce metrology");
685 gravi_compute_uv (p2vmred_data, eop_map);
686 CPLCHECK_CLEAN (
"Cannot compute uv");
688 gravi_compute_pointing (p2vmred_data, eop_map);
689 CPLCHECK_CLEAN (
"Cannot compute pointing");
692 gravi_compute_tau0 (p2vmred_data);
695 gravi_compute_snr (p2vmred_data, parlist);
696 CPLCHECK_MSG (
"Cannot compute SNR");
699 gravi_compute_signals (p2vmred_data, disp_map, parlist);
700 CPLCHECK_MSG (
"Cannot compute signals");
703 gravi_compute_rejection (p2vmred_data, parlist);
704 CPLCHECK_MSG (
"Cannot compute rejection flags signals");
708 tmpvis_data = gravi_compute_vis (p2vmred_data, parlist);
709 CPLCHECK_CLEAN (
"Cannot average the P2VMRED frames into VIS");
713 vis_data = tmpvis_data; tmpvis_data = NULL;
716 cpl_msg_info (cpl_func,
"Merge with previous OI_VIS");
717 gravi_data_append (vis_data, tmpvis_data, 1);
718 FREE (gravi_data_delete, tmpvis_data);
722 if (gravi_param_get_bool (parlist,
"gravity.dfs.p2vmred-file")) {
724 gravi_data_save_new (p2vmred_data, frameset, NULL, parlist,
725 current_frameset, frame,
"gravity_vis", NULL, redCatg);
727 CPLCHECK_CLEAN (
"Cannot save the P2VMREDUCED product");
731 if (gravi_param_get_bool (parlist,
"gravity.dfs.astro-file")) {
733 gravi_data_clean_for_astro (p2vmred_data);
734 gravi_data_save_new (p2vmred_data, frameset, NULL, parlist,
735 current_frameset, frame,
"gravity_vis",
736 NULL, GRAVI_ASTROREDUCED);
738 CPLCHECK_CLEAN (
"Cannot save the ASTROREDUCED product");
741 cpl_msg_info (cpl_func,
"Free the p2vmreduced");
742 FREE (cpl_frameset_delete, current_frameset);
743 FREE (gravi_data_delete, p2vmred_data);
750 gravi_compute_tf_qc (vis_data, diamcat_data);
753 gravi_compute_pointing (vis_data, eop_map);
756 if (gravi_param_get_bool (parlist,
"gravity.vis.flat-flux")) {
758 cpl_msg_info (cpl_func,
"Flatten the FLUX with the internal P2VM spectrum");
759 gravi_flat_flux (vis_data, p2vm_map);
760 CPLCHECK_CLEAN (
"Cannot flat the OI_FLUX");
763 cpl_msg_info (cpl_func,
"Don't flatten the FLUX with the internal P2VM spectrum");
768 if (!strcmp (gravi_param_get_string (parlist,
"gravity.vis.vis-correction"),
"FORCE")) {
770 cpl_msg_info (cpl_func,
"Align the SC visibilities on the FT");
771 gravi_normalize_sc_to_ft (vis_data);
774 cpl_msg_info (cpl_func,
"Don't align the SC visibilities on the FT");
778 if (gravi_param_get_bool (parlist,
"gravity.postprocess.average-vis")) {
779 gravi_average_vis (vis_data);
782 cpl_msg_info (cpl_func,
"Don't average the different observation (if any)");
787 gravi_vis_mjd_to_time (vis_data);
790 cpl_frameset_join (used_frameset, recipe_frameset);
791 frame = cpl_frameset_get_position (recipe_frameset, 0);
793 gravi_data_save_new (vis_data, frameset, NULL, parlist,
794 used_frameset, frame,
"gravity_vis", NULL, proCatg);
796 CPLCHECK_CLEAN (
"Cannot save the VIS product");
803 cpl_msg_info(cpl_func,
"Memory cleanup");
805 FREELOOP (gravi_data_delete,sky_maps,nb_sky);
806 FREE (gravi_data_delete,dark_map);
807 FREE (gravi_data_delete,data);
808 FREE (gravi_data_delete,preproc_data);
809 FREE (gravi_data_delete,profile_map);
810 FREE (gravi_data_delete,disp_map);
811 FREE (gravi_data_delete,wave_map);
812 FREE (gravi_data_delete,badpix_map);
813 FREE (gravi_data_delete,p2vm_map);
814 FREE (gravi_data_delete,p2vmred_data);
815 FREE (gravi_data_delete,vis_data);
816 FREE (gravi_data_delete,tmpvis_data);
817 FREE (gravi_data_delete,diamcat_data);
818 FREE (gravi_data_delete,eop_map);
819 FREE (cpl_frameset_delete,darkcalib_frameset);
820 FREE (cpl_frameset_delete,wavecalib_frameset);
821 FREE (cpl_frameset_delete,flatcalib_frameset);
822 FREE (cpl_frameset_delete,badcalib_frameset);
823 FREE (cpl_frameset_delete,p2vmcalib_frameset);
824 FREE (cpl_frameset_delete,dark_frameset);
825 FREE (cpl_frameset_delete,diamcat_frameset);
826 FREE (cpl_frameset_delete,sky_frameset);
827 FREE (cpl_frameset_delete,dispcalib_frameset);
828 FREE (cpl_frameset_delete,eop_frameset);
829 FREE (cpl_frameset_delete,recipe_frameset);
830 FREE (cpl_frameset_delete,current_frameset);
831 FREE (cpl_frameset_delete,used_frameset);
832 FREE (cpl_free,proCatg);
833 FREE (cpl_free,redCatg);
834 FREE (cpl_free,skyCatg);
835 FREE (cpl_free,mode);
837 gravi_msg_function_exit(1);
838 return (
int)cpl_error_get_code();