@@ -108,17 +108,24 @@ def from_string(cls, string):
108
108
sa ["parameters" ] = parameters
109
109
return tf
110
110
111
- def to_ras (self , moving = None , reference = None ):
111
+ def to_ras (self , moving = None , reference = None , pre_rotation = None , post_rotation = None ):
112
112
"""Return a nitransforms internal RAS+ matrix."""
113
113
# swapaxes is necessary, as axis 0 encodes series of transforms
114
114
retval = LPS @ np .swapaxes (self .structarr ["parameters" ].T , 0 , 1 ) @ LPS
115
- reference = _ensure_image (reference )
116
- if reference is not None and _is_oblique (reference .affine ):
117
- retval = retval @ _cardinal_rotation (reference .affine , True )
118
115
119
- moving = _ensure_image (moving )
120
- if moving is not None and _is_oblique (moving .affine ):
121
- retval = _cardinal_rotation (moving .affine , False ) @ retval
116
+ if pre_rotation is None and reference is not None :
117
+ ref_aff = _ensure_image (reference ).affine
118
+ pre_rotation = _cardinal_rotation (ref_aff , True ) if _is_oblique (ref_aff ) else None
119
+
120
+ if pre_rotation is not None :
121
+ retval = retval @ pre_rotation
122
+
123
+ if post_rotation is None and reference is not None :
124
+ mov_aff = _ensure_image (moving ).affine
125
+ post_rotation = _cardinal_rotation (mov_aff , True ) if _is_oblique (mov_aff ) else None
126
+
127
+ if post_rotation is not None :
128
+ retval = post_rotation @ retval
122
129
123
130
return retval
124
131
@@ -130,9 +137,21 @@ class AFNILinearTransformArray(BaseLinearTransformList):
130
137
131
138
def to_ras (self , moving = None , reference = None ):
132
139
"""Return a nitransforms' internal RAS matrix."""
133
- return np .stack (
134
- [xfm .to_ras (moving = moving , reference = reference ) for xfm in self .xforms ]
135
- )
140
+
141
+ pre_rotation = None
142
+ if reference is not None :
143
+ ref_aff = _ensure_image (reference ).affine
144
+ pre_rotation = _cardinal_rotation (ref_aff , True ) if _is_oblique (ref_aff ) else None
145
+
146
+ post_rotation = None
147
+ if moving is not None :
148
+ mov_aff = _ensure_image (moving ).affine
149
+ post_rotation = _cardinal_rotation (mov_aff , True ) if _is_oblique (mov_aff ) else None
150
+
151
+ return np .stack ([
152
+ xfm .to_ras (pre_rotation = pre_rotation , post_rotation = post_rotation )
153
+ for xfm in self .xforms
154
+ ])
136
155
137
156
def to_string (self ):
138
157
"""Convert to a string directly writeable to file."""
0 commit comments