diff --git a/rubix.cc b/rubix.cc index c6a54bc76c2dd80d30347e742c4bb087aba03db2..33b92f802a0fb97df8587b249c6fb1714480f04f 100644 --- a/rubix.cc +++ b/rubix.cc @@ -212,6 +212,10 @@ void LRSamples::record(const LRvoxel& LRv, int vox, int samp){ if (m_rician) m_tauLRsamples(samp,vox)=LRv.get_tauLR(); + if (m_fsumPrior) + m_sumfsamples(samp,vox)=LRv.get_mean_fsum(); + if (m_dPrior) + m_meandsamples(samp,vox)=LRv.get_meand(); m_lik_energy(samp,vox)=LRv.get_likelihood_energy(); m_prior_energy(samp,vox)=LRv.get_prior_energy(); @@ -229,7 +233,11 @@ void LRSamples::finish_voxel(int vox){ m_mean_S0samples(vox)=m_S0samples.Column(vox).Sum()/m_nsamps; if (m_rician) m_mean_tausamples(vox)=m_tauLRsamples.Column(vox).Sum()/m_nsamps; - + if (m_fsumPrior) + m_mean_sumfsamples(vox)=m_sumfsamples.Column(vox).Sum()/m_nsamps; + if (m_dPrior) + m_mean_meandsamples(vox)=m_meandsamples.Column(vox).Sum()/m_nsamps; + for(int m=0; m<m_Nmodes; m++){ m_mean_ksamples[m](vox)=m_ksamples[m].Column(vox).Sum()/m_nsamps; @@ -281,21 +289,32 @@ void LRSamples::save(const volume<float>& mask){ Log& logger = LogSingleton::getInstance(); tmp.setmatrix(m_mean_S0samples,mask); tmp.setDisplayMaximumMinimum(tmp.max(),0); - save_volume(tmp[0],logger.appendDir("mean_S0LRsamples")); + save_volume(tmp[0],logger.appendDir("mean_S0_LRsamples")); - tmp.setmatrix(m_lik_energy,mask); - tmp.setDisplayMaximumMinimum(tmp.max(),0); - save_volume4D(tmp,logger.appendDir("En_Lik_samples")); + //tmp.setmatrix(m_lik_energy,mask); + //tmp.setDisplayMaximumMinimum(tmp.max(),0); + //save_volume4D(tmp,logger.appendDir("En_Lik_LRsamples")); - tmp.setmatrix(m_prior_energy,mask); - tmp.setDisplayMaximumMinimum(tmp.max(),0); - save_volume4D(tmp,logger.appendDir("En_Prior_samples")); + //tmp.setmatrix(m_prior_energy,mask); + //tmp.setDisplayMaximumMinimum(tmp.max(),0); + //save_volume4D(tmp,logger.appendDir("En_Prior_LRsamples")); if (m_rician){ tmp.setmatrix(m_mean_tausamples,mask); tmp.setDisplayMaximumMinimum(tmp.max(),0); - save_volume(tmp[0],logger.appendDir("mean_tauLRsamples")); + save_volume(tmp[0],logger.appendDir("mean_tau_LRsamples")); } + if (m_fsumPrior){ + tmp.setmatrix(m_mean_sumfsamples,mask); + tmp.setDisplayMaximumMinimum(1,0); + save_volume(tmp[0],logger.appendDir("mean_fsumPriorMode_LRsamples")); + } + if (m_dPrior){ + tmp.setmatrix(m_mean_meandsamples,mask); + tmp.setDisplayMaximumMinimum(tmp.max(),0); + save_volume(tmp[0],logger.appendDir("mean_dPriorMode_LRsamples")); + } + //Sort the output based on mean_invksamples vector<Matrix> sumk; @@ -371,7 +390,7 @@ void LRVoxelManager::initialise(){ ColumnVector pvmf,pvmth,pvmph,pvm2invk,pvm2th,pvm2ph,predicted_signal; //Initialise each HR voxel using the HR data - float sumd=0, sumd2=0; + float sumd=0, sumd2=0, sumf=0; for (int n=0; n<m_HRvoxnumber.Nrows(); n++){ if (opts.modelnum.value()==1){ //Model 1 @@ -394,7 +413,6 @@ void LRVoxelManager::initialise(){ pvmf = pvm.get_f(); pvmth = pvm.get_th(); pvmph = pvm.get_ph(); pvmd_std=pvm.get_d_std(); pvmS0 =fabs(pvm.get_s0()); pvmd = pvm.get_d(); predicted_signal=pvm.get_prediction(); - OUT(pvmf); if(pvmd<0 || pvmd>0.01) pvmd=2e-3; if(pvmd_std<0 || pvmd_std>0.01) pvmd_std=pvmd/10; @@ -413,6 +431,7 @@ void LRVoxelManager::initialise(){ } sumd+=pvmd; sumd2+=pvmd*pvmd; + sumf+=pvmf.Sum(); } sumd/=m_HRvoxnumber.Nrows(); @@ -420,6 +439,8 @@ void LRVoxelManager::initialise(){ m_LRv.set_stdevd(sumd/100);//sqrt((sumd2-m_HRvoxnumber.Nrows()*sumd*sumd)/(m_HRvoxnumber.Nrows()-1.0))); m_LRv.set_mean_fsum(0.6); + sumf/=m_HRvoxnumber.Nrows(); + //m_LRv.set_mean_fsum(sumf); //does not make a big difference compared to initialising with a constant sumf=0.6 m_LRv.set_stdev_fsum(0.01); //Initialise the orientation prior parameters using the LR data @@ -601,7 +622,7 @@ int main(int argc, char *argv[]) float zratio=maskLR.zdim()/maskHR.zdim(); HRSamples HRsampl(datamHR.Ncols(), opts.njumps.value(), opts.sampleevery.value(), opts.nfibres.value(), opts.rician.value(), opts.modelnum.value()); - LRSamples LRsampl(datamLR.Ncols(), opts.njumps.value(), opts.sampleevery.value(), opts.nmodes.value(), opts.rician.value()); + LRSamples LRsampl(datamLR.Ncols(), opts.njumps.value(), opts.sampleevery.value(), opts.nmodes.value(), opts.rician.value(),opts.fsumPrior.value(),opts.dPrior.value()); //dHR.push_back(datamHR.Column(1)); dHR.push_back(datamHR.Column(2)); //dHR.push_back(datamHR.Column(3)); dHR.push_back(datamHR.Column(4)); diff --git a/rubix.h b/rubix.h index a97af67ed2a98a9b7ac1802acf162fd654d48433..28f378f60ceb7d0f5c670fdc5ec277eb99db22f0 100644 --- a/rubix.h +++ b/rubix.h @@ -111,6 +111,8 @@ namespace RUBIX{ vector<Matrix> m_ksamples; Matrix m_S0samples; Matrix m_tauLRsamples; + Matrix m_sumfsamples; + Matrix m_meandsamples; Matrix m_lik_energy; Matrix m_prior_energy; @@ -119,17 +121,21 @@ namespace RUBIX{ vector<RowVector> m_mean_ksamples; RowVector m_mean_S0samples; RowVector m_mean_tausamples; + RowVector m_mean_sumfsamples; + RowVector m_mean_meandsamples; int m_nsamps; const int m_njumps; const int m_sample_every; const int m_Nmodes; const bool m_rician; + const bool m_fsumPrior; + const bool m_dPrior; //const string m_logdir; public: - LRSamples(int nvoxels, const int njumps, const int sample_every, const int Nmodes, const bool rician=false): - m_njumps(njumps),m_sample_every(sample_every), m_Nmodes(Nmodes), m_rician(rician){ + LRSamples(int nvoxels, const int njumps, const int sample_every, const int Nmodes, const bool rician=false, const bool fsumPrior=false, const bool dPrior=false): + m_njumps(njumps),m_sample_every(sample_every), m_Nmodes(Nmodes), m_rician(rician), m_fsumPrior(fsumPrior), m_dPrior(dPrior){ int count=0; int nsamples=0; @@ -150,6 +156,16 @@ namespace RUBIX{ m_tauLRsamples.ReSize(nsamples,nvoxels); m_tauLRsamples=0; m_mean_tausamples.ReSize(nvoxels); m_mean_tausamples=0; } + if (m_fsumPrior){ + m_sumfsamples.ReSize(nsamples,nvoxels); m_sumfsamples=0; + m_mean_sumfsamples.ReSize(nvoxels); m_mean_sumfsamples=0; + } + + if (m_dPrior){ + m_meandsamples.ReSize(nsamples,nvoxels); m_meandsamples=0; + m_mean_meandsamples.ReSize(nvoxels); m_mean_meandsamples=0; + } + Matrix tmpvecs(3,nvoxels); tmpvecs=0; for(int f=0; f<m_Nmodes; f++){ @@ -193,7 +209,7 @@ namespace RUBIX{ const ColumnVector& dataLR,const vector<ColumnVector>& dataHR, const Matrix& bvecsLR, const Matrix& bvalsLR, const Matrix& bvecsHR, const Matrix& bvalsHR, const ColumnVector& HRweights): opts(rubixOptions::getInstance()), m_HRsamples(Hsamples), m_LRsamples(Lsamples), m_LRvoxnumber(LRvoxnum),m_HRvoxnumber(HRvoxnum), - m_LRv(bvecsHR, bvalsHR, bvecsLR, bvalsLR, dataLR, dataHR, opts.nfibres.value(), opts.nmodes.value(), HRweights, opts.modelnum.value(), opts.fudge.value(),opts.all_ard.value(), opts.no_ard.value(),opts.kappa_ard.value(), opts.fsumPrior.value(), opts. dPrior.value(), opts.rician.value()), + m_LRv(bvecsHR, bvalsHR, bvecsLR, bvalsLR, dataLR, dataHR, opts.nfibres.value(), opts.nmodes.value(), HRweights, opts.modelnum.value(), opts.fudge.value(),opts.all_ard.value(), opts.no_ard.value(),opts.kappa_ard.value(), opts.fsumPrior.value(), opts.dPrior.value(), opts.rician.value()), m_dataLR(dataLR), m_dataHR(dataHR),m_bvecsLR(bvecsLR), m_bvalsLR(bvalsLR), m_bvecsHR(bvecsHR), m_bvalsHR(bvalsHR), m_HRweights(HRweights) { } ~LRVoxelManager() { }