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_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" 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 *);
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
" (>50) : raw dispersion\n" 82 GRAVI_RECIPE_OUTPUT
"\n" 83 GRAVI_DISP_VIS
" : intermediate product\n" 84 GRAVI_DISP_MODEL
" : dispersion model of FDDL\n" 102 int cpl_plugin_get_info(cpl_pluginlist * list)
104 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
105 cpl_plugin * plugin = &recipe->interface;
107 if (cpl_plugin_init(plugin,
109 GRAVI_BINARY_VERSION,
110 CPL_PLUGIN_TYPE_RECIPE,
113 gravity_disp_description,
114 "Nabih Azouaoui, Vincent Lapeyrere, JB. Le Bouquin",
119 gravity_disp_destroy)) {
120 cpl_msg_error(cpl_func,
"Plugin initialization failed");
121 (void)cpl_error_set_where(cpl_func);
125 if (cpl_pluginlist_append(list, plugin)) {
126 cpl_msg_error(cpl_func,
"Error adding plugin to list");
127 (void)cpl_error_set_where(cpl_func);
143 static int gravity_disp_create(cpl_plugin * plugin)
149 if (cpl_error_get_code() != CPL_ERROR_NONE) {
150 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
151 cpl_func, __LINE__, cpl_error_get_where());
152 return (
int)cpl_error_get_code();
155 if (plugin == NULL) {
156 cpl_msg_error(cpl_func,
"Null plugin");
157 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
161 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
162 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
163 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
167 recipe = (cpl_recipe *)plugin;
170 recipe->parameters = cpl_parameterlist_new();
171 if (recipe->parameters == NULL) {
172 cpl_msg_error(cpl_func,
"Parameter list allocation failed");
173 cpl_ensure_code(0, (
int)CPL_ERROR_ILLEGAL_OUTPUT);
180 gravi_parameter_add_static_name (recipe->parameters);
183 gravi_parameter_add_preproc_file (recipe->parameters);
184 gravi_parameter_add_p2vmred_file (recipe->parameters);
185 gravi_parameter_add_vis_file (recipe->parameters);
188 gravi_parameter_add_compute_snr (recipe->parameters, isCalib);
189 gravi_parameter_add_compute_signal (recipe->parameters, isCalib);
190 gravi_parameter_add_rejection (recipe->parameters, isCalib);
191 gravi_parameter_add_compute_vis (recipe->parameters, isCalib);
203 static int gravity_disp_exec(cpl_plugin * plugin)
208 cpl_errorstate initial_errorstate = cpl_errorstate_get();
211 if (cpl_error_get_code() != CPL_ERROR_NONE) {
212 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
213 cpl_func, __LINE__, cpl_error_get_where());
214 return (
int)cpl_error_get_code();
217 if (plugin == NULL) {
218 cpl_msg_error(cpl_func,
"Null plugin");
219 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
223 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
224 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
225 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
229 recipe = (cpl_recipe *)plugin;
232 if (recipe->parameters == NULL) {
233 cpl_msg_error(cpl_func,
"Recipe invoked with NULL parameter list");
234 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
236 if (recipe->frames == NULL) {
237 cpl_msg_error(cpl_func,
"Recipe invoked with NULL frame set");
238 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
242 recipe_status = gravity_disp(recipe->frames, recipe->parameters);
246 if (cpl_dfs_update_product_header(recipe->frames)) {
248 recipe_status = (int)cpl_error_get_code();
252 if (!cpl_errorstate_is_equal(initial_errorstate)) {
255 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
258 return recipe_status;
268 static int gravity_disp_destroy(cpl_plugin * plugin)
272 if (plugin == NULL) {
273 cpl_msg_error(cpl_func,
"Null plugin");
274 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
278 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
279 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
280 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
284 recipe = (cpl_recipe *)plugin;
286 cpl_parameterlist_delete(recipe->parameters);
301 static int gravity_disp(cpl_frameset * frameset,
302 const cpl_parameterlist * parlist)
304 cpl_frameset * disp_frameset=NULL, * darkcalib_frameset=NULL,
305 * dark_frameset=NULL, * wavecalib_frameset=NULL,
306 * badcalib_frameset=NULL, * flatcalib_frameset=NULL, * dispvis_frameset=NULL,
307 * p2vmcalib_frameset=NULL, * wavelampcalib_frameset=NULL, *used_frameset=NULL,
308 * current_frameset=NULL;
310 cpl_frame * frame=NULL;
312 gravi_data * disp_map = NULL, * data = NULL, * dark_map = NULL, * wave_map = NULL,
313 * profile_map = NULL, * badpix_map = NULL, * p2vmred_data = NULL, * preproc_data = NULL,
314 * p2vm_map = NULL, * vis_data = NULL, * tmpvis_data=NULL, * argon_data=NULL;
319 gravity_print_banner ();
320 cpl_msg_set_time_on();
321 cpl_msg_set_component_on();
322 gravi_msg_function_start(1);
326 cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
327 cpl_error_get_code()) ;
330 dispvis_frameset = gravi_frameset_extract_dispvis_data (frameset);
333 used_frameset = cpl_frameset_new();
336 if (cpl_frameset_is_empty (dispvis_frameset)){
339 wavelampcalib_frameset = gravi_frameset_extract_wavelamp_map (frameset);
340 p2vmcalib_frameset = gravi_frameset_extract_p2vm_map (frameset);
341 wavecalib_frameset = gravi_frameset_extract_wave_map (frameset);
342 flatcalib_frameset = gravi_frameset_extract_flat_map (frameset);
343 badcalib_frameset = gravi_frameset_extract_bad_map (frameset);
345 darkcalib_frameset = gravi_frameset_extract_dark_map (frameset);
346 dark_frameset = gravi_frameset_extract_dark_data (frameset);
348 disp_frameset = gravi_frameset_extract_disp_data (frameset);
351 if ( cpl_frameset_is_empty(p2vmcalib_frameset) ||
352 cpl_frameset_is_empty(wavecalib_frameset) ||
353 cpl_frameset_is_empty(flatcalib_frameset) ||
354 cpl_frameset_is_empty(badcalib_frameset) ||
355 ( cpl_frameset_is_empty(dark_frameset) &&
356 cpl_frameset_is_empty(darkcalib_frameset) ) ||
357 cpl_frameset_is_empty(disp_frameset) ||
358 cpl_frameset_is_empty(wavelampcalib_frameset) ) {
360 cpl_error_set_message (cpl_func, CPL_ERROR_ILLEGAL_INPUT,
361 "Missing P2VM, DARK, BAD, WAVE, WAVELAMP, FLAT or DISP frames") ;
369 if (!cpl_frameset_is_empty (dark_frameset)) {
371 frame = cpl_frameset_get_position (dark_frameset, 0);
372 data = gravi_data_load_rawframe (frame, used_frameset);
373 gravi_data_detector_cleanup (data, parlist);
376 dark_map = gravi_compute_dark (data);
377 FREE (gravi_data_delete, data);
379 CPLCHECK_CLEAN (
"Could not compute the DARK map");
382 gravi_data_save_new (dark_map, frameset, NULL, parlist,
383 NULL, frame,
"gravi_single",
384 NULL, GRAVI_DARK_MAP);
386 CPLCHECK_CLEAN (
"Could not save the DARK map");
388 else if (!cpl_frameset_is_empty (darkcalib_frameset)) {
390 frame = cpl_frameset_get_position (darkcalib_frameset, 0);
391 dark_map = gravi_data_load_frame (frame, used_frameset);
393 CPLCHECK_CLEAN (
"Could not load the DARK map");
396 cpl_msg_error (cpl_func,
"There is no DARK in the frame set");
399 frame = cpl_frameset_get_position (badcalib_frameset, 0);
400 badpix_map = gravi_data_load_frame (frame, used_frameset);
403 frame = cpl_frameset_get_position (flatcalib_frameset, 0);
404 profile_map = gravi_data_load_frame (frame, used_frameset);
407 frame = cpl_frameset_get_position (wavecalib_frameset, 0);
408 wave_map = gravi_data_load_frame (frame, used_frameset);
411 frame = cpl_frameset_get_position (p2vmcalib_frameset, 0);
412 p2vm_map = gravi_data_load_frame (frame, used_frameset);
414 CPLCHECK_CLEAN (
"Error while loading the calibration map");
421 nb_frame = cpl_frameset_get_size (disp_frameset);
422 for (
int ivis = 0; ivis < nb_frame; ivis++) {
423 current_frameset = cpl_frameset_duplicate (used_frameset);
425 cpl_msg_info (cpl_func,
"*** Processing file %d over %d *** ", ivis+1, nb_frame);
427 frame = cpl_frameset_get_position (disp_frameset, ivis);
428 data = gravi_data_load_rawframe (frame, current_frameset);
429 gravi_data_detector_cleanup (data, parlist);
432 preproc_data = gravi_extract_spectrum (data, profile_map, dark_map,
433 badpix_map, NULL, parlist);
434 CPLCHECK_CLEAN (
"Cannot extract spectrum");
437 gravi_align_spectrum (preproc_data, wave_map, p2vm_map);
438 CPLCHECK_CLEAN (
"Cannot re-interpolate spectrum");
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");
448 FREE (gravi_data_delete,data);
451 if (gravi_param_get_bool (parlist,
"gravity.dfs.preproc-file")) {
453 gravi_data_save_new (preproc_data, frameset, NULL, parlist,
454 current_frameset, frame,
"gravity_disp",
455 NULL, GRAVI_PREPROC);
457 CPLCHECK_CLEAN (
"Could not save the 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");
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");
473 gravi_compute_opdc_state (p2vmred_data);
474 CPLCHECK_CLEAN (
"Cannot reduce OPDC");
477 gravi_metrology_reduce (p2vmred_data);
478 CPLCHECK_CLEAN (
"Cannot reduce metrology");
481 gravi_compute_snr (p2vmred_data, parlist);
482 CPLCHECK_MSG (
"Cannot compute SNR");
485 gravi_compute_signals (p2vmred_data, disp_map, parlist);
486 CPLCHECK_MSG (
"Cannot compute signals");
489 gravi_compute_rejection (p2vmred_data, parlist);
490 CPLCHECK_MSG (
"Cannot rejection flags signals");
493 if (gravi_param_get_bool (parlist,
"gravity.dfs.p2vmred-file")) {
495 gravi_data_save_new (p2vmred_data, frameset, NULL, parlist,
496 current_frameset, frame,
"gravity_disp",
497 NULL, GRAVI_P2VMRED_SINGLE_CALIB);
499 CPLCHECK_CLEAN (
"Cannot save the P2VMREDUCED product");
505 tmpvis_data = gravi_compute_vis (p2vmred_data, parlist);
506 CPLCHECK_CLEAN (
"Cannot average the visibilities");
509 if (gravi_param_get_bool (parlist,
"gravity.dfs.vis-file")) {
511 gravi_data_save_new (tmpvis_data, frameset, NULL, parlist,
512 current_frameset, frame,
"gravity_disp",
513 NULL, GRAVI_VIS_SINGLE_CALIB);
515 CPLCHECK_CLEAN (
"Cannot save the VIS product");
520 vis_data = tmpvis_data; tmpvis_data = NULL;
523 cpl_msg_info (cpl_func,
"Merge with previous OI_VIS");
524 gravi_data_append (vis_data, tmpvis_data, 1);
525 FREE (gravi_data_delete, tmpvis_data);
527 CPLCHECK_CLEAN (
"Cannot merge the visibilities");
529 cpl_msg_info (cpl_func,
"Free the p2vmreduced");
530 FREE (cpl_frameset_delete, current_frameset);
531 FREE (gravi_data_delete, p2vmred_data);
537 gravi_vis_mjd_to_time (vis_data);
540 frame = cpl_frameset_get_position (wavelampcalib_frameset, 0);
541 argon_data = gravi_data_load_frame (frame, used_frameset);
544 gravi_data_copy_ext (vis_data, argon_data,
"POS_ARGON");
547 cpl_frameset_join (used_frameset, disp_frameset);
548 frame = cpl_frameset_get_position (disp_frameset, 0);
550 gravi_data_save_new (vis_data, frameset, NULL, parlist,
551 used_frameset, frame,
"gravity_disp",
552 NULL, GRAVI_DISP_VIS);
554 CPLCHECK_CLEAN(
"Could not save the VIS_SINGLE product");
556 FREE (gravi_data_delete, profile_map);
557 FREE (gravi_data_delete, dark_map);
558 FREE (gravi_data_delete, wave_map);
559 FREE (gravi_data_delete, badpix_map);
560 FREE (gravi_data_delete, p2vm_map);
561 FREE (cpl_frameset_delete, darkcalib_frameset);
562 FREE (cpl_frameset_delete, wavecalib_frameset);
563 FREE (cpl_frameset_delete, dark_frameset);
564 FREE (cpl_frameset_delete, flatcalib_frameset);
565 FREE (cpl_frameset_delete, badcalib_frameset);
566 FREE (cpl_frameset_delete, p2vmcalib_frameset);
567 FREE (cpl_frameset_delete, wavelampcalib_frameset);
572 frame = cpl_frameset_get_position (dispvis_frameset, 0);
573 vis_data = gravi_data_load_frame (frame, used_frameset);
575 CPLCHECK_CLEAN (
"Cannot load the DISP_VIS file");
577 disp_frameset = cpl_frameset_duplicate (dispvis_frameset);
584 gravi_disp_cleanup (vis_data);
586 disp_map = gravi_compute_disp (vis_data);
588 CPLCHECK_CLEAN (
"Error while computing the disp_map");
591 frame = cpl_frameset_get_position (disp_frameset, 0);
594 gravi_data_save_new (disp_map, frameset, NULL, parlist,
595 used_frameset, frame,
"gravity_disp",
596 NULL, GRAVI_DISP_MODEL);
598 CPLCHECK_CLEAN(
"Could not save the DISP_MODEL product");
604 cpl_msg_info(cpl_func,
"Memory cleanup");
605 FREE (gravi_data_delete, data);
606 FREE (gravi_data_delete, tmpvis_data);
607 FREE (gravi_data_delete, vis_data);
608 FREE (gravi_data_delete, disp_map);
609 FREE (gravi_data_delete, dark_map);
610 FREE (gravi_data_delete, wave_map);
611 FREE (gravi_data_delete, profile_map);
612 FREE (gravi_data_delete, badpix_map);
613 FREE (gravi_data_delete, p2vmred_data);
614 FREE (gravi_data_delete, p2vm_map);
615 FREE (gravi_data_delete, preproc_data);
616 FREE (cpl_frameset_delete, disp_frameset);
617 FREE (cpl_frameset_delete, dispvis_frameset);
618 FREE (cpl_frameset_delete, darkcalib_frameset);
619 FREE (cpl_frameset_delete, dark_frameset);
620 FREE (cpl_frameset_delete, wavecalib_frameset);
621 FREE (cpl_frameset_delete, badcalib_frameset);
622 FREE (cpl_frameset_delete, flatcalib_frameset);
623 FREE (cpl_frameset_delete, p2vmcalib_frameset);
624 FREE (cpl_frameset_delete, wavelampcalib_frameset);
625 FREE (cpl_frameset_delete, used_frameset);
626 FREE (cpl_frameset_delete, current_frameset);
628 gravi_msg_function_exit(1);
629 return (
int)cpl_error_get_code();