Skip to content
Snippets Groups Projects
fsl_dualreg.cc 5.88 KiB
Newer Older
/*  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;
	  } 
	}