@@ -160,6 +160,7 @@ class _MergeSeriesInputSpec(BaseInterfaceInputSpec):
160
160
allow_4D = traits .Bool (
161
161
True , usedefault = True , desc = "whether 4D images are allowed to be concatenated"
162
162
)
163
+ affine_tolerance = traits .Float (desc = "Absolute tolerance allowed between image affines" )
163
164
164
165
165
166
class _MergeSeriesOutputSpec (TraitedSpec ):
@@ -174,8 +175,17 @@ class MergeSeries(SimpleInterface):
174
175
175
176
def _run_interface (self , runtime ):
176
177
nii_list = []
178
+ aff0 = None
177
179
for f in self .inputs .in_files :
178
180
filenii = nb .squeeze_image (nb .load (f ))
181
+ if self .inputs .affine_tolerance :
182
+ if aff0 is None :
183
+ aff0 = filenii .affine
184
+ elif not np .allclose (aff0 , filenii .affine , atol = self .inputs .affine_tolerance ):
185
+ raise ValueError (
186
+ "Difference in affines greater than allowed tolerance "
187
+ f"{ self .inputs .affine_tolerance } "
188
+ )
179
189
ndim = filenii .dataobj .ndim
180
190
if ndim == 3 :
181
191
nii_list .append (filenii )
@@ -188,7 +198,10 @@ def _run_interface(self, runtime):
188
198
"Input image has an incorrect number of dimensions" f" ({ ndim } )."
189
199
)
190
200
191
- img_4d = nb .concat_images (nii_list )
201
+ img_4d = nb .concat_images (
202
+ nii_list ,
203
+ check_affines = not bool (self .inputs .affine_tolerance )
204
+ )
192
205
out_file = fname_presuffix (
193
206
self .inputs .in_files [0 ], suffix = "_merged" , newpath = runtime .cwd
194
207
)
0 commit comments