11
11
"""
12
12
13
13
14
- import os , logging , zlib , h5py
14
+ import os , logging , zlib , h5py , textwrap
15
15
import cPickle as cp
16
16
import numpy as np
17
17
from ast import literal_eval
18
+ from string import join
18
19
from dimspy .models .peaklist_tags import Tag , PeakList_Tags
19
20
from dimspy .models .peaklist import PeakList
20
21
from dimspy .models .peak_matrix import PeakMatrix , unmask_all_peakmatrix
@@ -26,9 +27,16 @@ def _eval(v):
26
27
except (ValueError , SyntaxError ):
27
28
return str (v )
28
29
29
- _packMeta = lambda x : np .array (zlib .compress (cp .dumps (x )) + '\xFF ' ) # numpy truncates right-side \x00
30
+ _packMeta = lambda x : np .array (zlib .compress (cp .dumps (x ), 9 ) + '\xFF ' ) # numpy truncates right-side \x00
30
31
_unpackMeta = lambda x : cp .loads (zlib .decompress (x [:- 1 ]))
31
32
33
+ _BOOL_HEADERS = np .array ([0xE5 , 0xAD , 0x71 , 0x47 ], dtype = np .uint8 )
34
+ _encUInt8 = lambda x ,b : np .array (map (lambda v : int (v ,16 ), textwrap .wrap ('{0:#0{1}x}' .format (x ,2 * b + 2 )[2 :], 2 )), dtype = np .uint8 )
35
+ _decUInt8 = lambda x : int (join (map (lambda v : '{0:#0{1}x}' .format (v ,4 )[2 :], x ), '' ), 16 )
36
+
37
+ _packBool = lambda x : np .r_ [_BOOL_HEADERS , np .packbits (x ), _encUInt8 (x .shape [0 ], 4 )]
38
+ _unpackBool = lambda x : np .unpackbits (x [len (_BOOL_HEADERS ):- 4 ])[:_decUInt8 (x [- 4 :])].astype (bool )
39
+
32
40
33
41
# peaklists portals
34
42
def save_peaklists_as_hdf5 (pkls , filename ):
@@ -149,7 +157,8 @@ def _saveattr(attr):
149
157
150
158
dset .attrs ['flag_names' ] = pm .flag_names
151
159
for fn in pm .flag_names :
152
- dset .attrs [fn ] = pm .flag_values (fn )
160
+ fvals = pm .flag_values (fn )
161
+ dset .attrs [fn ] = fvals if fvals .nbytes < 64000 else _packBool (fvals ) if fvals .dtype .kind == 'b' else _packMeta (fvals )
153
162
154
163
155
164
def load_peak_matrix_from_hdf5 (filename ):
@@ -180,6 +189,8 @@ def load_peak_matrix_from_hdf5(filename):
180
189
ptgs = [PeakList_Tags (* [Tag (_eval (v ), None if t == 'None' else t ) for t ,v in tags ]) for tags in map (lambda x : dset .attrs [x ], tatt )]
181
190
182
191
flgs = [(fn , dset .attrs [fn ]) for fn in dset .attrs ['flag_names' ]]
192
+ flgs = [(fn , _unpackBool (fv ) if fv .dtype .kind == 'u' and np .all (fv [:len (_BOOL_HEADERS )] == _BOOL_HEADERS ) else \
193
+ _unpackMeta (fv ) if fv .dtype .kind == 's' and fv [- 1 ] == '\xFF ' else fv ) for fn ,fv in flgs ]
183
194
alst = [(attr , np .array (f [attr ]).astype (f [attr ].attrs ['dtype' ])) for attr in attl ]
184
195
185
196
pm = PeakMatrix (pids , ptgs , alst )
0 commit comments