@@ -129,48 +129,46 @@ def get_affine_rasmm_to_trackvis(header):
129
129
130
130
131
131
def encode_value_in_name (value , name , max_name_len = 20 ):
132
- """ Encodes a value in the last bytes of a string.
132
+ """ Return `name` as fixed-length string, appending `value` as string.
133
133
134
- If `value` is one, then there is no encoding and the last bytes
135
- are left untouched. Otherwise, a \x00 byte is added after `name`
136
- and followed by the ascii represensation of the value.
134
+ Form output from `name` if `value <= 1` else `name` + ``\x00 `` +
135
+ str(value).
137
136
138
- This function also verifies that the length of name is less
139
- than `max_name_len`.
137
+ Return output as fixed length string length `max_name_len`, padded with
138
+ ``\x00 ``.
139
+
140
+ This function also verifies that the modified length of name is less than
141
+ `max_name_len`.
140
142
141
143
Parameters
142
144
----------
143
- value : byte
144
- Integer value between 0 and 255 to encode.
145
- name : bytes
146
- Name in which the last two bytes will serve to encode `value`.
145
+ value : int
146
+ Integer value to encode.
147
+ name : str
148
+ Name to which we may append an ascii / latin-1 representation of
149
+ `value`.
147
150
max_name_len : int, optional
148
- Maximum length name can have.
151
+ Maximum length of byte string that output can have.
149
152
150
153
Returns
151
154
-------
152
155
encoded_name : bytes
153
- Name containing the encoded value.
156
+ Name maybe followed by ``\x00 `` and ascii / latin-1 representation of
157
+ `value`, padded with ``\x00 `` bytes.
154
158
"""
155
-
156
159
if len (name ) > max_name_len :
157
160
msg = ("Data information named '{0}' is too long"
158
161
" (max {1} characters.)" ).format (name , max_name_len )
159
162
raise ValueError (msg )
160
- elif value > 1 and len (name ) + len (str (value )) + 1 > max_name_len :
163
+ encoded_name = name if value <= 1 else name + '\x00 ' + str (value )
164
+ if len (encoded_name ) > max_name_len :
161
165
msg = ("Data information named '{0}' is too long (need to be less"
162
166
" than {1} characters when storing more than one value"
163
167
" for a given data information."
164
168
).format (name , max_name_len - (len (str (value )) + 1 ))
165
169
raise ValueError (msg )
166
-
167
- encoded_name = name
168
- if value > 1 :
169
- # Store the name followed by \x00 and the `value` (in ascii).
170
- encoded_name += '\x00 ' + str (value )
171
-
172
- encoded_name = encoded_name .ljust (max_name_len , '\x00 ' )
173
- return encoded_name
170
+ # Fill to the end with zeros
171
+ return encoded_name .ljust (max_name_len , '\x00 ' ).encode ('latin1' )
174
172
175
173
176
174
def decode_value_from_name (encoded_name ):
@@ -388,7 +386,7 @@ def _read():
388
386
return cls (tractogram , header = hdr )
389
387
390
388
def save (self , fileobj ):
391
- """ Saves tractogram to a file-like object using TRK format.
389
+ """ Save tractogram to a filename or file-like object using TRK format.
392
390
393
391
Parameters
394
392
----------
@@ -420,6 +418,7 @@ def save(self, fileobj):
420
418
# Keep track of the beginning of the header.
421
419
beginning = f .tell ()
422
420
421
+ # Write temporary header that we will update at the end
423
422
f .write (header .tostring ())
424
423
425
424
i4_dtype = np .dtype ("<i4" ) # Always save in little-endian.
@@ -449,8 +448,8 @@ def save(self, fileobj):
449
448
property_name = np .zeros (MAX_NB_NAMED_PROPERTIES_PER_STREAMLINE ,
450
449
dtype = 'S20' )
451
450
for i , name in enumerate (data_for_streamline_keys ):
452
- # Use the last two bytes of the name to store the number of
453
- # values associated to this data_for_streamline .
451
+ # Append number of values as ascii to zero-terminated name
452
+ # to encode number of values into trackvis name .
454
453
nb_values = data_for_streamline [name ].shape [- 1 ]
455
454
property_name [i ] = encode_value_in_name (nb_values , name )
456
455
header ['property_name' ][:] = property_name
@@ -466,8 +465,8 @@ def save(self, fileobj):
466
465
data_for_points_keys = sorted (data_for_points .keys ())
467
466
scalar_name = np .zeros (MAX_NB_NAMED_SCALARS_PER_POINT , dtype = 'S20' )
468
467
for i , name in enumerate (data_for_points_keys ):
469
- # Use the last two bytes of the name to store the number of
470
- # values associated to this data_for_streamline .
468
+ # Append number of values as ascii to zero-terminated name
469
+ # to encode number of values into trackvis name .
471
470
nb_values = data_for_points [name ].shape [- 1 ]
472
471
scalar_name [i ] = encode_value_in_name (nb_values , name )
473
472
header ['scalar_name' ][:] = scalar_name
0 commit comments