41 #include "gravi_utils.h"
42 #include "gravi_pfits.h"
43 #include "gravi_dfs.h"
44 #include "gravi_calib.h"
45 #include "gravi_vis.h"
46 #include "gravi_data.h"
52 static int gravi_all_disp_create(cpl_plugin *);
53 static int gravi_all_disp_exec(cpl_plugin *);
54 static int gravi_all_disp_destroy(cpl_plugin *);
55 static int gravi_all_disp(cpl_frameset *,
const cpl_parameterlist *);
61 static char gravi_all_disp_description[] =
62 "This recipe is associated to the template GRAVI_all_disp. Its aim is to reduce the raw"
63 "calibration file for dispersion calibration. It is used in both modes Dual and Single."
65 "Description DO category\n"
67 "Raw dark file (one or more) " GRAVI_DISP
"\n"
69 "Dispersion (one per input file) " DISP_MODEL
"\n";
86 int cpl_plugin_get_info(cpl_pluginlist * list)
88 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
89 cpl_plugin * plugin = &recipe->interface;
91 if (cpl_plugin_init(plugin,
94 CPL_PLUGIN_TYPE_RECIPE,
96 "This recipe is used to compute the median of a raw dark set of integration.",
97 gravi_all_disp_description,
101 gravi_all_disp_create,
103 gravi_all_disp_destroy)) {
104 cpl_msg_error(cpl_func,
"Plugin initialization failed");
105 (void)cpl_error_set_where(cpl_func);
109 if (cpl_pluginlist_append(list, plugin)) {
110 cpl_msg_error(cpl_func,
"Error adding plugin to list");
111 (void)cpl_error_set_where(cpl_func);
127 static int gravi_all_disp_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);
171 static int gravi_all_disp_exec(cpl_plugin * plugin)
176 cpl_errorstate initial_errorstate = cpl_errorstate_get();
179 if (cpl_error_get_code() != CPL_ERROR_NONE) {
180 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
181 cpl_func, __LINE__, cpl_error_get_where());
182 return (
int)cpl_error_get_code();
185 if (plugin == NULL) {
186 cpl_msg_error(cpl_func,
"Null plugin");
187 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
191 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
192 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
193 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
197 recipe = (cpl_recipe *)plugin;
200 if (recipe->parameters == NULL) {
201 cpl_msg_error(cpl_func,
"Recipe invoked with NULL parameter list");
202 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
204 if (recipe->frames == NULL) {
205 cpl_msg_error(cpl_func,
"Recipe invoked with NULL frame set");
206 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
210 recipe_status = gravi_all_disp(recipe->frames, recipe->parameters);
213 if (cpl_dfs_update_product_header(recipe->frames)) {
214 if (!recipe_status) recipe_status = (int)cpl_error_get_code();
217 if (!cpl_errorstate_is_equal(initial_errorstate)) {
220 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
223 return recipe_status;
233 static int gravi_all_disp_destroy(cpl_plugin * plugin)
237 if (plugin == NULL) {
238 cpl_msg_error(cpl_func,
"Null plugin");
239 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
243 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
244 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
245 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
249 recipe = (cpl_recipe *)plugin;
252 recipe = (cpl_recipe *)plugin;
255 recipe->parameters = cpl_parameterlist_new();
256 if (recipe->parameters == NULL) {
257 cpl_msg_error(cpl_func,
"Parameter list allocation failed");
258 cpl_ensure_code(0, (
int)CPL_ERROR_ILLEGAL_OUTPUT);
264 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.p2vmreduce_file",
265 CPL_TYPE_BOOL,
"Save the reduced p2vm file",
"gravi.gravi_all_p2vm", TRUE);
266 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"p2vmfile");
267 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
268 cpl_parameterlist_append(recipe->parameters, p);
271 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.opd_met",
272 CPL_TYPE_BOOL,
"extract the real opd from the metrology",
273 "gravi.gravi_all_p2vm", TRUE);
274 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"extmetrology");
275 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
276 cpl_parameterlist_append(recipe->parameters, p);
279 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.min_wave",
280 CPL_TYPE_DOUBLE,
"the minimum wavelength",
"gravi.gravi_all_p2vm", 2.0);
281 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lambdamin");
282 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
283 cpl_parameterlist_append(recipe->parameters, p);
286 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.max_wave",
287 CPL_TYPE_DOUBLE,
"the maximum wavelength",
"gravi.gravi_all_p2vm", 2.6);
288 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"lambdamax");
289 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
290 cpl_parameterlist_append(recipe->parameters, p);
293 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.readoutSC",
294 CPL_TYPE_DOUBLE,
"the readout error sigma SC",
"gravi.gravi_all_p2vm", 1.0);
295 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sigma_readout_SC");
296 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
297 cpl_parameterlist_append(recipe->parameters, p);
300 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.readoutFT",
301 CPL_TYPE_DOUBLE,
"the readout error sigma FT",
"gravi.gravi_all_p2vm", 1.0);
302 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sigma_readout_FT");
303 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
304 cpl_parameterlist_append(recipe->parameters, p);
307 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.nspectrum_FT",
308 CPL_TYPE_INT,
"the number of the spectral",
"gravi.gravi_all_p2vm", 5);
309 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"nlambda_ft");
310 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
311 cpl_parameterlist_append(recipe->parameters, p);
314 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.nspectrum_SC",
315 CPL_TYPE_INT,
"the number of the spectral",
"gravi.gravi_all_p2vm", 5);
316 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"nlambda_sc");
317 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
318 cpl_parameterlist_append(recipe->parameters, p);
321 p = cpl_parameter_new_value(
"gravi.gravi_all_flat."
322 "profile_width", CPL_TYPE_INT,
"profile width option",
323 "gravi.gravi_all_flat", 5);
324 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"profile_width");
325 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
326 cpl_parameterlist_append(recipe->parameters, p);
329 p = cpl_parameter_new_value(
"gravi.gravi_all_p2vm.preproc_param.correction",
330 CPL_TYPE_STRING,
"the background correction",
"gravi.gravi_all_p2vm",
"DARK");
331 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"background");
332 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
333 cpl_parameterlist_append(recipe->parameters, p);
335 p = cpl_parameter_new_value(
"gravi."
336 "flat_param.Bad_dark_threshold", CPL_TYPE_INT,
"the rms factor for "
337 "dark bad pixel threshold",
"gravi.gravi_all_flat", 5);
338 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"Bad_dark_threshold");
339 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
340 cpl_parameterlist_append(recipe->parameters, p);
355 static int gravi_all_disp(cpl_frameset * frameset,
356 const cpl_parameterlist * parlist)
358 cpl_frameset * disp_frameset, * wavecalib_frameset, * darkcalib_frameset,
359 * gaincalib_frameset, * dark_frameset, * wave_frameset,
360 * badpix_frameset, * gain_frameset, * p2vmreduce_frameset, * p2vm_frameset;
361 cpl_propertylist * applist, * primary_hdr, * primary_hdr_dark, * disp_plist,
362 * primary_hdr_wave, * bad_primary_hdr, * profile_primary_hdr;
364 const cpl_parameter * p;
365 char * out_dark, * out_wave, * preproc_name, * out_gain;
366 const char * filename;
367 gravi_data * disp_map, * data, * dark_map, * wave_map,
368 * profile_map, * badpix_map, * p2vm_reduce;
369 gravi_data ** calib_datas;
370 gravi_data * preproc_data, * p2vm_map;
371 gravi_data ** raw_data;
372 dark_map = NULL, wave_map = NULL;
373 int nb_frame, i, nb_frame_gain;
374 int rest, num_disp, nwave_sc;
375 double gain_ft, gain_sc, mjd_obs;
377 cpl_table * p2vm_met = NULL, * metrology_table, * opl_table = NULL, * disp_table;
379 cpl_propertylist * met_plist;
380 cpl_frameset * preproc_frame;
381 cpl_matrix * phase_matrix;
382 cpl_vector ** opd_vector;
387 cpl_ensure_code(gravi_dfs_set_groups(frameset) == CPL_ERROR_NONE,
388 cpl_error_get_code()) ;
392 p2vmreduce_frameset = gravi_frameset_extract_p2vmreduce_data(frameset);
393 p2vm_frameset = gravi_frameset_extract_p2vm_file(frameset);
394 if (cpl_frameset_is_empty(p2vmreduce_frameset)){
395 disp_frameset = gravi_frameset_extract_disp_data(frameset);
396 wavecalib_frameset = gravi_frameset_extract_wave_file(frameset);
397 darkcalib_frameset = gravi_frameset_extract_dark_file(frameset);
398 gaincalib_frameset = gravi_frameset_extract_flat_file(frameset);
399 wave_frameset = gravi_frameset_extract_wave(frameset);
400 dark_frameset = gravi_frameset_extract_dark(frameset);
401 gain_frameset = gravi_frameset_extract_flat(frameset);
402 badpix_frameset = gravi_frameset_extract_badpix(frameset);
403 if (cpl_frameset_is_empty(disp_frameset) ||
404 cpl_frameset_is_empty(p2vm_frameset)) {
407 cpl_frameset_delete(dark_frameset);
408 cpl_frameset_delete(wave_frameset);
409 cpl_frameset_delete(gain_frameset);
410 cpl_frameset_delete(disp_frameset);
411 cpl_frameset_delete(wavecalib_frameset);
412 cpl_frameset_delete(wavecalib_frameset);
413 cpl_frameset_delete(gaincalib_frameset);
414 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
415 "No dispersion or p2vm frame on the frameset") ;
421 if (!cpl_frameset_is_empty(dark_frameset)) {
422 frame = cpl_frameset_get_position(dark_frameset, 0);
424 filename = cpl_frame_get_filename(frame);
425 cpl_msg_info (NULL,
"This file %s is a dark file", filename);
426 data = gravi_data_load(filename);
427 primary_hdr = gravi_data_get_propertylist(data,
428 GRAVI_PRIMARY_HDR_NAME_EXT);
429 shutter = gravi_shutters_check(primary_hdr);
430 if (!((shutter[0] == 0) && (shutter[1] == 0) && (shutter[2] == 0)
431 && (shutter[3] == 0))){
432 cpl_frameset_delete(dark_frameset);
433 cpl_frameset_delete(wave_frameset);
434 cpl_frameset_delete(gain_frameset);
435 cpl_frameset_delete(darkcalib_frameset);
436 cpl_frameset_delete(wavecalib_frameset);
437 cpl_frameset_delete(gaincalib_frameset);
438 cpl_frameset_delete(disp_frameset);
439 gravi_data_delete(data);
440 return (
int)cpl_error_set_message(cpl_func,
441 CPL_ERROR_ILLEGAL_OUTPUT,
"Shutter problem");
445 dark_map = gravi_compute_dark(data);
446 if (cpl_error_get_code()) {
447 cpl_frameset_delete(dark_frameset);
448 cpl_frameset_delete(wave_frameset);
449 cpl_frameset_delete(gain_frameset);
450 cpl_frameset_delete(darkcalib_frameset);
451 cpl_frameset_delete(wavecalib_frameset);
452 cpl_frameset_delete(gaincalib_frameset);
453 gravi_data_delete(dark_map);
454 cpl_frameset_delete(disp_frameset);
455 cpl_propertylist_delete(applist);
456 gravi_data_delete(data);
457 return (
int)cpl_error_set_message(cpl_func,
458 CPL_ERROR_ILLEGAL_OUTPUT,
459 "Error while computing the dark_map");
463 cpl_frameset_insert(darkcalib_frameset, cpl_frame_duplicate(frame));
464 primary_hdr_dark = gravi_data_get_propertylist(dark_map,
465 GRAVI_PRIMARY_HDR_NAME_EXT);
466 applist = gravi_propertylist_get_qc (primary_hdr_dark);
470 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG,
476 out_dark =
"gravi_final_dark.fits";
478 if (gravi_data_save(dark_map, frameset, out_dark, parlist,
479 darkcalib_frameset, frame,
"gravi_all_disp", applist)
481 cpl_frameset_delete(dark_frameset);
482 cpl_frameset_delete(wave_frameset);
483 cpl_frameset_delete(gain_frameset);
484 cpl_frameset_delete(darkcalib_frameset);
485 cpl_frameset_delete(wavecalib_frameset);
486 cpl_frameset_delete(gaincalib_frameset);
487 gravi_data_delete(dark_map);
488 cpl_frameset_delete(disp_frameset);
489 cpl_propertylist_delete(applist);
490 gravi_data_delete(data);
492 return (
int) cpl_error_set_message(cpl_func,
493 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the dark_map"
494 " on the output file");
496 cpl_propertylist_delete(applist);
498 gravi_data_delete(data);
502 else if (!cpl_frameset_is_empty(darkcalib_frameset)){
503 frame = cpl_frameset_get_position(darkcalib_frameset, 0);
504 cpl_frameset_insert (dark_frameset, cpl_frame_duplicate (frame));
505 filename = cpl_frame_get_filename(frame);
507 cpl_msg_info (NULL,
"This file %s is a dark file already "
508 "computed", filename);
509 dark_map = gravi_data_load(filename);
515 cpl_frameset_delete(dark_frameset);
516 cpl_frameset_delete(wave_frameset);
517 cpl_frameset_delete(gain_frameset);
518 cpl_frameset_delete(disp_frameset);
519 cpl_frameset_delete(darkcalib_frameset);
520 cpl_frameset_delete(wavecalib_frameset);
521 cpl_frameset_delete(gaincalib_frameset);
522 gravi_data_delete(dark_map);
523 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
524 "No dark frames in the frameset");
530 if (!cpl_frameset_is_empty(badpix_frameset)){
531 frame = cpl_frameset_get_position(badpix_frameset, 0);
532 filename = cpl_frame_get_filename(frame);
533 cpl_msg_info (NULL,
"This file %s is a bad pixel map", filename);
535 badpix_map = gravi_data_load(filename);
539 badpix_map = gravi_compute_badpix(dark_map, parlist);
541 if (cpl_error_get_code()) {
542 gravi_data_delete(badpix_map);
543 cpl_frameset_delete(dark_frameset);
544 cpl_frameset_delete(wave_frameset);
545 cpl_frameset_delete(gain_frameset);
546 cpl_frameset_delete(disp_frameset);
547 cpl_frameset_delete(darkcalib_frameset);
548 cpl_frameset_delete(wavecalib_frameset);
549 cpl_frameset_delete(gaincalib_frameset);
550 gravi_data_delete(dark_map);
551 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
552 "Error while computing the bad pixel map");
556 bad_primary_hdr = gravi_data_get_propertylist (badpix_map,
557 GRAVI_PRIMARY_HDR_NAME_EXT);
558 applist = gravi_propertylist_get_qc (bad_primary_hdr);
560 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, BAD);
562 frame = cpl_frameset_get_position (dark_frameset, 0);
564 if (gravi_data_save (badpix_map, frameset,
"gravi_bad_map.fits", parlist,
565 dark_frameset, frame,
"gravi_all_disp", applist)
568 gravi_data_delete(badpix_map);
569 cpl_frameset_delete(dark_frameset);
570 cpl_frameset_delete(wave_frameset);
571 cpl_frameset_delete(gain_frameset);
572 cpl_frameset_delete(disp_frameset);
573 cpl_frameset_delete(darkcalib_frameset);
574 cpl_frameset_delete(wavecalib_frameset);
575 cpl_frameset_delete(gaincalib_frameset);
576 cpl_frameset_delete(badpix_frameset);
577 gravi_data_delete(dark_map);
578 return (
int) cpl_error_set_message(cpl_func,
579 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the bad pixel map");
581 cpl_propertylist_delete (applist);
584 cpl_frameset_delete(dark_frameset);
585 cpl_frameset_delete(badpix_frameset);
588 if (cpl_error_get_code()){
589 cpl_frameset_delete(disp_frameset);
590 cpl_frameset_delete(wavecalib_frameset);
591 cpl_frameset_delete(wave_frameset);
592 cpl_frameset_delete(gain_frameset);
593 gravi_data_delete(badpix_map);
594 gravi_data_delete(dark_map);
595 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
596 "Compute of the gain failed");
599 if ((!cpl_frameset_is_empty(gain_frameset)) &&
600 (cpl_frameset_is_empty(gaincalib_frameset)) ) {
602 nb_frame_gain = cpl_frameset_get_size (gain_frameset);
603 raw_data = cpl_malloc(nb_frame_gain *
sizeof(gravi_data *));
607 for (i = 0; i < nb_frame_gain; i++){
608 frame = cpl_frameset_get_position(gain_frameset, i);
609 filename = cpl_frame_get_filename(frame);
610 raw_data[i] = gravi_data_load(filename);
611 primary_hdr = gravi_data_get_propertylist(raw_data[i],
612 GRAVI_PRIMARY_HDR_NAME_EXT);
613 shutter = gravi_shutters_check(primary_hdr);
619 gain_sc = gravi_compute_gain(raw_data, nb_frame_gain, dark_map,
620 GRAVI_IMAGING_DATA_SC_EXT);
621 gain_ft = gravi_compute_gain(raw_data, nb_frame_gain, dark_map,
622 GRAVI_IMAGING_DATA_FT_EXT);
624 profile_map = gravi_compute_profile(raw_data, dark_map, badpix_map,
625 nb_frame_gain, parlist);
627 if (cpl_error_get_code()){
628 cpl_frameset_delete(disp_frameset);
629 cpl_frameset_delete(wavecalib_frameset);
630 cpl_frameset_delete(wave_frameset);
631 cpl_frameset_delete(gain_frameset);
632 gravi_data_delete(profile_map);
633 gravi_data_delete(dark_map);
634 for (i = 0; i < nb_frame_gain; i++){
635 gravi_data_delete(raw_data[i]);
638 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
639 "Compute of the profile map failed");
641 profile_primary_hdr = gravi_data_get_propertylist(profile_map,
642 GRAVI_PRIMARY_HDR_NAME_EXT);
644 applist = gravi_propertylist_get_qc (profile_primary_hdr);
645 cpl_propertylist_append_double (applist, QC_MEANGAIN_FT, gain_ft);
646 cpl_propertylist_append_double (applist, QC_MEANGAIN_SC, gain_sc);
648 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, FLAT);
650 out_gain =
"gravi_final_profile.fits";
651 frame = cpl_frameset_get_position(gain_frameset, 0);
652 if (gravi_data_save(profile_map, frameset, out_gain, parlist,
653 gain_frameset, frame,
"gravi_all_disp", applist)
656 cpl_frameset_delete(wavecalib_frameset);
657 cpl_frameset_delete(gaincalib_frameset);
658 cpl_frameset_delete(wave_frameset);
659 cpl_frameset_delete(gain_frameset);
660 for (i = 0; i < nb_frame_gain; i++){
661 gravi_data_delete(raw_data[i]);
664 gravi_data_delete(dark_map);
665 gravi_data_delete(profile_map);
666 cpl_frameset_delete(disp_frameset);
667 cpl_propertylist_delete(applist);
669 return (
int) cpl_error_set_message(cpl_func,
670 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the profile_map"
671 " on the output file");
673 cpl_propertylist_delete(applist);
675 for (i = 0; i < nb_frame_gain; i++){
676 gravi_data_delete(raw_data[i]);
683 frame = cpl_frameset_get_position(gaincalib_frameset, 0);
685 filename = cpl_frame_get_filename(frame);
686 cpl_msg_info (NULL,
"This file %s is a flat file already "
687 "computed", filename);
688 profile_map = gravi_data_load(filename);
692 cpl_frameset_delete(gaincalib_frameset);
693 cpl_frameset_delete(gain_frameset);
699 p = cpl_parameterlist_find_const(parlist,
"gravi.gravi_all_p2vm."
701 if ((!cpl_frameset_is_empty(wave_frameset)) &&
702 (cpl_frameset_is_empty(wavecalib_frameset))) {
703 frame = cpl_frameset_get_position(wave_frameset, 0);
705 filename = cpl_frame_get_filename(frame);
706 cpl_msg_info (NULL,
"This file %s is a wave file", filename);
707 data = gravi_data_load(filename);
708 primary_hdr = gravi_data_get_propertylist(data,
709 GRAVI_PRIMARY_HDR_NAME_EXT);
710 shutter = gravi_shutters_check(primary_hdr);
711 if (!((shutter[0] == 1) && (shutter[1] == 1) && (shutter[2] == 1)
712 && (shutter[3] == 1))){
713 cpl_frameset_delete(wavecalib_frameset);
714 cpl_frameset_delete(wave_frameset);
715 gravi_data_delete(dark_map);
716 cpl_frameset_delete(disp_frameset);
717 gravi_data_delete(data);
718 gravi_data_delete(profile_map);
719 return (
int)cpl_error_set_message(cpl_func,
720 CPL_ERROR_ILLEGAL_OUTPUT,
"Shutter problem");
725 if (cpl_parameter_get_bool (p)){
727 metrology_table = gravi_data_get_table(data,
728 GRAVI_METROLOGY_EXT);
729 met_plist = cpl_propertylist_duplicate(
730 gravi_data_get_propertylist(data,
731 GRAVI_METROLOGY_EXT));
732 if ((cpl_table_get_nrow(metrology_table)%4) != 0)
733 rest = 4 + (cpl_table_get_nrow(metrology_table)%4) ;
736 mjd_obs = gravi_pfits_get_mjd (primary_hdr);
738 opl_table = cpl_table_new (cpl_table_get_nrow(metrology_table) - rest);
739 p2vm_met = gravi_metrology_calibration (metrology_table,
743 wave_map = gravi_compute_wave(data, profile_map, dark_map, badpix_map,
746 cpl_table_delete (opl_table);
748 if (cpl_error_get_code()) {
749 cpl_frameset_delete(wavecalib_frameset);
750 cpl_frameset_delete(wave_frameset);
751 gravi_data_delete(dark_map);
752 gravi_data_delete(wave_map);
753 cpl_frameset_delete(disp_frameset);
754 gravi_data_delete(data);
755 gravi_data_delete(profile_map);
756 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
757 "Error while computing the wave_map");
761 primary_hdr_wave = gravi_data_get_propertylist(wave_map,
762 GRAVI_PRIMARY_HDR_NAME_EXT);
763 applist = gravi_propertylist_get_qc (primary_hdr_wave);
767 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG,
773 out_wave =
"gravi_final_wave.fits";
774 if (gravi_data_save(wave_map, frameset, out_wave, parlist,
775 wave_frameset, frame,
"gravi_all_disp", applist)
778 cpl_frameset_delete(wavecalib_frameset);
779 cpl_frameset_delete(wave_frameset);
780 gravi_data_delete(dark_map);
781 gravi_data_delete(wave_map);
782 cpl_frameset_delete(disp_frameset);
783 cpl_propertylist_delete(applist);
784 gravi_data_delete(data);
785 gravi_data_delete(profile_map);
786 return (
int) cpl_error_set_message(cpl_func,
787 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the wave_map"
788 " on the output file");
791 cpl_propertylist_delete(applist);
793 gravi_data_delete(data);
799 frame = cpl_frameset_get_position(wavecalib_frameset, 0);
801 filename = cpl_frame_get_filename(frame);
803 cpl_msg_info (NULL,
"This file %s is a wave file already "
804 "computed", filename);
805 wave_map = gravi_data_load(filename);
811 if (wave_map == NULL){
812 cpl_frameset_delete(disp_frameset);
813 cpl_frameset_delete(wavecalib_frameset);
814 cpl_frameset_delete(wave_frameset);
815 gravi_data_delete(wave_map);
816 gravi_data_delete(profile_map);
817 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_INVALID_TYPE,
818 "No wave frames in the frameset");
821 cpl_frameset_delete(wavecalib_frameset);
822 cpl_frameset_delete(wave_frameset);
824 calib_datas = cpl_malloc(4 *
sizeof(gravi_data *));
825 calib_datas[0] = dark_map;
826 calib_datas[1] = wave_map;
827 calib_datas[2] = profile_map;
828 calib_datas[3] = badpix_map;
831 frame = cpl_frameset_get_position(p2vm_frameset, 0);
832 filename = cpl_frame_get_filename(frame);
833 cpl_msg_info (NULL,
"This file %s is a p2vm file already "
834 "computed", filename);
836 p2vm_map = gravi_data_load (filename);
838 if (cpl_error_get_code()) {
839 cpl_frameset_delete(darkcalib_frameset);
840 cpl_frameset_delete(p2vm_frameset);
841 cpl_frameset_delete(dark_frameset);
842 cpl_frameset_delete(wave_frameset);
843 cpl_frameset_delete(gain_frameset);
844 gravi_data_delete(profile_map);
845 gravi_data_delete(dark_map);
846 gravi_data_delete(wave_map);
847 gravi_data_delete(p2vm_map);
848 gravi_data_delete(p2vm_map);
849 gravi_data_delete(badpix_map);
851 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
852 "Error while loading the p2vm_map");
856 nb_frame = cpl_frameset_get_size(disp_frameset);
858 p = cpl_parameterlist_find_const(parlist,
"gravi.gravi_all_p2vm."
859 "preproc_param.p2vmreduce_file");
865 nwave_sc = gravi_pfits_get_nwave (gravi_data_get_propertylist (wave_map, GRAVI_IO_WAVELENGTH_SC_EXT));
866 opd_vector = cpl_malloc (nwave_sc *
sizeof(cpl_vector *));
867 phase_matrix = cpl_malloc (
sizeof(cpl_matrix *));
870 for (i = 0; i < nb_frame; i++){
871 frame = cpl_frameset_get_position(disp_frameset, i);
872 filename = cpl_frame_get_filename(frame);
873 cpl_msg_info (NULL,
"Calibration of this file %s", filename);
874 data = gravi_data_load(filename);
875 primary_hdr = gravi_data_get_propertylist(data,
876 GRAVI_PRIMARY_HDR_NAME_EXT);
877 shutter = gravi_shutters_check(primary_hdr);
879 if ((shutter[0] == 1) && (shutter[1] == 1) && (shutter[2] == 1)
880 && (shutter[3] == 1)){
883 metrology_table = gravi_data_get_table(data,
884 GRAVI_METROLOGY_EXT);
886 if (p2vm_met == NULL){
887 met_plist = cpl_propertylist_duplicate
888 (gravi_data_get_propertylist (data, GRAVI_METROLOGY_EXT));
889 if ((cpl_table_get_nrow(metrology_table)%4) != 0)
890 rest = 4 + (cpl_table_get_nrow(metrology_table)%4) ;
893 mjd_obs = gravi_pfits_get_mjd (primary_hdr);
894 opl_table = cpl_table_new (cpl_table_get_nrow(metrology_table) - rest);
895 p2vm_met = gravi_metrology_calibration (metrology_table,
897 if (cpl_error_get_code()) {
898 cpl_frameset_delete(disp_frameset);
899 cpl_free(calib_datas);
900 gravi_data_delete(dark_map);
901 gravi_data_delete(wave_map);
902 gravi_data_delete(profile_map);
903 gravi_data_delete(badpix_map);
904 gravi_data_delete(data);
905 gravi_data_delete (p2vm_map);
906 cpl_table_delete (opl_table);
907 cpl_table_delete (p2vm_met);
908 cpl_propertylist_delete (met_plist);
910 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
911 "Error while computing p2vm metrology");
913 cpl_table_delete (opl_table);
920 preproc_data = gravi_preproc(data, calib_datas, 4, parlist);
922 printf (
"Temps gravi_preproc %s : %f\n", filename, (end - start) / (
double)CLOCKS_PER_SEC);
923 gravi_data_delete(data);
925 if (cpl_error_get_code()) {
926 cpl_frameset_delete(disp_frameset);
928 gravi_data_delete(badpix_map);
929 cpl_table_delete (opl_table);
930 cpl_table_delete (p2vm_met);
931 cpl_propertylist_delete (met_plist);
933 gravi_data_delete(preproc_data);
934 cpl_free(calib_datas);
935 gravi_data_delete(dark_map);
936 gravi_data_delete(wave_map);
937 gravi_data_delete (p2vm_map);
938 gravi_data_delete(profile_map);
939 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
940 "Error while computing the preproc data_map");
943 p2vm_reduce = gravi_p2vm_reduce (preproc_data, p2vm_map,
"gravi_single");
945 cpl_propertylist_set_string (met_plist,
"EXTNAME",
948 gravi_data_add (p2vm_reduce, met_plist, p2vm_met);
950 gravi_data_delete(preproc_data);
952 if (cpl_parameter_get_bool(p)){
953 preproc_frame = cpl_frameset_new ();
954 cpl_frameset_insert (preproc_frame, cpl_frame_duplicate (frame));
955 preproc_name = cpl_sprintf(
"p2vm_reduce_%s", filename);
957 applist = gravi_propertylist_get_qc (gravi_data_get_propertylist
958 (p2vm_reduce, GRAVI_PRIMARY_HDR_NAME_EXT));
961 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, PREPROC);
964 gravi_data_save(p2vm_reduce, frameset, preproc_name, parlist,
965 preproc_frame, frame,
"gravi_all_disp", applist);
968 cpl_free(preproc_name);
969 cpl_propertylist_delete (applist);
970 cpl_frameset_delete (preproc_frame);
975 if (gravi_disp_opd_phase_wrap (p2vm_reduce, p2vm_met, opd_vector, phase_matrix, num_disp) != CPL_ERROR_NONE){
977 gravi_data_delete(badpix_map);
978 cpl_table_delete (opl_table);
979 cpl_table_delete (p2vm_met);
980 cpl_propertylist_delete (met_plist);
982 gravi_data_delete(preproc_data);
983 cpl_free(calib_datas);
984 gravi_data_delete(dark_map);
985 gravi_data_delete(wave_map);
986 gravi_data_delete (p2vm_map);
987 gravi_data_delete(profile_map);
988 gravi_data_delete(p2vm_reduce);
989 return (
int) cpl_error_set_message(cpl_func,
990 CPL_ERROR_ILLEGAL_OUTPUT,
"Error while computing the dispersion");
993 disp_map = gravi_data_new (0);
994 gravi_data_set_propertylist(disp_map,
995 GRAVI_PRIMARY_HDR_NAME_EXT, primary_hdr);
999 gravi_data_delete (p2vm_reduce);
1009 cpl_free(calib_datas);
1010 gravi_data_delete(dark_map);
1011 gravi_data_delete(wave_map);
1012 gravi_data_delete(profile_map);
1013 gravi_data_delete(badpix_map);
1020 nb_frame = cpl_frameset_get_size (p2vmreduce_frameset);
1022 for (i = 0; i < nb_frame; i++){
1023 frame = cpl_frameset_get_position(p2vmreduce_frameset, i);
1024 filename = cpl_frame_get_filename(frame);
1025 cpl_msg_info (NULL,
"Load the p2vm_reduce %s", filename);
1028 p2vm_reduce = gravi_data_load(filename);
1029 primary_hdr = gravi_data_get_propertylist(data,
1030 GRAVI_PRIMARY_HDR_NAME_EXT);
1034 int nwave_sc = gravi_pfits_get_nwave (gravi_data_get_propertylist (p2vm_reduce, GRAVI_IO_WAVELENGTH_SC_EXT));
1035 opd_vector = cpl_malloc (nwave_sc *
sizeof(cpl_vector *));
1036 phase_matrix = cpl_malloc (
sizeof(cpl_matrix *));
1037 p2vm_met = cpl_table_duplicate (
1038 gravi_data_get_table (p2vm_reduce, GRAVI_P2VM_MET_EXT));
1039 met_plist = cpl_propertylist_duplicate (
1040 gravi_data_get_propertylist (p2vm_reduce, GRAVI_P2VM_MET_EXT));
1041 disp_map = gravi_data_new (0);
1042 gravi_data_set_propertylist(disp_map,
1043 GRAVI_PRIMARY_HDR_NAME_EXT, primary_hdr);
1046 if (gravi_disp_opd_phase_wrap (p2vm_reduce, p2vm_met,
1047 opd_vector, phase_matrix, num_disp) != CPL_ERROR_NONE){
1048 cpl_table_delete (p2vm_met);
1049 cpl_propertylist_delete (met_plist);
1050 for (i = 0; i < nwave_sc; i ++){
1051 cpl_vector_delete (opd_vector[i]);
1054 cpl_matrix_delete (phase_matrix);
1055 cpl_free (opd_vector);
1056 cpl_free (phase_matrix);
1057 gravi_data_delete(p2vm_reduce);
1058 return (
int) cpl_error_set_message(cpl_func,
1059 CPL_ERROR_ILLEGAL_OUTPUT,
"Error while computing the dispersion");
1064 gravi_data_delete (p2vm_reduce);
1076 disp_table = gravi_compute_disp(opd_vector, phase_matrix, nwave_sc);
1078 for (i = 0; i < nwave_sc; i ++){
1079 cpl_vector_delete (opd_vector[i]);
1082 cpl_matrix_delete (phase_matrix);
1083 cpl_free (opd_vector);
1084 cpl_free (phase_matrix);
1085 gravi_data_add (disp_map, met_plist, p2vm_met);
1087 cpl_table_delete (p2vm_met);
1088 cpl_propertylist_set_string (met_plist,
"EXTNAME",
1090 gravi_data_add (disp_map, met_plist, disp_table);
1091 cpl_propertylist_delete (met_plist);
1093 if (cpl_error_get_code()) {
1094 cpl_frameset_delete(disp_frameset);
1096 gravi_data_delete(disp_map);
1097 return (
int)cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
1098 "Error while computing the disp_map");
1104 disp_plist = gravi_data_get_propertylist(disp_map, GRAVI_PRIMARY_HDR_NAME_EXT);
1105 applist = gravi_propertylist_get_qc (disp_plist);
1107 cpl_propertylist_append_string(applist, CPL_DFS_PRO_CATG, DISP_MODEL);
1109 if (gravi_data_save( disp_map, frameset,
"gravi_all_disp.fits", parlist,
1110 disp_frameset, NULL,
"gravi_all_disp", applist)
1113 gravi_data_delete(disp_map);
1114 cpl_frameset_delete(disp_frameset);
1115 cpl_propertylist_delete(applist);
1116 return (
int) cpl_error_set_message(cpl_func,
1117 CPL_ERROR_ILLEGAL_OUTPUT,
"Could not save the disp map"
1118 " on the output file");
1123 gravi_data_delete(disp_map);
1124 cpl_frameset_delete(disp_frameset);
1125 cpl_propertylist_delete(applist);
1127 return (
int)cpl_error_get_code();