32
32
('type' , '>i4' ),
33
33
('dof' , '>i4' ),
34
34
('ras_good' , '>i2' ),
35
- ('delta ' , '>f4' , (3 ,)),
35
+ ('voxelsize ' , '>f4' , (3 ,)),
36
36
('x_ras' , '>f4' , (3 , 1 )),
37
37
('y_ras' , '>f4' , (3 , 1 )),
38
38
('z_ras' , '>f4' , (3 , 1 )),
@@ -155,11 +155,10 @@ def get_affine(self):
155
155
'''
156
156
affine = np .eye (4 )
157
157
hdr = self ._structarr
158
- d = np .diag (hdr ['delta' ])
159
- pcrs_c = hdr ['dims' ][:3 ] / 2.0
160
- MdcD = np .hstack ((hdr ['x_ras' ], hdr ['y_ras' ], hdr ['z_ras' ])).dot (d )
158
+ MdcD = np .hstack ((hdr ['x_ras' ], hdr ['y_ras' ], hdr ['z_ras' ])) * hdr ['voxelsize' ]
159
+ vol_center = MdcD .dot (hdr ['dims' ][:3 ].reshape (- 1 , 1 )) / 2
161
160
affine [:3 , :3 ] = MdcD
162
- affine [:3 , [3 ]] = hdr ['c_ras' ] - MdcD . dot ( pcrs_c . reshape ( 3 , 1 ))
161
+ affine [:3 , [3 ]] = hdr ['c_ras' ] - vol_center
163
162
return affine
164
163
165
164
# For compatibility with nifti (multiple affines)
@@ -174,8 +173,8 @@ def get_vox2ras_tkr(self):
174
173
''' Get the vox2ras-tkr transform. See "Torig" here:
175
174
https://surfer.nmr.mgh.harvard.edu/fswiki/CoordinateSystems
176
175
'''
177
- ds = np . array ( self ._structarr ['delta' ])
178
- ns = ( np . array ( self ._structarr ['dims' ][:3 ]) * ds ) / 2.0
176
+ ds = self ._structarr ['voxelsize' ]
177
+ ns = self ._structarr ['dims' ][:3 ] * ds / 2.0
179
178
v2rtkr = np .array ([[- ds [0 ], 0 , 0 , ns [0 ]],
180
179
[0 , 0 , ds [2 ], - ns [2 ]],
181
180
[0 , - ds [1 ], 0 , ns [1 ]],
@@ -213,9 +212,7 @@ def get_zooms(self):
213
212
z : tuple
214
213
tuple of header zoom values
215
214
'''
216
- hdr = self ._structarr
217
- zooms = hdr ['delta' ]
218
- return tuple (zooms [:])
215
+ return tuple (self ._structarr ['voxelsize' ])
219
216
220
217
def set_zooms (self , zooms ):
221
218
''' Set zooms into header fields
@@ -224,13 +221,12 @@ def set_zooms(self, zooms):
224
221
'''
225
222
hdr = self ._structarr
226
223
zooms = np .asarray (zooms )
227
- if len (zooms ) != len (hdr ['delta ' ]):
224
+ if len (zooms ) != len (hdr ['voxelsize ' ]):
228
225
raise HeaderDataError ('Expecting %d zoom values for ndim'
229
- % hdr ['delta ' ])
226
+ % hdr ['voxelsize ' ])
230
227
if np .any (zooms < 0 ):
231
228
raise HeaderDataError ('zooms must be positive' )
232
- delta = hdr ['delta' ]
233
- delta [:] = zooms [:]
229
+ hdr ['voxelsize' ] = zooms
234
230
235
231
def get_data_shape (self ):
236
232
''' Get shape of data
@@ -311,27 +307,27 @@ def default_structarr(klass, endianness=None):
311
307
312
308
Ignores byte order; always big endian
313
309
'''
314
- hdr_data = super (MGHHeader , klass ).default_structarr ()
315
- hdr_data ['version' ] = 1
316
- hdr_data ['dims' ][:] = np . array ([ 1 , 1 , 1 , 1 ])
317
- hdr_data ['type' ] = 3
318
- hdr_data ['ras_good' ] = 1
319
- hdr_data [ 'delta' ][:] = np . array ([ 1 , 1 , 1 ])
320
- hdr_data ['x_ras' ] = np . array ( [[- 1 ], [0 ], [0 ]])
321
- hdr_data ['y_ras' ] = np . array ( [[0 ], [0 ], [1 ]])
322
- hdr_data ['z_ras' ] = np . array ( [[0 ], [- 1 ], [0 ]])
323
- hdr_data ['c_ras' ] = 0
324
- hdr_data ['mrparms' ] = np . array ([ 0 , 0 , 0 , 0 ])
325
- return hdr_data
310
+ structarr = super (MGHHeader , klass ).default_structarr ()
311
+ structarr ['version' ] = 1
312
+ structarr ['dims' ] = 1
313
+ structarr ['type' ] = 3
314
+ structarr ['ras_good' ] = 1
315
+ structarr [ 'voxelsize' ] = 1
316
+ structarr ['x_ras' ] = [[- 1 ], [0 ], [0 ]]
317
+ structarr ['y_ras' ] = [[0 ], [0 ], [1 ]]
318
+ structarr ['z_ras' ] = [[0 ], [- 1 ], [0 ]]
319
+ structarr ['c_ras' ] = 0
320
+ structarr ['mrparms' ] = 0
321
+ return structarr
326
322
327
323
def _set_affine_default (self ):
328
324
''' If ras_good flag is 0, set the default affine
329
325
'''
330
326
self ._structarr ['ras_good' ] = 1
331
- self ._structarr ['delta' ][:] = np . array ([ 1 , 1 , 1 ])
332
- self ._structarr ['x_ras' ] = np . array ( [[- 1 ], [0 ], [0 ]])
333
- self ._structarr ['y_ras' ] = np . array ( [[0 ], [0 ], [1 ]])
334
- self ._structarr ['z_ras' ] = np . array ( [[0 ], [- 1 ], [0 ]])
327
+ self ._structarr ['voxelsize' ] = 1
328
+ self ._structarr ['x_ras' ] = [[- 1 ], [0 ], [0 ]]
329
+ self ._structarr ['y_ras' ] = [[0 ], [0 ], [1 ]]
330
+ self ._structarr ['z_ras' ] = [[0 ], [- 1 ], [0 ]]
335
331
self ._structarr ['c_ras' ] = 0
336
332
337
333
def writehdr_to (self , fileobj ):
@@ -535,18 +531,19 @@ def _write_data(self, mghfile, data, header):
535
531
def _affine2header (self ):
536
532
""" Unconditionally set affine into the header """
537
533
hdr = self ._header
538
- shape = np .array (self ._dataobj .shape [:3 ]).reshape (3 , 1 )
534
+ shape = np .array (self ._dataobj .shape [:3 ]).reshape (- 1 , 1 )
535
+
539
536
# for more information, go through save_mgh.m in FreeSurfer dist
540
- MdcD = self ._affine [:3 , :3 ]
541
- delta = voxel_sizes (self ._affine )
542
- Mdc = MdcD / np .tile (delta , (3 , 1 ))
543
- c_ras = self ._affine .dot (np .vstack ((shape , [1 ])))
537
+ voxelsize = voxel_sizes (self ._affine )
538
+ Mdc = self ._affine [:3 , :3 ] / voxelsize
539
+ c_ras = self ._affine .dot (np .vstack ((shape / 2 , [1 ])))[:3 ]
544
540
545
- hdr ['delta' ] = delta
541
+ # Assign after we've had a chance to raise exceptions
542
+ hdr ['voxelsize' ] = voxelsize
546
543
hdr ['x_ras' ] = Mdc [:, [0 ]]
547
544
hdr ['y_ras' ] = Mdc [:, [1 ]]
548
545
hdr ['z_ras' ] = Mdc [:, [2 ]]
549
- hdr ['c_ras' ] = c_ras [: 3 ]
546
+ hdr ['c_ras' ] = c_ras
550
547
551
548
552
549
load = MGHImage .load
0 commit comments