Skip to content
Snippets Groups Projects
merge_parts_gpu.cc 4.49 KiB
/*  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;
}