From 447ecbb0713251417f461da51d198637f7078c8d Mon Sep 17 00:00:00 2001
From: Tim Behrens <behrens@fmrib.ox.ac.uk>
Date: Thu, 18 Aug 2005 08:07:30 +0000
Subject: [PATCH] *** empty log message ***

---
 Makefile          |   7 ++-
 fdt_matrix_ops.cc | 139 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 145 insertions(+), 1 deletion(-)
 create mode 100644 fdt_matrix_ops.cc

diff --git a/Makefile b/Makefile
index 97fb300..c1e4932 100644
--- a/Makefile
+++ b/Makefile
@@ -22,6 +22,7 @@ DIFF_PVM=diff_pvm
 XFIBRES=xfibres
 RV=replacevols
 MDV=make_dyadic_vectors
+FMO=fdt_matrix_ops
 TEST=testfile
 
 DTIFITOBJS=dtifit.o dtifitOptions.o
@@ -36,12 +37,13 @@ DIFF_PVMOBJS=diff_pvm.o diff_pvmoptions.o
 XFIBOBJS=xfibres.o xfibresoptions.o
 RVOBJS=replacevols.o
 MDVOBJS=make_dyadic_vectors.o
+FMOOBJS=fdt_matrix_ops.o
 TESTOBJS=testfile.o
 
 SCRIPTS = eddy_correct bedpost bedpost_proc bedpost_cleanup bedpost_kill_all bedpost_kill_pid zeropad bedpost_datacheck
 FSCRIPTS=correct_and_average ocmr_preproc
 XFILES = dtifit probtrack find_the_biggest medianfilter diff_pvm make_dyadic_vectors proj_thresh
-FXFILES = reord_OM sausages replacevols
+FXFILES = reord_OM sausages replacevols fdt_matrix_ops
 
 
 RUNTCLS = Fdt
@@ -84,6 +86,9 @@ ${RV}:    	${RVOBJS}
 ${MDV}:    	${MDVOBJS}
 		   ${CXX} ${CXXFLAGS} ${LDFLAGS} -o $@ ${MDVOBJS} ${DLIBS}
 
+${FMO}:    	${FMOOBJS}
+		   ${CXX} ${CXXFLAGS} ${LDFLAGS} -o $@ ${FMOOBJS} ${DLIBS}
+
 ${TEST}:    	${TESTOBJS}
 		   ${CXX} ${CXXFLAGS} ${LDFLAGS} -o $@ ${TESTOBJS} ${DLIBS}
 
diff --git a/fdt_matrix_ops.cc b/fdt_matrix_ops.cc
new file mode 100644
index 0000000..a71547f
--- /dev/null
+++ b/fdt_matrix_ops.cc
@@ -0,0 +1,139 @@
+/*  Copyright (C) 2004 University of Oxford  */
+
+/*  CCOPYRIGHT  */
+
+#include <iostream>
+#include <fstream>
+#include <cmath>
+#include "newimage/newimageall.h"
+#include <vector>
+#include <algorithm>
+
+using namespace std;
+using namespace NEWIMAGE;
+using namespace NEWMAT;
+
+
+int main ( int argc, char **argv ){
+  if(argc<5){
+    cout<<"usage: fdt_matrix_ops <matrix1> <seedmask1> <matrix2> <seedmask2> ... [inclusion mask] <output>"<<endl;
+    cout<<"creates one big uber-matrix from lots of cute wee dinky ones"<<endl;
+    cout<<"If seedmasks overlap, it just takes the values from the first of them"<<endl;
+    cout<<"If you specify an incluson mask (optional), only voxels that are"<<endl;
+    cout<<"inside this mask will be included in the output"<<endl;
+    exit(0);
+  }
+  int var=argc-1;
+  bool incmaskyn = (float(var)/2.0)==int(float(var)/2.0);
+  int Nmats;
+  if(incmaskyn) Nmats=var/2-1;
+  else Nmats=(var-1)/2;
+  
+  vector<volume<int>* > masks;
+  vector<volume<float>* > mats;
+  vector<volume<int>* > coords;
+  volume<int> incmask;
+  volume<int> totalmask;
+  for(int i=0;i<Nmats;i++){
+    volume<float> *tmp= new volume<float>;
+    volume<int> *tmpcoords= new volume<int>;
+    volume<int> *tmpmask= new volume<int>;
+    read_volume(*tmp,argv[ 2*i + 1 ]);
+    read_volume(*tmpcoords,"coords_for_" + string(argv[ 2*i + 1 ]) );
+    read_volume(*tmpmask,argv[ 2*(i + 1) ]);
+    mats.push_back(tmp);
+    masks.push_back(tmpmask);
+    if(i==0) totalmask=*tmpmask;
+    else totalmask=totalmask+ *tmpmask;
+
+}
+  if(incmaskyn){
+    read_volume(incmask,argv[var-1]);
+    incmask=incmask*totalmask;
+  }else{
+    incmask=totalmask;
+  }
+  
+  vector<volume<int>* >lookups;
+  for(int i=0;i<Nmats;i++){
+    volume<int> *lu = new volume<int>;
+    *lu=*masks[i];int conrow=0;
+    for(int z=0;z<(*lu).zsize();z++){
+      for(int y=0;y<(*lu).ysize();y++){
+	for(int x=0;x<(*lu).xsize();x++){
+	  if((*masks[i])(x,y,z)>0){
+	    (*lu)(x,y,z)=conrow;
+	    conrow++;
+	  }
+	}
+      }
+    }
+    lookups.push_back(lu);
+  }
+  
+  
+  int nvoxels=0;
+
+  for(int z=0;z<incmask.zsize();z++) {
+    for(int y=0;y<incmask.ysize();y++){
+      for(int x=0;x<incmask.xsize();x++){
+	  if(incmask(x,y,z)>0) nvoxels++;
+      }
+    }
+  }
+  
+  volume<float> output(nvoxels,(*mats[0]).ysize(),0);
+  volume<float> outcoords(nvoxels,3,0);
+  
+  int newrow=0;
+  for(int z=0;z<incmask.zsize();z++) {
+    for(int y=0;y<incmask.ysize();y++){
+      for(int x=0;x<incmask.xsize();x++){
+	if(incmask(x,y,z)>0){
+	  bool found=false;
+	  for(unsigned int i=0;i<mats.size();i++){
+	    if(!found){
+	      if((*masks[i])(x,y,z)>0){
+		int oldrow=(*lookups[i])(x,y,z);
+		for(int col=0;col<(*mats[i]).ysize();col++){
+		  output(newrow,col,0)=(*mats[i])(oldrow,col,0);
+		}
+		outcoords(newrow,0,0)=(*coords[i])(oldrow,0,0);
+		outcoords(newrow,1,0)=(*coords[i])(oldrow,1,0);
+		outcoords(newrow,2,0)=(*coords[i])(oldrow,2,0);
+		
+		found=true;
+		newrow++;
+	      }
+	    }
+	    
+	  }
+	  
+	}
+      }
+    }
+  }
+
+  save_volume(output,argv[argc-1]);
+  save_volume(outcoords,"coords_for_"+string(argv[argc-1]));
+ return 0;
+}
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-- 
GitLab