Skip to content

Commit 691fde9

Browse files
committed
Moves the test to the DiffusionGradientTable object
The method `reorient_rasb` is now attached to this object.
1 parent 8e6b578 commit 691fde9

File tree

2 files changed

+30
-75
lines changed

2 files changed

+30
-75
lines changed

dmriprep/interfaces/vectors.py

Lines changed: 4 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
SimpleInterface, BaseInterfaceInputSpec, TraitedSpec,
77
File, traits, isdefined
88
)
9-
from ..utils.vectors import DiffusionGradientTable, B0_THRESHOLD, BVEC_NORM_EPSILON
9+
from ..utils.vectors import (DiffusionGradientTable, B0_THRESHOLD,
10+
BVEC_NORM_EPSILON
11+
)
1012

1113

1214
class _CheckGradientTableInputSpec(BaseInterfaceInputSpec):
@@ -96,72 +98,4 @@ def _undefined(objekt, name, default=None):
9698
value = getattr(objekt, name)
9799
if not isdefined(value):
98100
return default
99-
return value
100-
101-
102-
class _ReorientVectorsInputSpec(BaseInterfaceInputSpec):
103-
dwi_file = File(exists=True)
104-
rasb_file = File(exists=True)
105-
affines = traits.List()
106-
b0_threshold = traits.Float(B0_THRESHOLD, usedefault=True)
107-
108-
109-
class _ReorientVectorsOutputSpec(TraitedSpec):
110-
out_rasb = File(exists=True)
111-
112-
113-
class ReorientVectors(SimpleInterface):
114-
"""
115-
Reorient Vectors
116-
117-
Example
118-
-------
119-
>>> os.chdir(tmpdir)
120-
>>> oldrasb = str(data_dir / 'dwi.tsv')
121-
>>> oldrasb_mat = np.loadtxt(str(data_dir / 'dwi.tsv'), skiprows=1)
122-
>>> # The simple case: all affines are identity
123-
>>> affine_list = np.zeros((len(oldrasb_mat[:, 3][oldrasb_mat[:, 3] != 0]), 4, 4))
124-
>>> for i in range(4):
125-
>>> affine_list[:, i, i] = 1
126-
>>> reor_vecs = ReorientVectors()
127-
>>> reor_vecs = ReorientVectors()
128-
>>> reor_vecs.inputs.affines = affine_list
129-
>>> reor_vecs.inputs.in_rasb = oldrasb
130-
>>> res = reor_vecs.run()
131-
>>> out_rasb = res.outputs.out_rasb
132-
>>> out_rasb_mat = np.loadtxt(out_rasb, skiprows=1)
133-
>>> assert oldrasb_mat == out_rasb_mat
134-
True
135-
"""
136-
137-
input_spec = _ReorientVectorsInputSpec
138-
output_spec = _ReorientVectorsOutputSpec
139-
140-
def _run_interface(self, runtime):
141-
from nipype.utils.filemanip import fname_presuffix
142-
143-
table = DiffusionGradientTable(
144-
dwi_file=self.inputs.dwi_file,
145-
rasb_file=self.inputs.rasb_file,
146-
transforms=self.inputs.affines,
147-
)
148-
table.generate_vecval()
149-
reor_table = table.reorient_rasb()
150-
151-
cwd = Path(runtime.cwd).absolute()
152-
reor_rasb_file = fname_presuffix(
153-
self.inputs.rasb_file,
154-
use_ext=False,
155-
suffix="_reoriented.tsv",
156-
newpath=str(cwd),
157-
)
158-
np.savetxt(
159-
str(reor_rasb_file),
160-
reor_table,
161-
delimiter="\t",
162-
header="\t".join("RASB"),
163-
fmt=["%.8f"] * 3 + ["%g"],
164-
)
165-
166-
self._results["out_rasb"] = reor_rasb_file
167-
return runtime
101+
return value

dmriprep/utils/vectors.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,25 @@ def __init__(
5252
then bvecs and bvals will be dismissed.
5353
b_scale : bool
5454
Whether b-values should be normalized.
55+
56+
Example
57+
-------
58+
>>> os.chdir(tmpdir)
59+
>>> old_rasb = str(data_dir / 'dwi.tsv')
60+
>>> old_rasb_mat = np.loadtxt(str(data_dir / 'dwi.tsv'), skiprows=1)
61+
>>> check = DiffusionGradientTable(
62+
... dwi_file=str(data_dir / 'dwi.nii.gz'),
63+
... rasb_file=str(data_dir / 'dwi.tsv'))
64+
>>> affines = np.zeros((old_rasb_mat.shape[0], 4, 4))
65+
>>> aff_file_list = []
66+
>>> for ii, aff in enumerate(affines):
67+
... aff_file = f'aff_{ii}.npy'
68+
... np.save(aff_file, aff)
69+
... aff_file_list.append(aff_file)
70+
>>> check._transforms = aff_file_list
71+
>>> out_rasb_mat = check.reorient_rasb()
72+
>>> assert np.allclose(old_rasb_mat, out_rasb_mat)
73+
True
5574
"""
5675
self._transforms = transforms
5776
self._b_scale = b_scale
@@ -164,14 +183,15 @@ def generate_rasb(self):
164183

165184
def reorient_rasb(self):
166185
"""Reorient the vectors based o a list of affine transforms."""
167-
from dipy.core.gradients import gradient_table_from_bvals_bvecs, reorient_bvecs
186+
from dipy.core.gradients import (gradient_table_from_bvals_bvecs,
187+
reorient_bvecs)
168188

169189
affines = self._transforms.copy()
170190
bvals = self._bvals
171191
bvecs = self._bvecs
172192

173-
# Verify that number of non-B0 volumes corresponds to the number of affines.
174-
# If not, raise an error.
193+
# Verify that number of non-B0 volumes corresponds to the number of
194+
# affines. If not, try to fix it, or raise an error:
175195
if len(self._bvals[self._bvals >= self._b0_thres]) != len(affines):
176196
b0_indices = np.where(self._bvals <= self._b0_thres)[0].tolist()
177197
if len(self._bvals[self._bvals >= self._b0_thres]) < len(affines):
@@ -188,7 +208,8 @@ def reorient_rasb(self):
188208
)
189209

190210
# Build gradient table object
191-
gt = gradient_table_from_bvals_bvecs(bvals, bvecs, b0_threshold=self._b0_thres)
211+
gt = gradient_table_from_bvals_bvecs(bvals, bvecs,
212+
b0_threshold=self._b0_thres)
192213

193214
# Reorient table
194215
new_gt = reorient_bvecs(gt, [np.load(aff) for aff in affines])
@@ -238,7 +259,7 @@ def to_filename(self, filename, filetype="rasb"):
238259
np.savetxt("%s.bval" % filename, self.bvals, fmt="%.6f")
239260
else:
240261
raise ValueError('Unknown filetype "%s"' % filetype)
241-
262+
242263

243264
def normalize_gradients(bvecs, bvals, b0_threshold=B0_THRESHOLD,
244265
bvec_norm_epsilon=BVEC_NORM_EPSILON, b_scale=True):

0 commit comments

Comments
 (0)