SINFONI Pipeline Reference Manual  2.5.2
sinfo_pro_save.c
1 /*
2  * This file is part of the ESO SINFONI Pipeline
3  * Copyright (C) 2004,2005 European Southern Observatory
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 USA
18  */
19 #ifdef HAVE_CONFIG_H
20 # include <config.h>
21 #endif
22 
23 #include <cpl.h>
24 #include "sinfo_pro_save.h"
25 #include "sinfo_key_names.h"
26 #include "sinfo_functions.h"
27 #include "sinfo_utilities.h"
28 #include "sinfo_globals.h"
29 
30 static int
31 sinfo_pfits_put_qc(
32  cpl_propertylist * plist,
33  cpl_table * qclog);
34 
35 static void
36 sinfo_log_pro(char* name_o,
37  const char* pro_catg,
38  int frm_type,
39  cpl_frameset* ref_set,
40  cpl_frameset** out_set,
41  cpl_propertylist** plist,
42  cpl_parameterlist* parlist,
43  const char* recid);
44 
45 
46 static void
47 sinfo_check_name(const char* in, char** ou, int type, char** paf);
48 
49 static void
50 sinfo_clean_header(cpl_propertylist** header);
51 static void
52 sinfo_clean_cube_header(cpl_propertylist** header);
53 
54 
55 static FILE *
56 sinfo_paf_print_header(
57  const char * filename,
58  const char * paf_id,
59  const char * paf_desc,
60  const char * login_name,
61  char * datetime) ;
62 
63 
64 
71 /*--------------------------------------------------------------------------*/
96 /*--------------------------------------------------------------------------*/
97 static FILE *
98 sinfo_paf_print_header(
99  const char * filename,
100  const char * paf_id,
101  const char * paf_desc,
102  const char * login_name,
103  char * datetime)
104 {
105  FILE * paf ;
106 
107  if ((paf=fopen(filename, "w"))==NULL) {
108  sinfo_msg_error("cannot create PAF file [%s]", filename);
109  return NULL ;
110  }
111  fprintf(paf, "PAF.HDR.START ;# start of header\n");
112  fprintf(paf, "PAF.TYPE \"pipeline product\" ;\n");
113  fprintf(paf, "PAF.ID \"%s\"\n", paf_id);
114  fprintf(paf, "PAF.NAME \"%s\"\n", filename);
115  fprintf(paf, "PAF.DESC \"%s\"\n", paf_desc);
116  fprintf(paf, "PAF.CRTE.NAME \"%s\"\n", login_name) ;
117  fprintf(paf, "PAF.CRTE.DAYTIM \"%s\"\n", datetime) ;
118  fprintf(paf, "PAF.LCHG.NAME \"%s\"\n", login_name) ;
119  fprintf(paf, "PAF.LCHG.DAYTIM \"%s\"\n", datetime) ;
120  fprintf(paf, "PAF.CHCK.CHECKSUM \"\"\n");
121  fprintf(paf, "PAF.HDR.END ;# end of header\n");
122  fprintf(paf, "\n");
123  return paf ;
124 }
134 int
135 sinfo_update_fits_card_int(const char* file,const char* card,int value)
136 {
137  cpl_propertylist * plist =NULL;
138  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
139  sinfo_msg_error( "getting header from file %s",file);
140  cpl_propertylist_delete(plist) ;
141  return -1 ;
142  }
143 
144  if (CPL_ERROR_NONE!=cpl_propertylist_set_int(plist,card,value)){
145  sinfo_msg_error( "setting header of file %s",file);
146  cpl_propertylist_delete(plist) ;
147  return -1 ;
148  }
149  cpl_propertylist_delete(plist) ;
150  return 0;
151 }
152 
162 int
163 sinfo_update_fits_card_float(const char* file,const char* card,float value)
164 {
165  cpl_propertylist * plist =NULL;
166  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
167  sinfo_msg_error( "getting header from file %s",file);
168  sinfo_msg_error("%s", (char* ) cpl_error_get_message());
169  sinfo_msg_error("%s", (char* ) cpl_error_get_where());
170  cpl_propertylist_delete(plist) ;
171  return -1 ;
172  }
173 
174  if (CPL_ERROR_NONE!=cpl_propertylist_set_float(plist,card,value)){
175  sinfo_msg_error( "setting header of file %s",file);
176  sinfo_msg_error("%s", (char* ) cpl_error_get_message());
177  sinfo_msg_error("%s", (char* ) cpl_error_get_where());
178  cpl_propertylist_delete(plist) ;
179  return -1 ;
180  }
181  cpl_propertylist_delete(plist) ;
182  return 0;
183 }
184 
185 
195 int
196 sinfo_update_fits_card_double(const char* file,const char* card,double value)
197 {
198  cpl_propertylist * plist =NULL;
199  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
200  sinfo_msg_error( "getting header from file %s",file);
201  cpl_propertylist_delete(plist) ;
202  return -1 ;
203  }
204 
205  if (CPL_ERROR_NONE!=cpl_propertylist_set_double(plist,card,value)){
206  sinfo_msg_error( "gsetting header of file %s",file);
207  cpl_propertylist_delete(plist) ;
208  return -1 ;
209  }
210  cpl_propertylist_delete(plist) ;
211  return 0;
212 }
213 
223 int
224 sinfo_update_fits_card_long(const char* file,const char* card,long value)
225 {
226  cpl_propertylist * plist =NULL;
227  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
228  sinfo_msg_error( "getting header from file %s",file);
229  cpl_propertylist_delete(plist) ;
230  return -1 ;
231  }
232  if (CPL_ERROR_NONE!=cpl_propertylist_set_long(plist,card,value)){
233  sinfo_msg_error( "setting header of file %s",file);
234  cpl_propertylist_delete(plist) ;
235  return -1 ;
236  }
237  cpl_propertylist_delete(plist) ;
238  return 0;
239 }
240 
250 int
251 sinfo_update_ims_fits_card_string(cpl_imagelist* iml,
252  const char* file,
253  const char* card,
254  const char* value)
255 {
256 
257  cpl_propertylist * plist =NULL;
258  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
259  sinfo_msg_error( "getting header from reference ima frame %s",file);
260  cpl_propertylist_delete(plist) ;
261  return -1 ;
262  }
263 
264 
265  if (CPL_ERROR_NONE!=cpl_propertylist_set_string(plist,card,value)){
266  sinfo_msg_error( "getting header from reference ima frame %s",file);
267  cpl_propertylist_delete(plist) ;
268  return -1 ;
269  }
270 
271  if (cpl_imagelist_save(iml,file,CPL_BPP_IEEE_FLOAT,
272  plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
273  sinfo_msg_error( "getting header from reference ima frame %s",file);
274  cpl_propertylist_delete(plist) ;
275  }
276  cpl_propertylist_delete(plist) ;
277  return 0;
278 }
279 /* Not used
280 static int sinfo_save_paf(char* name_p,
281  const char* rec_id,
282  cpl_table* qclog,
283  cpl_propertylist* plist,
284  const char* pro_catg)
285 {
286 
287 
288 
289  FILE * paf ;
290  const char * sval ;
291  char key_name[FILE_NAME_SZ] ;
292  char key_paf[FILE_NAME_SZ] ;
293  char key_dpaf[FILE_NAME_SZ] ;
294  char key_type[FILE_NAME_SZ] ;
295  char key_value[FILE_NAME_SZ] ;
296  double dval=0;
297 
298  int i =0;
299  int n=0;
300  sinfo_msg( "Writing %s" , name_p) ;
301  // Create the default PAF header
302  if ((paf = sinfo_paf_print_header(name_p,rec_id,"QC file","login-name",
303  sinfo_get_datetime_iso8601())) == NULL) {
304  sinfo_msg_error( "cannot open file [%s] for output", name_p) ;
305  return -1 ;
306  }
307  if (sinfo_check_rec_status(0) == -1) {
308  sinfo_msg_error( "Something was wrong") ;
309  return -1 ;
310  }
311 
312  // Test entries
313  sinfo_blank2dot(PAF_NAME_PIPE_ID,key_dpaf);
314  fprintf(paf,"%-21s \"%s\" ;# %s\" \n", key_dpaf,
315  VERSION,KEY_HELP_PIPE_ID);
316 
317  strcpy(key_name,KEY_NAME_PIPEFILE);
318  strcpy(key_paf,KEY_NAME_PIPEFILE);
319  sinfo_blank2dot(key_paf,key_dpaf);
320  if (sinfo_propertylist_has(plist, key_name)) {
321  fprintf(paf,"%-21s \"%s\" ;# %s\" \n",key_dpaf,
322  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PIPEFILE);
323  }
324 
325  // Value: "TEMPORARY", "PREPROCESSED", "REDUCED" or "QCPARAM".
326  strcpy(key_name,KEY_NAME_PRO_TYPE);
327  strcpy(key_paf,PAF_NAME_PRO_TYPE);
328  sinfo_blank2dot(key_paf,key_dpaf);
329  if (sinfo_propertylist_has(plist, key_name)) {
330  fprintf(paf,"%-21s \"%s\" ;# %s\" \n", key_dpaf,
331  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PRO_TYPE);
332  }
333 
334  strcpy(key_name,KEY_NAME_PRO_DATANCOM);
335  strcpy(key_paf,PAF_NAME_PRO_DATANCOM);
336  sinfo_blank2dot(key_paf,key_dpaf);
337  if (sinfo_propertylist_has(plist,key_name)) {
338  fprintf(paf,"%-21s %d ;# %s\" \n",key_dpaf,
339  cpl_propertylist_get_int(plist,key_name),KEY_HELP_PRO_DATANCOM);
340  }
341 
342  strcpy(key_name,KEY_NAME_NCORRS_NAME);
343  strcpy(key_paf,PAF_NAME_NCORRS_NAME);
344  sinfo_blank2dot(key_paf,key_dpaf);
345  if (sinfo_propertylist_has(plist, key_name)) {
346  fprintf(paf,"%-21s \"%s\" ;# %s \n", key_dpaf,
347  cpl_propertylist_get_string(plist,key_name),KEY_HELP_NCORRS_NAME);
348  }
349 
350  strcpy(key_name,KEY_NAME_DET_NDSAMPLES);
351  strcpy(key_paf,PAF_NAME_DET_NDSAMPLES);
352  sinfo_blank2dot(key_paf,key_dpaf);
353  if (sinfo_propertylist_has(plist, key_name)) {
354  fprintf(paf,"%-21s %d ;# %s \n",key_dpaf,
355  cpl_propertylist_get_int(plist,key_name),KEY_HELP_DET_NDSAMPLES);
356  }
357 
358  strcpy(key_name,KEY_NAME_FILT_NAME);
359  strcpy(key_paf,PAF_NAME_FILT_NAME);
360  sinfo_blank2dot(key_paf,key_dpaf);
361  if (sinfo_propertylist_has(plist, key_name)) {
362  fprintf(paf,"%-21s \"%s\" ;# %s \n", key_dpaf,
363  cpl_propertylist_get_string(plist,key_name),KEY_HELP_FILT_NAME);
364  }
365 
366  strcpy(key_name,KEY_NAME_FILT_ID);
367  strcpy(key_paf,PAF_NAME_FILT_ID);
368  sinfo_blank2dot(key_paf,key_dpaf);
369  if (sinfo_propertylist_has(plist, key_name)) {
370  fprintf(paf,"%-21s \"%s\" ;# %s \n",key_dpaf,
371  cpl_propertylist_get_string(plist,key_name),KEY_HELP_FILT_ID);
372  }
373 
374  strcpy(key_name,KEY_NAME_PREOPTICS);
375  strcpy(key_paf,PAF_NAME_PREOPTICS);
376  sinfo_blank2dot(key_paf,key_dpaf);
377  if (sinfo_propertylist_has(plist, key_name)) {
378  fprintf(paf,"%-21s \"%s\" ;# %s \n",key_dpaf,
379  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PREOPTICS);
380  }
381 
382  strcpy(key_name,KEY_NAME_GRAT_NAME);
383  strcpy(key_paf,PAF_NAME_GRAT_NAME);
384  sinfo_blank2dot(key_paf,key_dpaf);
385  if (sinfo_propertylist_has(plist, key_name)) {
386  fprintf(paf, "%-21s \"%s\" ;# %s \n",key_dpaf,
387  cpl_propertylist_get_string(plist,key_name),KEY_HELP_GRAT_NAME);
388  }
389 
390  strcpy(key_name,KEY_NAME_GRAT_WLEN);
391  strcpy(key_paf,PAF_NAME_GRAT_WLEN);
392  sinfo_blank2dot(key_paf,key_dpaf);
393  if (sinfo_propertylist_has(plist, key_name)) {
394  fprintf(paf, "%-21s %f ;# %s \n", key_dpaf,
395  cpl_propertylist_get_double(plist,key_name),KEY_HELP_GRAT_WLEN);
396  }
397 
398  strcpy(key_name,KEY_NAME_PRO_RECID);
399  strcpy(key_paf,PAF_NAME_PRO_RECID);
400  sinfo_blank2dot(key_paf,key_dpaf);
401  if (sinfo_propertylist_has(plist, key_name)) {
402  fprintf(paf,"%-21s \"%s\" ;# %s \n", key_dpaf,
403  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PRO_RECID);
404  }
405 
406 
407  // snprintf(cval, MAX_NAME_SIZE-1,"CPL-%s", get_cpl_version());
408  strcpy(key_name,KEY_NAME_PRO_DRSID);
409  strcpy(key_paf,PAF_NAME_PRO_DRSID);
410  sinfo_blank2dot(key_paf,key_dpaf);
411  if (sinfo_propertylist_has(plist, key_name)) {
412  fprintf(paf,"%-21s \"%s\" ;# %s \n",key_dpaf,
413  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PRO_DRSID);
414  }
415 
416  if (sinfo_propertylist_has(plist,KEY_NAME_DATE_OBS)) {
417  sval = sinfo_pfits_get_date_obs(plist);
418  strcpy(key_paf,KEY_NAME_DATE_OBS);
419  sinfo_blank2dot(key_paf,key_dpaf);
420  fprintf(paf, "%-21s \"%s\" ;# %s\n",key_dpaf,
421  sval,KEY_HELP_DATE_OBS) ;
422  }
423 
424 
425  if (sinfo_propertylist_has(plist,KEY_NAME_TEL_AIRM_START)) {
426  dval = sinfo_pfits_get_airmass_start(plist);
427  strcpy(key_paf,PAF_NAME_TEL_AIRM_START);
428  sinfo_blank2dot(key_paf,key_dpaf);
429  fprintf(paf, "%-21s \"%f\" ;# %s \n",key_dpaf,
430  dval,KEY_HELP_TEL_AIRM_START) ;
431  }
432 
433  if (sinfo_propertylist_has(plist,KEY_NAME_ARCFILE)) {
434  sval = sinfo_pfits_get_arcfile(plist);
435  strcpy(key_paf,KEY_NAME_ARCFILE);
436  sinfo_blank2dot(key_paf,key_dpaf);
437  fprintf(paf, "%-21s \"%s\" ;# %s \n", key_dpaf,sval,KEY_HELP_ARCFILE) ;
438 
439  } else if (sinfo_propertylist_has(plist,KEY_NAME_PRO_REC1_RAW1_NAME)) {
440  sval = sinfo_pfits_get_rec1raw1name(plist);
441  strcpy(key_paf,KEY_NAME_ARCFILE);
442  sinfo_blank2dot(key_paf,key_dpaf);
443  fprintf(paf, "%-21s \"%s\" ;# %s \n", key_dpaf,sval,KEY_HELP_ARCFILE) ;
444  } else {
445  sinfo_msg_error("%s is missing QC LOG will fail!",KEY_NAME_ARCFILE);
446  }
447 
448  if (sinfo_propertylist_has(plist,KEY_NAME_TPL_ID)) {
449  sval = sinfo_pfits_get_templateid(plist);
450  strcpy(key_paf,PAF_NAME_TPL_ID);
451  sinfo_blank2dot(key_paf,key_dpaf);
452  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
453  sval,KEY_HELP_TPL_ID) ;
454 
455  }
456 
457  if (sinfo_propertylist_has(plist,KEY_NAME_DET_DIT)) {
458  strcpy(key_paf,PAF_NAME_DET_DIT);
459  sinfo_blank2dot(key_paf,key_dpaf);
460  fprintf(paf,"%-21s %f ; # %s\n", key_dpaf,
461  sinfo_pfits_get_dit(plist),KEY_HELP_DET_DIT) ;
462  }
463 
464 
465  if (sinfo_propertylist_has(plist,KEY_NAME_DET_NDIT)) {
466  strcpy(key_paf,PAF_NAME_DET_NDIT);
467  sinfo_blank2dot(key_paf,key_dpaf);
468  fprintf(paf,"%-21s %d ; # %s\n", key_dpaf,
469  sinfo_pfits_get_ndit(plist),KEY_HELP_DET_NDIT) ;
470  }
471 
472  if (sinfo_propertylist_has(plist,KEY_NAME_NCORRS_NAME)) {
473  sval = sinfo_pfits_get_ncorrs_name(plist);
474  strcpy(key_paf,PAF_NAME_NCORRS_NAME);
475  sinfo_blank2dot(key_paf,key_dpaf);
476 
477  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
478  sval, KEY_HELP_NCORRS_NAME) ;
479  }
480 
481  if (sinfo_propertylist_has(plist,KEY_NAME_DPR_TYPE)) {
482  sval = sinfo_pfits_get_dpr_type(plist);
483  strcpy(key_paf,PAF_NAME_DPR_TYPE);
484  sinfo_blank2dot(key_paf,key_dpaf);
485  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
486  sval, KEY_HELP_DPR_TYPE) ;
487  }
488 
489  if (sinfo_propertylist_has(plist,KEY_NAME_DPR_TECH)) {
490  sval = sinfo_pfits_get_dpr_tech(plist);
491  strcpy(key_paf,PAF_NAME_DPR_TECH);
492  sinfo_blank2dot(key_paf,key_dpaf);
493  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
494  sval, KEY_HELP_DPR_TECH) ;
495  }
496 
497 
498  if (sinfo_propertylist_has(plist,KEY_NAME_DPR_CATG)) {
499  sval = sinfo_pfits_get_dpr_catg(plist);
500  strcpy(key_paf,PAF_NAME_DPR_CATG);
501  sinfo_blank2dot(key_paf,key_dpaf);
502  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
503  sval, KEY_HELP_DPR_CATG) ;
504  }
505 
506  strcpy(key_paf,PAF_NAME_PRO_CATG);
507  sinfo_blank2dot(key_paf,key_dpaf);
508  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
509  pro_catg, KEY_HELP_PRO_CATG) ;
510 
511  if (sinfo_propertylist_has(plist,KEY_NAME_INS_SETUP)) {
512  sval = sinfo_pfits_get_ins_setup(plist);
513  strcpy(key_paf,PAF_NAME_INS_SETUP);
514  sinfo_blank2dot(key_paf,key_dpaf);
515  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
516  sval, KEY_HELP_INS_SETUP) ;
517  }
518 
519  n=cpl_table_get_nrow(qclog);
520  for(i=0;i<n;i++) {
521  strcpy(key_paf,cpl_table_get_string(qclog,"key_name",i));
522  sinfo_blank2dot(key_paf,key_name);
523  strcpy(key_type,cpl_table_get_string(qclog,"key_type",i));
524  strcpy(key_value,cpl_table_get_string(qclog,"key_value",i));
525  if(strcmp(key_type,"CPL_TYPE_STRING") == 0) {
526  strcat(key_name," \"%s\"\n");
527  fprintf(paf, key_name, key_value) ;
528  } else if(strcmp(key_type,"CPL_TYPE_BOOL") == 0) {
529  strcat(key_name," ");
530  strcat(key_name,"%c\n");
531  fprintf(paf, key_name, atoi(key_value)) ;
532  } else if(strcmp(key_type,"CPL_TYPE_INT") == 0) {
533  strcat(key_name," ");
534  strcat(key_name,"%d\n");
535  fprintf(paf, key_name, atoi(key_value)) ;
536  } else if(strcmp(key_type,"CPL_TYPE_FLOAT") == 0) {
537  strcat(key_name," ");
538  strcat(key_name,"%g\n");
539  fprintf(paf, key_name, (float) atof(key_value)) ;
540  } else if(strcmp(key_type,"CPL_TYPE_DOUBLE") == 0) {
541  strcat(key_name," ");
542  strcat(key_name,"%g\n");
543  fprintf(paf, key_name, atof(key_value)) ;
544  }
545 
546  }
547  fprintf(paf, "\n");
548  fclose(paf) ;
549 
550  if (sinfo_check_rec_status(1) == -1) {
551  sinfo_msg_error( "Something was wrong reading FITS keys") ;
552  return -1 ;
553  }
554  return 0;
555 
556 }
557 
558  */
559 
560 /*---------------------------------------------------------------------------*/
573 /*---------------------------------------------------------------------------*/
574 
575 
576 int sinfo_pro_save_ima(
577  cpl_image * ima,
578  cpl_frameset * ref,
579  cpl_frameset * set,
580  const char * out_file,
581  const char * pro_catg,
582  cpl_table * qclog,
583  const char * recid,
584  cpl_parameterlist* parlist)
585 
586 {
587  char * name_o ;
588  char * name_p ;
589 
590  cpl_propertylist * plist =NULL;
591  cpl_frame * first_frame=NULL;
592  char * ref_file=NULL;
593 
594  /* Get the reference file */
595  first_frame = cpl_frameset_get_first(ref) ;
596  ref_file = (char*) cpl_strdup(cpl_frame_get_filename(first_frame)) ;
597 
598  name_o = cpl_malloc(FILE_NAME_SZ * sizeof(char));
599  name_p = cpl_malloc(FILE_NAME_SZ * sizeof(char));
600  sinfo_check_name(out_file, &name_o, CPL_FRAME_TYPE_IMAGE, &name_p);
601  sinfo_msg( "Writing ima %s pro catg %s" , name_o, pro_catg) ;
602 
603  /* Get FITS header from reference file */
604  if ((cpl_error_code)((plist=cpl_propertylist_load(ref_file, 0)) == NULL)) {
605  sinfo_msg_error( "getting header from reference ima frame %s",ref_file);
606  cpl_propertylist_delete(plist) ;
607  cpl_free(ref_file);
608  return -1 ;
609  }
610 
611  sinfo_clean_header(&plist);
612  if ( ( strstr(pro_catg,"MASTER_PSF") != NULL ) ||
613  ( strstr(pro_catg,"STD_STAR_SPECTRUM") != NULL ) ||
614  ( strstr(pro_catg,"STD_STAR_SPECTRA") != NULL ) ) {
615  sinfo_clean_cube_header(&plist);
616  }
617 
618  /* Add DataFlow keywords and log the saved file in the input frameset */
619  sinfo_log_pro(name_o, pro_catg, CPL_FRAME_TYPE_IMAGE,
620  ref,&set,&plist,parlist,recid);
621  if(qclog != NULL) {
622  sinfo_pfits_put_qc(plist, qclog) ;
623  }
624 
625  /* Save the file */
626  if (cpl_image_save(ima, name_o, CPL_BPP_IEEE_FLOAT,
627  plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
628  sinfo_msg_error( "Cannot save the product %s",name_o);
629  cpl_propertylist_delete(plist) ;
630  cpl_free(ref_file);
631  cpl_free(name_o);
632  cpl_free(name_p);
633  return -1 ;
634  }
635 
636  /* THE PAF FILE FOR QC PARAMETERS
637  if( qclog != NULL) {
638  sinfo_save_paf(name_p,recid,qclog,plist,pro_catg);
639  }
640  */
641 
642  cpl_propertylist_delete(plist) ;
643  cpl_msg_indent_less() ;
644  cpl_free(name_o);
645  cpl_free(name_p);
646  cpl_free(ref_file);
647 
648  return 0 ;
649 }
650 
651 
652 /*---------------------------------------------------------------------------*/
665 /*---------------------------------------------------------------------------*/
666 
667 
668 
669 int sinfo_pro_save_tbl(
670  cpl_table * table,
671  cpl_frameset * ref,
672  cpl_frameset * set,
673  const char * out_file,
674  const char * pro_catg,
675  cpl_table * qclog,
676  const char * recid,
677  cpl_parameterlist* parlist)
678 
679 {
680  char * name_o =NULL;
681  char * name_p =NULL;
682  cpl_propertylist * plist=NULL ;
683  cpl_frame* first_frame=NULL;
684  char* ref_file=NULL;
685  /* Get the reference file */
686  first_frame = cpl_frameset_get_first(ref) ;
687  ref_file = cpl_strdup(cpl_frame_get_filename(first_frame)) ;
688 
689  name_o = cpl_malloc(FILE_NAME_SZ * sizeof(char));
690  name_p = cpl_malloc(FILE_NAME_SZ * sizeof(char));
691  sinfo_check_name(out_file, &name_o, CPL_FRAME_TYPE_TABLE, &name_p);
692  sinfo_msg( "Writing tbl %s pro catg %s" , name_o, pro_catg) ;
693 
694  /* Get FITS header from reference file */
695  if ((cpl_error_code)((plist = cpl_propertylist_load(ref_file,0)) == NULL))
696  {
697  sinfo_msg_error( "getting header from tbl frame %s",ref_file);
698  cpl_propertylist_delete(plist) ;
699  cpl_free(ref_file);
700  cpl_free(name_o);
701  cpl_free(name_p);
702  return -1 ;
703  }
704  sinfo_clean_header(&plist);
705 
706  /* Add DataFlow keywords and log the saved file in the input frameset */
707  sinfo_log_pro(name_o, pro_catg, CPL_FRAME_TYPE_TABLE,
708  ref,&set,&plist,parlist,recid);
709  if(qclog != NULL) {
710  sinfo_pfits_put_qc(plist, qclog) ;
711  }
712  /* Save the file */
713  if (cpl_table_save(table, plist, NULL, name_o, CPL_IO_DEFAULT)
714  != CPL_ERROR_NONE) {
715  sinfo_msg_error( "Cannot save the product: %s", name_o);
716  cpl_propertylist_delete(plist) ;
717  cpl_free(ref_file);
718  cpl_free(name_o);
719  cpl_free(name_p);
720  return -1 ;
721  }
722 
723 
724  /* THE PAF FILE FOR QC PARAMETERS
725  if (qclog != NULL) {
726  sinfo_save_paf(name_p,recid,qclog,plist,pro_catg);
727  }
728  */
729  cpl_propertylist_delete(plist) ;
730  cpl_msg_indent_less() ;
731  cpl_free(name_o);
732  cpl_free(name_p);
733  cpl_free(ref_file);
734  return 0 ;
735 }
736 
737 
738 
739 /*---------------------------------------------------------------------------*/
752 /*---------------------------------------------------------------------------*/
753 
754 
755 
756 int sinfo_pro_save_ims(
757  cpl_imagelist * ims,
758  cpl_frameset * ref,
759  cpl_frameset * set,
760  const char * out_file,
761  const char * pro_catg,
762  cpl_table * qclog,
763  const char * recid,
764  cpl_parameterlist* parlist)
765 
766 {
767  char * name_o=NULL;
768  char * name_p=NULL;
769 
770  cpl_propertylist * plist=NULL ;
771  cpl_frame* first_frame=NULL;
772  char* ref_file=NULL;
773 
774  /* Get the reference file */
775  first_frame = cpl_frameset_get_first(ref) ;
776  ref_file = cpl_strdup(cpl_frame_get_filename(first_frame)) ;
777 
778  name_o = cpl_malloc(FILE_NAME_SZ * sizeof(char));
779  name_p = cpl_malloc(FILE_NAME_SZ * sizeof(char));
780  sinfo_check_name(out_file, &name_o, CPL_FRAME_TYPE_IMAGE, &name_p);
781  sinfo_msg( "Writing ims %s pro catg %s" , name_o, pro_catg) ;
782  /* Get FITS header from reference file */
783  if ((cpl_error_code)((plist = cpl_propertylist_load(ref_file, 0)) == NULL))
784  {
785  sinfo_msg_error( "getting header from ims frame %s",ref_file);
786  cpl_propertylist_delete(plist) ;
787  cpl_free(ref_file);
788  cpl_free(name_o);
789  cpl_free(name_p);
790  return -1 ;
791  }
792  sinfo_clean_header(&plist);
793  if ( ( strstr(pro_catg,"STD") != NULL ) ||
794  ( strstr(pro_catg,"PSF") != NULL ) ||
795  ( strstr(pro_catg,"OBJ") != NULL ) ) {
796  sinfo_clean_cube_header(&plist);
797  }
798 
799  /* Add DataFlow keywords and log the saved file in the input frameset */
800  sinfo_log_pro(name_o, pro_catg, CPL_FRAME_TYPE_IMAGE,
801  ref,&set,&plist,parlist,recid);
802 
803  if(qclog != NULL) {
804  sinfo_pfits_put_qc(plist, qclog) ;
805  }
806 
807 
808  /* Save the file */
809  if (cpl_imagelist_save(ims, name_o, CPL_BPP_IEEE_FLOAT,
810  plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
811  sinfo_msg_error( "Cannot save the product %s",name_o);
812  cpl_propertylist_delete(plist) ;
813  cpl_free(ref_file);
814  cpl_free(name_o);
815  cpl_free(name_p);
816  return -1 ;
817  }
818 
819  /* THE PAF FILE FOR QC PARAMETERS
820  if (qclog != NULL) {
821  sinfo_save_paf(name_p,recid,qclog,plist,pro_catg);
822  }
823  */
824  cpl_propertylist_delete(plist) ;
825  cpl_msg_indent_less() ;
826  cpl_free(name_o);
827  cpl_free(name_p);
828  cpl_free(ref_file);
829  return 0 ;
830 }
831 
832 
833 
834 static void
835 sinfo_log_pro(char* name_o,
836  const char* pro_catg,
837  int frm_type,
838  cpl_frameset* ref_set,
839  cpl_frameset** out_set,
840  cpl_propertylist** plist,
841  cpl_parameterlist* parlist,
842  const char* recid)
843 {
844  cpl_frame* product_frame = NULL ;
845  char * pipe_id=NULL;
846  cpl_errorstate initial_errorstate = cpl_errorstate_get();
847 
848  pipe_id = cpl_calloc(FILE_NAME_SZ,sizeof(char));
849  snprintf(pipe_id,MAX_NAME_SIZE-1,"%s%s","sinfo/",PACKAGE_VERSION);
850  product_frame = cpl_frame_new() ;
851  cpl_frame_set_filename(product_frame, name_o) ;
852  cpl_frame_set_tag(product_frame, pro_catg) ;
853  cpl_frame_set_type(product_frame, frm_type);
854  cpl_frame_set_group(product_frame, CPL_FRAME_GROUP_PRODUCT);
855  cpl_frame_set_level(product_frame, CPL_FRAME_LEVEL_FINAL);
856 
857 #if defined CPL_VERSION_CODE && CPL_VERSION_CODE >= CPL_VERSION(4, 8, 0)
858  if(cpl_dfs_setup_product_header(*plist,product_frame,ref_set,parlist,recid,
859  pipe_id,KEY_VALUE_HPRO_DID,NULL) != CPL_ERROR_NONE) {
860  sinfo_msg_warning("Problem in the product DFS-compliance");
861  sinfo_msg_warning("%s", (char* ) cpl_error_get_message());
862  cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
863  cpl_error_reset();
864  }
865 #else
866  if(cpl_dfs_setup_product_header(*plist,product_frame,ref_set,parlist,recid,
867  pipe_id,KEY_VALUE_HPRO_DID) != CPL_ERROR_NONE) {
868  sinfo_msg_warning("Problem in the product DFS-compliance");
869  sinfo_msg_warning((char* ) cpl_error_get_message());
870  cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
871  cpl_error_reset();
872  }
873 #endif
874  cpl_frameset_insert(*out_set, product_frame);
875  cpl_free(pipe_id);
876 
877 }
878 
879 static void
880 sinfo_check_name(const char* in, char** ou, int type, char** paf) {
881 
882  char* tmp=NULL;
883  char name_b[512] ;
884  if (strstr(in, "." ) != NULL ) {
885  tmp = sinfo_new_get_rootname(in);
886  strcpy(name_b,tmp);
887  } else {
888  snprintf(name_b, MAX_NAME_SIZE-1,"%s", in) ;
889  }
890  strcpy(*ou,name_b);
891  if (type == CPL_FRAME_TYPE_TABLE) {
892  strcat(*ou,".fits");
893  } else {
894  strcat(*ou,".fits");
895  }
896  strcpy(*paf,name_b);
897  strcat(*paf,".paf");
898 
899 }
900 
901 
902 static void
903 sinfo_clean_header(cpl_propertylist** header)
904 {
905  cpl_propertylist_erase_regexp(*header, "CHECKSUM",0);
906  cpl_propertylist_erase_regexp(*header, "^ESO PRO .*",0);
907 
908 }
909 
910 
911 static void
912 sinfo_clean_cube_header(cpl_propertylist** header)
913 {
914 
915  cpl_propertylist_erase_regexp(*header, "^CRVAL*",0);
916  cpl_propertylist_erase_regexp(*header, "^CRPIX*",0);
917  cpl_propertylist_erase_regexp(*header, "^CTYPE*",0);
918  cpl_propertylist_erase_regexp(*header, "^CUNIT*",0);
919  cpl_propertylist_erase_regexp(*header, "^CD1_1",0);
920  cpl_propertylist_erase_regexp(*header, "^CD1_2",0);
921  cpl_propertylist_erase_regexp(*header, "^CD2_1",0);
922  cpl_propertylist_erase_regexp(*header, "^CD2_2",0);
923 
924 }
925 
926 
927 
928 
929 
930 
931 static int
932 sinfo_pfits_put_qc(
933  cpl_propertylist * plist,
934  cpl_table * qclog)
935 {
936  char key_name[FILE_NAME_SZ];
937  char key_value[FILE_NAME_SZ];
938  char key_type[FILE_NAME_SZ];
939  char key_help[FILE_NAME_SZ] ;
940 
941  int i =0;
942  int n =0;
943  /* Test entries */
944  if (plist == NULL) {
945  sinfo_msg_error("plist=NULL, something strange");
946  return -1 ;
947  }
948  /* Parameter Name: PIPEFILE */
949 
950  n=cpl_table_get_nrow(qclog);
951  for(i=0;i<n;i++) {
952  strcpy(key_name,"ESO ");
953  strcat(key_name,cpl_table_get_string(qclog,"key_name",i));
954  strcpy(key_type,cpl_table_get_string(qclog,"key_type",i));
955  strcpy(key_value,cpl_table_get_string(qclog,"key_value",i));
956  strcpy(key_help,cpl_table_get_string(qclog,"key_help",i));
957 
958  /* sinfo_msg("name=%s type=%s value=%s\n",key_name,key_type,key_value); */
959  if(!sinfo_propertylist_has(plist,key_name)) {
960  if(strcmp(key_type,"CPL_TYPE_STRING") == 0) {
961  cpl_propertylist_append_string(plist, key_name,key_value) ;
962  cpl_propertylist_set_comment(plist, key_name,key_help) ;
963  } else if(strcmp(key_type,"CPL_TYPE_BOOL") == 0) {
964  cpl_propertylist_append_bool(plist, key_name,atoi(key_value)) ;
965  cpl_propertylist_set_comment(plist, key_name,key_help) ;
966  } else if(strcmp(key_type,"CPL_TYPE_INT") == 0) {
967  cpl_propertylist_append_int(plist,key_name,atoi(key_value)) ;
968  cpl_propertylist_set_comment(plist, key_name,key_help) ;
969  } else if(strcmp(key_type,"CPL_TYPE_FLOAT") == 0) {
970  cpl_propertylist_append_float(plist, key_name,(float)atof(key_value)) ;
971  cpl_propertylist_set_comment(plist, key_name,key_help) ;
972  } else if(strcmp(key_type,"CPL_TYPE_DOUBLE") == 0) {
973  cpl_propertylist_append_double(plist, key_name,atof(key_value)) ;
974  cpl_propertylist_set_comment(plist, key_name,key_help) ;
975  }
976  }
977 
978  }
979 
980  return 0 ;
981 }
982 
983 
984 
985 
986 
987 
988 
989 cpl_table *
990 sinfo_qclog_init(void)
991 {
992 
993  cpl_table *table;
994 
995  table = cpl_table_new(0);
996  cpl_table_new_column(table,"key_name", CPL_TYPE_STRING);
997  cpl_table_new_column(table,"key_type", CPL_TYPE_STRING);
998  cpl_table_new_column(table,"key_value", CPL_TYPE_STRING);
999  cpl_table_new_column(table,"key_help", CPL_TYPE_STRING);
1000 
1001  return table;
1002 }
1003 
1004 
1005 
1006 
1007 
1008 int
1009 sinfo_qclog_add_int(cpl_table* table,
1010  const char* key_name,
1011  const int value,
1012  const char* key_help,
1013  const char* format)
1014 {
1015  int sz = cpl_table_get_nrow(table);
1016  int raw = sz;
1017  char key_value[FILE_NAME_SZ];
1018  char key_type[FILE_NAME_SZ];
1019 
1020  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
1021  strcpy(key_type,"CPL_TYPE_INT");
1022 
1023  cpl_table_set_size(table,sz+1);
1024 
1025  cpl_table_set_string(table,"key_name" ,raw,key_name);
1026  cpl_table_set_string(table,"key_type" ,raw,key_type);
1027  cpl_table_set_string(table,"key_value",raw,key_value);
1028  cpl_table_set_string(table,"key_help" ,raw,key_help);
1029 
1030  return 0;
1031 
1032 }
1033 
1034 
1035 
1036 int
1037 sinfo_qclog_add_bool(cpl_table* table,
1038  const char* key_name,
1039  const char value,
1040  const char* key_help,
1041  const char* format)
1042 {
1043  int sz = cpl_table_get_nrow(table);
1044  int raw = sz;
1045  char key_value[FILE_NAME_SZ];
1046  char key_type[FILE_NAME_SZ];
1047 
1048  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
1049  strcpy(key_type,"CPL_TYPE_BOOL");
1050 
1051  cpl_table_set_size(table,sz+1);
1052 
1053  cpl_table_set_string(table,"key_name" ,raw,key_name);
1054  cpl_table_set_string(table,"key_type" ,raw,key_type);
1055  cpl_table_set_string(table,"key_value",raw,key_value);
1056  cpl_table_set_string(table,"key_help" ,raw,key_help);
1057 
1058  return 0;
1059 
1060 }
1061 
1062 
1063 
1064 int
1065 sinfo_qclog_add_float(cpl_table* table,
1066  const char* key_name,
1067  const float value,
1068  const char* key_help,
1069  const char* format)
1070 {
1071  int sz = cpl_table_get_nrow(table);
1072  int raw = sz;
1073  char key_value[FILE_NAME_SZ];
1074  char key_type[FILE_NAME_SZ];
1075 
1076  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
1077  strcpy(key_type,"CPL_TYPE_FLOAT");
1078 
1079  cpl_table_set_size(table,sz+1);
1080 
1081  cpl_table_set_string(table,"key_name" ,raw,key_name);
1082  cpl_table_set_string(table,"key_type" ,raw,key_type);
1083  cpl_table_set_string(table,"key_value",raw,key_value);
1084  cpl_table_set_string(table,"key_help" ,raw,key_help);
1085 
1086  return 0;
1087 
1088 }
1089 
1090 
1091 
1092 int
1093 sinfo_qclog_add_double(cpl_table* table,
1094  const char* key_name,
1095  const double value,
1096  const char* key_help,
1097  const char* format)
1098 {
1099  int sz = cpl_table_get_nrow(table);
1100  int raw = sz;
1101  char key_value[FILE_NAME_SZ];
1102  char key_type[FILE_NAME_SZ];
1103 
1104  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
1105  strcpy(key_type,"CPL_TYPE_DOUBLE");
1106 
1107  cpl_table_set_size(table,sz+1);
1108 
1109  cpl_table_set_string(table,"key_name" ,raw,key_name);
1110  cpl_table_set_string(table,"key_type" ,raw,key_type);
1111  cpl_table_set_string(table,"key_value",raw,key_value);
1112  cpl_table_set_string(table,"key_help" ,raw,key_help);
1113 
1114  return 0;
1115 
1116 }
1117 
1118 int
1119 sinfo_qclog_add_string(cpl_table* table,
1120  const char* key_name,
1121  const char* value,
1122  const char* key_help,
1123  const char* format)
1124 {
1125  int sz = cpl_table_get_nrow(table);
1126  int raw = sz;
1127  char key_value[FILE_NAME_SZ];
1128  char key_type[FILE_NAME_SZ];
1129 
1130  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
1131  strcpy(key_type,"CPL_TYPE_STRING");
1132 
1133  cpl_table_set_size(table,sz+1);
1134 
1135  cpl_table_set_string(table,"key_name" ,raw,key_name);
1136  cpl_table_set_string(table,"key_type" ,raw,key_type);
1137  cpl_table_set_string(table,"key_value",raw,key_value);
1138  cpl_table_set_string(table,"key_help" ,raw,key_help);
1139 
1140  return 0;
1141 
1142 }
1143 
1144 
1145 
1146