Skip to content
Snippets Groups Projects
fslcorrecthd.cc 2.51 KiB
//     fslcorrecthd.cc - check and correct a nifti file for bad vox-offset
//     Matthew Webster, FMRIB Image Analysis Group
//     Copyright (C) 2007 University of Oxford  
//     CCOPYRIGHT  

#include "newimage/newimageall.h"
#include "fslio/fslio.h"
#include <iostream>
using namespace NEWIMAGE;

void print_usage(const string& progname) 
{
  cout << endl;
  cout << "Usage: fslcorrecthd <input> <output>" << endl;
  cout << "       Note that fslcorrecthd only operates on uncompressed NIFTI or ANALYZE files" << endl;
}

int main(int argc,char *argv[])
{
  if (argc < 3) 
  {
    print_usage(string(argv[0]));
    return 1; 
  }
  FSLIO* fslio=NULL;
  fslio = FslOpen(FslMakeBaseName(argv[1]),"rb");
  FslClose(fslio);
  struct dsr *hdr;
  hdr = (struct dsr *)calloc(1,sizeof(struct dsr));
  FslReadRawHeader(hdr,fslio->niftiptr->fname);
  if (fslio->niftiptr->byteorder != nifti_short_order()) 
  {
    cout << "Byte swapping" << endl;
    AvwSwapHeader(hdr);
  } 
  //check nifti-libs output versus raw header info
  int offset =(int) ( fslio->niftiptr->iname_offset - hdr->dime.vox_offset );
  int minft=(int)MIN(fslio->niftiptr->iname_offset,hdr->dime.vox_offset);
  cout << "number of bytes wrong: " << offset << endl << "start at byte location: " << minft << endl;

  if (offset==0) {
    cout << "No byte correction needed, exiting." << endl;
    return 0;
  }

  if (FslIsCompressedFileType(FslGetFileType(fslio))) {
    cerr << "Error: fslcorrecthd requires uncompressed input" << endl;         
    return 1;
  }

 ifstream input_file;
 ofstream output_file;
 char *temp,*outputName,*inputName; 
 FslGetHdrImgNames(argv[2],fslio,&temp,&outputName);
 FslGetHdrImgNames(argv[1],fslio,&temp,&inputName);
 char byte[1];
 input_file.open(inputName,ios::in | ios :: binary);
 output_file.open(outputName,ofstream::out | ofstream::binary);

 for(int i=1;i<=minft;i++) //Write Header
 {
   input_file.read(byte,1);
   if (input_file.eof()) break;
   output_file.write(byte,1);
 }

 for(int i=1;i<=abs(offset) && offset>0;i++) //Pad if we have missing 4 bytes
 {
   byte[0]=0;
   output_file.write(byte,1);
 }

 for(int i=1;i<=abs(offset) && offset<0;i++) //Read past bad extensions/junk 
 {
   input_file.read(byte,1);
 }

 while(true) //Copy the data
 {
   input_file.read(byte,1);
   if (input_file.eof()) break;
   output_file.write(byte,1);
 }  
 output_file.close();
 input_file.close();

 system(("FSLOUTPUTTYPE=NIFTI; ${FSLDIR}/bin/fslmaths " + string(outputName)).c_str());  //To clean up header
 free(temp);
 free(outputName);
 free(hdr);
 return 0;
}