Newer
Older
/* MELODIC - Multivariate exploratory linear optimized decomposition into

Paul McCarthy
committed
independent components
Christian F. Beckmann, FMRIB Analysis Group
Copyright (C) 1999-2013 University of Oxford */
#ifndef __MELODICDATA_h
#define __MELODICDATA_h

Paul McCarthy
committed
#include <random>

Paul McCarthy
committed
#include "armawrap/newmat.h"
#include "newimage/newimageall.h"
#include "utils/log.h"

Paul McCarthy
committed
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public:
//constructor
MelodicData(MelodicOptions &popts, Utilities::Log &plogger):
opts(popts),logger(plogger)
{
after_mm = false;
Resels = 0;
}
void save();
cifti::CiftiFile inputCifti;
NEWMAT::ReturnMatrix process_file(std::string fname, int numfiles = 1);
inline void save4D(NEWMAT::Matrix what, std::string fname){
if ( !opts.readCIFTI.value() ) //Process NIFTI
{
NEWIMAGE::volume4D<float> tempVol;
tempVol.setmatrix(what,Mask);
NEWIMAGE::save_volume4D(tempVol,logger.appendDir(fname));
message(" " << logger.appendDir(fname) << std::endl);
} else { //Process CIFTI save ICs as float
cifti::CiftiFile outputFile;
outputFile.setWritingFile(logger.appendDir(fname)+".nii");//sets up on-disk writing with default writing version
cifti::CiftiXML xml(inputCifti.getCiftiXML());
cifti::CiftiScalarsMap scalarsMap;
std::vector<char> foo = xml.writeXMLToVector();
scalarsMap.setLength(what.Nrows());
xml.setMap(0, scalarsMap);
outputFile.setCiftiXML(xml,false);
std::vector<float> scratchRow(what.Nrows());//read/write a row at a time
for (int64_t row=0;row<what.Ncols();row++) {
for (int64_t col=0;col<what.Nrows();col++)
scratchRow[col]=what(col+1,row+1);
outputFile.setRow(scratchRow.data(),row);
}

Paul McCarthy
committed
}

Paul McCarthy
committed
inline void saveascii(NEWMAT::Matrix what, std::string fname){
MISCMATHS::write_ascii_matrix(logger.appendDir(fname),what);
message(" " << logger.appendDir(fname) << std::endl);
}

Paul McCarthy
committed
inline void savebinary(NEWMAT::Matrix what, std::string fname){
MISCMATHS::write_binary_matrix(what,logger.appendDir(fname));
message(" " << logger.appendDir(fname) << std::endl);
}

Paul McCarthy
committed
int remove_components();

Paul McCarthy
committed
void setup_classic();
void setup_migp();
void setup();

Paul McCarthy
committed
void status(const std::string &txt);

Paul McCarthy
committed
inline NEWMAT::Matrix& get_pcaE() {return pcaE;}
inline void set_pcaE(NEWMAT::Matrix& Arg) {pcaE = Arg;}

Paul McCarthy
committed
inline NEWMAT::RowVector& get_pcaD() {return pcaD;}
inline void set_pcaD(NEWMAT::RowVector& Arg) {pcaD = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_data() {return Data;}
inline void set_data(NEWMAT::Matrix& Arg) {Data = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_IC() {return IC;}
inline void set_IC(NEWMAT::Matrix& Arg) {IC = Arg;}
inline void set_IC(int ctr, NEWMAT::Matrix& Arg) {IC.Row(ctr) = Arg;}

Paul McCarthy
committed
inline std::vector<NEWMAT::Matrix>& get_Smodes() {return Smodes;}
inline NEWMAT::Matrix& get_Smodes(int what) {return Smodes.at(what);}
inline void add_Smodes(NEWMAT::Matrix& Arg) {Smodes.push_back(Arg);}
inline void save_Smodes(){
if(Smodes.size()>0){
NEWMAT::Matrix tmp = Smodes.at(0);
for(unsigned int ctr = 1; ctr < Smodes.size(); ctr++)
tmp |= Smodes.at(ctr);
saveascii(tmp,opts.outputfname.value() + "_Smodes");

Paul McCarthy
committed
}
inline std::vector<NEWMAT::Matrix>& get_Tmodes() {return Tmodes;}
inline NEWMAT::Matrix& get_Tmodes(int what) {return Tmodes.at(what);}
inline void add_Tmodes(NEWMAT::Matrix& Arg) {Tmodes.push_back(Arg);}
inline void save_Tmodes(){
if(Tmodes.size()>0){
NEWMAT::Matrix tmp = Tmodes.at(0);
outMsize("tmp",tmp);
for(unsigned int ctr = 1; ctr < Tmodes.size(); ctr++){
outMsize("Tmodes ",Tmodes.at(ctr));
tmp |= Tmodes.at(ctr);
}
saveascii(tmp,opts.outputfname.value() + "_Tmodes");

Paul McCarthy
committed
}

Paul McCarthy
committed
void set_TSmode_depr();
void set_TSmode();

Paul McCarthy
committed
inline NEWMAT::Matrix& get_param() {return param;}
inline void set_param(NEWMAT::Matrix& Arg) {param = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_paramS() {return paramS;}
inline void set_paramS(NEWMAT::Matrix& Arg) {paramS = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_white() {return whiteMatrix;}
inline void set_white(NEWMAT::Matrix& Arg) {whiteMatrix = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_dewhite() {return dewhiteMatrix;}
inline void set_dewhite(NEWMAT::Matrix& Arg) {dewhiteMatrix = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_meanC() {return meanC;}
inline NEWMAT::Matrix& get_meanR() {return meanR;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_stdDevi() {return stdDevi;}
inline void set_stdDevi(NEWMAT::Matrix& Arg) {stdDevi = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_mix() {return mixMatrix;}

Paul McCarthy
committed
inline void set_mix(NEWMAT::Matrix& Arg) {
mixMatrix = Arg;
if (Tmodes.size() < 1)
for (int ctr = 1; ctr <= Arg.Ncols(); ctr++){
NEWMAT::Matrix tmp = Arg.Column(ctr);
add_Tmodes(tmp);
}
}

Paul McCarthy
committed
NEWMAT::Matrix expand_mix();
NEWMAT::Matrix expand_dimred(const NEWMAT::Matrix& Mat);
NEWMAT::Matrix reduce_dimred(const NEWMAT::Matrix& Mat);

Paul McCarthy
committed
inline NEWMAT::Matrix& get_fmix() {return mixFFT;}
inline void set_fmix(NEWMAT::Matrix& Arg) {mixFFT = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_unmix() {return unmixMatrix;}
inline void set_unmix(NEWMAT::Matrix& Arg) {unmixMatrix = Arg;}

Paul McCarthy
committed
inline NEWIMAGE::volume<float>& get_mask() {return Mask;}
inline void set_mask(NEWIMAGE::volume<float>& Arg) {Mask = Arg;}

Paul McCarthy
committed
inline NEWIMAGE::volume<float>& get_mean() {return Mean;}
inline void set_mean(NEWIMAGE::volume<float>& Arg) {Mean = Arg;}

Paul McCarthy
committed
inline NEWIMAGE::volume<float>& get_bg() {
if(opts.bgimage.value()>"")
return background;
else
return Mean;
}
inline void set_bg(NEWIMAGE::volume<float>& Arg) {background = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_Data() {return Data;}
inline void set_Data(NEWMAT::Matrix& Arg) {Data = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_RXweight() {return RXweight;}
inline void set_RXweight(NEWMAT::Matrix& Arg) {RXweight = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_ICstats() {return ICstats;}
inline void set_ICstats(NEWMAT::Matrix& Arg) {ICstats = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_EVP() {return EVP;}
inline void set_EVP(NEWMAT::Matrix& Arg) {if(EVP.Storage()==0)
EVP = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_EV() {return EV;}
inline void set_EV(NEWMAT::Matrix& Arg) {if(EV.Storage()==0)
EV = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_PPCA() {return PPCA;}
inline void set_PPCA(NEWMAT::Matrix& Arg) {if(PPCA.Storage()==0)
PPCA = Arg;}

Paul McCarthy
committed
inline NEWMAT::Matrix& get_stdNoisei() {return stdNoisei;}
inline void set_stdNoisei(NEWMAT::Matrix& Arg) {stdNoisei = Arg;}

Paul McCarthy
committed
inline int data_dim() {return Data.Nrows();}
inline int data_samples() {return Data.Ncols();}

Paul McCarthy
committed
inline float get_resels() {return Resels;}
inline void set_resels(float& Arg) {Resels = Arg;}

Paul McCarthy
committed
inline int get_numfiles() {return numfiles;}

Paul McCarthy
committed
inline void set_after_mm(bool val) {after_mm = val;}

Paul McCarthy
committed
inline void flipres(int num){
IC.Row(num) = -IC.Row(num);
mixMatrix.Column(num) = -mixMatrix.Column(num);
mixFFT=calc_FFT(mixMatrix);
unmixMatrix = pinv(mixMatrix);
if(ICstats.Storage()>0&&ICstats.Ncols()>3){
double tmp;
tmp = ICstats(num,3);
ICstats(num,3) = -1.0*ICstats(num,4);
ICstats(num,4) = -1.0*tmp;

Paul McCarthy
committed
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
}
void sort();
void dual_regression();
std::vector<NEWMAT::Matrix> DWM, WM;
basicGLM glmT, glmS;
NEWMAT::Matrix Tdes, Tcon, TconF, Sdes, Scon, SconF, param, paramS;
NEWMAT::RowVector explained_var;
private:
MelodicOptions &opts;
Utilities::Log &logger;
NEWMAT::Matrix pcaE;
NEWMAT::RowVector pcaD;
NEWMAT::Matrix whiteMatrix;
NEWMAT::Matrix dewhiteMatrix;
NEWMAT::Matrix meanC;
NEWMAT::Matrix meanR;
NEWMAT::Matrix stdDev;
NEWMAT::Matrix stdDevi;
NEWMAT::Matrix RXweight;
NEWMAT::Matrix mixMatrix;
NEWMAT::Matrix unmixMatrix;
NEWMAT::Matrix mixFFT;
NEWMAT::Matrix IC;
NEWMAT::Matrix ICstats;
std::vector<NEWMAT::Matrix> Tmodes;
std::vector<NEWMAT::Matrix> Smodes;
NEWMAT::Matrix EVP;
NEWMAT::Matrix EV;
NEWMAT::Matrix stdNoisei;
NEWIMAGE::volume<float> Mask;
NEWIMAGE::volume<float> Mean;
NEWIMAGE::volume<float> background;
NEWMAT::Matrix insta_mask;
NEWMAT::Matrix Data;
NEWMAT::Matrix PPCA;
NEWMAT::Matrix jointCC;

Paul McCarthy
committed
/*
* Random number generator (seeded/used
* alongside rand/srand for some operations).
*/
std::mt19937_64 rng;

Paul McCarthy
committed
bool after_mm;
float Resels;
int numfiles;
char Mean_fname[1000];
void setup_misc();
void create_mask(NEWIMAGE::volume<float>& theMask);
void create_RXweight();
void est_smoothness();
unsigned long standardise(NEWIMAGE::volume<float>& mask,
NEWIMAGE::volume4D<float>& R);
float est_resels(NEWIMAGE::volume4D<float> R, NEWIMAGE::volume<float> mask);