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
" >10 : raw dispersion\n" 82 GRAVI_RECIPE_OUTPUT
"\n" 83 GRAVI_DISP_MODEL
" : dispersion model of FDDL\n" 101 int cpl_plugin_get_info(cpl_pluginlist * list)
103 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
104 cpl_plugin * plugin = &recipe->interface;
106 if (cpl_plugin_init(plugin,
108 GRAVI_BINARY_VERSION,
109 CPL_PLUGIN_TYPE_RECIPE,
112 gravity_disp_description,
113 "Nabih Azouaoui, Vincent Lapeyrere, JB. Le Bouquin",
118 gravity_disp_destroy)) {
119 cpl_msg_error(cpl_func,
"Plugin initialization failed");
120 (void)cpl_error_set_where(cpl_func);
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);
142 static int gravity_disp_create(cpl_plugin * plugin)
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();
154 if (plugin == NULL) {
155 cpl_msg_error(cpl_func,
"Null plugin");
156 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
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);
166 recipe = (cpl_recipe *)plugin;
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);
179 gravi_parameter_add_static_name (recipe->parameters);
182 gravi_parameter_add_preproc_file (recipe->parameters);
183 gravi_parameter_add_p2vmred_file (recipe->parameters);
186 gravi_parameter_add_compute_snr (recipe->parameters, isCalib);
189 gravi_parameter_add_rejection (recipe->parameters, isCalib);
192 gravi_parameter_add_compute_vis (recipe->parameters, isCalib);
204 static int gravity_disp_exec(cpl_plugin * plugin)
209 cpl_errorstate initial_errorstate = cpl_errorstate_get();
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();
218 if (plugin == NULL) {
219 cpl_msg_error(cpl_func,
"Null plugin");
220 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
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);
230 recipe = (cpl_recipe *)plugin;
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);
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);
243 recipe_status = gravity_disp(recipe->frames, recipe->parameters);
247 if (cpl_dfs_update_product_header(recipe->frames)) {
249 recipe_status = (int)cpl_error_get_code();
253 if (!cpl_errorstate_is_equal(initial_errorstate)) {
256 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
259 return recipe_status;
269 static int gravity_disp_destroy(cpl_plugin * plugin)
273 if (plugin == NULL) {
274 cpl_msg_error(cpl_func,
"Null plugin");
275 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
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);
285 recipe = (cpl_recipe *)plugin;
287 cpl_parameterlist_delete(recipe->parameters);
302 static int gravity_disp(cpl_frameset * frameset,
303 const cpl_parameterlist * parlist)
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;
311 cpl_frame * frame=NULL;
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;
320 gravity_print_banner ();
321 cpl_msg_set_time_on();
322 cpl_msg_set_component_on();
323 gravi_msg_function_start(1);
327 cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
328 cpl_error_get_code()) ;
331 dispvis_frameset = gravi_frameset_extract_dispvis_data (frameset);
334 used_frameset = cpl_frameset_new();
337 if (cpl_frameset_is_empty (dispvis_frameset)){
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);
346 darkcalib_frameset = gravi_frameset_extract_dark_map (frameset);
347 dark_frameset = gravi_frameset_extract_dark_data (frameset);
349 disp_frameset = gravi_frameset_extract_disp_data (frameset);
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) ) {
361 cpl_error_set_message (cpl_func, CPL_ERROR_ILLEGAL_INPUT,
362 "Missing P2VM, DARK, BAD, WAVE, WAVELAMP, FLAT or DISP frames") ;
370 if (!cpl_frameset_is_empty (dark_frameset)) {
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);
377 dark_map = gravi_compute_dark (data);
378 FREE (gravi_data_delete, data);
380 CPLCHECK_CLEAN (
"Could not compute the DARK map");
383 gravi_data_save_new (dark_map, frameset, NULL, parlist,
384 NULL, frame,
"gravi_single",
385 NULL, GRAVI_DARK_MAP);
387 CPLCHECK_CLEAN (
"Could not save the DARK map");
389 else if (!cpl_frameset_is_empty (darkcalib_frameset)) {
391 frame = cpl_frameset_get_position (darkcalib_frameset, 0);
392 dark_map = gravi_data_load_frame (frame, used_frameset);
394 CPLCHECK_CLEAN (
"Could not load the DARK map");
397 cpl_msg_error (cpl_func,
"There is no DARK in the frame set");
400 frame = cpl_frameset_get_position (badcalib_frameset, 0);
401 badpix_map = gravi_data_load_frame (frame, used_frameset);
404 frame = cpl_frameset_get_position (flatcalib_frameset, 0);
405 profile_map = gravi_data_load_frame (frame, used_frameset);
408 frame = cpl_frameset_get_position (wavecalib_frameset, 0);
409 wave_map = gravi_data_load_frame (frame, used_frameset);
412 frame = cpl_frameset_get_position (p2vmcalib_frameset, 0);
413 p2vm_map = gravi_data_load_frame (frame, used_frameset);
415 CPLCHECK_CLEAN (
"Error while loading the calibration map");
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);
426 cpl_msg_info (cpl_func,
"*** Processing file %d over %d *** ", ivis+1, nb_frame);
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);
433 preproc_data = gravi_extract_spectrum (data, profile_map, dark_map, badpix_map, NULL);
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");
495 tmpvis_data = gravi_compute_vis (p2vmred_data, parlist);
496 CPLCHECK_CLEAN (
"Cannot average the visibilities");
500 vis_data = tmpvis_data; tmpvis_data = NULL;
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);
507 CPLCHECK_CLEAN (
"Cannot merge the visibilities");
510 if (gravi_param_get_bool (parlist,
"gravity.dfs.p2vmred-file")) {
512 gravi_data_save_new (p2vmred_data, frameset, NULL, parlist,
513 current_frameset, frame,
"gravity_disp",
514 NULL, GRAVI_P2VMRED_SINGLE_CALIB);
516 CPLCHECK_CLEAN (
"Cannot save the P2VMREDUCED product");
519 cpl_msg_info (cpl_func,
"Free the p2vmreduced");
520 FREE (cpl_frameset_delete, current_frameset);
521 FREE (gravi_data_delete, p2vmred_data);
527 gravi_vis_mjd_to_time (vis_data);
530 frame = cpl_frameset_get_position (wavelampcalib_frameset, 0);
531 argon_data = gravi_data_load_frame (frame, used_frameset);
534 gravi_data_copy_ext (vis_data, argon_data,
"POS_ARGON");
537 cpl_frameset_join (used_frameset, disp_frameset);
538 frame = cpl_frameset_get_position (disp_frameset, 0);
540 gravi_data_save_new (vis_data, frameset, NULL, parlist,
541 used_frameset, frame,
"gravity_disp",
542 NULL, GRAVI_DISP_VIS);
544 CPLCHECK_CLEAN(
"Could not save the VIS_SINGLE product");
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);
562 frame = cpl_frameset_get_position (dispvis_frameset, 0);
563 vis_data = gravi_data_load_frame (frame, used_frameset);
565 CPLCHECK_CLEAN (
"Cannot load the DISP_VIS file");
567 disp_frameset = cpl_frameset_duplicate (dispvis_frameset);
574 gravi_disp_cleanup (vis_data);
576 disp_map = gravi_compute_disp (vis_data);
578 CPLCHECK_CLEAN (
"Error while computing the disp_map");
581 frame = cpl_frameset_get_position (disp_frameset, 0);
584 gravi_data_save_new (disp_map, frameset, NULL, parlist,
585 used_frameset, frame,
"gravity_disp",
586 NULL, GRAVI_DISP_MODEL);
588 CPLCHECK_CLEAN(
"Could not save the DISP_MODEL product");
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);
618 gravi_msg_function_exit(1);
619 return (
int)cpl_error_get_code();