From 9b3a18b53f2013c442db9ccef92ec054daa16604 Mon Sep 17 00:00:00 2001
From: Matthew Webster <mwebster@fmrib.ox.ac.uk>
Date: Fri, 9 Jan 2015 16:00:19 +0000
Subject: [PATCH] Current Version Jan 15

---
 fslhd.cc | 268 +++++++++++++++++--------------------------------------
 1 file changed, 80 insertions(+), 188 deletions(-)

diff --git a/fslhd.cc b/fslhd.cc
index 17088f8..1bf97ba 100755
--- a/fslhd.cc
+++ b/fslhd.cc
@@ -8,204 +8,96 @@
 #include <iostream>
 using namespace NEWIMAGE;
 
-void print_usage(const string& progname) 
+void reportXMLHeader(const NiftiHeader& header)
 {
-  cout << endl;
-  cout << "Usage: fslhd [-x] <input>" << endl;
-  cout << "       -x : instead print an XML-style NIFTI header" << endl;
-}
-
-void ShowNifti(FSLIO* fslio)
-{
-    if (fslio == NULL) {
-        cerr << "ERROR: Could not open file" << endl;
-	return;
-    }
-    if (fslio->niftiptr!=NULL) {
-        cout << nifti_image_to_ascii(fslio->niftiptr) << endl;
-	return;
-    }
-    return;
-}
-
-void ShowHdr(char *fileName, FSLIO* fslio)
-{
-  int i, ft, isanalyze=0;
-  struct dsr *hdr;
-  mat44 mat;
-  int icode, jcode, kcode;
-
-  if (fslio == NULL) 
-  {
-    cerr << "ERROR: Could not open file" << endl;;
-    return;
+  cout << "<nifti_image" << endl;
+  cout << "  image_offset = '" << header.vox_offset  << "'" << endl;
+  cout << "  ndim = '" << header.dim[0] << "'" << endl;
+  cout << "  nx = '" << header.dim[1] << "'" << endl;
+  cout << "  ny = '" << header.dim[2] << "'" << endl;
+  cout << "  nz = '" << header.dim[3] << "'" << endl;
+  cout << "  nt = '" << header.dim[4] << "'" << endl;
+  if ( header.dim[0] > 4 ) {
+    cout << "  nu = '" << header.dim[5] << "'" << endl;
+    cout << "  nv = '" << header.dim[6] << "'" << endl;
+    cout << "  nw = '" << header.dim[7] << "'" << endl;
   }
-
-  ft = FslGetFileType(fslio);
-
-  if (fslio->niftiptr == NULL) 
-  {
-    cerr << "ERROR: Not an Analyze or Nifti file" << endl;
-    return;
+  cout << "  dx = '" << header.pixdim[1] << "'" << endl;
+  cout << "  dy = '" << header.pixdim[2] << "'" << endl;
+  cout << "  dz = '" << header.pixdim[3] << "'" << endl;
+  cout << "  dt = '" << header.pixdim[4] << "'" << endl;
+  if ( header.dim[0] > 4 ) {
+    cout << "  du = '" << header.pixdim[5] << "'" << endl;
+    cout << "  dv = '" << header.pixdim[6] << "'" << endl;
+    cout << "  dw = '" << header.pixdim[7] << "'" << endl;
   }
-  //-------------------- ANALYZE CASE ----------------------- 
-  if (FslBaseFileType(ft)==FSL_TYPE_ANALYZE) 
-  { 
-    isanalyze=1; 
-    //load raw hdr structure   
-    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);
+  cout << "  datatype = '" << header.datatype << "'" << endl;
+  cout << "  nvox = '" << header.nElements() << "'" << endl;
+  cout << "  nbyper = '" << header.bitsPerVoxel/8 << "'" << endl;
+  cout << "  scl_slope = '" << header.sclSlope << "'" << endl;
+  cout << "  scl_inter = '" << header.sclInter << "'" << endl;
+  cout << "  intent_code = '" << header.intentCode << "'" << endl;
+  cout << "  intent_p1 = '" << header.intent_p1 << "'" << endl;
+  cout << "  intent_p2 = '" << header.intent_p2 << "'" << endl;
+  cout << "  intent_p3 = '" << header.intent_p3 << "'" << endl;
+  cout << "  intent_name = '" << header.intentName << "'" << endl;
+  cout << "  toffset = '" << header.toffset << "'" << endl;
+  cout << "  xyz_units = '" << XYZT_TO_SPACE(header.units) << "'" << endl;
+  cout << "  time_units = '" << XYZT_TO_TIME(header.units) << "'" << endl;
+  cout << "  freq_dim = '" << (int)header.freqDim() << "'" << endl;
+  cout << "  phase_dim = '" << (int)header.phaseDim() << "'" << endl;
+  cout << "  slice_dim = '" << (int)header.sliceDim() << "'" << endl;
+  cout << "  descrip = '" << header.description << "'" << endl;
+  cout << "  aux_file = '" << header.auxillaryFile << "'" << endl;
+  cout << "  qform_code = '" << header.qformCode << "'" << endl;
+  cout << "  qfac = '" << header.leftHanded() << "'" << endl;
+  cout << "  quatern_b = '" << header.qB << "'" << endl;
+  cout << "  quatern_c = '" << header.qC << "'" << endl;
+  cout << "  quatern_d = '" << header.qD << "'" << endl;
+  cout << "  qoffset_x = '" << header.qX << "'" << endl;
+  cout << "  qoffset_y = '" << header.qY << "'" << endl;
+  cout << "  qoffset_z = '" << header.qZ << "'" << endl;
+  cout << "  sform_code = '" << header.sformCode << "'" << endl;
+  cout << "  sto_xyz_matrix = '"; 
+  mat44 output(header.getSForm());
+  for (int i=0;i<4;i++)
+    for (int j=0;j<4;j++) {
+     cout << output.m[i][j]; 
+     if ( j==3 && i==3 )
+       cout << "'" << endl;
+     else
+       cout << " ";
     }
-    cout << "filename       " << fileName << endl << endl;
-    
-    //Header Key
-    cout << "sizeof_hdr     " << hdr->hk.sizeof_hdr<< endl;
-    cout << "data_type      " << hdr->hk.data_type << endl;
-    cout << "db_name        " << hdr->hk.db_name << endl;
-    cout << "extents        " << hdr->hk.extents << endl;
-    cout << "session_error  " << hdr->hk.session_error << endl;
-    cout << "regular        " << hdr->hk.regular << endl;
-    cout << "hkey_un0       " << hdr->hk.hkey_un0 << endl;
-    //Image Dimension 
-    for(i=0;i<8;i++) cout << "dim" << i << "           " << hdr->dime.dim[i] << endl;
-    cout << "vox_units      " << hdr->dime.vox_units << endl;
-    cout << "cal_units      " << hdr->dime.cal_units << endl;
-    cout << "unused1        " << hdr->dime.unused1 << endl;
-    cout << "datatype       " << hdr->dime.datatype << endl;
-    cout << "bitpix         " << hdr->dime.bitpix << endl;
-    cout.setf(ios::fixed);  //need cout.setf(ios::fixed) instead of << fixed in stream for tru64 comp
-    for(i=0;i<8;i++) cout << "pixdim" << i << "        " << setprecision(10) << hdr->dime.pixdim[i] << endl;       
-    cout.precision(4);                                   
-    cout << "vox_offset     " << setw(6) << hdr->dime.vox_offset << endl;
-    cout << "funused1       " << setw(6) << hdr->dime.funused1 << endl;
-    cout << "funused2       " << setw(6) << hdr->dime.funused2 << endl;
-    cout << "funused3       " << setw(6) << hdr->dime.funused3 << endl;
-    cout << "cal_max        " << setw(6) << hdr->dime.cal_max << endl;
-    cout << "cal_min        " << setw(6) << hdr->dime.cal_min << endl;
-    cout << "compressed     " << hdr->dime.compressed << endl;
-    cout << "verified       " << hdr->dime.verified << endl;
-    cout << "glmax          " << hdr->dime.glmax << endl;
-    cout << "glmin          " << hdr->dime.glmin << endl ;
-    //Data History 
-    cout << "descrip        " <<  hdr->hist.descrip << endl;
-    cout << "aux_file       " <<  hdr->hist.aux_file << endl;
-    cout << "orient         " << (int)hdr->hist.orient << endl; //need cast else blank
-    cout << "originator     " << hdr->hist.originator << endl;
-    /*{
-      short blah[5];
-      memcpy(blah,hdr->hist.originator,5*sizeof(short));
-      cout << "origin1        " << blah[0] << endl;
-      cout << "origin2        " <<blah[1] << endl;
-      cout << "origin3        " << blah[2] << endl;
-      }*/
-    cout << "origin1        " << (short)hdr->hist.originator[0] << endl; //These lines don't work on
-    cout << "origin2        " << (short)hdr->hist.originator[2] << endl; //all platforms... but WHICH 
-    cout << "origin3        " << (short)hdr->hist.originator[4] << endl; //ones - that is the question
-    cout << "generated      " << hdr->hist.generated << endl;
-    cout << "scannum        " << hdr->hist.scannum << endl;
-    cout << "patient_id     " <<  hdr->hist.patient_id << endl;
-    cout << "exp_date       " << hdr->hist.exp_date << endl;
-    cout << "exp_time       " << hdr->hist.exp_time << endl;
-    cout << "hist_un0       " << hdr->hist.hist_un0 <<endl;
-    cout << "views          " << hdr->hist.views << endl;
-    cout << "vols_added     " << hdr->hist.vols_added << endl;
-    cout << "start_field    " << hdr->hist.start_field << endl;
-    cout << "field_skip     " << hdr->hist.field_skip << endl;
-    cout << "omax           " << hdr->hist.omax << endl;
-    cout << "omin           " << hdr->hist.omin << endl;
-    cout << "smin           " << hdr->hist.smax << endl;
-    cout << "smin           " << hdr->hist.smin << endl;
-    cout << "file_type      " << FslFileTypeString(0) << endl;
-    cout << "file_code      0" << endl;
-    return;
-  }
-    /* -------------------- NIFTI CASE ----------------------- */
-  if (fslio->niftiptr->byteorder != nifti_short_order()) 
-  { 
-    cout << "Byte swapping" << endl;
-  }
-
-  cout << "filename       " <<  fslio->niftiptr->fname << endl << endl;
-  cout << "sizeof_hdr     " <<  "348" << endl;
-  cout << "data_type      " <<  nifti_datatype_string(fslio->niftiptr->datatype) << endl;
-  for(i=0;i<8;i++)  cout << "dim" << i << "           " <<  fslio->niftiptr->dim[i] << endl;
-  cout << "vox_units      " <<  nifti_units_string(fslio->niftiptr->xyz_units) << endl;
-  cout << "time_units     " <<  nifti_units_string(fslio->niftiptr->time_units) << endl;
-  cout << "datatype       " <<  fslio->niftiptr->datatype << endl;
-  cout << "nbyper         " <<  fslio->niftiptr->nbyper << endl;
-  cout << "bitpix         " <<  fslio->niftiptr->nbyper * 8 << endl;
-  cout.setf(ios::fixed);  //need cout.setf(ios::fixed) instead of << fixed in stream for tru64 comp
-  for(i=0;i<8;i++) cout << "pixdim" << i << "        " << setprecision(10) <<  fslio->niftiptr->pixdim[i] << endl;
-  cout << "vox_offset     " <<   fslio->niftiptr->iname_offset << endl;
-  cout.precision(4);
-  cout << "cal_max        " << setw(6) <<  fslio->niftiptr->cal_max << endl;
-  cout << "cal_min        " << setw(6) <<  fslio->niftiptr->cal_min << endl;
-  cout.precision(6);
-  cout << "scl_slope      " <<  fslio->niftiptr->scl_slope << endl;
-  cout << "scl_inter      " <<  fslio->niftiptr->scl_inter << endl;
-  cout << "phase_dim      " <<  fslio->niftiptr->phase_dim << endl;
-  cout << "freq_dim       " <<  fslio->niftiptr->freq_dim  << endl;
-  cout << "slice_dim      " <<  fslio->niftiptr->slice_dim << endl;
-  cout << "slice_name     " <<  nifti_slice_string(fslio->niftiptr->slice_code) << endl;
-  cout << "slice_code     " <<  fslio->niftiptr->slice_code << endl;
-  cout << "slice_start    " <<  fslio->niftiptr->slice_start << endl;
-  cout << "slice_end      " <<  fslio->niftiptr->slice_end << endl;
-  cout << "slice_duration " <<  fslio->niftiptr->slice_duration << endl;
-  cout << "time_offset    " <<  fslio->niftiptr->toffset << endl;
-  cout << "intent         " <<  nifti_intent_string(fslio->niftiptr->intent_code) << endl;
-  cout << "intent_code    " <<  fslio->niftiptr->intent_code << endl;
-  cout << "intent_name    " <<  fslio->niftiptr->intent_name << endl;
-  cout << "intent_p1      " <<  fslio->niftiptr->intent_p1 << endl;
-  cout << "intent_p2      " <<  fslio->niftiptr->intent_p2 << endl;
-  cout << "intent_p3      " <<  fslio->niftiptr->intent_p3 << endl;
-  cout << "qform_name     " <<  nifti_xform_string(fslio->niftiptr->qform_code) << endl;
-  cout << "qform_code     " <<  fslio->niftiptr->qform_code << endl;
-  mat = fslio->niftiptr->qto_xyz;
-  for(i=1;i<=4;i++) cout << "qto_xyz:" << i << "      " << mat.m[i-1][0] << "  " << mat.m[i-1][1] << "  " << mat.m[i-1][2] << "  " << mat.m[i-1][3] << endl;
-  nifti_mat44_to_orientation(mat,&icode,&jcode,&kcode);
-  cout << "qform_xorient  " << nifti_orientation_string(icode) << endl;
-  cout << "qform_yorient  " << nifti_orientation_string(jcode) << endl;
-  cout << "qform_zorient  " << nifti_orientation_string(kcode) << endl;
-  cout << "sform_name     " << nifti_xform_string(fslio->niftiptr->sform_code) << endl;
-  cout << "sform_code     " << fslio->niftiptr->sform_code << endl;
-  mat = fslio->niftiptr->sto_xyz;
-  for(i=1;i<=4;i++) cout << "sto_xyz:" << i << "      " << mat.m[i-1][0] << "  " << mat.m[i-1][1] << "  " << mat.m[i-1][2] << "  " << mat.m[i-1][3] << endl;
-  nifti_mat44_to_orientation(mat,&icode,&jcode,&kcode);
-  cout << "sform_xorient  " << nifti_orientation_string(icode) << endl;
-  cout << "sform_yorient  " << nifti_orientation_string(jcode) << endl;
-  cout << "sform_zorient  " << nifti_orientation_string(kcode) << endl;
-  cout << "file_type      " << FslFileTypeString(fslio->niftiptr->nifti_type) << endl;
-  cout << "file_code      " << fslio->niftiptr->nifti_type << endl;
-  //Data History 
-  cout << "descrip        " << fslio->niftiptr->descrip << endl;
-  cout << "aux_file       " << fslio->niftiptr->aux_file << endl;
-  /*cout << "orient         %d\n", hdr->hist.orient); */
-  return;
+  cout << "  slice_code = '" << header.sliceCode << "'" << endl;
+  cout << "  slice_start = '" << header.sliceStart << "'" << endl;
+  cout << "  scl_end = '" << header.sliceEnd << "'" << endl;
+  cout << "  scl_duration = '" << header.sliceDuration << "'" << endl;
+  cout << "/>" << endl;
 }
 
+int print_usage(const string& progname) 
+{
+  cout << endl;
+  cout << "Usage: fslhd [-x] <input>" << endl;
+  cout << "       -x : instead print an XML-style NIFTI header" << endl;
+  return 1;
+}
 
 int main(int argc,char *argv[])
 {
   if (argc < 2) 
-  {
-    print_usage(string(argv[0]));
-    return 1; 
-  }
-  FSLIO* fslio=NULL;
-  int argval=1, niftiform=0;
-  if (strcmp(argv[1],"-x")==0) 
-  {
-      niftiform=1;
-      argval=2;
-  }
-  fslio = FslOpen(FslMakeBaseName(argv[argval]),"rb");
-  FslClose(fslio);
-  if (niftiform==0) ShowHdr(argv[argval], fslio); 
-  else ShowNifti(fslio); 
+    return print_usage(string(argv[0]));
+  NiftiIO reader;
+  try {
+    string filename(return_validimagefilename(argv[argc-1]));
+    NiftiHeader header(reader.loadHeader(filename));
+    if ( argc==3 && strcmp(argv[1],"-x")==0 )
+      reportXMLHeader(header);
+    else {
+      cout << "filename\t" << filename << endl;
+      header.report();
+    }
+  }  catch ( exception& e ) { cerr << e.what() << endl; return 1;}
   return 0;
 }
 
-- 
GitLab