From 54ffb77a558586108c838bc427aa741c9e4095bf Mon Sep 17 00:00:00 2001
From: Johannes Stelzer <johannes.stelzer@tuebingen.mpg.de>
Date: Mon, 11 Mar 2019 16:17:43 +0100
Subject: [PATCH] fixed nifti headers if entry does not exist in vista

---
 vviewer/VistaLoad.py | 77 +++++++++++++++++++++++++-------------------
 1 file changed, 44 insertions(+), 33 deletions(-)

diff --git a/vviewer/VistaLoad.py b/vviewer/VistaLoad.py
index 6cc1929..46828e8 100644
--- a/vviewer/VistaLoad.py
+++ b/vviewer/VistaLoad.py
@@ -56,6 +56,8 @@ import re
 
 #%% AUX
 def get_property_str(header_img, str_property, repn_property="int"):
+    if header_img is None:
+        return -1
     idx_begin = header_img.find(str_property)
     if idx_begin == -1:
         return -1
@@ -85,7 +87,7 @@ def get_subheader(header, section_demark):
     
     
 #%% reader
-fp_input = "/home/morty/tmp/test.v"
+# fp_input = "/mnt/50tbd/gabriele/median_02.v"
 
 def load_vista(fp_input):
     
@@ -206,55 +208,64 @@ def load_vista(fp_input):
         
         
     #%% re-parse the header to get the complete header information
+    nii_loaded = nib.Nifti1Image(data, affine=np.eye(4))
     mm = get_property_str(header_img, "voxel", "list")
+    nii_loaded.header.set_zooms(mm)
+    nii_loaded.header['pixdim'][4] = tr
+    nii_loaded.header.set_xyzt_units(xyz="mm", t="msec")
+    
     if dim == "4D":
         mm.append(tdim)
     
     #get s-form code
     sform_code = get_property_str(header, "sform_code", "int")
+    if sform_code != -1:
+        nii_loaded.header['sform_code'] = sform_code
     qform_code = get_property_str(header, "qform_code", "int")
+    if qform_code != -1:
+        nii_loaded.header['qform_code'] = qform_code
     
     header_sform = get_subheader(header, "sform: image")
-    offset_sform = get_property_str(header_sform, "data", "int") + last_idx_header
-    length_sform = int(get_property_str(header_sform, "length", "int")/4)
-    sform1D = np.frombuffer(raw, dtype=np.float32, count=length_sform, offset=offset_sform).byteswap()
-    sform2D = np.reshape(sform1D, (4,4))
+    offset_sform = get_property_str(header_sform, "data", "int")
+    if offset_sform != -1:
+        offset_sform += last_idx_header
+        length_sform = int(get_property_str(header_sform, "length", "int")/4)
+        sform1D = np.frombuffer(raw, dtype=np.float32, count=length_sform, offset=offset_sform).byteswap()
+        sform2D = np.reshape(sform1D, (4,4))
+        nii_loaded.set_sform(sform2D)
     
     
     header_dim = get_subheader(header, "dim: bundle")
-    offset_dim = get_property_str(header_dim, "data", "int") + last_idx_header
-    length_dim = int(get_property_str(header_dim, "length", "int")/4)
-    dim1D = np.frombuffer(raw, dtype=np.float32, count=length_dim, offset=offset_dim)
-    
+    offset_dim = get_property_str(header_dim, "data", "int")
+    if offset_sform != -1:
+        offset_sform += last_idx_header
+        length_dim = int(get_property_str(header_dim, "length", "int")/4)
+        dim1D = np.frombuffer(raw, dtype=np.float32, count=length_dim, offset=offset_dim)
+        
     
     header_pixdim = get_subheader(header, "pixdim: bundle")
-    offset_pixdim= get_property_str(header_dim, "data", "int") + last_idx_header
-    length_pixdim = int(get_property_str(header_dim, "length", "int")/4)
-    pixdim1D = np.frombuffer(raw, dtype=np.float32, count=length_dim, offset=offset_dim)
-    
-    
+    offset_pixdim= get_property_str(header_dim, "data", "int")
+    if offset_sform != -1:
+        offset_sform += last_idx_header
+        length_pixdim = int(get_property_str(header_dim, "length", "int")/4)
+        pixdim1D = np.frombuffer(raw, dtype=np.float32, count=length_dim, offset=offset_dim)
+        
+        
     header_qform = get_subheader(header, "qform: bundle")
-    offset_qform = get_property_str(header_qform, "data", "int") + last_idx_header
-    length_qform = int(get_property_str(header_qform, "length", "int")/4)
-    qformdim1D = np.frombuffer(raw, dtype=np.float32, count=length_qform, offset=offset_qform)
-    # quatern_b quatern_c quatern_d qoffset_x qoffset_y qoffset_z
+    offset_qform = get_property_str(header_qform, "data", "int")
+    if offset_sform != -1:
+        offset_sform += last_idx_header
+        length_qform = int(get_property_str(header_qform, "length", "int")/4)
+        qformdim1D = np.frombuffer(raw, dtype=np.float32, count=length_qform, offset=offset_qform)
+        nii_loaded.header['quatern_b'] = qformdim1D[0]
+        nii_loaded.header['quatern_c'] = qformdim1D[1]
+        nii_loaded.header['quatern_d'] = qformdim1D[2]
+        nii_loaded.header['qoffset_x'] = qformdim1D[3]
+        nii_loaded.header['qoffset_y'] = qformdim1D[4]
+        nii_loaded.header['qoffset_z'] = qformdim1D[5]
+        # quatern_b quatern_c quatern_d qoffset_x qoffset_y qoffset_z
     
     
-    #%% convert to nii object... fill in data and header
-    nii_loaded = nib.Nifti1Image(data, affine=np.eye(4))
-    # import pdb; pdb.set_trace()
-    nii_loaded.header.set_zooms(mm)
-    nii_loaded.header['pixdim'][4] = tr
-    nii_loaded.set_sform(sform2D)
-    nii_loaded.header['qform_code'] = qform_code
-    nii_loaded.header['qform_code'] = sform_code
-    nii_loaded.header['quatern_b'] = qformdim1D[0]
-    nii_loaded.header['quatern_c'] = qformdim1D[1]
-    nii_loaded.header['quatern_d'] = qformdim1D[2]
-    nii_loaded.header['qoffset_x'] = qformdim1D[3]
-    nii_loaded.header['qoffset_y'] = qformdim1D[4]
-    nii_loaded.header['qoffset_z'] = qformdim1D[5]
-    nii_loaded.header.set_xyzt_units(xyz="mm", t="msec")
     
     return nii_loaded
 
-- 
GitLab