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"
51 static int gravi_all_viscal_create(cpl_plugin *);
52 static int gravi_all_viscal_exec(cpl_plugin *);
53 static int gravi_all_viscal_destroy(cpl_plugin *);
54 static int gravi_all_viscal(cpl_frameset *,
const cpl_parameterlist *);
60 static char gravi_all_viscal_description[] =
61 "This recipe calibrate the visibilities acquired on sicence target using \n"
62 "visibilities acquired on calibrator target. It is used in single mode.\n"
63 "The insput file tags are " VIS_SINGLE_CALIB
" and " VIS_SINGLE_SCIENCE
"\n"
64 "The output FITS file is an OI_FITS with tag " VIS_SINGLE_CALIBRATED
". It contains , \n"
65 "the values of the visibility complex, squared visibility and the cloture phase.\n"
67 "Additionally, it should describe functionality of the expected output."
85 int cpl_plugin_get_info(cpl_pluginlist * list)
87 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
88 cpl_plugin * plugin = &recipe->interface;
90 if (cpl_plugin_init(plugin,
93 CPL_PLUGIN_TYPE_RECIPE,
95 "This recipe is used to calibrate the visibilities",
96 gravi_all_viscal_description,
100 gravi_all_viscal_create,
101 gravi_all_viscal_exec,
102 gravi_all_viscal_destroy)) {
103 cpl_msg_error(cpl_func,
"Plugin initialization failed");
104 (void)cpl_error_set_where(cpl_func);
108 if (cpl_pluginlist_append(list, plugin)) {
109 cpl_msg_error(cpl_func,
"Error adding plugin to list");
110 (void)cpl_error_set_where(cpl_func);
126 static int gravi_all_viscal_create(cpl_plugin * plugin)
132 if (cpl_error_get_code() != CPL_ERROR_NONE) {
133 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
134 cpl_func, __LINE__, cpl_error_get_where());
135 return (
int)cpl_error_get_code();
138 if (plugin == NULL) {
139 cpl_msg_error(cpl_func,
"Null plugin");
140 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
144 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
145 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
146 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
150 recipe = (cpl_recipe *)plugin;
153 recipe->parameters = cpl_parameterlist_new();
154 if (recipe->parameters == NULL) {
155 cpl_msg_error(cpl_func,
"Parameter list allocation failed");
156 cpl_ensure_code(0, (
int)CPL_ERROR_ILLEGAL_OUTPUT);
162 p = cpl_parameter_new_value(
"gravi.delta-time-calib",
163 CPL_TYPE_DOUBLE,
"Delta time to interpolate the TF [s]",
"gravi.gravi_all_viscal", 3600.0);
164 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"delta-time-calib");
165 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
166 cpl_parameterlist_append(recipe->parameters, p);
169 p = cpl_parameter_new_value(
"gravi.force-calib",
170 CPL_TYPE_BOOL,
"Force the calibration, don't check setup",
"gravi.gravi_all_viscal", FALSE);
171 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"force-calib");
172 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
173 cpl_parameterlist_append(recipe->parameters, p);
186 static int gravi_all_viscal_exec(cpl_plugin * plugin)
191 cpl_errorstate initial_errorstate = cpl_errorstate_get();
194 if (cpl_error_get_code() != CPL_ERROR_NONE) {
195 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
196 cpl_func, __LINE__, cpl_error_get_where());
197 return (
int)cpl_error_get_code();
200 if (plugin == NULL) {
201 cpl_msg_error(cpl_func,
"Null plugin");
202 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
206 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
207 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
208 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
212 recipe = (cpl_recipe *)plugin;
215 if (recipe->parameters == NULL) {
216 cpl_msg_error(cpl_func,
"Recipe invoked with NULL parameter list");
217 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
219 if (recipe->frames == NULL) {
220 cpl_msg_error(cpl_func,
"Recipe invoked with NULL frame set");
221 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
225 recipe_status = gravi_all_viscal(recipe->frames, recipe->parameters);
229 if (cpl_dfs_update_product_header(recipe->frames)) {
231 recipe_status = (int)cpl_error_get_code();
235 if (!cpl_errorstate_is_equal(initial_errorstate)) {
238 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
241 return recipe_status;
251 static int gravi_all_viscal_destroy(cpl_plugin * plugin)
255 if (plugin == NULL) {
256 cpl_msg_error(cpl_func,
"Null plugin");
257 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
261 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
262 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
263 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
267 recipe = (cpl_recipe *)plugin;
269 cpl_parameterlist_delete(recipe->parameters);
284 static int gravi_all_viscal(cpl_frameset * frameset,
285 const cpl_parameterlist * parlist)
287 cpl_frameset * vis_calib_frameset = NULL, * vis_sci_frameset = NULL, *used_frame = NULL;
288 cpl_frameset * tf_calib_frameset = NULL, * calib_frameset = NULL;
289 cpl_frame * frame = NULL;
290 cpl_propertylist * applist = NULL, * primary_hdr = NULL;
292 cpl_errorstate errorstate;
294 const char * filename = NULL;
297 gravi_data ** vis_calibs = NULL, *vis_calib = NULL, * zero_data = NULL, * tf_science = NULL;
298 gravi_data * calibrated = NULL, * vis_data = NULL;
300 int nb_frame_tf, nb_frame_calib, nb_frame_sci, i, j, nb_calib = 0;
304 cpl_msg_set_time_on();
305 cpl_msg_set_component_on();
306 cpl_msg_info(cpl_func,
"Start function");
309 cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
310 cpl_error_get_code());
313 vis_calib_frameset = gravi_frameset_extract_vis_calib (frameset);
314 vis_sci_frameset = gravi_frameset_extract_vis_science (frameset);
315 tf_calib_frameset = gravi_frameset_extract_tf_calib (frameset);
319 if ( cpl_frameset_is_empty(vis_calib_frameset) &&
320 cpl_frameset_is_empty(tf_calib_frameset) ) {
321 FREE (cpl_frameset_delete,vis_calib_frameset);
322 FREE (cpl_frameset_delete,vis_sci_frameset);
323 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
324 "No VIS_*_CAL frames in the input ");
328 nb_frame_tf = cpl_frameset_get_size(tf_calib_frameset);
329 nb_frame_calib = cpl_frameset_get_size(vis_calib_frameset);
330 nb_frame_sci = cpl_frameset_get_size(vis_sci_frameset);
337 vis_calibs = cpl_malloc ( (nb_frame_calib + nb_frame_tf) *
sizeof (gravi_data *));
338 for (j = 0; j < (nb_frame_calib + nb_frame_tf); j++) vis_calibs[j] = NULL;
341 calib_frameset = cpl_frameset_new();
344 for (j = 0; j < nb_frame_calib; j++) {
345 frame = cpl_frameset_get_position (vis_calib_frameset, j);
346 filename = cpl_frame_get_filename (frame);
348 cpl_msg_info (cpl_func,
"*** Compute TF: %s (%i over %i) ***", FILESHORT(filename), j+1, nb_frame_calib);
349 errorstate = cpl_errorstate_get();
352 vis_data = gravi_data_load (filename);
353 vis_calib = gravi_compute_tf(vis_data);
355 if ( cpl_error_get_code() != CPL_ERROR_NONE ){
356 cpl_msg_warning(cpl_func,
"Cannot compute the TF for file %s", FILESHORT(filename));
357 FREE (gravi_data_delete, vis_data);
358 FREE (gravi_data_delete, vis_calib);
359 cpl_errorstate_set (errorstate);
364 primary_hdr = gravi_data_get_propertylist(vis_calib, GRAVI_PRIMARY_HDR_NAME_EXT);
365 applist = gravi_propertylist_get_qc (primary_hdr);
366 data_mode=gravi_data_frame_get_mode(frame);
367 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, TF_CAL_SWITCH(data_mode));
370 used_frame = cpl_frameset_new();
371 cpl_frameset_insert(used_frame, cpl_frame_duplicate (frame));
375 tmp = gravi_data_product_name (filename,
"tfcal");
376 gravi_data_save(vis_calib, frameset, tmp, parlist,
377 used_frame, frame,
"gravi_all_viscal", applist);
380 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
381 cpl_msg_warning(cpl_func,
"Cannot save the TF for file %s", FILESHORT(filename));
382 FREE (gravi_data_delete,vis_data);
383 FREE (gravi_data_delete,vis_calib);
384 FREE (cpl_frameset_delete,used_frame);
385 FREE (cpl_propertylist_delete,applist);
386 cpl_errorstate_set (errorstate);
391 vis_calibs[nb_calib] = vis_calib;
396 frame = cpl_frame_duplicate (frame);
397 cpl_frame_set_group (frame, CPL_FRAME_GROUP_CALIB);
398 cpl_frameset_insert (calib_frameset, frame);
401 FREE (gravi_data_delete,vis_data);
402 FREE (cpl_propertylist_delete,applist);
403 FREE (cpl_frameset_delete,used_frame);
408 cpl_msg_info (cpl_func,
"*** Load already computed TF ***");
409 for (j = 0; j < nb_frame_tf; j++) {
410 frame = cpl_frameset_get_position (tf_calib_frameset, j);
411 filename = cpl_frame_get_filename (frame);
413 cpl_msg_info( cpl_func,
" %s (%i over %i)", FILESHORT(filename), j+1, nb_frame_tf);
414 errorstate = cpl_errorstate_get();
417 vis_calib = gravi_data_load (filename);
419 if ( cpl_error_get_code() != CPL_ERROR_NONE ){
420 cpl_msg_warning (cpl_func,
"Cannot load the TF file %s", FILESHORT(filename));
421 FREE (gravi_data_delete,vis_calib);
422 cpl_errorstate_set (errorstate);
427 vis_calibs[nb_calib] = vis_calib;
431 frame = cpl_frame_duplicate (frame);
432 cpl_frame_set_group (frame, CPL_FRAME_GROUP_CALIB);
433 cpl_frameset_insert (calib_frameset, frame);
438 cpl_msg_info(cpl_func,
"Load or create successfully %i TF over %i input CAL files", nb_calib, nb_frame_calib + nb_frame_tf);
444 if ( nb_calib > 1 ) {
445 errorstate = cpl_errorstate_get();
447 cpl_msg_info (cpl_func,
"*** Compute the zero of the metrology -- FIXME: to be done ***");
448 zero_data = gravi_compute_zp (vis_calibs, nb_calib);
450 primary_hdr = gravi_data_get_propertylist(zero_data, GRAVI_PRIMARY_HDR_NAME_EXT);
451 applist = gravi_propertylist_get_qc (primary_hdr);
453 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, ZP_CAL);
454 gravi_data_save(zero_data, frameset,
"zero_metrology.fits", parlist,
455 calib_frameset, NULL,
"gravi_all_viscal", applist);
457 if ( cpl_error_get_code() != CPL_ERROR_NONE) {
458 cpl_msg_warning(cpl_func,
"Cannot save the zero_metrology.fits");
459 FREE (gravi_data_delete,zero_data);
460 cpl_errorstate_set (errorstate);
463 FREE (cpl_propertylist_delete,applist);
471 for (i = 0; i < nb_frame_sci; i++){
472 frame = cpl_frameset_get_position (vis_sci_frameset, i);
473 filename = cpl_frame_get_filename (frame);
475 cpl_msg_info (cpl_func,
"*** Calibration of file %s (%i over %i) ***", FILESHORT(filename), i+1, nb_frame_sci);
476 errorstate = cpl_errorstate_get();
478 vis_data = gravi_data_load (filename);
479 tf_science = gravi_data_duplicate (vis_data);
480 calibrated = gravi_calib_vis (vis_data, vis_calibs, nb_calib, zero_data, tf_science, parlist);
482 if ( cpl_error_get_code() != CPL_ERROR_NONE){
483 cpl_msg_warning(cpl_func,
"Cannot calibrate the visibility of file %s", FILESHORT(filename));
484 FREE (gravi_data_delete,vis_data);
485 FREE (gravi_data_delete,tf_science);
486 FREE (gravi_data_delete,calibrated);
487 FREE (cpl_frameset_delete,used_frame);
488 cpl_errorstate_set (errorstate);
493 used_frame = cpl_frameset_duplicate (calib_frameset);
494 cpl_frameset_insert (used_frame, cpl_frame_duplicate (frame));
497 primary_hdr = gravi_data_get_propertylist(calibrated, GRAVI_PRIMARY_HDR_NAME_EXT);
498 applist = gravi_propertylist_get_qc (primary_hdr);
500 if (!strcmp(cpl_frame_get_tag (frame), VIS_SINGLE_SCIENCE))
501 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, VIS_SINGLE_CALIBRATED);
502 else if (!strcmp(cpl_frame_get_tag (frame), VIS_DUAL_SCIENCE))
503 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, VIS_DUAL_CALIBRATED);
505 cpl_propertylist_update_int(gravi_data_get_propertylist(calibrated, GRAVI_OI_VIS_SC_EXT),
"OI_REVN", 1);
506 cpl_propertylist_update_int(gravi_data_get_propertylist(calibrated, GRAVI_OI_VIS2_SC_EXT),
"OI_REVN", 1);
507 cpl_propertylist_update_int(gravi_data_get_propertylist(calibrated, GRAVI_OI_T3_SC_EXT),
"OI_REVN", 1);
508 cpl_propertylist_update_int(gravi_data_get_propertylist(calibrated, GRAVI_OI_WAVELENGTH_SC_EXT),
"OI_REVN", 1);
509 cpl_propertylist_update_int(gravi_data_get_propertylist(calibrated, GRAVI_OI_ARRAY_EXT),
"OI_REVN", 1);
513 tmp = gravi_data_product_name (filename,
"calibrated");
514 gravi_data_save(calibrated, frameset, tmp, parlist, used_frame, frame,
"gravi_all_viscal", applist);
517 if( cpl_error_get_code() != CPL_ERROR_NONE) {
518 cpl_msg_warning(cpl_func,
"Cannot save the calibrated visibilities for file %s", FILESHORT(filename));
519 FREE (gravi_data_delete,vis_data);
520 FREE (gravi_data_delete,tf_science);
521 FREE (gravi_data_delete,calibrated);
522 FREE (cpl_propertylist_delete,applist);
523 FREE (cpl_frameset_delete,used_frame);
524 cpl_errorstate_set (errorstate);
530 tmp = gravi_data_product_name (filename,
"tfsci");
531 data_mode=gravi_data_frame_get_mode(frame);
532 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, TF_SCI_SWITCH(data_mode));
533 gravi_data_save(tf_science, frameset, tmp, parlist,
534 used_frame, frame,
"gravi_all_viscal", applist);
537 if ( cpl_error_get_code() != CPL_ERROR_NONE) {
538 cpl_msg_warning(cpl_func,
"Cannot save the TF interpolated for file %s", FILESHORT(filename));
539 FREE (gravi_data_delete,vis_data);
540 FREE (gravi_data_delete,tf_science);
541 FREE (gravi_data_delete,calibrated);
542 FREE (cpl_propertylist_delete,applist);
543 FREE (cpl_frameset_delete,used_frame);
544 cpl_errorstate_set (errorstate);
548 FREE (gravi_data_delete,vis_data);
549 FREE (gravi_data_delete,tf_science);
550 FREE (gravi_data_delete,calibrated);
551 FREE (cpl_propertylist_delete,applist);
552 FREE (cpl_frameset_delete,used_frame);
557 FREE (gravi_data_delete,zero_data);
558 FREE (cpl_frameset_delete,tf_calib_frameset);
559 FREE (cpl_frameset_delete,vis_calib_frameset);
560 FREE (cpl_frameset_delete,vis_sci_frameset);
561 FREE (cpl_frameset_delete,used_frame);
562 FREELOOP (gravi_data_delete,vis_calibs,nb_frame_calib+nb_frame_tf);
564 cpl_msg_info(cpl_func,
"Exit function");
565 return (
int)cpl_error_get_code();