|
27 | 27 | EQUALITY_TOL,
|
28 | 28 | )
|
29 | 29 | from nitransforms.io import get_linear_factory, TransformFileError
|
30 |
| -from nitransforms.io.x5 import X5Transform, X5Domain, to_filename as save_x5 |
| 30 | +from nitransforms.io.x5 import ( |
| 31 | + X5Transform, |
| 32 | + X5Domain, |
| 33 | + to_filename as save_x5, |
| 34 | + from_filename as load_x5, |
| 35 | +) |
31 | 36 |
|
32 | 37 |
|
33 | 38 | class Affine(TransformBase):
|
@@ -174,8 +179,20 @@ def ndim(self):
|
174 | 179 | return self._matrix.ndim + 1
|
175 | 180 |
|
176 | 181 | @classmethod
|
177 |
| - def from_filename(cls, filename, fmt=None, reference=None, moving=None): |
| 182 | + def from_filename( |
| 183 | + cls, filename, fmt=None, reference=None, moving=None, x5_position=0 |
| 184 | + ): |
178 | 185 | """Create an affine from a transform file."""
|
| 186 | + |
| 187 | + if fmt and fmt.upper() == "X5": |
| 188 | + x5_xfm = load_x5(filename)[x5_position] |
| 189 | + Transform = cls if x5_xfm.array_length == 1 else LinearTransformsMapping |
| 190 | + if x5_xfm.domain: |
| 191 | + # override reference |
| 192 | + raise NotImplementedError |
| 193 | + |
| 194 | + return Transform(x5_xfm.transform, reference=reference) |
| 195 | + |
179 | 196 | fmtlist = [fmt] if fmt is not None else ("itk", "lta", "afni", "fsl")
|
180 | 197 |
|
181 | 198 | if fmt is not None and not Path(filename).exists():
|
@@ -265,7 +282,9 @@ def to_filename(self, filename, fmt="X5", moving=None, x5_inverse=False):
|
265 | 282 | if fmt.upper() == "X5":
|
266 | 283 | return save_x5(filename, [self.to_x5(store_inverse=x5_inverse)])
|
267 | 284 |
|
268 |
| - writer = get_linear_factory(fmt, is_array=isinstance(self, LinearTransformsMapping)) |
| 285 | + writer = get_linear_factory( |
| 286 | + fmt, is_array=isinstance(self, LinearTransformsMapping) |
| 287 | + ) |
269 | 288 |
|
270 | 289 | if fmt.lower() in ("itk", "ants", "elastix"):
|
271 | 290 | writer.from_ras(self.matrix).to_filename(filename)
|
|
0 commit comments