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_dual_create(cpl_plugin *);
54 static int gravi_dual_exec(cpl_plugin *);
55 static int gravi_dual_destroy(cpl_plugin *);
56 static int gravi_dual(cpl_frameset *,
const cpl_parameterlist *);
62 static char gravi_dual_description[] =
63 "This recipe is associated to the observing template in dual field mode.\n"
64 "Its aim is to reduce the raw interferometric data acquired on calibrator or \n"
65 "science targets and to compute the intrumental visibility.\n"
66 "The output OIFITS file contains the values of the complex visibilities, \n"
67 "squared visibilities and the closure phases.\n"
68 "Description DO category\n"
70 " Master dark " DARK
"\n"
71 " Master flat " FLAT
"\n"
72 " Bad pixel map " BAD
"\n"
73 " Master wave " WAVE
"\n"
74 " Master p2vm " P2VM
"\n"
75 " Raw observation file " GRAVI_DUAL_CALIB
" or "
76 GRAVI_DUAL_SCIENCE
"\n"
78 " Sky file (one or more) " DUAL_CAL_SKY_RAW
" or "
82 " Master sky (one per input sky) " SKY
"\n"
83 " Raw Visibilities " VIS_DUAL_CALIB
" or " VIS_DUAL_SCIENCE
"\n"
85 " Preprocessed files (--preproc-file) " PREPROC
"\n"
86 " Non averaged visibilities (--p2vmreduced-file) " P2VMREDUCED
"\n"
104 int cpl_plugin_get_info(cpl_pluginlist * list)
106 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
107 cpl_plugin * plugin = &recipe->interface;
109 if (cpl_plugin_init(plugin,
111 GRAVI_BINARY_VERSION,
112 CPL_PLUGIN_TYPE_RECIPE,
114 "This recipe is used to compute the squared visibility",
115 gravi_dual_description,
116 "Firstname Lastname",
121 gravi_dual_destroy)) {
122 cpl_msg_error(cpl_func,
"Plugin initialization failed");
123 (void)cpl_error_set_where(cpl_func);
127 if (cpl_pluginlist_append(list, plugin)) {
128 cpl_msg_error(cpl_func,
"Error adding plugin to list");
129 (void)cpl_error_set_where(cpl_func);
145 static int gravi_dual_create(cpl_plugin * plugin)
151 if (cpl_error_get_code() != CPL_ERROR_NONE) {
152 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
153 cpl_func, __LINE__, cpl_error_get_where());
154 return (
int)cpl_error_get_code();
157 if (plugin == NULL) {
158 cpl_msg_error(cpl_func,
"Null plugin");
159 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
163 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
164 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
165 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
169 recipe = (cpl_recipe *)plugin;
172 recipe->parameters = cpl_parameterlist_new();
173 if (recipe->parameters == NULL) {
174 cpl_msg_error(cpl_func,
"Parameter list allocation failed");
175 cpl_ensure_code(0, (
int)CPL_ERROR_ILLEGAL_OUTPUT);
181 p = cpl_parameter_new_value(
"gravi.preproc_param.preproc_file",
182 CPL_TYPE_BOOL,
"Save the preprocessed file",
"gravi.gravi_all_p2vm", FALSE);
183 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"preproc-file");
184 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
185 cpl_parameterlist_append(recipe->parameters, p);
188 p = cpl_parameter_new_value(
"gravi.preproc_param.p2vmreduced_file",
189 CPL_TYPE_BOOL,
"Save the file with non averaged visibilities",
"gravi.gravi_dual", FALSE);
190 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"p2vmreduced-file");
191 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
192 cpl_parameterlist_append(recipe->parameters, p);
195 p = cpl_parameter_new_value(
"gravi.vis_reduce.vis_correction",
196 CPL_TYPE_BOOL,
"Correction of visibilities looses",
"gravi.gravi_dual", FALSE);
197 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"vis-correction");
198 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
199 cpl_parameterlist_append(recipe->parameters, p);
202 p = cpl_parameter_new_value(
"gravi.snr_threshold_ft",
203 CPL_TYPE_DOUBLE,
"SNR threshold for fringe detection in FT (>0)",
"gravi", 3.0);
204 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"snr-threshold-ft");
205 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
206 cpl_parameterlist_append(recipe->parameters, p);
209 p = cpl_parameter_new_value(
"gravi.fringedet_threshold_sc",
210 CPL_TYPE_DOUBLE,
"Fringe-detection ratio threshold to accept SC frame (0..1)",
"gravi", 0.8);
211 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"fringedet-threshold-sc");
212 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
213 cpl_parameterlist_append(recipe->parameters, p);
216 p = cpl_parameter_new_value(
"gravi.debias_sc",
217 CPL_TYPE_BOOL,
"Subtrast the V2 bias from SC",
"gravi", TRUE);
218 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"debias-sc");
219 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
220 cpl_parameterlist_append(recipe->parameters, p);
223 p = cpl_parameter_new_value(
"gravi.debias_ft",
224 CPL_TYPE_BOOL,
"Subtrast the V2 bias from FT",
"gravi", TRUE);
225 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"debias-ft");
226 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
227 cpl_parameterlist_append(recipe->parameters, p);
230 p = cpl_parameter_new_value(
"gravi.use_met",
231 CPL_TYPE_BOOL,
"Use the metrology to rephase the SC data in real-time",
"gravi", FALSE);
232 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"use-met");
233 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
234 cpl_parameterlist_append(recipe->parameters, p);
237 p = cpl_parameter_new_value(
"gravi.vis_flat",
238 CPL_TYPE_BOOL,
"Flat the OIVIS by the VIS_FLAT file",
"gravi", TRUE);
239 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"vis-flat");
240 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
241 cpl_parameterlist_append(recipe->parameters, p);
253 static int gravi_dual_exec(cpl_plugin * plugin)
258 cpl_errorstate initial_errorstate = cpl_errorstate_get();
262 if (cpl_error_get_code() != CPL_ERROR_NONE) {
263 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
264 cpl_func, __LINE__, cpl_error_get_where());
265 return (
int)cpl_error_get_code();
268 if (plugin == NULL) {
269 cpl_msg_error(cpl_func,
"Null plugin");
270 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
274 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
275 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
276 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
280 recipe = (cpl_recipe *)plugin;
283 if (recipe->parameters == NULL) {
284 cpl_msg_error(cpl_func,
"Recipe invoked with NULL parameter list");
285 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
287 if (recipe->frames == NULL) {
288 cpl_msg_error(cpl_func,
"Recipe invoked with NULL frame set");
289 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
293 recipe_status = gravi_dual(recipe->frames, recipe->parameters);
297 if (cpl_dfs_update_product_header(recipe->frames)) {
299 recipe_status = (int)cpl_error_get_code();
303 if (!cpl_errorstate_is_equal(initial_errorstate)) {
306 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
309 return recipe_status;
319 static int gravi_dual_destroy(cpl_plugin * plugin)
323 if (plugin == NULL) {
324 cpl_msg_error(cpl_func,
"Null plugin");
325 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
329 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
330 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
331 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
335 recipe = (cpl_recipe *)plugin;
337 cpl_parameterlist_delete(recipe->parameters);
352 static int gravi_dual(cpl_frameset * frameset,
353 const cpl_parameterlist * parlist)
355 cpl_frameset * recipe_frameset=NULL, * wave_frameset=NULL, * dark_frameset=NULL,
356 * darkcalib_frameset=NULL, * skyframeset=NULL,
357 * gain_frameset=NULL, * p2vm_frameset=NULL, * badpix_frameset=NULL, *used_frameset=NULL,
358 * visflat_frameset=NULL;
359 cpl_propertylist * applist=NULL, * primary_hdr=NULL, * primary_hdr_dark=NULL, * wave_plist=NULL
360 , *bad_primary_hdr=NULL;
361 cpl_table * detector_table=NULL;
362 cpl_frame * frame=NULL;
363 const cpl_parameter * p=NULL, * p_=NULL;
364 cpl_parameter * par=NULL;
365 char * out_dark=NULL, * preproc_name=NULL;
366 const char * frame_tag=NULL, * filename=NULL, * temp=NULL;
367 gravi_data * p2vm_map=NULL, * data=NULL, * darkOrSky_map=NULL, * wave_map=NULL, * dark_map=NULL,
368 * profile_map=NULL, * badpix_map=NULL, * vis_flat=NULL;
369 gravi_data ** calib_datas=NULL;
370 gravi_data * preproc_data=NULL;
371 gravi_data ** raw_data=NULL, * p2vm_reduce=NULL;
372 gravi_data * oi_vis=NULL;
373 darkOrSky_map = NULL, wave_map = NULL;
374 int nb_frame, i, j, nwave_ft, nwave_sc, n_region;
378 char * vis_name=NULL;
381 cpl_msg_set_time_on();
382 cpl_msg_set_component_on();
383 cpl_msg_info(cpl_func,
"Start function -- cleanup");
390 cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
391 cpl_error_get_code()) ;
393 p2vm_frameset = gravi_frameset_extract_p2vm_file(frameset);
396 recipe_frameset = gravi_frameset_extract_dual_data(frameset);
397 darkcalib_frameset = gravi_frameset_extract_dark_file(frameset);
398 wave_frameset = gravi_frameset_extract_wave_file(frameset);
399 dark_frameset = gravi_frameset_extract_dark(frameset);
400 gain_frameset = gravi_frameset_extract_flat_file(frameset);
401 badpix_frameset = gravi_frameset_extract_badpix(frameset);
402 skyframeset = gravi_frameset_extract_dual_sky_data (frameset);
403 visflat_frameset = gravi_frameset_extract_visflat(frameset);
407 if (cpl_frameset_is_empty(recipe_frameset)) {
408 cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
409 "No DUAL frame on the frameset");
415 if ((cpl_frameset_is_empty(p2vm_frameset)) ||
416 (cpl_frameset_is_empty(wave_frameset)) ||
417 (cpl_frameset_is_empty(gain_frameset))) {
418 cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
419 "No P2VM or FLAT or WAVE file on the frameset") ;
424 nb_frame = cpl_frameset_get_size(recipe_frameset);
430 if (!cpl_frameset_is_empty(dark_frameset)) {
432 frame = cpl_frameset_get_position(dark_frameset, 0);
433 filename = cpl_frame_get_filename(frame);
435 cpl_msg_info (cpl_func,
"File %s is a raw DARK file", FILESHORT(filename));
436 data = gravi_data_load(filename);
439 primary_hdr = gravi_data_get_propertylist(data, GRAVI_PRIMARY_HDR_NAME_EXT);
440 shutter = gravi_shutters_check(primary_hdr);
441 if (!((shutter[0] == 0) && (shutter[1] == 0) &&
442 (shutter[2] == 0) && (shutter[3] == 0))){
443 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
"Shutter problem in the DARK");
448 dark_map = gravi_compute_dark(data);
450 CPLCHECK_CLEAN(
"Could not compute the DARK map");
453 primary_hdr_dark = gravi_data_get_propertylist(dark_map,
454 GRAVI_PRIMARY_HDR_NAME_EXT);
455 applist = gravi_propertylist_get_qc (primary_hdr_dark);
456 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, DARK);
459 out_dark = gravi_data_product_name (filename,
"dark");
461 gravi_data_save(dark_map, frameset, out_dark, parlist,
462 dark_frameset, frame,
"gravi_dual", applist);
464 CPLCHECK_CLEAN(
"Could not save the DARK map");
466 FREE (cpl_propertylist_delete,applist);
467 FREE (gravi_data_delete,data);
468 FREE (cpl_free,shutter);
472 else if (!cpl_frameset_is_empty(darkcalib_frameset)) {
474 frame = cpl_frameset_get_position(darkcalib_frameset, 0);
475 filename = cpl_frame_get_filename(frame);
477 cpl_msg_info (cpl_func,
"File %s is a master DARK file already computed", FILESHORT(filename));
478 dark_map = gravi_data_load(filename);
479 cpl_frameset_insert (dark_frameset, cpl_frame_duplicate (frame));
484 cpl_msg_info (cpl_func,
"There is no DARK in the frame set");
490 if (!cpl_frameset_is_empty(skyframeset)) {
493 frame = cpl_frameset_get_position(skyframeset, 0);
494 filename = cpl_frame_get_filename(frame);
496 cpl_msg_info (cpl_func,
"File %s is a raw SKY file", FILESHORT(filename));
498 data = gravi_data_load(filename);
499 primary_hdr = gravi_data_get_propertylist(data, GRAVI_PRIMARY_HDR_NAME_EXT);
502 darkOrSky_map = gravi_compute_dark(data);
503 FREE (gravi_data_delete,data);
505 CPLCHECK_CLEAN(
"Error while computing the darkOrSky_map");
508 cpl_frameset_insert (dark_frameset, cpl_frame_duplicate (frame));
510 primary_hdr_dark = gravi_data_get_propertylist(darkOrSky_map,
511 GRAVI_PRIMARY_HDR_NAME_EXT);
513 applist = gravi_propertylist_get_qc (primary_hdr_dark);
515 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, SKY);
517 out_dark = gravi_data_product_name (filename,
"sky");
519 gravi_data_save(darkOrSky_map, frameset, out_dark, parlist,
520 skyframeset, frame,
"gravi_dual", applist);
522 CPLCHECK_CLEAN(
"Could not save the darkOrSky_map");
524 FREE (cpl_propertylist_delete,applist);
525 FREE (cpl_free,out_dark);
527 else if (testDarkSky) {
528 darkOrSky_map = dark_map;
531 cpl_msg_info (cpl_func,
"There is no sky in the frame set");
534 cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
"No dark or sky frames in the frameset");
538 FREE (cpl_frameset_delete,skyframeset);
544 if (!cpl_frameset_is_empty(badpix_frameset)){
547 frame = cpl_frameset_get_position(badpix_frameset, 0);
548 filename = cpl_frame_get_filename(frame);
550 cpl_msg_info (cpl_func,
"File %s is a BAD pixel map", FILESHORT(filename));
551 badpix_map = gravi_data_load(filename);
555 badpix_map = gravi_compute_badpix(darkOrSky_map, parlist);
557 CPLCHECK_CLEAN(
"Could not compute the BAD pixel map");
560 bad_primary_hdr = gravi_data_get_propertylist (badpix_map, GRAVI_PRIMARY_HDR_NAME_EXT);
561 applist = gravi_propertylist_get_qc (bad_primary_hdr);
563 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, BAD);
565 frame = cpl_frameset_get_position (dark_frameset, 0);
567 gravi_data_save (badpix_map, frameset,
"gravi_bad_map.fits", parlist,
568 dark_frameset, frame,
"gravi_dual", applist);
570 CPLCHECK_CLEAN(
"Could not save the BAD pixel map");
572 FREE (cpl_propertylist_delete, applist);
579 frame = cpl_frameset_get_position(gain_frameset, 0);
580 filename = cpl_frame_get_filename(frame);
582 cpl_msg_info (cpl_func,
"File %s is a master FLAT already computed", FILESHORT(filename));
583 profile_map = gravi_data_load(filename);
589 frame = cpl_frameset_get_position(wave_frameset, 0);
590 filename = cpl_frame_get_filename(frame);
592 cpl_msg_info (cpl_func,
"File %s is a master WAVE map already computed", FILESHORT(filename));
593 wave_map = gravi_data_load(filename);
596 if ((wave_map == NULL) || (profile_map == NULL)) {
597 cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
"No WAVE or FLAT frames in the frameset");
605 frame = cpl_frameset_get_position(p2vm_frameset, 0);
606 filename = cpl_frame_get_filename(frame);
608 cpl_msg_info (cpl_func,
"File %s is a P2VM file already computed", FILESHORT(filename));
609 p2vm_map = gravi_data_load (filename);
611 CPLCHECK_CLEAN(
"Error while loading the P2VM map");
616 if (!cpl_frameset_is_empty(visflat_frameset))
618 frame = cpl_frameset_get_position(visflat_frameset, 0);
619 filename = cpl_frame_get_filename(frame);
620 cpl_msg_info (cpl_func,
"File %s is a VIS_FLAT already computed", FILESHORT(filename));
621 vis_flat = gravi_data_load(filename);
629 detector_table = gravi_data_get_table (p2vm_map, GRAVI_IMAGING_DETECTOR_FT_EXT);
630 n_region = cpl_table_get_nrow(detector_table);
632 wave_plist = gravi_data_get_oi_propertylist
633 (p2vm_map, GRAVI_OI_WAVE_SWITCH(GRAVI_TYPE_SC),
634 GRAVI_SPECTRO_SWITCH(GRAVI_TYPE_SC,0,2));
635 nwave_sc = gravi_pfits_get_nwave (wave_plist);
636 wave_plist = gravi_data_get_oi_propertylist (p2vm_map,
637 GRAVI_OI_WAVE_SWITCH(GRAVI_TYPE_FT),
638 GRAVI_SPECTRO_SWITCH(GRAVI_TYPE_FT,0,2));
639 nwave_ft = gravi_pfits_get_nwave (wave_plist);
642 wave_plist = gravi_data_get_oi_propertylist
643 (p2vm_map, GRAVI_OI_WAVE_SWITCH(GRAVI_TYPE_SC), GRAVI_SPECTRO_SWITCH(GRAVI_TYPE_SC,0,1));
644 nwave_sc = gravi_pfits_get_nwave (wave_plist);
645 wave_plist = gravi_data_get_oi_propertylist (p2vm_map,
646 GRAVI_OI_WAVE_SWITCH(GRAVI_TYPE_FT), GRAVI_SPECTRO_SWITCH(GRAVI_TYPE_FT,0,1));
647 nwave_ft = gravi_pfits_get_nwave (wave_plist);
650 primary_hdr = gravi_data_get_propertylist (wave_map, GRAVI_PRIMARY_HDR_NAME_EXT);
652 CPLCHECK_CLEAN(
"Missed one the preproc parameters");
661 calib_datas = cpl_malloc(nb_calfile *
sizeof(gravi_data *));
663 calib_datas[0] = darkOrSky_map;
664 calib_datas[1] = wave_map;
665 calib_datas[2] = profile_map;
666 calib_datas[3] = badpix_map;
668 calib_datas[4] = dark_map;
671 used_frameset=cpl_frameset_new();
672 cpl_frameset_join(used_frameset, cpl_frameset_duplicate(dark_frameset));
673 cpl_frameset_join(used_frameset, cpl_frameset_duplicate(badpix_frameset));
674 cpl_frameset_join(used_frameset, cpl_frameset_duplicate(wave_frameset));
675 cpl_frameset_join(used_frameset, cpl_frameset_duplicate(gain_frameset));
676 cpl_frameset_join(used_frameset, cpl_frameset_duplicate(p2vm_frameset));
678 p = cpl_parameterlist_find_const(parlist,
"gravi.preproc_param.preproc_file");
680 p_ = cpl_parameterlist_find_const(parlist,
"gravi.preproc_param.p2vmreduced_file");
686 oi_vis = gravi_data_new(0);
687 primary_hdr = gravi_data_get_propertylist (p2vm_map,
688 GRAVI_PRIMARY_HDR_NAME_EXT);
690 const char * resol_p2vm = gravi_pfits_get_resolution (primary_hdr);
691 const char * resol_file;
699 for (thread = 0; thread < nb_frame; thread++){
701 frame = cpl_frameset_get_position (recipe_frameset, thread);
702 frame_tag = cpl_frame_get_tag (frame);
703 filename = cpl_frame_get_filename (frame);
705 data = gravi_data_load(filename);
706 primary_hdr = gravi_data_get_propertylist (data,
707 GRAVI_PRIMARY_HDR_NAME_EXT);
711 shutter = gravi_shutters_check(primary_hdr);
712 resol_file = gravi_pfits_get_resolution (primary_hdr);
715 if ((shutter [0] != 1) || (shutter [1] != 1) ||
716 (shutter [2] != 1) || (shutter [3] != 1)) {
717 cpl_msg_warning( cpl_func,
"RAW data shutters: %d-%d-%d-%d",
718 shutter[0], shutter[1], shutter[2], shutter[3] );
721 cpl_msg_info (cpl_func,
"Preprocessing of the dual"
722 " field file %s", FILESHORT(filename));
724 preproc_data = gravi_preproc(data, calib_datas, nb_calfile, p2vm_map, parlist);
726 FREE (gravi_data_delete,data);
727 FREE (cpl_free,shutter);
729 CPLCHECK_CLEAN(
"Cannot preproc the data");
732 if (cpl_parameter_get_bool(p)){
734 preproc_name = gravi_data_product_name (filename,
"preproc");
735 cpl_frameset * preproc_frame = cpl_frameset_new ();
736 cpl_frameset_insert (preproc_frame, cpl_frame_duplicate (frame));
737 cpl_frameset_join(preproc_frame, cpl_frameset_duplicate(used_frameset));
739 applist = gravi_propertylist_get_qc (gravi_data_get_propertylist
740 (preproc_data, GRAVI_PRIMARY_HDR_NAME_EXT));
742 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, PREPROC);
744 gravi_data_save(preproc_data, frameset, preproc_name, parlist,
745 preproc_frame, frame,
"gravi_dual", applist);
747 CPLCHECK_CLEAN(
"Cannot save the PREPROC product");
749 FREE (cpl_free,preproc_name);
750 FREE (cpl_propertylist_delete,applist);
751 FREE (cpl_frameset_delete,preproc_frame);
756 cpl_msg_info (cpl_func,
"Application of the p2vm to file %s", FILESHORT(filename));
757 p2vm_reduce = gravi_p2vm_reduce (preproc_data, p2vm_map,
"gravi_dual", parlist);
758 FREE (gravi_data_delete,preproc_data);
760 CPLCHECK_CLEAN(
"Cannot apply p2vm to the preproc data");
765 gravi_compute_tau0 (p2vm_reduce);
769 cpl_msg_info (cpl_func,
"Computing the average visibilities of file %s", FILESHORT(filename));
770 gravi_vis_reduce (oi_vis, p2vm_reduce, nb_vis, parlist,
"gravi_dual");
772 CPLCHECK_CLEAN(
"Cannot average the visibilities");
776 cpl_msg_info( cpl_func,
"Compute the QC TF parameters" );
777 cpl_errorstate prestate = cpl_errorstate_get();
779 gravi_data * oi_tf = gravi_compute_tf( oi_vis );
781 cpl_propertylist_copy_property_regexp( gravi_data_get_propertylist (oi_vis, GRAVI_PRIMARY_HDR_NAME_EXT),
782 gravi_data_get_propertylist (oi_tf, GRAVI_PRIMARY_HDR_NAME_EXT),
784 FREE (gravi_data_delete,oi_tf);
787 if( cpl_error_get_code() ) {
788 cpl_msg_warning(cpl_func,
"Cannot compute the QC TF parameters for this observation");
789 cpl_errorstate_dump (prestate, 0, NULL);
794 if (cpl_parameter_get_bool(p_)){
795 cpl_msg_info( cpl_func,
"Save the p2vmreduced file" );
798 char * p2vm_name = gravi_data_product_name (filename,
"p2vmreduced");
800 cpl_frameset * p2vmreduced_frame = cpl_frameset_new ();
801 cpl_frameset_insert (p2vmreduced_frame, cpl_frame_duplicate (frame));
802 cpl_frameset_join(p2vmreduced_frame, cpl_frameset_duplicate(used_frameset));
803 applist = gravi_propertylist_get_qc (gravi_data_get_propertylist
804 (p2vm_reduce, GRAVI_PRIMARY_HDR_NAME_EXT));
806 if ((strcmp(frame_tag, DUAL_CAL_SKY_RAW) == 0) ||
807 (strcmp(frame_tag, DUAL_SCI_SKY_RAW) == 0))
808 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, SKYREDUCED);
810 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, P2VMREDUCED);
812 gravi_data_save(p2vm_reduce, frameset, p2vm_name, parlist,
813 p2vmreduced_frame, frame,
"gravi_dual", applist);
815 CPLCHECK_CLEAN(
"Cannot save the P2VMREDUCED product");
817 FREE (cpl_free,p2vm_name);
818 FREE (cpl_propertylist_delete,applist);
819 FREE (cpl_frameset_delete,p2vmreduced_frame);
823 cpl_msg_info(cpl_func,
"Free the p2vmreduced");
824 FREE (gravi_data_delete,p2vm_reduce);
829 if (gravi_param_get_bool(parlist,
"gravi.vis_flat")) {
832 cpl_msg_info (cpl_func,
"Perform the visibility flat with the provided VIS_FLAT file");
833 gravi_flat_vis (oi_vis, vis_flat);
834 CPLCHECK_CLEAN(
"Cannot flat the OI_VIS");
838 cpl_msg_warning (cpl_func,
"vis-flat option requested but no VIS_FLAT in the frameset");
843 frame = cpl_frameset_get_position (recipe_frameset, 0);
844 frame_tag = cpl_frame_get_tag (frame);
845 primary_hdr = gravi_data_get_propertylist(oi_vis,
846 GRAVI_PRIMARY_HDR_NAME_EXT);
847 applist = gravi_propertylist_get_qc (primary_hdr);
849 cpl_propertylist_append_int(applist, GRAVI_NIGHT_OBS,
850 cpl_propertylist_get_int (primary_hdr, GRAVI_NIGHT_OBS));
851 cpl_propertylist_append_string(applist,
"DATE-OBS",
852 cpl_propertylist_get_string (primary_hdr,
"DATE-OBS"));
855 if ((strcmp(frame_tag, GRAVI_DUAL_CALIB) == 0)) {
856 vis_name = gravi_data_product_name (filename,
"dualcal");
857 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, VIS_DUAL_CALIB);
859 else if ((strcmp(frame_tag, GRAVI_DUAL_SCIENCE) == 0)) {
860 vis_name = gravi_data_product_name (filename,
"dualsci");
861 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, VIS_DUAL_SCIENCE);
864 vis_name = gravi_data_product_name (filename,
"dualsci");
865 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, VIS_DUAL_SCIENCE);
868 cpl_frameset_join (recipe_frameset, cpl_frameset_duplicate (used_frameset));
870 gravi_data_save(oi_vis, frameset, vis_name, parlist,
871 recipe_frameset, frame,
"gravi_dual", applist);
873 CPLCHECK_CLEAN(
"Cannot save the VIS product");
881 cpl_msg_info(cpl_func,
"Memory cleanup");
883 FREE (gravi_data_delete,dark_map);
884 FREE (gravi_data_delete,data);
885 FREE (cpl_free,shutter);
886 FREE (cpl_free,preproc_name);
887 FREE (gravi_data_delete,preproc_data);
888 FREE (gravi_data_delete,profile_map);
889 FREE (gravi_data_delete,darkOrSky_map);
890 FREE (gravi_data_delete,wave_map);
891 FREE (gravi_data_delete,badpix_map);
892 FREE (gravi_data_delete,p2vm_map);
893 FREE (gravi_data_delete,vis_flat);
894 FREE (cpl_frameset_delete,darkcalib_frameset);
895 FREE (cpl_frameset_delete,wave_frameset);
896 FREE (cpl_frameset_delete,dark_frameset);
897 FREE (cpl_frameset_delete,gain_frameset);
898 FREE (cpl_frameset_delete,badpix_frameset);
899 FREE (gravi_data_delete,p2vm_reduce);
900 FREE (cpl_free,calib_datas);
901 FREE (cpl_free,vis_name);
902 FREE (cpl_propertylist_delete,applist);
903 FREE (gravi_data_delete,oi_vis);
904 FREE (cpl_frameset_delete,p2vm_frameset);
905 FREE (cpl_frameset_delete,visflat_frameset);
906 FREE (cpl_frameset_delete,recipe_frameset);
907 FREE (cpl_frameset_delete,used_frameset);
909 cpl_msg_info(cpl_func,
"Exit function");
910 return (
int)cpl_error_get_code();