SINFONI Pipeline Reference Manual  2.6.0
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 
70 int
71 sinfo_update_fits_card_int(const char* file,const char* card,int value)
72 {
73  cpl_propertylist * plist =NULL;
74  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
75  sinfo_msg_error( "getting header from file %s",file);
76  cpl_propertylist_delete(plist) ;
77  return -1 ;
78  }
79 
80  if (CPL_ERROR_NONE!=cpl_propertylist_set_int(plist,card,value)){
81  sinfo_msg_error( "setting header of file %s",file);
82  cpl_propertylist_delete(plist) ;
83  return -1 ;
84  }
85  cpl_propertylist_delete(plist) ;
86  return 0;
87 }
88 
98 int
99 sinfo_update_fits_card_float(const char* file,const char* card,float value)
100 {
101  cpl_propertylist * plist =NULL;
102  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
103  sinfo_msg_error( "getting header from file %s",file);
104  sinfo_msg_error("%s", (char* ) cpl_error_get_message());
105  sinfo_msg_error("%s", (char* ) cpl_error_get_where());
106  cpl_propertylist_delete(plist) ;
107  return -1 ;
108  }
109 
110  if (CPL_ERROR_NONE!=cpl_propertylist_set_float(plist,card,value)){
111  sinfo_msg_error( "setting header of file %s",file);
112  sinfo_msg_error("%s", (char* ) cpl_error_get_message());
113  sinfo_msg_error("%s", (char* ) cpl_error_get_where());
114  cpl_propertylist_delete(plist) ;
115  return -1 ;
116  }
117  cpl_propertylist_delete(plist) ;
118  return 0;
119 }
120 
121 
131 int
132 sinfo_update_fits_card_double(const char* file,const char* card,double value)
133 {
134  cpl_propertylist * plist =NULL;
135  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
136  sinfo_msg_error( "getting header from file %s",file);
137  cpl_propertylist_delete(plist) ;
138  return -1 ;
139  }
140 
141  if (CPL_ERROR_NONE!=cpl_propertylist_set_double(plist,card,value)){
142  sinfo_msg_error( "gsetting header of file %s",file);
143  cpl_propertylist_delete(plist) ;
144  return -1 ;
145  }
146  cpl_propertylist_delete(plist) ;
147  return 0;
148 }
149 
159 int
160 sinfo_update_fits_card_long(const char* file,const char* card,long value)
161 {
162  cpl_propertylist * plist =NULL;
163  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
164  sinfo_msg_error( "getting header from file %s",file);
165  cpl_propertylist_delete(plist) ;
166  return -1 ;
167  }
168  if (CPL_ERROR_NONE!=cpl_propertylist_set_long(plist,card,value)){
169  sinfo_msg_error( "setting header of file %s",file);
170  cpl_propertylist_delete(plist) ;
171  return -1 ;
172  }
173  cpl_propertylist_delete(plist) ;
174  return 0;
175 }
176 
186 int
187 sinfo_update_ims_fits_card_string(cpl_imagelist* iml,
188  const char* file,
189  const char* card,
190  const char* value)
191 {
192 
193  cpl_propertylist * plist =NULL;
194  if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
195  sinfo_msg_error( "getting header from reference ima frame %s",file);
196  cpl_propertylist_delete(plist) ;
197  return -1 ;
198  }
199 
200 
201  if (CPL_ERROR_NONE!=cpl_propertylist_set_string(plist,card,value)){
202  sinfo_msg_error( "getting header from reference ima frame %s",file);
203  cpl_propertylist_delete(plist) ;
204  return -1 ;
205  }
206 
207  if (cpl_imagelist_save(iml,file,CPL_BPP_IEEE_FLOAT,
208  plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
209  sinfo_msg_error( "getting header from reference ima frame %s",file);
210  cpl_propertylist_delete(plist) ;
211  return -1 ;
212  }
213  cpl_propertylist_delete(plist) ;
214  return 0;
215 }
216 /* Not used
217 static int sinfo_save_paf(char* name_p,
218  const char* rec_id,
219  cpl_table* qclog,
220  cpl_propertylist* plist,
221  const char* pro_catg)
222 {
223 
224 
225 
226  FILE * paf ;
227  const char * sval ;
228  char key_name[FILE_NAME_SZ] ;
229  char key_paf[FILE_NAME_SZ] ;
230  char key_dpaf[FILE_NAME_SZ] ;
231  char key_type[FILE_NAME_SZ] ;
232  char key_value[FILE_NAME_SZ] ;
233  double dval=0;
234 
235  int i =0;
236  int n=0;
237  sinfo_msg( "Writing %s" , name_p) ;
238  // Create the default PAF header
239  if ((paf = sinfo_paf_print_header(name_p,rec_id,"QC file","login-name",
240  sinfo_get_datetime_iso8601())) == NULL) {
241  sinfo_msg_error( "cannot open file [%s] for output", name_p) ;
242  return -1 ;
243  }
244  if (sinfo_check_rec_status(0) == -1) {
245  sinfo_msg_error( "Something was wrong") ;
246  return -1 ;
247  }
248 
249  // Test entries
250  sinfo_blank2dot(PAF_NAME_PIPE_ID,key_dpaf);
251  fprintf(paf,"%-21s \"%s\" ;# %s\" \n", key_dpaf,
252  VERSION,KEY_HELP_PIPE_ID);
253 
254  strcpy(key_name,KEY_NAME_PIPEFILE);
255  strcpy(key_paf,KEY_NAME_PIPEFILE);
256  sinfo_blank2dot(key_paf,key_dpaf);
257  if (cpl_propertylist_has(plist, key_name)) {
258  fprintf(paf,"%-21s \"%s\" ;# %s\" \n",key_dpaf,
259  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PIPEFILE);
260  }
261 
262  // Value: "TEMPORARY", "PREPROCESSED", "REDUCED" or "QCPARAM".
263  strcpy(key_name,KEY_NAME_PRO_TYPE);
264  strcpy(key_paf,PAF_NAME_PRO_TYPE);
265  sinfo_blank2dot(key_paf,key_dpaf);
266  if (cpl_propertylist_has(plist, key_name)) {
267  fprintf(paf,"%-21s \"%s\" ;# %s\" \n", key_dpaf,
268  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PRO_TYPE);
269  }
270 
271  strcpy(key_name,KEY_NAME_PRO_DATANCOM);
272  strcpy(key_paf,PAF_NAME_PRO_DATANCOM);
273  sinfo_blank2dot(key_paf,key_dpaf);
274  if (cpl_propertylist_has(plist,key_name)) {
275  fprintf(paf,"%-21s %d ;# %s\" \n",key_dpaf,
276  cpl_propertylist_get_int(plist,key_name),KEY_HELP_PRO_DATANCOM);
277  }
278 
279  strcpy(key_name,KEY_NAME_NCORRS_NAME);
280  strcpy(key_paf,PAF_NAME_NCORRS_NAME);
281  sinfo_blank2dot(key_paf,key_dpaf);
282  if (cpl_propertylist_has(plist, key_name)) {
283  fprintf(paf,"%-21s \"%s\" ;# %s \n", key_dpaf,
284  cpl_propertylist_get_string(plist,key_name),KEY_HELP_NCORRS_NAME);
285  }
286 
287  strcpy(key_name,KEY_NAME_DET_NDSAMPLES);
288  strcpy(key_paf,PAF_NAME_DET_NDSAMPLES);
289  sinfo_blank2dot(key_paf,key_dpaf);
290  if (cpl_propertylist_has(plist, key_name)) {
291  fprintf(paf,"%-21s %d ;# %s \n",key_dpaf,
292  cpl_propertylist_get_int(plist,key_name),KEY_HELP_DET_NDSAMPLES);
293  }
294 
295  strcpy(key_name,KEY_NAME_FILT_NAME);
296  strcpy(key_paf,PAF_NAME_FILT_NAME);
297  sinfo_blank2dot(key_paf,key_dpaf);
298  if (cpl_propertylist_has(plist, key_name)) {
299  fprintf(paf,"%-21s \"%s\" ;# %s \n", key_dpaf,
300  cpl_propertylist_get_string(plist,key_name),KEY_HELP_FILT_NAME);
301  }
302 
303  strcpy(key_name,KEY_NAME_FILT_ID);
304  strcpy(key_paf,PAF_NAME_FILT_ID);
305  sinfo_blank2dot(key_paf,key_dpaf);
306  if (cpl_propertylist_has(plist, key_name)) {
307  fprintf(paf,"%-21s \"%s\" ;# %s \n",key_dpaf,
308  cpl_propertylist_get_string(plist,key_name),KEY_HELP_FILT_ID);
309  }
310 
311  strcpy(key_name,KEY_NAME_PREOPTICS);
312  strcpy(key_paf,PAF_NAME_PREOPTICS);
313  sinfo_blank2dot(key_paf,key_dpaf);
314  if (cpl_propertylist_has(plist, key_name)) {
315  fprintf(paf,"%-21s \"%s\" ;# %s \n",key_dpaf,
316  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PREOPTICS);
317  }
318 
319  strcpy(key_name,KEY_NAME_GRAT_NAME);
320  strcpy(key_paf,PAF_NAME_GRAT_NAME);
321  sinfo_blank2dot(key_paf,key_dpaf);
322  if (cpl_propertylist_has(plist, key_name)) {
323  fprintf(paf, "%-21s \"%s\" ;# %s \n",key_dpaf,
324  cpl_propertylist_get_string(plist,key_name),KEY_HELP_GRAT_NAME);
325  }
326 
327  strcpy(key_name,KEY_NAME_GRAT_WLEN);
328  strcpy(key_paf,PAF_NAME_GRAT_WLEN);
329  sinfo_blank2dot(key_paf,key_dpaf);
330  if (cpl_propertylist_has(plist, key_name)) {
331  fprintf(paf, "%-21s %f ;# %s \n", key_dpaf,
332  cpl_propertylist_get_double(plist,key_name),KEY_HELP_GRAT_WLEN);
333  }
334 
335  strcpy(key_name,KEY_NAME_PRO_RECID);
336  strcpy(key_paf,PAF_NAME_PRO_RECID);
337  sinfo_blank2dot(key_paf,key_dpaf);
338  if (cpl_propertylist_has(plist, key_name)) {
339  fprintf(paf,"%-21s \"%s\" ;# %s \n", key_dpaf,
340  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PRO_RECID);
341  }
342 
343 
344  // snprintf(cval, MAX_NAME_SIZE-1,"CPL-%s", get_cpl_version());
345  strcpy(key_name,KEY_NAME_PRO_DRSID);
346  strcpy(key_paf,PAF_NAME_PRO_DRSID);
347  sinfo_blank2dot(key_paf,key_dpaf);
348  if (cpl_propertylist_has(plist, key_name)) {
349  fprintf(paf,"%-21s \"%s\" ;# %s \n",key_dpaf,
350  cpl_propertylist_get_string(plist,key_name),KEY_HELP_PRO_DRSID);
351  }
352 
353  if (cpl_propertylist_has(plist,KEY_NAME_DATE_OBS)) {
354  sval = sinfo_pfits_get_date_obs(plist);
355  strcpy(key_paf,KEY_NAME_DATE_OBS);
356  sinfo_blank2dot(key_paf,key_dpaf);
357  fprintf(paf, "%-21s \"%s\" ;# %s\n",key_dpaf,
358  sval,KEY_HELP_DATE_OBS) ;
359  }
360 
361 
362  if (cpl_propertylist_has(plist,KEY_NAME_TEL_AIRM_START)) {
363  dval = sinfo_pfits_get_airmass_start(plist);
364  strcpy(key_paf,PAF_NAME_TEL_AIRM_START);
365  sinfo_blank2dot(key_paf,key_dpaf);
366  fprintf(paf, "%-21s \"%f\" ;# %s \n",key_dpaf,
367  dval,KEY_HELP_TEL_AIRM_START) ;
368  }
369 
370  if (cpl_propertylist_has(plist,KEY_NAME_ARCFILE)) {
371  sval = sinfo_pfits_get_arcfile(plist);
372  strcpy(key_paf,KEY_NAME_ARCFILE);
373  sinfo_blank2dot(key_paf,key_dpaf);
374  fprintf(paf, "%-21s \"%s\" ;# %s \n", key_dpaf,sval,KEY_HELP_ARCFILE) ;
375 
376  } else if (cpl_propertylist_has(plist,KEY_NAME_PRO_REC1_RAW1_NAME)) {
377  sval = sinfo_pfits_get_rec1raw1name(plist);
378  strcpy(key_paf,KEY_NAME_ARCFILE);
379  sinfo_blank2dot(key_paf,key_dpaf);
380  fprintf(paf, "%-21s \"%s\" ;# %s \n", key_dpaf,sval,KEY_HELP_ARCFILE) ;
381  } else {
382  sinfo_msg_error("%s is missing QC LOG will fail!",KEY_NAME_ARCFILE);
383  }
384 
385  if (cpl_propertylist_has(plist,KEY_NAME_TPL_ID)) {
386  sval = sinfo_pfits_get_templateid(plist);
387  strcpy(key_paf,PAF_NAME_TPL_ID);
388  sinfo_blank2dot(key_paf,key_dpaf);
389  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
390  sval,KEY_HELP_TPL_ID) ;
391 
392  }
393 
394  if (cpl_propertylist_has(plist,KEY_NAME_DET_DIT)) {
395  strcpy(key_paf,PAF_NAME_DET_DIT);
396  sinfo_blank2dot(key_paf,key_dpaf);
397  fprintf(paf,"%-21s %f ; # %s\n", key_dpaf,
398  sinfo_pfits_get_dit(plist),KEY_HELP_DET_DIT) ;
399  }
400 
401 
402  if (cpl_propertylist_has(plist,KEY_NAME_DET_NDIT)) {
403  strcpy(key_paf,PAF_NAME_DET_NDIT);
404  sinfo_blank2dot(key_paf,key_dpaf);
405  fprintf(paf,"%-21s %d ; # %s\n", key_dpaf,
406  sinfo_pfits_get_ndit(plist),KEY_HELP_DET_NDIT) ;
407  }
408 
409  if (cpl_propertylist_has(plist,KEY_NAME_NCORRS_NAME)) {
410  sval = sinfo_pfits_get_ncorrs_name(plist);
411  strcpy(key_paf,PAF_NAME_NCORRS_NAME);
412  sinfo_blank2dot(key_paf,key_dpaf);
413 
414  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
415  sval, KEY_HELP_NCORRS_NAME) ;
416  }
417 
418  if (cpl_propertylist_has(plist,KEY_NAME_DPR_TYPE)) {
419  sval = sinfo_pfits_get_dpr_type(plist);
420  strcpy(key_paf,PAF_NAME_DPR_TYPE);
421  sinfo_blank2dot(key_paf,key_dpaf);
422  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
423  sval, KEY_HELP_DPR_TYPE) ;
424  }
425 
426  if (cpl_propertylist_has(plist,KEY_NAME_DPR_TECH)) {
427  sval = sinfo_pfits_get_dpr_tech(plist);
428  strcpy(key_paf,PAF_NAME_DPR_TECH);
429  sinfo_blank2dot(key_paf,key_dpaf);
430  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
431  sval, KEY_HELP_DPR_TECH) ;
432  }
433 
434 
435  if (cpl_propertylist_has(plist,KEY_NAME_DPR_CATG)) {
436  sval = sinfo_pfits_get_dpr_catg(plist);
437  strcpy(key_paf,PAF_NAME_DPR_CATG);
438  sinfo_blank2dot(key_paf,key_dpaf);
439  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
440  sval, KEY_HELP_DPR_CATG) ;
441  }
442 
443  strcpy(key_paf,PAF_NAME_PRO_CATG);
444  sinfo_blank2dot(key_paf,key_dpaf);
445  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
446  pro_catg, KEY_HELP_PRO_CATG) ;
447 
448  if (cpl_propertylist_has(plist,KEY_NAME_INS_SETUP)) {
449  sval = sinfo_pfits_get_ins_setup(plist);
450  strcpy(key_paf,PAF_NAME_INS_SETUP);
451  sinfo_blank2dot(key_paf,key_dpaf);
452  fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
453  sval, KEY_HELP_INS_SETUP) ;
454  }
455 
456  n=cpl_table_get_nrow(qclog);
457  for(i=0;i<n;i++) {
458  strcpy(key_paf,cpl_table_get_string(qclog,"key_name",i));
459  sinfo_blank2dot(key_paf,key_name);
460  strcpy(key_type,cpl_table_get_string(qclog,"key_type",i));
461  strcpy(key_value,cpl_table_get_string(qclog,"key_value",i));
462  if(strcmp(key_type,"CPL_TYPE_STRING") == 0) {
463  strcat(key_name," \"%s\"\n");
464  fprintf(paf, key_name, key_value) ;
465  } else if(strcmp(key_type,"CPL_TYPE_BOOL") == 0) {
466  strcat(key_name," ");
467  strcat(key_name,"%c\n");
468  fprintf(paf, key_name, atoi(key_value)) ;
469  } else if(strcmp(key_type,"CPL_TYPE_INT") == 0) {
470  strcat(key_name," ");
471  strcat(key_name,"%d\n");
472  fprintf(paf, key_name, atoi(key_value)) ;
473  } else if(strcmp(key_type,"CPL_TYPE_FLOAT") == 0) {
474  strcat(key_name," ");
475  strcat(key_name,"%g\n");
476  fprintf(paf, key_name, (float) atof(key_value)) ;
477  } else if(strcmp(key_type,"CPL_TYPE_DOUBLE") == 0) {
478  strcat(key_name," ");
479  strcat(key_name,"%g\n");
480  fprintf(paf, key_name, atof(key_value)) ;
481  }
482 
483  }
484  fprintf(paf, "\n");
485  fclose(paf) ;
486 
487  if (sinfo_check_rec_status(1) == -1) {
488  sinfo_msg_error( "Something was wrong reading FITS keys") ;
489  return -1 ;
490  }
491  return 0;
492 
493 }
494 
495  */
496 
497 /*---------------------------------------------------------------------------*/
510 /*---------------------------------------------------------------------------*/
511 
512 
513 int sinfo_pro_save_ima(
514  cpl_image * ima,
515  cpl_frameset * ref,
516  cpl_frameset * set,
517  const char * out_file,
518  const char * pro_catg,
519  cpl_table * qclog,
520  const char * recid,
521  cpl_parameterlist* parlist)
522 
523 {
524  char * name_o ;
525  char * name_p ;
526 
527  cpl_propertylist * plist =NULL;
528  //cpl_frame * first_frame=NULL;
529  char * ref_file=NULL;
530 
531  /* Get the reference file */
532  cpl_frameset_iterator* it = cpl_frameset_iterator_new(ref);
533  cpl_frame *first_frame = cpl_frameset_iterator_get(it);
534 
535  ref_file = (char*) cpl_strdup(cpl_frame_get_filename(first_frame)) ;
536 
537  name_o = cpl_malloc(FILE_NAME_SZ * sizeof(char));
538  name_p = cpl_malloc(FILE_NAME_SZ * sizeof(char));
539  sinfo_check_name(out_file, &name_o, CPL_FRAME_TYPE_IMAGE, &name_p);
540  sinfo_msg( "Writing ima %s pro catg %s" , name_o, pro_catg) ;
541 
542  /* Get FITS header from reference file */
543  if ((cpl_error_code)((plist=cpl_propertylist_load(ref_file, 0)) == NULL)) {
544  sinfo_msg_error( "getting header from reference ima frame %s",ref_file);
545  cpl_propertylist_delete(plist) ;
546  cpl_free(ref_file);
547  cpl_frameset_iterator_delete(it);
548  return -1 ;
549  }
550 
551  sinfo_clean_header(&plist);
552  if ( ( strstr(pro_catg,"MASTER_PSF") != NULL ) ||
553  ( strstr(pro_catg,"STD_STAR_SPECTRUM") != NULL ) ||
554  ( strstr(pro_catg,"STD_STAR_SPECTRA") != NULL ) ) {
555  sinfo_clean_cube_header(&plist);
556  }
557 
558  /* Add DataFlow keywords and log the saved file in the input frameset */
559  sinfo_log_pro(name_o, pro_catg, CPL_FRAME_TYPE_IMAGE,
560  ref,&set,&plist,parlist,recid);
561  if(qclog != NULL) {
562  sinfo_pfits_put_qc(plist, qclog) ;
563  }
564 
565  /* Save the file */
566  if (cpl_image_save(ima, name_o, CPL_BPP_IEEE_FLOAT,
567  plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
568  sinfo_msg_error( "Cannot save the product %s",name_o);
569  cpl_propertylist_delete(plist) ;
570  cpl_free(ref_file);
571  cpl_free(name_o);
572  cpl_free(name_p);
573  cpl_frameset_iterator_delete(it);
574  return -1 ;
575  }
576 
577  /* THE PAF FILE FOR QC PARAMETERS
578  if( qclog != NULL) {
579  sinfo_save_paf(name_p,recid,qclog,plist,pro_catg);
580  }
581  */
582 
583  cpl_propertylist_delete(plist) ;
584  cpl_msg_indent_less() ;
585  cpl_free(name_o);
586  cpl_free(name_p);
587  cpl_free(ref_file);
588  cpl_frameset_iterator_delete(it);
589 
590  return 0 ;
591 }
592 
593 
594 /*---------------------------------------------------------------------------*/
607 /*---------------------------------------------------------------------------*/
608 
609 
610 
611 int sinfo_pro_save_tbl(
612  cpl_table * table,
613  cpl_frameset * ref,
614  cpl_frameset * set,
615  const char * out_file,
616  const char * pro_catg,
617  cpl_table * qclog,
618  const char * recid,
619  cpl_parameterlist* parlist)
620 
621 {
622  char * name_o =NULL;
623  char * name_p =NULL;
624  cpl_propertylist * plist=NULL ;
625  char* ref_file=NULL;
626  /* Get the reference file */
627 
628  cpl_frameset_iterator* it = cpl_frameset_iterator_new(ref);
629  cpl_frame *first_frame = cpl_frameset_iterator_get(it);
630  ref_file = cpl_strdup(cpl_frame_get_filename(first_frame)) ;
631 
632  name_o = cpl_malloc(FILE_NAME_SZ * sizeof(char));
633  name_p = cpl_malloc(FILE_NAME_SZ * sizeof(char));
634  sinfo_check_name(out_file, &name_o, CPL_FRAME_TYPE_TABLE, &name_p);
635  sinfo_msg( "Writing tbl %s pro catg %s" , name_o, pro_catg) ;
636 
637  /* Get FITS header from reference file */
638  if ((cpl_error_code)((plist = cpl_propertylist_load(ref_file,0)) == NULL))
639  {
640  sinfo_msg_error( "getting header from tbl frame %s",ref_file);
641  cpl_propertylist_delete(plist) ;
642  cpl_free(ref_file);
643  cpl_free(name_o);
644  cpl_free(name_p);
645  cpl_frameset_iterator_delete(it);
646  return -1 ;
647  }
648  sinfo_clean_header(&plist);
649 
650  /* Add DataFlow keywords and log the saved file in the input frameset */
651  sinfo_log_pro(name_o, pro_catg, CPL_FRAME_TYPE_TABLE,
652  ref,&set,&plist,parlist,recid);
653  if(qclog != NULL) {
654  sinfo_pfits_put_qc(plist, qclog) ;
655  }
656  /* Save the file */
657  if (cpl_table_save(table, plist, NULL, name_o, CPL_IO_DEFAULT)
658  != CPL_ERROR_NONE) {
659  sinfo_msg_error( "Cannot save the product: %s", name_o);
660  cpl_propertylist_delete(plist) ;
661  cpl_free(ref_file);
662  cpl_free(name_o);
663  cpl_free(name_p);
664  cpl_frameset_iterator_delete(it);
665  return -1 ;
666  }
667 
668 
669  /* THE PAF FILE FOR QC PARAMETERS
670  if (qclog != NULL) {
671  sinfo_save_paf(name_p,recid,qclog,plist,pro_catg);
672  }
673  */
674  cpl_propertylist_delete(plist) ;
675  cpl_msg_indent_less() ;
676  cpl_free(name_o);
677  cpl_free(name_p);
678  cpl_free(ref_file);
679  cpl_frameset_iterator_delete(it);
680  return 0 ;
681 }
682 
683 
684 
685 /*---------------------------------------------------------------------------*/
698 /*---------------------------------------------------------------------------*/
699 
700 
701 
702 int sinfo_pro_save_ims(
703  cpl_imagelist * ims,
704  cpl_frameset * ref,
705  cpl_frameset * set,
706  const char * out_file,
707  const char * pro_catg,
708  cpl_table * qclog,
709  const char * recid,
710  cpl_parameterlist* parlist)
711 
712 {
713  char * name_o=NULL;
714  char * name_p=NULL;
715 
716  cpl_propertylist * plist=NULL ;
717  char* ref_file=NULL;
718 
719  /* Get the reference file */
720  cpl_frameset_iterator* it = cpl_frameset_iterator_new(ref);
721  cpl_frame *first_frame = cpl_frameset_iterator_get(it);
722 
723  ref_file = cpl_strdup(cpl_frame_get_filename(first_frame)) ;
724 
725  name_o = cpl_malloc(FILE_NAME_SZ * sizeof(char));
726  name_p = cpl_malloc(FILE_NAME_SZ * sizeof(char));
727  sinfo_check_name(out_file, &name_o, CPL_FRAME_TYPE_IMAGE, &name_p);
728  sinfo_msg( "Writing ims %s pro catg %s" , name_o, pro_catg) ;
729  /* Get FITS header from reference file */
730  if ((cpl_error_code)((plist = cpl_propertylist_load(ref_file, 0)) == NULL))
731  {
732  sinfo_msg_error( "getting header from ims frame %s",ref_file);
733  cpl_propertylist_delete(plist) ;
734  cpl_free(ref_file);
735  cpl_free(name_o);
736  cpl_free(name_p);
737  cpl_frameset_iterator_delete(it);
738  return -1 ;
739  }
740  sinfo_clean_header(&plist);
741  if ( ( strstr(pro_catg,"STD") != NULL ) ||
742  ( strstr(pro_catg,"PSF") != NULL ) ||
743  ( strstr(pro_catg,"OBJ") != NULL ) ) {
744  sinfo_clean_cube_header(&plist);
745  }
746 
747  /* Add DataFlow keywords and log the saved file in the input frameset */
748  sinfo_log_pro(name_o, pro_catg, CPL_FRAME_TYPE_IMAGE,
749  ref,&set,&plist,parlist,recid);
750 
751  if(qclog != NULL) {
752  sinfo_pfits_put_qc(plist, qclog) ;
753  }
754 
755 
756  /* Save the file */
757  if (cpl_imagelist_save(ims, name_o, CPL_BPP_IEEE_FLOAT,
758  plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
759  sinfo_msg_error( "Cannot save the product %s",name_o);
760  cpl_propertylist_delete(plist) ;
761  cpl_free(ref_file);
762  cpl_free(name_o);
763  cpl_free(name_p);
764  cpl_frameset_iterator_delete(it);
765  return -1 ;
766  }
767 
768  /* THE PAF FILE FOR QC PARAMETERS
769  if (qclog != NULL) {
770  sinfo_save_paf(name_p,recid,qclog,plist,pro_catg);
771  }
772  */
773  cpl_propertylist_delete(plist) ;
774  cpl_msg_indent_less() ;
775  cpl_free(name_o);
776  cpl_free(name_p);
777  cpl_free(ref_file);
778  cpl_frameset_iterator_delete(it);
779  return 0 ;
780 }
781 
782 
783 
784 static void
785 sinfo_log_pro(char* name_o,
786  const char* pro_catg,
787  int frm_type,
788  cpl_frameset* ref_set,
789  cpl_frameset** out_set,
790  cpl_propertylist** plist,
791  cpl_parameterlist* parlist,
792  const char* recid)
793 {
794  cpl_frame* product_frame = NULL ;
795  char * pipe_id=NULL;
796  cpl_errorstate initial_errorstate = cpl_errorstate_get();
797 
798  pipe_id = cpl_calloc(FILE_NAME_SZ,sizeof(char));
799  snprintf(pipe_id,MAX_NAME_SIZE-1,"%s%s","sinfo/",PACKAGE_VERSION);
800  product_frame = cpl_frame_new() ;
801  cpl_frame_set_filename(product_frame, name_o) ;
802  cpl_frame_set_tag(product_frame, pro_catg) ;
803  cpl_frame_set_type(product_frame, frm_type);
804  cpl_frame_set_group(product_frame, CPL_FRAME_GROUP_PRODUCT);
805  cpl_frame_set_level(product_frame, CPL_FRAME_LEVEL_FINAL);
806 
807 #if defined CPL_VERSION_CODE && CPL_VERSION_CODE >= CPL_VERSION(4, 8, 0)
808  if(cpl_dfs_setup_product_header(*plist,product_frame,ref_set,parlist,recid,
809  pipe_id,KEY_VALUE_HPRO_DID,NULL) != CPL_ERROR_NONE) {
810  sinfo_msg_warning("Problem in the product DFS-compliance");
811  sinfo_msg_warning("%s", (char* ) cpl_error_get_message());
812  cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
813  cpl_error_reset();
814  }
815 #else
816  if(cpl_dfs_setup_product_header(*plist,product_frame,ref_set,parlist,recid,
817  pipe_id,KEY_VALUE_HPRO_DID) != CPL_ERROR_NONE) {
818  sinfo_msg_warning("Problem in the product DFS-compliance");
819  sinfo_msg_warning((char* ) cpl_error_get_message());
820  cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
821  cpl_error_reset();
822  }
823 #endif
824  cpl_frameset_insert(*out_set, product_frame);
825  cpl_free(pipe_id);
826 
827 }
828 
829 static void
830 sinfo_check_name(const char* in, char** ou, int type, char** paf) {
831 
832  char name_b[512] ;
833  if (strstr(in, "." ) != NULL ) {
834  char* tmp = sinfo_new_get_rootname(in);
835  strcpy(name_b,tmp);
836  } else {
837  snprintf(name_b, MAX_NAME_SIZE-1,"%s", in) ;
838  }
839  strcpy(*ou,name_b);
840  if (type == CPL_FRAME_TYPE_TABLE) {
841  strcat(*ou,".fits");
842  } else {
843  strcat(*ou,".fits");
844  }
845  strcpy(*paf,name_b);
846  strcat(*paf,".paf");
847 
848 }
849 
850 
851 static void
852 sinfo_clean_header(cpl_propertylist** header)
853 {
854  cpl_propertylist_erase_regexp(*header, "CHECKSUM",0);
855  cpl_propertylist_erase_regexp(*header, "^ESO PRO .*",0);
856 
857 }
858 
859 
860 static void
861 sinfo_clean_cube_header(cpl_propertylist** header)
862 {
863 
864  cpl_propertylist_erase_regexp(*header, "^CRVAL*",0);
865  cpl_propertylist_erase_regexp(*header, "^CRPIX*",0);
866  cpl_propertylist_erase_regexp(*header, "^CTYPE*",0);
867  cpl_propertylist_erase_regexp(*header, "^CUNIT*",0);
868  cpl_propertylist_erase_regexp(*header, "^CD1_1",0);
869  cpl_propertylist_erase_regexp(*header, "^CD1_2",0);
870  cpl_propertylist_erase_regexp(*header, "^CD2_1",0);
871  cpl_propertylist_erase_regexp(*header, "^CD2_2",0);
872 
873 }
874 
875 
876 
877 
878 
879 
880 static int
881 sinfo_pfits_put_qc(
882  cpl_propertylist * plist,
883  cpl_table * qclog)
884 {
885  char key_name[FILE_NAME_SZ];
886  char key_value[FILE_NAME_SZ];
887  char key_type[FILE_NAME_SZ];
888  char key_help[FILE_NAME_SZ] ;
889 
890  int i =0;
891  int n =0;
892  /* Test entries */
893  if (plist == NULL) {
894  sinfo_msg_error("plist=NULL, something strange");
895  return -1 ;
896  }
897  /* Parameter Name: PIPEFILE */
898 
899  n=cpl_table_get_nrow(qclog);
900  for(i=0;i<n;i++) {
901  strcpy(key_name,"ESO ");
902  strcat(key_name,cpl_table_get_string(qclog,"key_name",i));
903  strcpy(key_type,cpl_table_get_string(qclog,"key_type",i));
904  strcpy(key_value,cpl_table_get_string(qclog,"key_value",i));
905  strcpy(key_help,cpl_table_get_string(qclog,"key_help",i));
906 
907  /* sinfo_msg("name=%s type=%s value=%s\n",key_name,key_type,key_value); */
908  if(!cpl_propertylist_has(plist,key_name)) {
909  if(strcmp(key_type,"CPL_TYPE_STRING") == 0) {
910  cpl_propertylist_append_string(plist, key_name,key_value) ;
911  cpl_propertylist_set_comment(plist, key_name,key_help) ;
912  } else if(strcmp(key_type,"CPL_TYPE_BOOL") == 0) {
913  cpl_propertylist_append_bool(plist, key_name,atoi(key_value)) ;
914  cpl_propertylist_set_comment(plist, key_name,key_help) ;
915  } else if(strcmp(key_type,"CPL_TYPE_INT") == 0) {
916  cpl_propertylist_append_int(plist,key_name,atoi(key_value)) ;
917  cpl_propertylist_set_comment(plist, key_name,key_help) ;
918  } else if(strcmp(key_type,"CPL_TYPE_FLOAT") == 0) {
919  cpl_propertylist_append_float(plist, key_name,(float)atof(key_value)) ;
920  cpl_propertylist_set_comment(plist, key_name,key_help) ;
921  } else if(strcmp(key_type,"CPL_TYPE_DOUBLE") == 0) {
922  cpl_propertylist_append_double(plist, key_name,atof(key_value)) ;
923  cpl_propertylist_set_comment(plist, key_name,key_help) ;
924  }
925  }
926 
927  }
928 
929  return 0 ;
930 }
931 
932 
933 
934 
935 
936 
937 
938 cpl_table *
939 sinfo_qclog_init(void)
940 {
941 
942  cpl_table *table;
943 
944  table = cpl_table_new(0);
945  cpl_table_new_column(table,"key_name", CPL_TYPE_STRING);
946  cpl_table_new_column(table,"key_type", CPL_TYPE_STRING);
947  cpl_table_new_column(table,"key_value", CPL_TYPE_STRING);
948  cpl_table_new_column(table,"key_help", CPL_TYPE_STRING);
949 
950  return table;
951 }
952 
953 
954 
955 
956 
957 int
958 sinfo_qclog_add_int(cpl_table* table,
959  const char* key_name,
960  const int value,
961  const char* key_help,
962  const char* format)
963 {
964  int sz = cpl_table_get_nrow(table);
965  int raw = sz;
966  char key_value[FILE_NAME_SZ];
967  char key_type[FILE_NAME_SZ];
968 
969  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
970  strcpy(key_type,"CPL_TYPE_INT");
971 
972  cpl_table_set_size(table,sz+1);
973 
974  cpl_table_set_string(table,"key_name" ,raw,key_name);
975  cpl_table_set_string(table,"key_type" ,raw,key_type);
976  cpl_table_set_string(table,"key_value",raw,key_value);
977  cpl_table_set_string(table,"key_help" ,raw,key_help);
978 
979  return 0;
980 
981 }
982 
983 
984 
985 int
986 sinfo_qclog_add_bool(cpl_table* table,
987  const char* key_name,
988  const char value,
989  const char* key_help,
990  const char* format)
991 {
992  int sz = cpl_table_get_nrow(table);
993  int raw = sz;
994  char key_value[FILE_NAME_SZ];
995  char key_type[FILE_NAME_SZ];
996 
997  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
998  strcpy(key_type,"CPL_TYPE_BOOL");
999 
1000  cpl_table_set_size(table,sz+1);
1001 
1002  cpl_table_set_string(table,"key_name" ,raw,key_name);
1003  cpl_table_set_string(table,"key_type" ,raw,key_type);
1004  cpl_table_set_string(table,"key_value",raw,key_value);
1005  cpl_table_set_string(table,"key_help" ,raw,key_help);
1006 
1007  return 0;
1008 
1009 }
1010 
1011 
1012 
1013 int
1014 sinfo_qclog_add_float(cpl_table* table,
1015  const char* key_name,
1016  const float value,
1017  const char* key_help,
1018  const char* format)
1019 {
1020  int sz = cpl_table_get_nrow(table);
1021  int raw = sz;
1022  char key_value[FILE_NAME_SZ];
1023  char key_type[FILE_NAME_SZ];
1024 
1025  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
1026  strcpy(key_type,"CPL_TYPE_FLOAT");
1027 
1028  cpl_table_set_size(table,sz+1);
1029 
1030  cpl_table_set_string(table,"key_name" ,raw,key_name);
1031  cpl_table_set_string(table,"key_type" ,raw,key_type);
1032  cpl_table_set_string(table,"key_value",raw,key_value);
1033  cpl_table_set_string(table,"key_help" ,raw,key_help);
1034 
1035  return 0;
1036 
1037 }
1038 
1039 
1040 
1041 int
1042 sinfo_qclog_add_double(cpl_table* table,
1043  const char* key_name,
1044  const double value,
1045  const char* key_help,
1046  const char* format)
1047 {
1048  int sz = cpl_table_get_nrow(table);
1049  int raw = sz;
1050  char key_value[FILE_NAME_SZ];
1051  char key_type[FILE_NAME_SZ];
1052 
1053  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
1054  strcpy(key_type,"CPL_TYPE_DOUBLE");
1055 
1056  cpl_table_set_size(table,sz+1);
1057 
1058  cpl_table_set_string(table,"key_name" ,raw,key_name);
1059  cpl_table_set_string(table,"key_type" ,raw,key_type);
1060  cpl_table_set_string(table,"key_value",raw,key_value);
1061  cpl_table_set_string(table,"key_help" ,raw,key_help);
1062 
1063  return 0;
1064 
1065 }
1066 
1067 int
1068 sinfo_qclog_add_string(cpl_table* table,
1069  const char* key_name,
1070  const char* value,
1071  const char* key_help,
1072  const char* format)
1073 {
1074  int sz = cpl_table_get_nrow(table);
1075  int raw = sz;
1076  char key_value[FILE_NAME_SZ];
1077  char key_type[FILE_NAME_SZ];
1078 
1079  snprintf(key_value,MAX_NAME_SIZE-1,format,value);
1080  strcpy(key_type,"CPL_TYPE_STRING");
1081 
1082  cpl_table_set_size(table,sz+1);
1083 
1084  cpl_table_set_string(table,"key_name" ,raw,key_name);
1085  cpl_table_set_string(table,"key_type" ,raw,key_type);
1086  cpl_table_set_string(table,"key_value",raw,key_value);
1087  cpl_table_set_string(table,"key_help" ,raw,key_help);
1088 
1089  return 0;
1090 
1091 }
1092 
1093 
1094 
1095 
#define sinfo_msg_error(...)
Print an error message.
Definition: sinfo_msg.h:69
#define sinfo_msg_warning(...)
Print an warning message.
Definition: sinfo_msg.h:93