Esempio n. 1
0
/*!
 * 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;
}
Esempio n. 2
0
/** 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;
}