sinfo_pro_save.c

00001 /*
00002  * This file is part of the ESO SINFONI Pipeline
00003  * Copyright (C) 2004,2005 European Southern Observatory
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; either version 2 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA  02111-1307  USA
00018  */
00019 #ifdef HAVE_CONFIG_H
00020 #  include <config.h>
00021 #endif
00022 
00023 #include <cpl.h>
00024 #include "sinfo_pro_save.h"
00025 #include "sinfo_key_names.h"
00026 #include "sinfo_functions.h"
00027 #include "sinfo_utilities.h" 
00028 #include "sinfo_globals.h" 
00029 
00030 static int 
00031 sinfo_pfits_put_qc(
00032            cpl_propertylist       *   plist,
00033            cpl_table          *   qclog);
00034 
00035 static void
00036 sinfo_log_pro(char* name_o,
00037               const char* pro_catg, 
00038               int frm_type, 
00039               cpl_frameset* ref_set,
00040               cpl_frameset** out_set, 
00041               cpl_propertylist** plist,
00042               cpl_parameterlist* parlist, 
00043               const char* recid);
00044 
00045 
00046 static void
00047 sinfo_check_name(const char* in, char** ou, int type, char** paf);
00048 
00049 static void
00050 sinfo_clean_header(cpl_propertylist** header);
00051 static void
00052 sinfo_clean_cube_header(cpl_propertylist** header);
00053 
00054 
00055 static FILE * 
00056 sinfo_paf_print_header(
00057                const char    *   filename,
00058                const char    *   paf_id,
00059                const char    *   paf_desc,
00060                const char    *   login_name,
00061                char    *   datetime) ;
00062 
00063 
00064 
00071 /*--------------------------------------------------------------------------*/
00096 /*--------------------------------------------------------------------------*/
00097 static FILE * 
00098 sinfo_paf_print_header(
00099                const char    *   filename,
00100                const char    *      paf_id,
00101                const char    *    paf_desc,
00102                const char    *   login_name,
00103                char    *   datetime)
00104 {
00105   FILE * paf ;
00106     
00107   if ((paf=fopen(filename, "w"))==NULL) {
00108     sinfo_msg_error("cannot create PAF file [%s]", filename);
00109     return NULL ;
00110   }
00111   fprintf(paf, "PAF.HDR.START         ;# start of header\n");
00112   fprintf(paf, "PAF.TYPE              \"pipeline product\" ;\n");
00113   fprintf(paf, "PAF.ID                \"%s\"\n", paf_id);
00114   fprintf(paf, "PAF.NAME              \"%s\"\n", filename);
00115   fprintf(paf, "PAF.DESC              \"%s\"\n", paf_desc);
00116   fprintf(paf, "PAF.CRTE.NAME         \"%s\"\n", login_name) ;
00117   fprintf(paf, "PAF.CRTE.DAYTIM       \"%s\"\n", datetime) ;
00118   fprintf(paf, "PAF.LCHG.NAME         \"%s\"\n", login_name) ;
00119   fprintf(paf, "PAF.LCHG.DAYTIM       \"%s\"\n", datetime) ;
00120   fprintf(paf, "PAF.CHCK.CHECKSUM     \"\"\n");
00121   fprintf(paf, "PAF.HDR.END           ;# end of header\n");
00122   fprintf(paf, "\n");
00123   return paf ;
00124 }
00134 int 
00135 sinfo_update_fits_card_int(const char* file,const char* card,int value)
00136 {
00137   cpl_propertylist *   plist =NULL;
00138   if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
00139     sinfo_msg_error( "getting header from file %s",file);
00140     cpl_propertylist_delete(plist) ;
00141     return -1 ;
00142   }
00143 
00144   if (CPL_ERROR_NONE!=cpl_propertylist_set_int(plist,card,value)){
00145     sinfo_msg_error( "setting header of file %s",file);
00146     cpl_propertylist_delete(plist) ;
00147     return -1 ;
00148   }
00149   cpl_propertylist_delete(plist) ;
00150   return 0;
00151 }
00152 
00162 int 
00163 sinfo_update_fits_card_float(const char* file,const char* card,float value)
00164 {
00165   cpl_propertylist *   plist =NULL;
00166   if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
00167     sinfo_msg_error( "getting header from file %s",file);
00168     sinfo_msg_error((char* ) cpl_error_get_message());
00169     sinfo_msg_error((char* ) cpl_error_get_where());
00170     cpl_propertylist_delete(plist) ;
00171     return -1 ;
00172   }
00173 
00174   if (CPL_ERROR_NONE!=cpl_propertylist_set_float(plist,card,value)){
00175     sinfo_msg_error( "setting header of file %s",file);
00176     sinfo_msg_error((char* ) cpl_error_get_message());
00177     sinfo_msg_error((char* ) cpl_error_get_where());
00178     cpl_propertylist_delete(plist) ;
00179     return -1 ;
00180   }
00181   cpl_propertylist_delete(plist) ;
00182   return 0;
00183 }
00184 
00185 
00195 int 
00196 sinfo_update_fits_card_double(const char* file,const char* card,double value)
00197 {
00198   cpl_propertylist *   plist =NULL;
00199   if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
00200     sinfo_msg_error( "getting header from file %s",file);
00201     cpl_propertylist_delete(plist) ;
00202     return -1 ;
00203   }
00204 
00205   if (CPL_ERROR_NONE!=cpl_propertylist_set_double(plist,card,value)){
00206     sinfo_msg_error( "gsetting header of file %s",file);
00207     cpl_propertylist_delete(plist) ;
00208     return -1 ;
00209   }
00210   cpl_propertylist_delete(plist) ;
00211   return 0;
00212 }
00213 
00223 int 
00224 sinfo_update_fits_card_long(const char* file,const char* card,long value)
00225 {
00226   cpl_propertylist *   plist =NULL;
00227   if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
00228     sinfo_msg_error( "getting header from file %s",file);
00229     cpl_propertylist_delete(plist) ;
00230     return -1 ;
00231   }
00232   if (CPL_ERROR_NONE!=cpl_propertylist_set_long(plist,card,value)){
00233     sinfo_msg_error( "setting header of file %s",file);
00234     cpl_propertylist_delete(plist) ;
00235     return -1 ;
00236   }
00237   cpl_propertylist_delete(plist) ;
00238   return 0;
00239 }
00240 
00250 int 
00251 sinfo_update_ims_fits_card_string(cpl_imagelist* iml,
00252                                   const char* file, 
00253                                   const char* card,
00254                                   const char* value)
00255 {
00256 
00257   cpl_propertylist *   plist =NULL;
00258   if ((plist = cpl_propertylist_load(file, 0)) == NULL) {
00259     sinfo_msg_error( "getting header from reference ima frame %s",file);
00260     cpl_propertylist_delete(plist) ;
00261     return -1 ;
00262   }
00263 
00264 
00265   if (CPL_ERROR_NONE!=cpl_propertylist_set_string(plist,card,value)){
00266     sinfo_msg_error( "getting header from reference ima frame %s",file);
00267     cpl_propertylist_delete(plist) ;
00268     return -1 ;
00269   }
00270 
00271   if (cpl_imagelist_save(iml,file,CPL_BPP_IEEE_FLOAT,
00272                          plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
00273     sinfo_msg_error( "getting header from reference ima frame %s",file);
00274     cpl_propertylist_delete(plist) ;
00275   }
00276   cpl_propertylist_delete(plist) ;
00277   return 0;
00278 }
00279 /* Not used 
00280 static int sinfo_save_paf(char* name_p, 
00281               const char* rec_id, 
00282               cpl_table* qclog,
00283               cpl_propertylist*   plist,
00284               const char*      pro_catg)
00285 {
00286 
00287 
00288 
00289   FILE            *   paf ;
00290   const char            *   sval ;
00291   char            key_name[FILE_NAME_SZ] ;
00292   char            key_paf[FILE_NAME_SZ] ;
00293   char            key_dpaf[FILE_NAME_SZ] ;
00294   char            key_type[FILE_NAME_SZ] ;
00295   char            key_value[FILE_NAME_SZ] ;
00296   double dval=0;
00297 
00298   int i =0;
00299   int n=0;
00300   sinfo_msg( "Writing %s" , name_p) ;
00301   // Create the default PAF header
00302   if ((paf = sinfo_paf_print_header(name_p,rec_id,"QC file","login-name",
00303                     sinfo_get_datetime_iso8601())) == NULL) {
00304     sinfo_msg_error( "cannot open file [%s] for output", name_p) ;
00305     return -1 ;
00306   }
00307   if (sinfo_check_rec_status(0) == -1) {
00308     sinfo_msg_error( "Something was wrong") ;
00309     return -1 ;
00310   }
00311 
00312   // Test entries
00313   sinfo_blank2dot(PAF_NAME_PIPE_ID,key_dpaf);
00314   fprintf(paf,"%-21s \"%s\" ;# %s\" \n", key_dpaf,
00315       VERSION,KEY_HELP_PIPE_ID);
00316 
00317   strcpy(key_name,KEY_NAME_PIPEFILE);        
00318   strcpy(key_paf,KEY_NAME_PIPEFILE);        
00319   sinfo_blank2dot(key_paf,key_dpaf);
00320   if (sinfo_propertylist_has(plist, key_name)) {
00321     fprintf(paf,"%-21s \"%s\" ;# %s\" \n",key_dpaf,
00322         cpl_propertylist_get_string(plist,key_name),KEY_HELP_PIPEFILE);
00323   }
00324 
00325   // Value: "TEMPORARY", "PREPROCESSED", "REDUCED" or "QCPARAM".
00326   strcpy(key_name,KEY_NAME_PRO_TYPE);
00327   strcpy(key_paf,PAF_NAME_PRO_TYPE);    
00328   sinfo_blank2dot(key_paf,key_dpaf);
00329   if (sinfo_propertylist_has(plist, key_name)) {
00330     fprintf(paf,"%-21s \"%s\" ;# %s\" \n", key_dpaf,
00331         cpl_propertylist_get_string(plist,key_name),KEY_HELP_PRO_TYPE);
00332   }
00333 
00334   strcpy(key_name,KEY_NAME_PRO_DATANCOM); 
00335   strcpy(key_paf,PAF_NAME_PRO_DATANCOM); 
00336   sinfo_blank2dot(key_paf,key_dpaf);
00337   if (sinfo_propertylist_has(plist,key_name)) {
00338     fprintf(paf,"%-21s %d ;# %s\" \n",key_dpaf,
00339         cpl_propertylist_get_int(plist,key_name),KEY_HELP_PRO_DATANCOM);
00340   }
00341      
00342   strcpy(key_name,KEY_NAME_NCORRS_NAME);
00343   strcpy(key_paf,PAF_NAME_NCORRS_NAME);
00344   sinfo_blank2dot(key_paf,key_dpaf);
00345   if (sinfo_propertylist_has(plist, key_name)) {
00346     fprintf(paf,"%-21s \"%s\" ;# %s \n", key_dpaf,
00347         cpl_propertylist_get_string(plist,key_name),KEY_HELP_NCORRS_NAME);
00348   }
00349 
00350   strcpy(key_name,KEY_NAME_DET_NDSAMPLES);
00351   strcpy(key_paf,PAF_NAME_DET_NDSAMPLES);
00352   sinfo_blank2dot(key_paf,key_dpaf);        
00353   if (sinfo_propertylist_has(plist, key_name)) {
00354     fprintf(paf,"%-21s %d ;# %s \n",key_dpaf, 
00355         cpl_propertylist_get_int(plist,key_name),KEY_HELP_DET_NDSAMPLES);
00356   }
00357 
00358   strcpy(key_name,KEY_NAME_FILT_NAME);      
00359   strcpy(key_paf,PAF_NAME_FILT_NAME);      
00360   sinfo_blank2dot(key_paf,key_dpaf);        
00361   if (sinfo_propertylist_has(plist, key_name)) {
00362     fprintf(paf,"%-21s \"%s\" ;# %s \n", key_dpaf,
00363         cpl_propertylist_get_string(plist,key_name),KEY_HELP_FILT_NAME);
00364   }
00365 
00366   strcpy(key_name,KEY_NAME_FILT_ID);        
00367   strcpy(key_paf,PAF_NAME_FILT_ID);        
00368   sinfo_blank2dot(key_paf,key_dpaf);        
00369   if (sinfo_propertylist_has(plist, key_name)) {
00370     fprintf(paf,"%-21s \"%s\" ;# %s \n",key_dpaf, 
00371         cpl_propertylist_get_string(plist,key_name),KEY_HELP_FILT_ID);
00372   }
00373 
00374   strcpy(key_name,KEY_NAME_PREOPTICS);        
00375   strcpy(key_paf,PAF_NAME_PREOPTICS);        
00376   sinfo_blank2dot(key_paf,key_dpaf);        
00377   if (sinfo_propertylist_has(plist, key_name)) {
00378     fprintf(paf,"%-21s \"%s\" ;# %s \n",key_dpaf, 
00379         cpl_propertylist_get_string(plist,key_name),KEY_HELP_PREOPTICS);
00380   }
00381 
00382   strcpy(key_name,KEY_NAME_GRAT_NAME);        
00383   strcpy(key_paf,PAF_NAME_GRAT_NAME);        
00384   sinfo_blank2dot(key_paf,key_dpaf);        
00385   if (sinfo_propertylist_has(plist, key_name)) {
00386     fprintf(paf, "%-21s \"%s\" ;# %s \n",key_dpaf, 
00387         cpl_propertylist_get_string(plist,key_name),KEY_HELP_GRAT_NAME);
00388   }
00389     
00390   strcpy(key_name,KEY_NAME_GRAT_WLEN);        
00391   strcpy(key_paf,PAF_NAME_GRAT_WLEN);        
00392   sinfo_blank2dot(key_paf,key_dpaf);        
00393   if (sinfo_propertylist_has(plist, key_name)) {
00394     fprintf(paf, "%-21s %f ;# %s \n", key_dpaf,
00395         cpl_propertylist_get_double(plist,key_name),KEY_HELP_GRAT_WLEN);
00396   }
00397 
00398   strcpy(key_name,KEY_NAME_PRO_RECID);  
00399   strcpy(key_paf,PAF_NAME_PRO_RECID);  
00400   sinfo_blank2dot(key_paf,key_dpaf);        
00401   if (sinfo_propertylist_has(plist, key_name)) {
00402     fprintf(paf,"%-21s \"%s\" ;# %s \n", key_dpaf,
00403         cpl_propertylist_get_string(plist,key_name),KEY_HELP_PRO_RECID);
00404   }
00405 
00406 
00407   // snprintf(cval, MAX_NAME_SIZE-1,"CPL-%s", get_cpl_version());
00408   strcpy(key_name,KEY_NAME_PRO_DRSID); 
00409   strcpy(key_paf,PAF_NAME_PRO_DRSID); 
00410   sinfo_blank2dot(key_paf,key_dpaf);        
00411   if (sinfo_propertylist_has(plist, key_name)) {
00412     fprintf(paf,"%-21s \"%s\" ;# %s \n",key_dpaf, 
00413         cpl_propertylist_get_string(plist,key_name),KEY_HELP_PRO_DRSID);
00414   }
00415 
00416   if (sinfo_propertylist_has(plist,KEY_NAME_DATE_OBS)) {
00417     sval = sinfo_pfits_get_date_obs(plist);
00418     strcpy(key_paf,KEY_NAME_DATE_OBS); 
00419     sinfo_blank2dot(key_paf,key_dpaf);        
00420     fprintf(paf, "%-21s \"%s\" ;# %s\n",key_dpaf, 
00421         sval,KEY_HELP_DATE_OBS) ;
00422   }
00423 
00424   
00425   if (sinfo_propertylist_has(plist,KEY_NAME_TEL_AIRM_START)) {
00426     dval = sinfo_pfits_get_airmass_start(plist);
00427     strcpy(key_paf,PAF_NAME_TEL_AIRM_START); 
00428     sinfo_blank2dot(key_paf,key_dpaf);        
00429     fprintf(paf, "%-21s \"%f\" ;# %s \n",key_dpaf, 
00430         dval,KEY_HELP_TEL_AIRM_START) ;
00431   }
00432    
00433   if (sinfo_propertylist_has(plist,KEY_NAME_ARCFILE)) {
00434     sval = sinfo_pfits_get_arcfile(plist);
00435     strcpy(key_paf,KEY_NAME_ARCFILE);
00436     sinfo_blank2dot(key_paf,key_dpaf);      
00437     fprintf(paf, "%-21s \"%s\" ;# %s \n", key_dpaf,sval,KEY_HELP_ARCFILE) ;
00438 
00439   } else if (sinfo_propertylist_has(plist,KEY_NAME_PRO_REC1_RAW1_NAME)) {
00440     sval = sinfo_pfits_get_rec1raw1name(plist);
00441     strcpy(key_paf,KEY_NAME_ARCFILE);
00442     sinfo_blank2dot(key_paf,key_dpaf);       
00443     fprintf(paf, "%-21s \"%s\" ;# %s \n", key_dpaf,sval,KEY_HELP_ARCFILE) ;
00444   } else {
00445     sinfo_msg_error("%s is missing QC LOG will fail!",KEY_NAME_ARCFILE);
00446   }
00447 
00448   if (sinfo_propertylist_has(plist,KEY_NAME_TPL_ID)) {
00449     sval = sinfo_pfits_get_templateid(plist);
00450     strcpy(key_paf,PAF_NAME_TPL_ID);
00451     sinfo_blank2dot(key_paf,key_dpaf);       
00452     fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
00453         sval,KEY_HELP_TPL_ID) ;
00454  
00455   }
00456 
00457   if (sinfo_propertylist_has(plist,KEY_NAME_DET_DIT)) { 
00458     strcpy(key_paf,PAF_NAME_DET_DIT); 
00459     sinfo_blank2dot(key_paf,key_dpaf);        
00460     fprintf(paf,"%-21s %f ; # %s\n", key_dpaf,
00461         sinfo_pfits_get_dit(plist),KEY_HELP_DET_DIT) ;
00462   }
00463 
00464 
00465   if (sinfo_propertylist_has(plist,KEY_NAME_DET_NDIT)) {
00466     strcpy(key_paf,PAF_NAME_DET_NDIT); 
00467     sinfo_blank2dot(key_paf,key_dpaf); 
00468     fprintf(paf,"%-21s %d ; # %s\n", key_dpaf,
00469         sinfo_pfits_get_ndit(plist),KEY_HELP_DET_NDIT) ;
00470   }
00471 
00472   if (sinfo_propertylist_has(plist,KEY_NAME_NCORRS_NAME)) {
00473     sval = sinfo_pfits_get_ncorrs_name(plist);
00474     strcpy(key_paf,PAF_NAME_NCORRS_NAME); 
00475     sinfo_blank2dot(key_paf,key_dpaf);        
00476 
00477     fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
00478         sval, KEY_HELP_NCORRS_NAME) ;
00479   }
00480     
00481   if (sinfo_propertylist_has(plist,KEY_NAME_DPR_TYPE)) {
00482     sval = sinfo_pfits_get_dpr_type(plist);
00483     strcpy(key_paf,PAF_NAME_DPR_TYPE); 
00484     sinfo_blank2dot(key_paf,key_dpaf);        
00485     fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
00486         sval, KEY_HELP_DPR_TYPE) ;
00487   }
00488 
00489   if (sinfo_propertylist_has(plist,KEY_NAME_DPR_TECH)) {
00490     sval = sinfo_pfits_get_dpr_tech(plist);
00491     strcpy(key_paf,PAF_NAME_DPR_TECH); 
00492     sinfo_blank2dot(key_paf,key_dpaf);   
00493     fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
00494         sval, KEY_HELP_DPR_TECH) ;
00495   }
00496     
00497 
00498   if (sinfo_propertylist_has(plist,KEY_NAME_DPR_CATG)) {
00499     sval = sinfo_pfits_get_dpr_catg(plist);
00500     strcpy(key_paf,PAF_NAME_DPR_CATG); 
00501     sinfo_blank2dot(key_paf,key_dpaf); 
00502     fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
00503         sval, KEY_HELP_DPR_CATG) ;
00504   }
00505     
00506   strcpy(key_paf,PAF_NAME_PRO_CATG); 
00507   sinfo_blank2dot(key_paf,key_dpaf); 
00508   fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
00509       pro_catg, KEY_HELP_PRO_CATG) ;
00510 
00511   if (sinfo_propertylist_has(plist,KEY_NAME_INS_SETUP)) {
00512     sval = sinfo_pfits_get_ins_setup(plist);
00513     strcpy(key_paf,PAF_NAME_INS_SETUP); 
00514     sinfo_blank2dot(key_paf,key_dpaf); 
00515     fprintf(paf, "%-21s \"%s\" ; # %s\n", key_dpaf,
00516         sval, KEY_HELP_INS_SETUP) ;
00517   }
00518 
00519   n=cpl_table_get_nrow(qclog);
00520   for(i=0;i<n;i++) {
00521     strcpy(key_paf,cpl_table_get_string(qclog,"key_name",i));
00522     sinfo_blank2dot(key_paf,key_name);
00523     strcpy(key_type,cpl_table_get_string(qclog,"key_type",i));
00524     strcpy(key_value,cpl_table_get_string(qclog,"key_value",i));
00525     if(strcmp(key_type,"CPL_TYPE_STRING") == 0) {
00526       strcat(key_name,"               \"%s\"\n");
00527       fprintf(paf, key_name, key_value) ;
00528     } else if(strcmp(key_type,"CPL_TYPE_BOOL") == 0) {
00529       strcat(key_name,"               ");
00530       strcat(key_name,"%c\n");
00531       fprintf(paf, key_name, atoi(key_value)) ;
00532     } else if(strcmp(key_type,"CPL_TYPE_INT") == 0) {
00533       strcat(key_name,"               ");
00534       strcat(key_name,"%d\n");
00535       fprintf(paf, key_name, atoi(key_value)) ;
00536     } else if(strcmp(key_type,"CPL_TYPE_FLOAT") == 0) {
00537       strcat(key_name,"               ");
00538       strcat(key_name,"%g\n");
00539       fprintf(paf, key_name, (float) atof(key_value)) ;
00540     } else if(strcmp(key_type,"CPL_TYPE_DOUBLE") == 0) {
00541       strcat(key_name,"               ");
00542       strcat(key_name,"%g\n");
00543       fprintf(paf, key_name, atof(key_value)) ;
00544     }
00545 
00546   }
00547   fprintf(paf, "\n");
00548   fclose(paf) ;
00549 
00550   if (sinfo_check_rec_status(1) == -1) {
00551     sinfo_msg_error( "Something was wrong reading FITS keys") ;
00552     return -1 ;
00553   }
00554   return 0;
00555 
00556 }
00557 
00558 */
00559 
00560 /*---------------------------------------------------------------------------*/
00573 /*---------------------------------------------------------------------------*/
00574 
00575 
00576 int sinfo_pro_save_ima(
00577                cpl_image       *   ima,
00578                cpl_frameset    *   ref,
00579                cpl_frameset    *   set,
00580                const char      *   out_file,
00581                const char      *   pro_catg,
00582                cpl_table       *   qclog,
00583                const char      *   recid,
00584                cpl_parameterlist* parlist)
00585 
00586 {
00587   char      *         name_o ;
00588   char      *         name_p ;
00589 
00590   cpl_propertylist *   plist =NULL;
00591   cpl_frame       *   first_frame=NULL;
00592   char            *   ref_file=NULL;
00593 
00594   /* Get the reference file  */
00595   first_frame = cpl_frameset_get_first(ref) ;
00596   ref_file = (char*) cpl_strdup(cpl_frame_get_filename(first_frame)) ;
00597  
00598   name_o = cpl_malloc(FILE_NAME_SZ * sizeof(char));
00599   name_p = cpl_malloc(FILE_NAME_SZ * sizeof(char));
00600   sinfo_check_name(out_file, &name_o, CPL_FRAME_TYPE_IMAGE, &name_p);
00601   sinfo_msg( "Writing ima %s pro catg %s" , name_o, pro_catg) ;
00602 
00603   /* Get FITS header from reference file */
00604   if ((cpl_error_code)((plist=cpl_propertylist_load(ref_file, 0)) == NULL)) {
00605     sinfo_msg_error( "getting header from reference ima frame %s",ref_file);
00606     cpl_propertylist_delete(plist) ;
00607     cpl_free(ref_file);
00608     return -1 ;
00609   }
00610 
00611   sinfo_clean_header(&plist);
00612   if ( ( strstr(pro_catg,"MASTER_PSF") != NULL ) || 
00613        ( strstr(pro_catg,"STD_STAR_SPECTRUM") != NULL ) || 
00614        ( strstr(pro_catg,"STD_STAR_SPECTRA") != NULL ) ) {
00615     sinfo_clean_cube_header(&plist);
00616   }
00617 
00618   /* Add DataFlow keywords and log the saved file in the input frameset */
00619   sinfo_log_pro(name_o, pro_catg, CPL_FRAME_TYPE_IMAGE, 
00620         ref,&set,&plist,parlist,recid);
00621   if(qclog != NULL) {
00622     sinfo_pfits_put_qc(plist, qclog) ;
00623   }
00624 
00625   /* Save the file */
00626   if (cpl_image_save(ima, name_o, CPL_BPP_IEEE_FLOAT, 
00627              plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
00628     sinfo_msg_error( "Cannot save the product %s",name_o);
00629     cpl_propertylist_delete(plist) ;
00630     cpl_free(ref_file);
00631     cpl_free(name_o);
00632     cpl_free(name_p);
00633     return -1 ;
00634   }
00635 
00636   /* THE PAF FILE FOR QC PARAMETERS 
00637      if( qclog != NULL) {
00638      sinfo_save_paf(name_p,recid,qclog,plist,pro_catg);  
00639      }
00640   */
00641 
00642   cpl_propertylist_delete(plist) ;
00643   cpl_msg_indent_less() ;
00644   cpl_free(name_o);
00645   cpl_free(name_p);
00646   cpl_free(ref_file);
00647 
00648   return 0 ;
00649 }
00650 
00651 
00652 /*---------------------------------------------------------------------------*/
00665 /*---------------------------------------------------------------------------*/
00666 
00667 
00668 
00669 int sinfo_pro_save_tbl(
00670                cpl_table       *   table,
00671                cpl_frameset    *   ref,
00672                cpl_frameset    *   set,
00673                const char      *   out_file,
00674                const char      *   pro_catg,      
00675                cpl_table       *   qclog,
00676                const char      *   recid,
00677                cpl_parameterlist* parlist)
00678 
00679 {
00680   char *    name_o =NULL;
00681   char *    name_p =NULL;
00682   cpl_propertylist *   plist=NULL ;
00683   cpl_frame* first_frame=NULL;
00684   char* ref_file=NULL;
00685   /* Get the reference file  */
00686   first_frame = cpl_frameset_get_first(ref) ;
00687   ref_file = cpl_strdup(cpl_frame_get_filename(first_frame)) ;
00688  
00689   name_o = cpl_malloc(FILE_NAME_SZ * sizeof(char));
00690   name_p = cpl_malloc(FILE_NAME_SZ * sizeof(char));
00691   sinfo_check_name(out_file, &name_o, CPL_FRAME_TYPE_TABLE, &name_p);
00692   sinfo_msg( "Writing tbl %s pro catg %s" , name_o, pro_catg) ;
00693 
00694   /* Get FITS header from reference file */
00695   if ((cpl_error_code)((plist = cpl_propertylist_load(ref_file,0)) == NULL)) 
00696     {
00697       sinfo_msg_error( "getting header from tbl frame %s",ref_file);
00698       cpl_propertylist_delete(plist) ;
00699       cpl_free(ref_file);
00700       cpl_free(name_o);
00701       cpl_free(name_p);
00702       return -1 ;
00703     }
00704   sinfo_clean_header(&plist);
00705 
00706   /* Add DataFlow keywords and log the saved file in the input frameset */
00707   sinfo_log_pro(name_o, pro_catg, CPL_FRAME_TYPE_TABLE, 
00708         ref,&set,&plist,parlist,recid);
00709   if(qclog != NULL) {
00710     sinfo_pfits_put_qc(plist, qclog) ;
00711   }
00712   /* Save the file */
00713   if (cpl_table_save(table, plist, NULL, name_o, CPL_IO_DEFAULT) 
00714       != CPL_ERROR_NONE) {
00715     sinfo_msg_error( "Cannot save the product: %s", name_o);
00716     cpl_propertylist_delete(plist) ;
00717     cpl_free(ref_file);
00718     cpl_free(name_o);
00719     cpl_free(name_p);
00720     return -1 ;
00721   }
00722 
00723  
00724   /* THE PAF FILE FOR QC PARAMETERS 
00725      if (qclog != NULL) {
00726      sinfo_save_paf(name_p,recid,qclog,plist,pro_catg);
00727      }
00728   */
00729   cpl_propertylist_delete(plist) ;
00730   cpl_msg_indent_less() ;
00731   cpl_free(name_o);
00732   cpl_free(name_p);
00733   cpl_free(ref_file);
00734   return 0 ;
00735 }
00736 
00737 
00738 
00739 /*---------------------------------------------------------------------------*/
00752 /*---------------------------------------------------------------------------*/
00753 
00754 
00755 
00756 int sinfo_pro_save_ims(
00757                cpl_imagelist   *   ims,
00758                cpl_frameset    *   ref,
00759                cpl_frameset    *   set,
00760                const char      *   out_file,
00761                const char      *   pro_catg,      
00762                cpl_table       *   qclog,
00763                const char      *   recid,
00764                cpl_parameterlist* parlist)
00765 
00766 {
00767   char *               name_o=NULL;
00768   char *               name_p=NULL;
00769 
00770   cpl_propertylist * plist=NULL ;
00771   cpl_frame* first_frame=NULL;
00772   char* ref_file=NULL;
00773     
00774   /* Get the reference file  */
00775   first_frame = cpl_frameset_get_first(ref) ;
00776   ref_file = cpl_strdup(cpl_frame_get_filename(first_frame)) ;
00777 
00778   name_o = cpl_malloc(FILE_NAME_SZ * sizeof(char));
00779   name_p = cpl_malloc(FILE_NAME_SZ * sizeof(char));
00780   sinfo_check_name(out_file, &name_o, CPL_FRAME_TYPE_IMAGE, &name_p);
00781   sinfo_msg( "Writing ims %s pro catg %s" , name_o, pro_catg) ;
00782   /* Get FITS header from reference file */
00783   if ((cpl_error_code)((plist = cpl_propertylist_load(ref_file, 0)) == NULL))
00784     {
00785       sinfo_msg_error( "getting header from ims frame %s",ref_file);
00786       cpl_propertylist_delete(plist) ;
00787       cpl_free(ref_file);
00788       cpl_free(name_o);
00789       cpl_free(name_p);
00790       return -1 ;
00791     }
00792   sinfo_clean_header(&plist);
00793   if ( ( strstr(pro_catg,"STD") != NULL ) || 
00794        ( strstr(pro_catg,"PSF") != NULL ) || 
00795        ( strstr(pro_catg,"OBJ") != NULL ) ) {
00796     sinfo_clean_cube_header(&plist);
00797   }
00798 
00799   /* Add DataFlow keywords and log the saved file in the input frameset */
00800   sinfo_log_pro(name_o, pro_catg, CPL_FRAME_TYPE_IMAGE, 
00801         ref,&set,&plist,parlist,recid);
00802    
00803   if(qclog != NULL) {
00804     sinfo_pfits_put_qc(plist, qclog) ;
00805   }
00806    
00807 
00808   /* Save the file */
00809   if (cpl_imagelist_save(ims, name_o, CPL_BPP_IEEE_FLOAT, 
00810              plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
00811     sinfo_msg_error( "Cannot save the product %s",name_o);
00812     cpl_propertylist_delete(plist) ;
00813     cpl_free(ref_file);
00814     cpl_free(name_o);
00815     cpl_free(name_p);
00816     return -1 ;
00817   }
00818 
00819   /* THE PAF FILE FOR QC PARAMETERS 
00820      if (qclog != NULL) {
00821      sinfo_save_paf(name_p,recid,qclog,plist,pro_catg);
00822      }
00823   */
00824   cpl_propertylist_delete(plist) ;
00825   cpl_msg_indent_less() ;
00826   cpl_free(name_o);
00827   cpl_free(name_p);
00828   cpl_free(ref_file);
00829   return 0 ;
00830 }
00831 
00832 
00833 
00834 static void
00835 sinfo_log_pro(char* name_o, 
00836               const char* pro_catg, 
00837               int frm_type, 
00838               cpl_frameset* ref_set,
00839               cpl_frameset** out_set,
00840               cpl_propertylist** plist,
00841               cpl_parameterlist* parlist, 
00842               const char* recid)
00843 {
00844   cpl_frame* product_frame = NULL ;
00845   char * pipe_id=NULL;
00846   cpl_errorstate initial_errorstate = cpl_errorstate_get();
00847 
00848   pipe_id = cpl_calloc(FILE_NAME_SZ,sizeof(char));
00849   snprintf(pipe_id,MAX_NAME_SIZE-1,"%s%s","sinfo/",PACKAGE_VERSION);
00850   product_frame = cpl_frame_new() ;
00851   cpl_frame_set_filename(product_frame, name_o) ;
00852   cpl_frame_set_tag(product_frame, pro_catg) ;
00853   cpl_frame_set_type(product_frame, frm_type);
00854   cpl_frame_set_group(product_frame, CPL_FRAME_GROUP_PRODUCT);
00855   cpl_frame_set_level(product_frame, CPL_FRAME_LEVEL_FINAL);
00856 
00857 #if defined CPL_VERSION_CODE && CPL_VERSION_CODE >= CPL_VERSION(4, 8, 0) 
00858   if(cpl_dfs_setup_product_header(*plist,product_frame,ref_set,parlist,recid,
00859                   pipe_id,KEY_VALUE_HPRO_DID,NULL) != CPL_ERROR_NONE) {
00860     sinfo_msg_warning("Problem in the product DFS-compliance");
00861     sinfo_msg_warning((char* ) cpl_error_get_message());
00862     cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
00863     cpl_error_reset();
00864   }
00865 #else
00866   if(cpl_dfs_setup_product_header(*plist,product_frame,ref_set,parlist,recid,
00867                   pipe_id,KEY_VALUE_HPRO_DID) != CPL_ERROR_NONE) {
00868     sinfo_msg_warning("Problem in the product DFS-compliance");
00869     sinfo_msg_warning((char* ) cpl_error_get_message());
00870     cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
00871     cpl_error_reset();
00872   }
00873 #endif
00874   cpl_frameset_insert(*out_set, product_frame);
00875   cpl_free(pipe_id);
00876 
00877 }
00878 
00879 static void
00880 sinfo_check_name(const char* in, char** ou, int type, char** paf) {
00881 
00882   char* tmp=NULL;
00883   char  name_b[512] ;
00884   if (strstr(in, "." ) != NULL ) {
00885     tmp = sinfo_new_get_rootname(in);
00886     strcpy(name_b,tmp);
00887   } else {
00888     snprintf(name_b, MAX_NAME_SIZE-1,in) ;
00889   }
00890   strcpy(*ou,name_b);
00891   if (type == CPL_FRAME_TYPE_TABLE) {
00892     strcat(*ou,".fits");
00893   } else {
00894     strcat(*ou,".fits");
00895   }
00896   strcpy(*paf,name_b);
00897   strcat(*paf,".paf");
00898 
00899 }
00900 
00901 
00902 static void
00903 sinfo_clean_header(cpl_propertylist** header)
00904 {
00905   cpl_propertylist_erase_regexp(*header, "^ESO PRO .*",0);
00906 
00907 }
00908 
00909 
00910 static void
00911 sinfo_clean_cube_header(cpl_propertylist** header)
00912 {
00913   cpl_propertylist_erase_regexp(*header, "^CRVAL*",0);
00914   cpl_propertylist_erase_regexp(*header, "^CRPIX*",0);
00915   cpl_propertylist_erase_regexp(*header, "^CTYPE*",0);
00916   cpl_propertylist_erase_regexp(*header, "^CUNIT*",0);
00917   cpl_propertylist_erase_regexp(*header, "^CD1_1",0);
00918   cpl_propertylist_erase_regexp(*header, "^CD1_2",0);
00919   cpl_propertylist_erase_regexp(*header, "^CD2_1",0);
00920   cpl_propertylist_erase_regexp(*header, "^CD2_2",0);
00921 
00922 }
00923 
00924 
00925 
00926 
00927 
00928 
00929 static int 
00930 sinfo_pfits_put_qc(
00931            cpl_propertylist       *   plist,
00932            cpl_table          *   qclog)
00933 {
00934   char            key_name[FILE_NAME_SZ];
00935   char            key_value[FILE_NAME_SZ];
00936   char            key_type[FILE_NAME_SZ];
00937   char            key_help[FILE_NAME_SZ] ;
00938 
00939   int             i =0;
00940   int n =0;
00941   /* Test entries */
00942   if (plist == NULL) {
00943     sinfo_msg_error("plist=NULL, something strange");
00944     return -1 ;
00945   }
00946   /* Parameter Name:    PIPEFILE */
00947 
00948   n=cpl_table_get_nrow(qclog);
00949   for(i=0;i<n;i++) {
00950     strcpy(key_name,"ESO ");
00951     strcat(key_name,cpl_table_get_string(qclog,"key_name",i));
00952     strcpy(key_type,cpl_table_get_string(qclog,"key_type",i));
00953     strcpy(key_value,cpl_table_get_string(qclog,"key_value",i));
00954     strcpy(key_help,cpl_table_get_string(qclog,"key_help",i));
00955 
00956     /* sinfo_msg("name=%s type=%s value=%s\n",key_name,key_type,key_value); */
00957     if(!sinfo_propertylist_has(plist,key_name)) {
00958       if(strcmp(key_type,"CPL_TYPE_STRING") == 0) {
00959     cpl_propertylist_append_string(plist, key_name,key_value) ;
00960     cpl_propertylist_set_comment(plist, key_name,key_help) ;
00961       } else if(strcmp(key_type,"CPL_TYPE_BOOL") == 0) {
00962     cpl_propertylist_append_bool(plist, key_name,atoi(key_value)) ;
00963     cpl_propertylist_set_comment(plist, key_name,key_help) ;
00964       } else if(strcmp(key_type,"CPL_TYPE_INT") == 0) {
00965     cpl_propertylist_append_int(plist,key_name,atoi(key_value)) ;
00966     cpl_propertylist_set_comment(plist, key_name,key_help) ;
00967       } else if(strcmp(key_type,"CPL_TYPE_FLOAT") == 0) {
00968         cpl_propertylist_append_float(plist, key_name,(float)atof(key_value)) ;
00969         cpl_propertylist_set_comment(plist, key_name,key_help) ;
00970       } else if(strcmp(key_type,"CPL_TYPE_DOUBLE") == 0) {
00971         cpl_propertylist_append_double(plist, key_name,atof(key_value)) ;
00972         cpl_propertylist_set_comment(plist, key_name,key_help) ;
00973       }
00974     }
00975 
00976   }
00977 
00978   return 0 ;
00979 }
00980 
00981 
00982 
00983 
00984 
00985 
00986 
00987 cpl_table *
00988 sinfo_qclog_init(void)
00989 {
00990 
00991   cpl_table *table;
00992 
00993   table = cpl_table_new(0);
00994   cpl_table_new_column(table,"key_name", CPL_TYPE_STRING);
00995   cpl_table_new_column(table,"key_type", CPL_TYPE_STRING);
00996   cpl_table_new_column(table,"key_value", CPL_TYPE_STRING);
00997   cpl_table_new_column(table,"key_help", CPL_TYPE_STRING);
00998 
00999   return table;
01000 }
01001 
01002 
01003 
01004 
01005 
01006 int
01007 sinfo_qclog_add_int(cpl_table* table,
01008             const char*  key_name,  
01009             const int    value,
01010             const char*  key_help,
01011             const char*  format)
01012 {
01013   int sz = cpl_table_get_nrow(table);
01014   int raw = sz;
01015   char key_value[FILE_NAME_SZ];
01016   char key_type[FILE_NAME_SZ];
01017 
01018   snprintf(key_value,MAX_NAME_SIZE-1,format,value);
01019   strcpy(key_type,"CPL_TYPE_INT"); 
01020  
01021   cpl_table_set_size(table,sz+1);
01022 
01023   cpl_table_set_string(table,"key_name" ,raw,key_name);
01024   cpl_table_set_string(table,"key_type" ,raw,key_type);
01025   cpl_table_set_string(table,"key_value",raw,key_value);
01026   cpl_table_set_string(table,"key_help" ,raw,key_help);
01027 
01028   return 0;
01029 
01030 }
01031 
01032 
01033 
01034 int
01035 sinfo_qclog_add_bool(cpl_table* table,
01036              const char*  key_name,  
01037              const char   value,
01038              const char*  key_help,
01039              const char*  format)
01040 {
01041   int sz = cpl_table_get_nrow(table);
01042   int raw = sz;
01043   char key_value[FILE_NAME_SZ];
01044   char key_type[FILE_NAME_SZ];
01045 
01046   snprintf(key_value,MAX_NAME_SIZE-1,format,value);
01047   strcpy(key_type,"CPL_TYPE_BOOL"); 
01048 
01049   cpl_table_set_size(table,sz+1);
01050 
01051   cpl_table_set_string(table,"key_name" ,raw,key_name);
01052   cpl_table_set_string(table,"key_type" ,raw,key_type);
01053   cpl_table_set_string(table,"key_value",raw,key_value);
01054   cpl_table_set_string(table,"key_help" ,raw,key_help);
01055 
01056   return 0;
01057 
01058 }
01059 
01060 
01061 
01062 int
01063 sinfo_qclog_add_float(cpl_table* table,
01064               const char*  key_name,  
01065               const float  value,
01066               const char*  key_help,
01067               const char*  format)
01068 {
01069   int sz = cpl_table_get_nrow(table);
01070   int raw = sz;
01071   char key_value[FILE_NAME_SZ];
01072   char key_type[FILE_NAME_SZ];
01073 
01074   snprintf(key_value,MAX_NAME_SIZE-1,format,value);
01075   strcpy(key_type,"CPL_TYPE_FLOAT"); 
01076  
01077   cpl_table_set_size(table,sz+1);
01078 
01079   cpl_table_set_string(table,"key_name" ,raw,key_name);
01080   cpl_table_set_string(table,"key_type" ,raw,key_type);
01081   cpl_table_set_string(table,"key_value",raw,key_value);
01082   cpl_table_set_string(table,"key_help" ,raw,key_help);
01083 
01084   return 0;
01085 
01086 }
01087 
01088 
01089 
01090 int
01091 sinfo_qclog_add_double(cpl_table* table,
01092                const char*  key_name,  
01093                const double value,
01094                const char*  key_help,
01095                const char*  format)
01096 {
01097   int sz = cpl_table_get_nrow(table);
01098   int raw = sz;
01099   char key_value[FILE_NAME_SZ];
01100   char key_type[FILE_NAME_SZ];
01101 
01102   snprintf(key_value,MAX_NAME_SIZE-1,format,value);
01103   strcpy(key_type,"CPL_TYPE_DOUBLE"); 
01104  
01105   cpl_table_set_size(table,sz+1);
01106 
01107   cpl_table_set_string(table,"key_name" ,raw,key_name);
01108   cpl_table_set_string(table,"key_type" ,raw,key_type);
01109   cpl_table_set_string(table,"key_value",raw,key_value);
01110   cpl_table_set_string(table,"key_help" ,raw,key_help);
01111 
01112   return 0;
01113 
01114 }
01115 
01116 int
01117 sinfo_qclog_add_string(cpl_table* table,
01118                const char*  key_name,  
01119                const char*  value,
01120                const char*  key_help,
01121                const char*  format)
01122 {
01123   int sz = cpl_table_get_nrow(table);
01124   int raw = sz;
01125   char key_value[FILE_NAME_SZ];
01126   char key_type[FILE_NAME_SZ];
01127 
01128   snprintf(key_value,MAX_NAME_SIZE-1,format,value);
01129   strcpy(key_type,"CPL_TYPE_STRING"); 
01130  
01131   cpl_table_set_size(table,sz+1);
01132 
01133   cpl_table_set_string(table,"key_name" ,raw,key_name);
01134   cpl_table_set_string(table,"key_type" ,raw,key_type);
01135   cpl_table_set_string(table,"key_value",raw,key_value);
01136   cpl_table_set_string(table,"key_help" ,raw,key_help);
01137 
01138   return 0;
01139 
01140 }
01141 
01142 
01143 
01144 

Generated on 3 Mar 2013 for SINFONI Pipeline Reference Manual by  doxygen 1.6.1