diff --git a/dtifit.cc b/dtifit.cc index 0e73c2a90567af73d34ebc1bf4c7195d333a703f..24bcd81d6a7ff7acf269ab6f14dc9eeda46e752e 100644 --- a/dtifit.cc +++ b/dtifit.cc @@ -2,10 +2,6 @@ /* CCOPYRIGHT */ -#ifndef EXPOSE_TREACHEROUS -#define EXPOSE_TREACHEROUS -#endif - #include <iostream> #include <cmath> #include "miscmaths/miscmaths.h" @@ -243,7 +239,7 @@ void tensorfit(DiagonalMatrix& Dd,ColumnVector& evec1,ColumnVector& evec2,Column //Correct bvals/bvecs accounting for Gradient Nonlinearities //ColumnVector grad_nonlin has 9 entries, corresponding to the 3 components of each of the x,y and z gradient deviation -void correct_bvals_bvecs(const Matrix& bvals,const Matrix& bvecs, const ColumnVector& grad_nonlin, const Matrix& Qform, const Matrix& Qform_inv, Matrix& bvals_c, Matrix& bvecs_c){ +void correct_bvals_bvecs(const Matrix& bvals,const Matrix& bvecs, const ColumnVector& grad_nonlin, Matrix& bvals_c, Matrix& bvecs_c){ bvals_c=bvals; bvecs_c=bvecs; Matrix L(3,3); //gradient coil tensor float mag; @@ -251,45 +247,21 @@ void correct_bvals_bvecs(const Matrix& bvals,const Matrix& bvecs, const ColumnVe L(2,1)=grad_nonlin(2); L(2,2)=grad_nonlin(5); L(2,3)=grad_nonlin(8); L(3,1)=grad_nonlin(3); L(3,2)=grad_nonlin(6); L(3,3)=grad_nonlin(9); - IdentityMatrix Id(3); + IdentityMatrix Id(3); + //Correct each gradient for (int l=1; l<=bvals.Ncols(); l++){ if (bvals(1,l)>0){ //do not correct b0s - //Rotate bvecs to scanner's coordinate system - ColumnVector bvec_tmp(3); - bvec_tmp=Qform*bvecs.Column(l); - bvec_tmp(1)=-bvec_tmp(1); //Sign-flip X coordinate - - //Correct for grad-nonlin in scanner's coordinate system - bvecs_c.Column(l)=(Id+L)*bvec_tmp;//bvecs.Column(l); + bvecs_c.Column(l)=(Id+L)*bvecs.Column(l); mag=sqrt(bvecs_c(1,l)*bvecs_c(1,l)+bvecs_c(2,l)*bvecs_c(2,l)+bvecs_c(3,l)*bvecs_c(3,l)); if (mag!=0) bvecs_c.Column(l)=bvecs_c.Column(l)/mag; - bvals_c(1,l)=mag*mag*bvals(1,l); - bvec_tmp=bvecs_c.Column(l); - - //Rotate corrected bvecs back to voxel coordinate system - bvec_tmp(1)=-bvec_tmp(1); //Sign-flip X coordinate - bvecs_c.Column(l)=Qform_inv*bvec_tmp; + bvals_c(1,l)=mag*mag*bvals(1,l); //mag^2 as b propto |G|^2 } } } -//Get the scale-free Qform matrix to rotate bvecs back to scanner's coordinate system -//After applying this matrix, make sure to sign flip the x coordinate of the resulted bvecs! -//If you apply the inverse of the matrix, sign flip the x coordinate of the input bvecs -void Return_Qform(const Matrix& qform_mat, Matrix& QMat, const float xdim, const float ydim, const float zdim){ - Matrix QMat_tmp; DiagonalMatrix Scale(3); - - QMat_tmp=qform_mat.SubMatrix(1,3,1,3); - Scale(1)=xdim; Scale(2)=ydim; Scale(3)=zdim; - QMat_tmp=Scale.i()*QMat_tmp; - QMat=QMat_tmp; -} - - - int main(int argc, char** argv) { //parse command line @@ -338,13 +310,9 @@ int main(int argc, char** argv) if( data.tsize() != b.Ncols() ){cerr << "Error: data and bvals/bvecs do not contain the same number of entries" << endl;return(-1);} //Read Gradient Non_linearity Maps if provided - volume4D<float> grad, bvalmap; Matrix Qform, Qform_inv; - if (opts.grad_file.set()){ + volume4D<float> grad, bvalmap; + if (opts.grad_file.set()) read_volume4D(grad,opts.grad_file.value()); - //Get the scale-free Qform matrix to rotate bvecs back to scanner's coordinate system - Return_Qform(data.qform_mat(), Qform, data.xdim(), data.ydim(), data.zdim()); - Qform_inv=Qform.i(); - } int minx=opts.littlebit.value() ? opts.x_min.value():0; int maxx=opts.littlebit.value() ? opts.x_max.value():mask.xsize(); @@ -436,7 +404,7 @@ int main(int argc, char** argv) ColumnVector gradm(9); for (int t=0; t<9; t++) gradm(t+1)=grad(i,j,k,t); - correct_bvals_bvecs(b,r, gradm,Qform,Qform_inv,bvals_c,bvecs_c); + correct_bvals_bvecs(b,r, gradm,bvals_c,bvecs_c); if (opts.save_bvals.value()){ for (int t=0; t<data.tsize(); t++) bvalmap(i-minx,j-miny,k-minz,t)=bvals_c(1,t+1); diff --git a/xfibres.cc b/xfibres.cc index 3bdc9fcb71cc17e35f6c849b521835dd2bfe5abd..f3e802b3c51fa4f797754901e7ad6673b7243656 100644 --- a/xfibres.cc +++ b/xfibres.cc @@ -6,10 +6,6 @@ /* CCOPYRIGHT */ -#ifndef EXPOSE_TREACHEROUS -#define EXPOSE_TREACHEROUS -#endif - #include <iostream> #include <fstream> #include <iomanip> @@ -515,8 +511,8 @@ public: if(!opts.localinit.value()) if(!m_samples.neighbour_initialise(m_voxelnumber,m_multifibre)) initialise_tensor(Amat); - else - initialise_tensor(Amat); + else + initialise_tensor(Amat); } } m_multifibre.initialise_energies(); @@ -764,23 +760,10 @@ public: }; -//Get the scale-free Qform matrix to rotate bvecs back to scanner's coordinate system -//After applying this matrix, make sure to sign flip the x coordinate of the resulted bvecs! -//If you apply the inverse of the matrix, sign flip the x coordinate of the input bvecs -void Return_Qform(const Matrix& qform_mat, Matrix& QMat, const float xdim, const float ydim, const float zdim){ - Matrix QMat_tmp; DiagonalMatrix Scale(3); - - QMat_tmp=qform_mat.SubMatrix(1,3,1,3); - Scale(1)=xdim; Scale(2)=ydim; Scale(3)=zdim; - QMat_tmp=Scale.i()*QMat_tmp; - QMat=QMat_tmp; -} - - //Correct bvals/bvecs accounting for Gradient Nonlinearities //ColumnVector grad_nonlin has 9 entries, corresponding to the 3 components of each of the x,y and z gradient deviation -void correct_bvals_bvecs(const Matrix& bvals,const Matrix& bvecs, const ColumnVector& grad_nonlin, const Matrix& Qform, const Matrix& Qform_inv, Matrix& bvals_c, Matrix& bvecs_c){ +void correct_bvals_bvecs(const Matrix& bvals,const Matrix& bvecs, const ColumnVector& grad_nonlin, Matrix& bvals_c, Matrix& bvecs_c){ bvals_c=bvals; bvecs_c=bvecs; Matrix L(3,3); //gradient coil tensor float mag; @@ -788,26 +771,16 @@ void correct_bvals_bvecs(const Matrix& bvals,const Matrix& bvecs, const ColumnVe L(2,1)=grad_nonlin(2); L(2,2)=grad_nonlin(5); L(2,3)=grad_nonlin(8); L(3,1)=grad_nonlin(3); L(3,2)=grad_nonlin(6); L(3,3)=grad_nonlin(9); - IdentityMatrix Id(3); + IdentityMatrix Id(3); + //Correct each gradient for (int l=1; l<=bvals.Ncols(); l++){ if (bvals(1,l)>0){ //do not correct b0s - //Rotate bvecs to scanner's coordinate system - ColumnVector bvec_tmp(3); - bvec_tmp=Qform*bvecs.Column(l); - bvec_tmp(1)=-bvec_tmp(1); //Sign-flip X coordinate - - //Correct for grad-nonlin in scanner's coordinate system - bvecs_c.Column(l)=(Id+L)*bvec_tmp;//bvecs.Column(l); + bvecs_c.Column(l)=(Id+L)*bvecs.Column(l); mag=sqrt(bvecs_c(1,l)*bvecs_c(1,l)+bvecs_c(2,l)*bvecs_c(2,l)+bvecs_c(3,l)*bvecs_c(3,l)); if (mag!=0) bvecs_c.Column(l)=bvecs_c.Column(l)/mag; - bvals_c(1,l)=mag*mag*bvals(1,l); - bvec_tmp=bvecs_c.Column(l); - - //Rotate corrected bvecs back to voxel coordinate system - bvec_tmp(1)=-bvec_tmp(1); //Sign-flip X coordinate - bvecs_c.Column(l)=Qform_inv*bvec_tmp; + bvals_c(1,l)=mag*mag*bvals(1,l); //mag^2 as b propto |G|^2 } } } @@ -852,13 +825,10 @@ int main(int argc, char *argv[]) Samples samples(vol2matrixkey,matrix2volkey,datam.Ncols(),datam.Nrows()); //Read Gradient Non_linearity Maps if provided - volume4D<float> grad; Matrix gradm, Qform, Qform_inv; + volume4D<float> grad; Matrix gradm; if (opts.grad_file.set()){ read_volume4D(grad,opts.grad_file.value()); gradm=grad.matrix(mask); - //Get the scale-free Qform matrix to rotate bvecs back to scanner's coordinate system - Return_Qform(data.qform_mat(), Qform, data.xdim(), data.ydim(), data.zdim()); - Qform_inv=Qform.i(); } Matrix Amat; ColumnVector alpha, beta; @@ -879,7 +849,7 @@ int main(int argc, char *argv[]) Matrix Amat_c, bvals_c, bvecs_c; ColumnVector alpha_c, beta_c; - correct_bvals_bvecs(bvals,bvecs, gradm.Column(vox),Qform,Qform_inv,bvals_c,bvecs_c); //correct for gradient nonlinearities + correct_bvals_bvecs(bvals,bvecs, gradm.Column(vox),bvals_c,bvecs_c); //correct for gradient nonlinearities Amat_c=form_Amat(bvecs_c,bvals_c); cart2sph(bvecs_c,alpha_c,beta_c); xfibresVoxelManager vm(datam.Column(vox),alpha_c,beta_c,bvecs_c,bvals_c,samples,vox);