00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
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
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
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
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
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
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
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
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
00637
00638
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
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
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
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
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
00725
00726
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
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
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
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
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
00820
00821
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
00942 if (plist == NULL) {
00943 sinfo_msg_error("plist=NULL, something strange");
00944 return -1 ;
00945 }
00946
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
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