From 84b6c1840fd55940b2bc442c7a3e7cd5b214950f Mon Sep 17 00:00:00 2001
From: Moises Fernandez <moisesf@fmrib.ox.ac.uk>
Date: Fri, 12 Apr 2013 14:27:59 +0000
Subject: [PATCH] Method to merge the result parts of Bedpostx. Call from
 post-proc script

---
 merge_parts_gpu.cc | 141 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 141 insertions(+)
 create mode 100644 merge_parts_gpu.cc

diff --git a/merge_parts_gpu.cc b/merge_parts_gpu.cc
new file mode 100644
index 0000000..35eaa00
--- /dev/null
+++ b/merge_parts_gpu.cc
@@ -0,0 +1,141 @@
+/*  merge_parts_gpu.cc
+
+    Tim Behrens, Saad Jbabdi, Stam Sotiropoulos, Moises Hernandez  - FMRIB Image Analysis Group
+
+    Copyright (C) 2005 University of Oxford  */
+
+/*  CCOPYRIGHT  */
+
+#include "xfibresoptions.h"
+#include "newmat.h"
+#include "newimage/newimageall.h"
+
+using namespace Xfibres;
+
+
+void join_Parts(NEWIMAGE::volume<float> mask, string name_in, string name_out, string subjdir, int nvox, int nsamples, int nParts, float max, float min){
+		int size_parts = nvox/nParts;
+		int last_part = nvox - ((nParts-1)*size_parts);
+
+		//if(mean) nsamples=1;
+
+		Matrix result(nsamples,0);
+		Matrix part;
+
+		for(int i=0;i<(nParts-1);i++){
+			part.ReSize(nsamples,size_parts);
+			std::ostringstream num;
+			num << i;
+			std::string part_number;
+			part_number.assign(num.str());
+			std::string aux;
+			while(part_number.size()<4){
+				aux = "0" + part_number;
+				part_number.assign(aux);
+			}
+			std::string file_name;
+			file_name.assign(subjdir);
+			file_name += ".bedpostX/diff_parts/data_part_";
+			file_name += part_number; 
+			file_name += "/"; 
+			file_name += name_in; 
+			file_name += "J"; 
+
+			ifstream in;
+			in.open (file_name.data(), ios::in | ios::binary);
+			in.read((char*)&part(1,1), size_parts*nsamples*sizeof(Real));
+			in.close();
+
+			result = result | part;
+		}
+		part.ReSize(nsamples,last_part);
+		std::ostringstream num;
+		num << nParts-1;;
+		std::string part_number;
+		part_number.assign(num.str());
+		std::string aux;
+		while(part_number.size()<4){
+			aux = "0" + part_number;
+			part_number.assign(aux);
+		}
+		std::string file_name;
+		file_name.assign(subjdir);
+		file_name += ".bedpostX/diff_parts/data_part_";
+		file_name += part_number; 
+		file_name += "/"; 
+		file_name += name_in;
+		file_name += "J";  
+
+		ifstream in;
+		in.open (file_name.data(), ios::in | ios::binary);
+		in.read((char*)&part(1,1), last_part*nsamples*sizeof(Real));
+		in.close();
+		result = result | part;
+
+		NEWIMAGE::volume4D<float> tmp;
+      		tmp.setmatrix(result,mask);
+		if(max==-10) max=tmp.max();
+		if(min==-10) min=tmp.min(); 
+		tmp.setDisplayMaximumMinimum(max,min);
+     		save_volume4D(tmp,subjdir+".bedpostX/"+name_out);
+}
+
+//////////////////////////////////////////////////////////
+//       MERGE THE OUTPUTS FILES OF BEDPOSTX
+//////////////////////////////////////////////////////////
+//parameters:
+// argc - 3 nvox
+// argc - 2 nParts
+// argc - 1 subjdir
+
+int main(int argc, char *argv[])
+{
+	// Setup logging:
+    	Log& logger = LogSingleton::getInstance();
+    	xfibresOptions& opts = xfibresOptions::getInstance();
+	opts.parse_command_line(argc-3,argv,logger);
+
+    	NEWIMAGE::volume<float> mask;
+    	read_volume(mask,opts.maskfile.value());
+
+	cout << opts.maskfile.value() << endl;
+    	
+	int nvox = atoi(argv[argc-3]);
+	int nParts = atoi(argv[argc-2]);
+	string subjdir = argv[argc-1];
+
+	int nsamples = opts.njumps.value()/opts.sampleevery.value();
+	
+	//////////////////////////////////////////////////////////////
+	////////// JOIN Results of the Parts //////////////////////
+	//////////////////////////////////////////////////////////////
+
+	if(opts.modelnum.value()==1){
+		join_Parts(mask,"mean_dsamples","mean_dsamples",subjdir, nvox, 1, nParts, -10, 0);
+	}else if(opts.modelnum.value()==2){
+		join_Parts(mask,"mean_dsamples","mean_dsamples",subjdir, nvox, 1, nParts, -10, 0);
+		join_Parts(mask,"mean_d_stdsamples","mean_d_stdsamples",subjdir, nvox, 1, nParts, -10, 0);
+		//join_Parts(mask,"dsamples","dsamples",subjdir, nvox, nsamples, nParts, -10, 0);
+		//join_Parts(mask,"d_stdsamples","d_stdsamples",subjdir, nvox, nsamples, nParts, -10, 0);
+	}	
+	if (opts.f0.value()){
+      		join_Parts(mask,"mean_f0samples","mean_f0samples",subjdir, nvox, 1, nParts, 1, 0);
+		//join_Parts(mask,"f0samples","f0samples",subjdir, nvox, nsamples, nParts, 1, 0);
+    	}
+    	if (opts.rician.value()){
+		join_Parts(mask,"mean_tausamples","mean_tausamples",subjdir, nvox, 1, nParts, -10, 0);
+    	}
+	join_Parts(mask,"mean_S0samples","mean_S0samples",subjdir, nvox, 1, nParts, -10, 0);
+
+	for(int f=0;f<opts.nfibres.value();f++){
+		join_Parts(mask,"th"+num2str(f+1)+"samples","merged_th"+num2str(f+1)+"samples",subjdir, nvox, nsamples, nParts, -10, -10);
+		join_Parts(mask,"ph"+num2str(f+1)+"samples","merged_ph"+num2str(f+1)+"samples",subjdir, nvox, nsamples, nParts, -10, -10);
+		join_Parts(mask,"f"+num2str(f+1)+"samples","merged_f"+num2str(f+1)+"samples",subjdir, nvox, nsamples, nParts, 1, 0);
+
+		//join_Parts(mask,"mean_f"+num2str(f+1)+"samples",subjdir, nvox, 1, nParts, 1, 0);
+		//join_Parts(mask,"dyads"+num2str(f+1),subjdir, nvox, nsamples, nParts, 1, -1);
+	}	
+		
+  	return 0;
+}
+
-- 
GitLab