From 81c11e7701c658a410257f8f74476628db5deb3c Mon Sep 17 00:00:00 2001
From: Stephen Smith <steve@fmrib.ox.ac.uk>
Date: Sun, 12 Mar 2006 16:14:54 +0000
Subject: [PATCH] added --tglobal option and fixed offset for --tcustom option

---
 slicetimer.cc | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/slicetimer.cc b/slicetimer.cc
index 3698768..ab14ef5 100644
--- a/slicetimer.cc
+++ b/slicetimer.cc
@@ -41,7 +41,7 @@ Option<bool> odd(string("--odd"), false,
 		     string("use interleaved acquisition"), 
 		     false, no_argument);
 Option<bool> down(string("--down"), false, 
-		     string("reverse slice indexing"), 
+		     string("reverse slice indexing (default is: slices were acquired bottom-up)"), 
 		     false, no_argument);
 Option<string> inputname(string("-i,--in"), string(""),
 			 string("filename of input timeseries"),
@@ -52,6 +52,9 @@ Option<string> outputname(string("-o,--out"), string(""),
 Option<string> tcustom(string("--tcustom"), string(""),
 			  string("filename of single-column custom interleave timing file"),
 			  false, requires_argument);
+Option<float>  tglobal(string("--tglobal"), 0.5,
+			  string("global shift (default is 0.5 = no shift)"),
+			  false, requires_argument);
 Option<string> ocustom(string("--ocustom"), string(""),
 			  string("filename of single-column custom interleave order file (first slice is referred to as 1 not 0)"),
 			  false, requires_argument);
@@ -106,45 +109,47 @@ int do_slice_correction()
   ColumnVector userkernel = sinckernel1D("hanning", 7, 1201);
   // for(int i=1; i<=1201; i++) cout << i << " " << userkernel(i) << endl;
 
-  float recenter = (((float) no_slices)/2 - 0.5)/ no_slices;
+  float recenter = (((float) no_slices)/2 - 0.5)/ no_slices; // only valid for slice-count-based corrections
   
   for (int slice=1; slice<=no_slices; slice++) {
 
-    if (tcustom.set()) {
-      offset = -timings(slice, 1);
+    if (tglobal.set()) {
+      offset = 0.5 - tglobal.value();
+    } else if (tcustom.set()) {
+      offset = 0.5 - timings(slice, 1);
     } else if (ocustom.set()) { 
       int local_count=1;
       while (local_count <= no_slices) {
 	if (timings(local_count, 1) == slice) {
-	  offset = -(local_count -1)* (slice_spacing / repeat_time);
+	  offset = recenter -(local_count -1)* (slice_spacing / repeat_time);
 	  local_count = no_slices + 1;
 	} else 
 	  local_count++;
       }
     } else if (odd.value()) { // acquisition order: 1,3,5, ..., 2,4,6 ...
       if ((slice % 2) == 0) // even
-	offset = -( ceil((float)no_slices / 2) + ((slice -1)/ 2)) * (slice_spacing / repeat_time);
+	offset = recenter - ( ceil((float)no_slices / 2) + ((slice -1)/ 2)) * (slice_spacing / repeat_time);
       else
-	offset = -((slice -1) / 2) * (slice_spacing / repeat_time);
+	offset = recenter - ((slice -1) / 2) * (slice_spacing / repeat_time);
     } else if (down.value()) {
-      offset = -(no_slices - slice)* (slice_spacing / repeat_time);
+      offset = recenter - (no_slices - slice) * (slice_spacing / repeat_time);
     } else { 
-      offset = -(slice -1)* (slice_spacing / repeat_time);
+      offset = recenter - (slice -1) * (slice_spacing / repeat_time);
     }
-    
+
     for (int x_pos = 0; x_pos < timeseries. xsize(); x_pos++)
       for (int y_pos = 0; y_pos < timeseries. ysize(); y_pos++){
 	ColumnVector voxeltimeseries = timeseries.voxelts(x_pos,y_pos,slice-1);
 	ColumnVector interpseries = voxeltimeseries;
 	for (int time_step=1; time_step <= no_volumes; time_step++){
-	  // interpseries(time_step) = interpolate_1d(voxeltimeseries, time_step - offset - recenter);
-	  interpseries(time_step) = kernelinterpolation_1d(voxeltimeseries, time_step - offset - recenter, userkernel, 7);
+	  // interpseries(time_step) = interpolate_1d(voxeltimeseries, time_step - offset);
+	  interpseries(time_step) = kernelinterpolation_1d(voxeltimeseries, time_step - offset, userkernel, 7);
 	}
 	timeseries.setvoxelts(interpseries,x_pos,y_pos,slice-1);
       }
     
     if (verbose.value())
-      cerr << "Slice " << slice << " offset " << offset + recenter << endl;
+      cerr << "Slice " << slice << " offset " << offset << endl;
   }
   
   if (direction.value() == 1) timeseries. swapdimensions(3,2,1); // reverse Flip z and x
@@ -170,6 +175,7 @@ int main (int argc,char** argv)
     options.add(direction);
     options.add(odd);
     options.add(tcustom);
+    options.add(tglobal);
     options.add(ocustom);
 
     options.parse_command_line(argc, argv);
-- 
GitLab