@@ -178,14 +178,48 @@ def __ne__(self, other):
178
178
class TransformBase :
179
179
"""Abstract image class to represent transforms."""
180
180
181
- __slots__ = ("_reference" , "_ndim" ,)
182
-
183
- def __init__ (self , reference = None ):
181
+ __slots__ = ("_reference" , "_ndim" , "_affine" , "_shape" , "_header" ,
182
+ "_grid" , "_mapping" , "_hdf5_dct" , "_x5_dct" )
183
+
184
+ x5_struct = {
185
+ 'TransformGroup/0' : {
186
+ 'Type' : None ,
187
+ 'Transform' : None ,
188
+ 'Metadata' : None ,
189
+ 'Inverse' : None
190
+ },
191
+ 'TransformGroup/0/Domain' : {
192
+ 'Grid' : None ,
193
+ 'Size' : None ,
194
+ 'Mapping' : None
195
+ },
196
+ 'TransformGroup/1' : {},
197
+ 'TransformChain' : {}
198
+ }
199
+
200
+ def __init__ (self , x5 = None , hdf5 = None , nifti = None , shape = None , affine = None ,
201
+ header = None , reference = None ):
184
202
"""Instantiate a transform."""
203
+
185
204
self ._reference = None
186
205
if reference :
187
206
self .reference = reference
188
207
208
+ if nifti is not None :
209
+ self ._x5_dct = self .init_x5_structure (nifti )
210
+ elif hdf5 :
211
+ self .update_x5_structure (hdf5 )
212
+ elif x5 :
213
+ self .update_x5_structure (x5 )
214
+
215
+ self ._shape = shape
216
+ self ._affine = affine
217
+ self ._header = header
218
+
219
+ # TO-DO
220
+ self ._grid = None
221
+ self ._mapping = None
222
+
189
223
def __call__ (self , x , inverse = False ):
190
224
"""Apply y = f(x)."""
191
225
return self .map (x , inverse = inverse )
@@ -222,6 +256,12 @@ def ndim(self):
222
256
"""Access the dimensions of the reference space."""
223
257
raise TypeError ("TransformBase has no dimensions" )
224
258
259
+ def init_x5_structure (self , xfm_data = None ):
260
+ self .x5_struct ['TransformGroup/0/Transform' ] = xfm_data
261
+
262
+ def update_x5_structure (self , hdf5_struct = None ):
263
+ self .x5_struct .update (hdf5_struct )
264
+
225
265
def apply (
226
266
self ,
227
267
spatialimage ,
@@ -338,65 +378,6 @@ def map(self, x, inverse=False):
338
378
"""
339
379
return x
340
380
341
- def to_filename (self , filename , fmt = "X5" ):
342
- """Store the transform in BIDS-Transforms HDF5 file format (.x5)."""
343
- with h5py .File (filename , "w" ) as out_file :
344
- out_file .attrs ["Format" ] = "X5"
345
- out_file .attrs ["Version" ] = np .uint16 (1 )
346
- root = out_file .create_group ("/0" )
347
- self ._to_hdf5 (root )
348
-
349
- return filename
350
-
351
- def _to_hdf5 (self , x5_root ):
352
- """Serialize this object into the x5 file format."""
353
- transform_group = x5_root .create_group ("TransformGroup" )
354
-
355
- """Group '0' containing Affine transform"""
356
- transform_0 = transform_group .create_group ("0" )
357
-
358
- transform_0 .attrs ["Type" ] = "Affine"
359
- transform_0 .create_dataset ("Transform" , data = self ._matrix )
360
- transform_0 .create_dataset ("Inverse" , data = np .linalg .inv (self ._matrix ))
361
-
362
- metadata = {"key" : "value" }
363
- transform_0 .attrs ["Metadata" ] = str (metadata )
364
-
365
- """sub-group 'Domain' contained within group '0' """
366
- domain_group = transform_0 .create_group ("Domain" )
367
- domain_group .attrs ["Grid" ] = self .grid
368
- domain_group .create_dataset ("Size" , data = _as_homogeneous (self ._reference .shape ))
369
- domain_group .create_dataset ("Mapping" , data = self .map )
370
-
371
- raise NotImplementedError
372
-
373
- def read_x5 (self , x5_root ):
374
- variables = {}
375
- with h5py .File (x5_root , "r" ) as f :
376
- f .visititems (lambda filename , x5_root : self ._from_hdf5 (filename , x5_root , variables ))
377
-
378
- _transform = variables ["TransformGroup/0/Transform" ]
379
- _inverse = variables ["TransformGroup/0/Inverse" ]
380
- _size = variables ["TransformGroup/0/Domain/Size" ]
381
- _map = variables ["TransformGroup/0/Domain/Mapping" ]
382
-
383
- return _transform , _inverse , _size , _map
384
-
385
- def _from_hdf5 (self , name , x5_root , storage ):
386
- if isinstance (x5_root , h5py .Dataset ):
387
- storage [name ] = {
388
- 'type' : 'dataset' ,
389
- 'attrs' : dict (x5_root .attrs ),
390
- 'shape' : x5_root .shape ,
391
- 'data' : x5_root [()] # Read the data
392
- }
393
- elif isinstance (x5_root , h5py .Group ):
394
- storage [name ] = {
395
- 'type' : 'group' ,
396
- 'attrs' : dict (x5_root .attrs ),
397
- 'members' : {}
398
- }
399
-
400
381
401
382
def _as_homogeneous (xyz , dtype = "float32" , dim = 3 ):
402
383
"""
0 commit comments