From 1c46c0a80142c896f0ae94ee3870d3cba9cb5fb0 Mon Sep 17 00:00:00 2001 From: Christian Beckmann <c.beckmann@donders.ru.nl> Date: Wed, 2 Oct 2013 09:32:08 +0000 Subject: [PATCH] *** empty log message *** --- fsl_dualreg.cc | 254 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 fsl_dualreg.cc diff --git a/fsl_dualreg.cc b/fsl_dualreg.cc new file mode 100644 index 0000000..bc0fb91 --- /dev/null +++ b/fsl_dualreg.cc @@ -0,0 +1,254 @@ +/* test.cc + + Christian F. Beckmann, FMRIB Analysis Group + + Copyright (C) 1999-20013 University of Oxford */ + +/* CCOPYRIGHT */ + +#include "libvis/miscplot.h" +#include "miscmaths/miscmaths.h" +#include "miscmaths/miscprob.h" +#include "utils/options.h" +#include <vector> +#include <ctime> +#include "newimage/newimageall.h" +#include "melhlprfns.h" +#include <iostream> + +#ifdef __APPLE__ +#include <mach/mach.h> +#define memmsg(msg) { \ + struct task_basic_info t_info; \ + mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; \ + if (KERN_SUCCESS == task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) &t_info, &t_info_count)) \ + { \ + cout << msg << " res: " << t_info.resident_size/1000000 << " virt: " << t_info.virtual_size/1000000 << "\n"; \ + cout.flush(); \ + } \ +} +#else +#define memmsg(msg) { \ + cout << msg; \ +} +#endif + +// a simple message macro that takes care of cout and log +#define message(msg) { \ + cout << msg; \ + cout.flush(); \ +} + +#define outMsize(msg,Mat) { \ + cerr << " " << msg << " " <<Mat.Nrows() << " x " << Mat.Ncols() << endl; \ +} + + +using namespace MISCPLOT; +using namespace MISCMATHS; +using namespace Utilities; +using namespace std; +using namespace Melodic; + +// GLOBALS + +clock_t tictime; + + +// The two strings below specify the title and example usage that is +// printed out as the help or usage message + + string title=string("fsl_BLAH")+ + string("\nAuthor: Christian F. Beckmann \nCopyright(c) 2008-2013 University of Oxford\n")+ + string(" \n \n")+ + string(" \n"); + string examples="fsl_BLAH [options]"; + +//Command line Options { + Option<string> fnin(string("-i,--in"), string(""), + string("input file name (matrix 3D or 4D image)"), + false, requires_argument); + Option<string> fnmask(string("-m"), string(""), + string("mask file name "), + false, requires_argument); + Option<int> help(string("-h,--help"), 0, + string("display this help text"), + false,no_argument); + Option<int> xdim(string("-x,--xdim"), 0, + string("xdim"), + false,requires_argument); + Option<int> ydim(string("-y,--ydim"), 0, + string("ydim"), + false,requires_argument); + Option<int> econ(string("-e,--econ"), 0, + string("econ: how to liump stuff"), + false,requires_argument); + /* +} +*/ +//////////////////////////////////////////////////////////////////////////// + +// Local functions + +void tic(){ + tictime = clock(); +} + +void toc(){ + cerr << endl << "TOC: " << float(clock()-tictime)/CLOCKS_PER_SEC << " seconds" << endl<<endl; +} + +Matrix calccorr(const Matrix& in, int econ) + { + Matrix Res; + int nrows=in.Nrows(); + int ncols=in.Ncols(); + Res = zeros(nrows,nrows); + + if(econ>0){ + RowVector colmeans(ncols); + for (int n=1; n<=ncols; n++) { + colmeans(n)=0; + for (int m=1; m<=nrows; m++) { + colmeans(n)+=in(m,n); + } + colmeans(n)/=nrows; + } + int dcol = econ; + Matrix suba; + + for(int ctr=1; ctr <= in.Ncols(); ctr+=dcol){ + suba=in.SubMatrix(1,nrows,ctr,Min(ctr+dcol-1,ncols)); + int scolmax = suba.Ncols(); + + for (int n=1; n<=scolmax; n++) { + double cmean=colmeans(ctr + n - 1); + for (int m=1; m<=nrows; m++) { + suba(m,n)-=cmean; + } + } + + Res += suba*suba.t() / ncols; + } + } + else + Res = cov(in.t()); + return Res; + } //Matrix calccorr + +void convert_to_mat(volume4D<float>& in, volume<float>& mask, Matrix& out) +{ + out = in[0].vec(mask).t(); + in.deletevolume(0); + while(in.tsize()>0){ + out &= in[0].vec(mask).t(); + in.deletevolume(0); + } +} + +int do_work(int argc, char* argv[]) { + + + tic(); + Matrix MatrixData; + volume<float> Mean; + + if(xdim.value()==0 && ydim.value()==0) + { + volume4D<float> RawData; + volume<float> theMask; + toc(); + //read data + message("Reading data file " << (string)fnin.value() << " ... "); + read_volume4D(RawData,fnin.value()); + message(" done" << endl); + + Mean = meanvol(RawData); + toc(); + message("Reading mask file " << (string)fnmask.value() << " ... "); + read_volume(theMask,fnmask.value()); + + MatrixData = RawData.matrix(); + + memmsg("start"); + Matrix res; + convert_to_mat(RawData,theMask, res); + + memmsg(" Before reshape "); + + write_ascii_matrix("mat1", res); + write_ascii_matrix("mat2", MatrixData); + + + } + else{ + Matrix data = unifrnd(xdim.value(),ydim.value()); + outMsize("data", data); + tic(); calccorr(data,econ.value()); toc(); + + data = unifrnd(10,100); + outMsize("data", data); + tic(); calccorr(data,econ.value()); toc(); + + data = unifrnd(100,1000); + outMsize("data", data); + tic(); calccorr(data,econ.value()); toc(); + + data = unifrnd(100,10000); + outMsize("data", data); + tic(); calccorr(data,econ.value()); toc(); + + data = unifrnd(300,200000); + outMsize("data", data); + tic(); calccorr(data,econ.value()); toc(); + + data = unifrnd(500,20000); + outMsize("data", data); + tic(); calccorr(data,econ.value()); toc(); + + data = unifrnd(500,200000); + outMsize("data", data); + tic(); calccorr(data,econ.value()); toc(); + + + } + + + return 0; +} + +//////////////////////////////////////////////////////////////////////////// + + int main(int argc,char *argv[]){ + Tracer tr("main"); + OptionParser options(title, examples); + try{ + // must include all wanted options here (the order determines how + // the help message is printed) + + options.add(fnin); + options.add(fnmask); + options.add(help); + options.add(xdim); + options.add(ydim); + options.add(econ); + options.parse_command_line(argc, argv); + + // line below stops the program if the help was requested or + // a compulsory option was not set + if ( (help.value()) || (!options.check_compulsory_arguments(true)) ){ + options.usage(); + exit(EXIT_FAILURE); + }else{ + // Call the local functions + return do_work(argc,argv); + } + }catch(X_OptionError& e) { + options.usage(); + cerr << endl << e.what() << endl; + exit(EXIT_FAILURE); + }catch(std::exception &e) { + cerr << e.what() << endl; + } + } + -- GitLab