@@ -178,14 +178,48 @@ def __ne__(self, other):
178178class TransformBase :
179179 """Abstract image class to represent transforms."""
180180
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 ):
184202 """Instantiate a transform."""
203+
185204 self ._reference = None
186205 if reference :
187206 self .reference = reference
188207
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+
189223 def __call__ (self , x , inverse = False ):
190224 """Apply y = f(x)."""
191225 return self .map (x , inverse = inverse )
@@ -222,6 +256,12 @@ def ndim(self):
222256 """Access the dimensions of the reference space."""
223257 raise TypeError ("TransformBase has no dimensions" )
224258
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+
225265 def apply (
226266 self ,
227267 spatialimage ,
@@ -338,65 +378,6 @@ def map(self, x, inverse=False):
338378 """
339379 return x
340380
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 (x5_root ):
374- variables = {}
375- with h5py .File (x5_root , "r" ) as f :
376- f .visititems (lambda name , x5_root : _from_hdf5 (name , 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 (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-
400381
401382def _as_homogeneous (xyz , dtype = "float32" , dim = 3 ):
402383 """
0 commit comments