/*! * Fill IMG struct header information from Analyze 7.5 database files. * SIF file is read if available. Information concerning separate frames * or planes is not filled though. * * @param dbname name of Analyze database, may contain filename extension * @param img pointer to the initiated IMG data * @return errstatus, which is STATUS_OK (0) when call was successful, * and >0 in case of an error. */ int imgReadAnalyzeHeader(const char *dbname, IMG *img) { char hdrfile[FILENAME_MAX], siffile[FILENAME_MAX]; ANALYZE_DSR ana_header; SIF sif; double f; int ret; if(IMG_TEST) printf("\nimgReadAnalyzeHeader(%s, *img)\n", dbname); /* Check the input */ if(img==NULL) return STATUS_FAULT; if(img->status!=IMG_STATUS_INITIALIZED) return STATUS_FAULT; imgSetStatus(img, STATUS_FAULT); if(dbname==NULL) return STATUS_FAULT; /* Determine the names of hdr and sif files */ ret=anaDatabaseExists(dbname, hdrfile, NULL, siffile); if(ret==0) return STATUS_NOFILE; /* Read Analyze header file */ ret=anaReadHeader(hdrfile, &ana_header); if(ret!=0) { if(IMG_TEST>1) printf("anaReadHeader() return value := %d\n", ret); if(ret==1) return STATUS_FAULT; else if(ret==2) return STATUS_NOHEADERFILE; else return STATUS_UNSUPPORTED; return(STATUS_FAULT); } /* and set IMG contents */ ret=imgGetAnalyzeHeader(img, &ana_header); if(ret!=0) { imgSetStatus(img, ret); return(ret); } /* If SIF does not exist, then that's it */ if(!siffile[0]) { imgSetStatus(img, STATUS_OK); return STATUS_OK; } /* SIF is available, so read that too */ sifInit(&sif); ret=0; if(sifRead(siffile, &sif)!=0) return STATUS_OK; /* Copy scan time */ img->scanStart=sif.scantime; /* Study number, if not yet defined */ if(!img->studyNr[0] && strlen(sif.studynr)>1 ) strncpy(img->studyNr, sif.studynr, MAX_STUDYNR_LEN); /* Isotope half-life, if not yet defined */ f=hlFromIsotope(sif.isotope_name); if(img->isotopeHalflife<=0.0 && f>0.0) img->isotopeHalflife=60.0*f; sifEmpty(&sif); return STATUS_OK; }
/** Set IMG contents based on data in SIF. \return Returns 0 if successful. */ int sif2img( /** Pointer to SIF struct from which content is copied to IMG */ SIF *sif, /** Pointer to IMG. Must be initiated with imgInit(), and allocated * if frame time or count information is to be copied */ IMG *img, /** Select whether SIF header contents are copied (1) or not (0) */ int copy_header, /** Select whether SIF header contents are copied (1) or not (0) */ int copy_frames, /** Select whether SIF countheader contents are copied (1) or not (0) */ int copy_counts ) { int fi; if(img==NULL || sif==NULL) return 1; if(copy_header) { img->scanStart=sif->scantime; img->isotopeHalflife=60.0*hlFromIsotope(sif->isotope_name); strcpy(img->studyNr, sif->studynr); } if(copy_frames) { if(sif->frameNr!=img->dimt) return(3); for(fi=0; fi<img->dimt; fi++) { img->start[fi]=sif->x1[fi]; img->end[fi]=sif->x2[fi]; img->mid[fi]=0.5*(img->start[fi]+img->end[fi]); } } if(copy_counts) { if(sif->frameNr!=img->dimt) return(3); if(sif->colNr<4) return(4); for(fi=0; fi<img->dimt; fi++) { img->prompts[fi]=sif->prompts[fi]; img->randoms[fi]=sif->randoms[fi]; img->weight[fi]=sif->weights[fi]; } } return 0; }