-
Notifications
You must be signed in to change notification settings - Fork 228
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bval/bvec files for Bruker enhanced DICOMs #265
Comments
The Matlab script looks handy. The code suggests that Bruker Gradient matrix is reported with respect to the Freq (X), Phase (Y), Slice (Z) just like GE. In contrast, Siemens and Philips report gradient directions with respect to the scanner bore. Can you please confirm this, otherwise your script will provide incorrect results when slice angulations are applied. Also, since Bruker systems are often used in animals, I think we would want to make sure we have a generalized solution that works for axial, coronal and sagittal acquisitions. For humans, DWI scans are almost always axial as the S->I distance is shorter than full brain coronal A->P slices. This is not the case in rodents. The wiki links to a "dedicated document", e.g. |
I'll ask around for a confirmation regarding the reference frame. I think your second link to the document is broken. |
Here is a link to a Dropbox zip archive that uses the Matlab code you provided as well as a C port by Connelly Barnes of the public domain Java Matrix library JAMA. Note that the sign of bvec solutions differs for some of the vectors. (i=input matrix, e=eigenmatrix, v=3rd column of e). For example for the last vector in your 20 direction file: C For computing preferential diffusion direction gradients with the precisely opposite polarity will sensitize the same orthogonal plane. However, I worry that Eddy uses this. I am not sure what the correct result is for the symmetric matrix provided by Bruker. If you can resolve these tricky questions, the C code should be easy to plug in to dcm2niix (I added the function to the existing nifti1_io_core.cpp). Until then, I am afraid this is as far as I can go. Perhaps the engineers at Bruker can help. |
Fixed link |
According to the documentation, the rows and columns of the matrix are the X (right to left), Y (anterior to posterior) and Z (foot to head) patient-relative orthogonal axes. |
Just to clarify the situation with my C code and your Matlab code. You are suggesting that we compute C solution: A=[78.9072 269.576 -25.1249; 269.576 269.576 920.972; -25.1249 920.972 -85.8359]; Matlab: Test C solution
V =
D =
ans =
ans =
Matlab: Generate and Test Matlab solution
V =
D =
ans =
ans =
|
function bmat2bvec
%converts diffusion bmatrix to bvector, converts bvector+bvalue to bmatrix
% Rationale:
% Bruker only provides BMatrix+BVal, FSL expects BVec
% https://github.com/rordenlab/dcm2niix/issues/265
% Issue:
% The polarity of the BVec can not be extracted from the BMatrix
% A vector and a flipped vector are the same eigen vector with different eigen value
% "The choice of sign is arbitrary"
% http://nipy.org/dipy/theory/bmatrix.html
% "Because the solution is a square root, the sign of the returned vector is arbitrary. We set the vector to have a positive x component by convention."
% https://raw.githubusercontent.com/matthew-brett/nibabel/master/nibabel/nicom/dwiparams.py
% For FA/Diffusion the polarity of the gradient does not matter
% However, it DOES matter for FSL's eddy
% https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/eddy#eddy_--_a_tool_for_correcting_eddy_currents_and_movements_in_diffusion_data
% Since the BMatrix is underspecified for estimating BVec polarity,
% we follow the convention of making the X vector positive
% Eddy will see this as a half-shell acquisition
% This script demonstrates the problem in two ways:
% 1. The estimated bvec is often 180-degrees different from actual bvec
% 2. The estimated bmat if identical for a flipped or non-flipped bvec
%
%The sample data comes from Siemens XA10 which saves both BVec (0018,9089) and BMatrix
% (0018,9089) FD 0.70429527759552002\0\-0.70990711450576782 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 250 # 8, 1 DiffusionBValue
% (0018,9602) FD 125 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 0 # 8, 1 DiffusionBValueXY
% (0018,9604) FD -126 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 0 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 0 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 127 # 8, 1 DiffusionBValueZZ
bval = 250;
bvec = [0.70429527759552002, 0, -0.70990711450576782];
bmats = [125,0,-126,0,0,127];
testBMat(bmats, bvec, bval);
% (0018,9089) FD -0.70429527759552002\0\-0.70990711450576782 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 250 # 8, 1 DiffusionBValue
% (0018,9602) FD 125 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 0 # 8, 1 DiffusionBValueXY
% (0018,9604) FD 126 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 0 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 0 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 127 # 8, 1 DiffusionBValueZZ
bval = 250;
bvec = [-0.70429527759552002, 0, -0.70990711450576782];
bmats = [125,0,126,0,0,127];
testBMat(bmats, bvec, bval);
% (0018,9089) FD 0\-0.70429527759552002\-0.70990711450576782 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 250 # 8, 1 DiffusionBValue
% (0018,9602) FD 0 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 0 # 8, 1 DiffusionBValueXY
% (0018,9604) FD 0 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 125 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 126 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 127 # 8, 1 DiffusionBValueZZ
bval = 250;
bvec = [0, -0.70429527759552002, -0.70990711450576782];
bmats = [0,0,0,125,126,127];
testBMat(bmats, bvec, bval);
% (0018,9089) FD 0\-0.70995223522186279\0.70424985885620117 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 250 # 8, 1 DiffusionBValue
% (0018,9602) FD 0 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 0 # 8, 1 DiffusionBValueXY
% (0018,9604) FD 0 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 125 # 8, 1 DiffusionBValueYY
% (0018,9606) FD -124 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 123 # 8, 1 DiffusionBValueZZ
bval = 250;
bvec = [0, -0.70995223522186279, 0.70424985885620117];
bmats = [0,0,0,125,-124,123];
testBMat(bmats, bvec, bval);
% (0018,9089) FD 0.7070954442024231\-0.70709550380706787\-0.0056565827690064907 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 250 # 8, 1 DiffusionBValue
% (0018,9602) FD 125 # 8, 1 DiffusionBValueXX
% (0018,9603) FD -125 # 8, 1 DiffusionBValueXY
% (0018,9604) FD -1 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 125 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 1 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 0 # 8, 1 DiffusionBValueZZ
bval = 250;
bvec = [0.7070954442024231, -0.70709550380706787, -0.0056565827690064907];
bmats = [125,-125,-1,125,1,0];
testBMat(bmats, bvec, bval);
% (0018,9089) FD -0.7070954442024231\-0.70709550380706787\-0.0056565827690064907 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 250 # 8, 1 DiffusionBValue
% (0018,9602) FD 125 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 125 # 8, 1 DiffusionBValueXY
% (0018,9604) FD 1 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 125 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 1 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 0 # 8, 1 DiffusionBValueZZ
bval = 250;
bvec = [-0.7070954442024231, -0.70709550380706787, -0.0056565827690064907];
bmats = [125,125,1,125,1,0];
testBMat(bmats, bvec, bval);
% (0018,9089) FD 0.70587193965911865\0\-0.7083393931388855 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 2000 # 8, 1 DiffusionBValue
% (0018,9602) FD 1000 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 0 # 8, 1 DiffusionBValueXY
% (0018,9604) FD -1003 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 0 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 0 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 1007 # 8, 1 DiffusionBValueZZ
bval = 2000;
bvec = [0.70587193965911865, 0, -0.7083393931388855];
bmats = [1000,0,-1003,0,0,1007];
testBMat(bmats, bvec, bval);
% (0018,9089) FD -0.70587193965911865\0\-0.7083393931388855 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 2000 # 8, 1 DiffusionBValue
% (0018,9602) FD 1000 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 0 # 8, 1 DiffusionBValueXY
% (0018,9604) FD 1003 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 0 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 0 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 1007 # 8, 1 DiffusionBValueZZ
bval = 2000;
bvec = [-0.70587193965911865, 0, -0.7083393931388855];
bmats = [1000,0,1003,0,0,1007];
testBMat(bmats, bvec, bval);
% (0018,9089) FD 0\-0.70587193965911865\-0.7083393931388855 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 2000 # 8, 1 DiffusionBValue
% (0018,9602) FD 0 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 0 # 8, 1 DiffusionBValueXY
% (0018,9604) FD 0 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 1000 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 1003 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 1007 # 8, 1 DiffusionBValueZZ
bval = 2000;
bvec = [0, -0.70587193965911865, -0.7083393931388855];
bmats = [0,0,0,1000,1003,1007];
testBMat(bmats, bvec, bval);
% (0018,9089) FD 0\-0.70834684371948242\0.70586460828781128 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 2000 # 8, 1 DiffusionBValue
% (0018,9602) FD 0 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 0 # 8, 1 DiffusionBValueXY
% (0018,9604) FD 0 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 1000 # 8, 1 DiffusionBValueYY
% (0018,9606) FD -997 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 993 # 8, 1 DiffusionBValueZZ
bval = 2000;
bvec = [0, -0.70834684371948242, 0.70586460828781128];
bmats = [0,0,0,1000,-997,993];
testBMat(bmats, bvec, bval);
% (0018,9089) FD 0.70710510015487671\-0.70710533857345581\-0.0021213062573224306 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 2000 # 8, 1 DiffusionBValue
% (0018,9602) FD 1000 # 8, 1 DiffusionBValueXX
% (0018,9603) FD -1000 # 8, 1 DiffusionBValueXY
% (0018,9604) FD -3 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 1000 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 3 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 0 # 8, 1 DiffusionBValueZZ
bval = 2000;
bvec = [0.70710510015487671, -0.70710533857345581, -0.0021213062573224306];
bmats = [1000,-1000,-3,1000,3,0];
testBMat(bmats, bvec, bval);
% (0018,9089) FD -0.70710510015487671\-0.70710533857345581\-0.0021213062573224306 # 24, 3 DiffusionGradientOrientation
% (0018,9087) FD 2000 # 8, 1 DiffusionBValue
% (0018,9602) FD 1000 # 8, 1 DiffusionBValueXX
% (0018,9603) FD 1000 # 8, 1 DiffusionBValueXY
% (0018,9604) FD 3 # 8, 1 DiffusionBValueXZ
% (0018,9605) FD 1000 # 8, 1 DiffusionBValueYY
% (0018,9606) FD 3 # 8, 1 DiffusionBValueYZ
% (0018,9607) FD 0 # 8, 1 DiffusionBValueZZ
bval = 2000;
bvec = [-0.70710510015487671, -0.70710533857345581, -0.0021213062573224306];
bmats = [1000,1000,3,1000,3,0];
testBMat(bmats, bvec, bval);
%end bmat2bvec()
function testBMat(bmats, bvec, bval)
fprintf('STEP1: estimate bvec from known bmat;\n')
bm = [bmats(1), bmats(2), bmats(3);
bmats(2), bmats(4), bmats(5);
bmats(3), bmats(5), bmats(6)];
[V,D,W] = eig(bm);
printMat('bmat', bm);
fprintf('bvec = [%g %g %g];\n', bvec(1), bvec(2), bvec(3) );
fprintf('bval = %g;\n', bval );
fprintf('[V,D,W] = eig(bmat);\n')
printMat('D', D);
printMat('W', W);
printMat('V', V);
bvecEst= V(:,3);
fprintf('estimated_bvec = [%g %g %g];\n', bvecEst(1), bvecEst(2), bvecEst(3) );
deg = atan2d(norm(cross(bvec,bvecEst)),dot(bvec,bvecEst));
if deg > 1
fprintf(2,'estimated_bvec_error_deg %g\n', deg);
end
fprintf('STEP2: estimate bmat from known bval/bvec;\n')
bmEst = bvec2bmatSiemens(bvec, bval);
printMat('estimated_bmat', bmEst);
%fprintf('max_bmat_error = %g\n', max(abs(bm(:)-bmEst(:))) );
%flip polarity of bvec
bvec = -bvec;
bmEst = bvec2bmatSiemens(bvec, bval);
printMat('estimated_bmat_flipped_bvec', bmEst);
fprintf('\n');
%end testBMat()
function bmEst = bvec2bmatSiemens(bvec, bval)
bmats = bval*[bvec(1).^2 bvec(1).*bvec(2) bvec(1).*bvec(3) bvec(2).^2 bvec(2).*bvec(3) bvec(3).^2];
bmEst = [bmats(1), bmats(2), bmats(3);
bmats(2), bmats(4), bmats(5);
bmats(3), bmats(5), bmats(6)];
%end bvec2bmatSiemens()
function bmEst = bvec2bmat(bvec, bval)
% https://cmiclab.cs.ucl.ac.uk/CMIC/NiftyFit-Release/blob/master/fit-lib/_dwiDti.cpp
% https://github.com/stijnimaging/ExploreDTI_scripts
% https://raw.githubusercontent.com/nipy/dipy/master/dipy/reconst/qtdmri.py (cite Basser et al. 1994)
bmats = bval*[bvec(1).^2 2*bvec(1).*bvec(2) 2*bvec(1).*bvec(3) bvec(2).^2 2*bvec(2).*bvec(3) bvec(3).^2];
bmEst = [bmats(1), bmats(2), bmats(3);
bmats(2), bmats(4), bmats(5);
bmats(3), bmats(5), bmats(6)];
%end bvec2bmat()
function printMat(str, m)
fprintf('%s=[%g %g %g; %g %g %g; %g %g %g];\n', str, ...
m(1,1), m(1,2), m(1,3), ...
m(2,1), m(2,2), m(2,3), ...
m(3,1), m(3,2), m(3,3));
%end printMat()
|
Regarding (7) above ( "Eddy undistortion will not be as effective"), I would argue that the problem is more severe than that, and that attempting to use |
Okay, so I shall try to come up with a mathematical formulation: If we compare the 1st and 2nd expression for Ai , you should reach B=ggT which is also stated there. Then, the problem reduces to finding eigen decomposition of B in terms of g and gT. The math is as follows: B= U A UT Then, (since A is a diagonal eigenvalue matrix, its square root is straightforward) If I follow my above math, then the first step would be computing eigenvalue of B, one of which is negative (surprising). Consequently, when you compute square root, you have a complex number.
With complex eigenvalue, the resultant g has unique polarity, however complex.
I am trying to establish the way we can reach unequivocal gradient direction from B matrix. In this particular case, the non positive-semi-definiteness of B matrix, is giving us complex number, which should not be the case. So, @isolovey-robarts , would it be possible to double check correctness of B matrix you provided? |
As an aside, I would love to know the theory about how the third eigenvector of a B matrix gives gradient direction. |
A simple example demonstrates that the B_matrix is underspecified to store the polarity of the B_vector. Consider the B_vector [1, 0,0] and its polar opposite [-1,0,0]: both create the B_matrix [1,0,0; 0, 0,0; 0,0,0]. Therefore, given only this B_matrix it is impossible to determine the polarity. I agree with @tashrifbillah that using one vector of the SVD is unintuitive. The concept is described here. While this may not be the only solution, pragmatically it appears to work. Note that many compute the B-Matrix by pre-multiplying the off diagonal entries by 2 (e.g. here, here and here). While not specified in the DICOM standard it seems that this is not done by Siemens or Bruker. In this way the DICOM B_matrix is similar to the NRRD format. Jesper Andersson agrees with @mharms that we should not use the term "bvec" for files that can not determine polarity. Therefore, the latest commit will create "mvec" files, which have the same format as the "bvec" files but alert the user to the fact that the values come from the matrix and therefore the polarity is unknown. He also provides the following advice:
This issue has been resolved to the full extent possible with the provided data. Validation would require images from a phantom or brain that exhibits tract-like diffusion signal. It would really help to have different series that validate axial, coronal and sagittal slices. Further, it woul be nice to see the slice angulation is handled correctly as the FSL bvec format reports the vectors with respect to the image, while the DICOM format is oriented relative to the participant. Without new data, I think we should close this issue. |
When I run one of the @neurolabusc examples above, the bvec (i.e., DiffusionGradientOrientation value, (0018,9089)) is the first (not third) eigenvector returned by Matlab's |
Also, in this era in which accurate polarity of the bvec's matter, this is probably a good point for a historical reminder that prior to Siemens VB17 software line, the polarity of the bvec reported in the DICOM (DiffusionGradientOrientation value, (0018,9089)) was occasionally wrong. This is therefore an issue in VB15 and earlier data. And to make matters worse, the direction is itself sometimes simply wrong for VB13 and earlier data. |
Others have pointed out the bizarre nature of the B-Matrices provided in the Bruker DICOM header. One generally expects the B-Matrix to be a positive semidefinite having non-negative eigenvalues only. Further, the sum of the diagonals doesn’t equal the scalar b-value. The Matlab code below shows the B-matrices provided by @isolovey-robarts sample Bruker DICOM data with attempts to estimate b-vector and b-value from these. I am closing this issue until the issue is clarified. Until this is resolved, stable releases of dcm2niix will attempt to resolve the B-vector from the B-matrix. Any user who wants to explore this can work with the developmental branch code.
|
I tried the bvec related stuff. The private tag (0177,1101) stores a complete version of bmatrix (9 numbers each direction). Those 9 numbers seem to give correct bval. Based on this, my guess is that the 6-number bmatrix in PerFrameSeq may not be right. Based on my guess, I updated dicm2nii.m. If there is a real dataset, please test the bvec to verify/deny my guess. |
@xiangruili you are correct. Looking at the VisuAcqDiffusionBMatrix stored in (0177,1101) reveals the error in the public tags. Specifically, the public tags are supposed to store [xx,xy,xz,yy,yz,zz], but Bruker has saved [xx,xy,xz,yx,yy,yz]. Since we have the b-value (0018,9087) and bvalue=xx+yy+zz, we can detect the error and recover zz. Your solution of reading the 0177,1101 works well, but is laborious to implement in C. Therefore, I have decided to rely on the public tags to detect this error and recover the value. Be aware that my prior concern regarding the vectors [1,0,0] and [-1,0,0] creating the same BMatrix still holds: you can not determine BVector polarity from the BMatrix. Therefore, I would suggest you have dicm2nii use the extension ".mvec" instead of ".bvec" when the vectors are inferred from the matrix (as dcm2niix does). |
@xiangruili - I note that (0177,1101) also includes a field with DwDir that appears to be vectors with polarity and unit length. Better yet, they seem to report polarity. They are plausible on their own, but their direction seems in conflict with the values reported in the b-matrix. At first, I thought this might reflect a different frame of reference, but the slices are acquired aligned to the scanner bore (ImageOrientationPatient (0020,0037) DS [1\0\0\0\1\0]). Any thoughts about these?
|
Using There are multiple parameters related to bmatrix:
We may not bother their meaning, but simply use Users will need to test the bvec to make sure the sign is correct. |
@isolovey-robarts can you confirm that your system has the ParaVison 6.0.1 patch ( PCISW-2290-2337-DCMExport.linux.tar.gz) installed. I you contact Bruker they can send you a copy and install instructions. |
If Bruker agrees, the best solution is to store the real bvec into (0018,9089), following dicom standard. That will avoid all the confusion. Another piece of information is the slice timing. I tried in the private tags, but with no success. |
I am going to close this issue. This is based on comments sent to me from an experienced Bruker user who noted they found |
thanks so much , the only thing I could find for VisuAcqDiffusionBMatrix is as below, VisuAcqDiffusionBMatrix - Diffusion B-Matrix(es) in subject coordinate system. The parameter VisuAcqDiffusionBMatrix is set to the PVM_DwBMat diffusion b-matrix and made dependent to the diffusion loop. VisuAcqDiffusionBMatrix - Diffusion b-matrix(es) in subject coordinate system. First dimension is the number of b-matrices and second dimension is 9 for a 3x3 matrix. |
We can not use the b-matrix, as polar opposite b-vectors generate the identical b-matrix (e.g. consider the b-vectors [1,0,0] and [-1,0,0] which both generate the b-matrix [1,0,0; 0,1,0; 0,0,1]). We need to distinguish these for tools like Eddy to work effectively. In theory, the vector |
The private tag (0177,1100) contains PVM_DwGradRead, PVM_DwGradPhase, and PVM_DwGradSlice. Based on the names, I think those are in the frame image. For simplicity, I am using PVM_DwGradVec, which contains all 3 dimensions. This is based on the only testing dataset without angulation relative to the scanner bore. If someone can provide another dataset with angulation, we will be able to verify the solution. |
@nie-xingju can you provide two series of DTI DICOM images that use the same sequence, but where one is aligned orthogonal to the scanner bore and the other has an angulation applied? Ideally, a phantom or animal with anisotropic diffusion would help. This would test @xiangruili's hypothesis that vectors are applied in image space. |
sure, I could collect some data in the near future. My system is Bruker 94/20 with Paravision 360 v2.0 or v3.3 thanks,
|
Hello Dr. Rorden, Width: 19.2000 mm (96) all slice orientation: axial best and please let me know if you need to test more |
|
This is my observation from the new dataset, mainly from '45: read 5 degree angulation'. bval and bvec are stored in the enhanced dicom format with public tags, which is nice, but see below for possible issue. It seems the new dicom does not contain the private tag anymore. I found the file The problem is that those stored in the enhanced dicom are the same as DwGradVec, except normalized. Those dicom public tags should be in Patient reference, according to dicom standard. There is a possibility that all of these bvec are in Patient reference, although the names suggest otherwise. This can be verified or denied with a larger angulation, as @neurolabusc has pointed out. If the currently stored bvec are in Patient reference, we will need to fix the code, so the early data with private tag gives correct output. Otherwise, Bruker needs to fix the bvec in enhanced dicom, so they are in Patient reference. EDIT on 3/13/2023: |
@xiangruili well spotted. I also notice that the images with a low Diffusion b-value (0018 9087) omit the Diffusion Gradient Orientation (0018 9089). These are clearly intended as the |
These images are also very anisotropic (0.2mm in plane, 0.8mm slice thickness). For fitting diffusion tensors it helps to have isotropic data. Perhaps a smaller matrix in plane (64x64 instead of 96x96), decreased field of view and thinner slices would help. |
hello all, I apologize for the delay and collected more data with positive and minus 35 degree rotation in slice, phase and read direction. head first, supine position if animal alive (data uploaded on March 10th is foot first prone) Width: 19.2000 mm (64) all slice orientation: axial 3: no angulation it seems to me the major changes are PVM_DwBMatMag and PVM_DwBMatPat after changing the angulation. best and please let me know if you need to test more, |
I have another issue with Enhanced MR IOD DICOMs from Bruker. The
bval
/bvec
files are not extracted from DTI series. The issue is likely that Bruker encodes the diffusion direction as a B-matrix. Thebvec
s need to be computed from that.I put up two DTI series on Dropbox. There is also a Matlab script another lab member wrote to output
bval
/bvec
files given a DICOM file as input.The text was updated successfully, but these errors were encountered: