legend-pydataobj 1.10.0__tar.gz → 1.10.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/PKG-INFO +1 -1
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/pyproject.toml +2 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/legend_pydataobj.egg-info/PKG-INFO +1 -1
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/_version.py +2 -2
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/compression/radware.py +8 -16
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/composite.py +1 -2
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/ndarray.py +4 -5
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/scalar.py +2 -2
- legend_pydataobj-1.10.2/src/lgdo/lh5/_serializers/read/utils.py +174 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/vector_of_vectors.py +1 -1
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/core.py +7 -0
- legend_pydataobj-1.10.2/src/lgdo/lh5/iterator.py +498 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/store.py +16 -2
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/utils.py +16 -42
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/histogram.py +104 -3
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/table.py +2 -2
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/vectorofvectors.py +2 -2
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/compression/conftest.py +1 -1
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/lh5/test_core.py +2 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/lh5/test_lh5_iterator.py +83 -2
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/lh5/test_lh5_store.py +87 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/lh5/test_lh5_write.py +1 -1
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_histogram.py +97 -1
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_vectorofvectors.py +1 -1
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_vovutils.py +1 -1
- legend_pydataobj-1.10.0/src/lgdo/lh5/_serializers/read/utils.py +0 -35
- legend_pydataobj-1.10.0/src/lgdo/lh5/iterator.py +0 -314
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/LICENSE +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/README.md +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/setup.cfg +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/legend_pydataobj.egg-info/SOURCES.txt +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/legend_pydataobj.egg-info/dependency_links.txt +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/legend_pydataobj.egg-info/entry_points.txt +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/legend_pydataobj.egg-info/not-zip-safe +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/legend_pydataobj.egg-info/requires.txt +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/legend_pydataobj.egg-info/top_level.txt +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/__init__.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/cli.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/compression/__init__.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/compression/base.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/compression/generic.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/compression/utils.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/compression/varlen.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lgdo_utils.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/__init__.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/__init__.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/__init__.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/array.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/encoded.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/write/__init__.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/write/array.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/write/composite.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/write/scalar.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/write/vector_of_vectors.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/datatype.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/exceptions.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/tools.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5_store.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/logging.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/__init__.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/array.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/arrayofequalsizedarrays.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/encoded.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/fixedsizearray.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/lgdo.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/scalar.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/struct.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/vovutils.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/types/waveformtable.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/units.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/utils.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/compression/sigcompress/LDQTA_r117_20200110T105115Z_cal_geds_raw-0.dat +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/compression/sigcompress/special-wf-clipped.dat +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/compression/test_compression.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/compression/test_radware_sigcompress.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/compression/test_str2wfcodec.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/compression/test_uleb128_zigzag_diff.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/conftest.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/lh5/conftest.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/lh5/test_lh5_datatype.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/lh5/test_lh5_tools.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/lh5/test_lh5_utils.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/test_cli.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/test_lgdo_utils.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_array.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_arrayofequalsizedarrays.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_encoded.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_fixedsizearray.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_representations.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_scalar.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_struct.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_table.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_table_eval.py +0 -0
- {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/tests/types/test_waveformtable.py +0 -0
@@ -137,6 +137,7 @@ ignore = [
|
|
137
137
|
"PLR2004", # Magic value used in comparison
|
138
138
|
"ISC001", # Conflicts with formatter
|
139
139
|
"PT011",
|
140
|
+
"RUF013", # complains if you default to None for an asinine reason
|
140
141
|
]
|
141
142
|
isort.required-imports = ["from __future__ import annotations"]
|
142
143
|
# Uncomment if using a _compat.typing backport
|
@@ -145,6 +146,7 @@ isort.required-imports = ["from __future__ import annotations"]
|
|
145
146
|
[tool.ruff.lint.per-file-ignores]
|
146
147
|
"tests/**" = ["T20"]
|
147
148
|
"noxfile.py" = ["T20"]
|
149
|
+
"docs/source/notebooks/*" = ["T201", "E402"]
|
148
150
|
|
149
151
|
[tool.pylint]
|
150
152
|
py-version = "3.8"
|
@@ -441,15 +441,11 @@ def _radware_sigcompress_encode(
|
|
441
441
|
while (i < sig_in.size) and (i < j + 48):
|
442
442
|
si_i = int16(sig_in[i] + shift)
|
443
443
|
si_im1 = int16(sig_in[i - 1] + shift)
|
444
|
-
|
445
|
-
|
446
|
-
if min1 > si_i:
|
447
|
-
min1 = si_i
|
444
|
+
max1 = max(max1, si_i)
|
445
|
+
min1 = min(min1, si_i)
|
448
446
|
ds = si_i - si_im1
|
449
|
-
|
450
|
-
|
451
|
-
if min2 > ds:
|
452
|
-
min2 = ds
|
447
|
+
max2 = max(max2, ds)
|
448
|
+
min2 = min(min2, ds)
|
453
449
|
nw += 1
|
454
450
|
i += 1
|
455
451
|
if max1 - min1 <= max2 - min2: # use absolute values
|
@@ -460,15 +456,13 @@ def _radware_sigcompress_encode(
|
|
460
456
|
i < j + 128
|
461
457
|
): # FIXME: 128 could be tuned better?
|
462
458
|
si_i = int16(sig_in[i] + shift)
|
463
|
-
|
464
|
-
max1 = si_i
|
459
|
+
max1 = max(max1, si_i)
|
465
460
|
dd1 = max1 - min1
|
466
461
|
if min1 > si_i:
|
467
462
|
dd1 = max1 - si_i
|
468
463
|
if dd1 > mask[nb1]:
|
469
464
|
break
|
470
|
-
|
471
|
-
min1 = si_i
|
465
|
+
min1 = min(min1, si_i)
|
472
466
|
nw += 1
|
473
467
|
i += 1
|
474
468
|
else: # use difference values
|
@@ -481,15 +475,13 @@ def _radware_sigcompress_encode(
|
|
481
475
|
si_i = int16(sig_in[i] + shift)
|
482
476
|
si_im1 = int16(sig_in[i - 1] + shift)
|
483
477
|
ds = si_i - si_im1
|
484
|
-
|
485
|
-
max2 = ds
|
478
|
+
max2 = max(max2, ds)
|
486
479
|
dd2 = max2 - min2
|
487
480
|
if min2 > ds:
|
488
481
|
dd2 = max2 - ds
|
489
482
|
if dd2 > mask[nb2]:
|
490
483
|
break
|
491
|
-
|
492
|
-
min2 = ds
|
484
|
+
min2 = min(min2, ds)
|
493
485
|
nw += 1
|
494
486
|
i += 1
|
495
487
|
|
{legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/composite.py
RENAMED
@@ -103,8 +103,7 @@ def _h5_read_lgdo(
|
|
103
103
|
if idx is not None:
|
104
104
|
# check if idx is just an ordered list of the integers if so can ignore
|
105
105
|
if (idx == np.arange(0, len(idx), 1)).all():
|
106
|
-
|
107
|
-
n_rows = len(idx)
|
106
|
+
n_rows = min(n_rows, len(idx))
|
108
107
|
idx = None
|
109
108
|
else:
|
110
109
|
# chop off indices < start_row
|
{legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/ndarray.py
RENAMED
@@ -43,15 +43,14 @@ def _h5_read_ndarray(
|
|
43
43
|
if idx is not None:
|
44
44
|
if len(idx) > 0 and idx[-1] >= ds_n_rows:
|
45
45
|
log.warning("idx indexed past the end of the array in the file. Culling...")
|
46
|
-
n_rows_to_read = bisect_left(idx
|
47
|
-
idx =
|
46
|
+
n_rows_to_read = bisect_left(idx, ds_n_rows)
|
47
|
+
idx = idx[:n_rows_to_read]
|
48
48
|
if len(idx) == 0:
|
49
49
|
log.warning("idx empty after culling.")
|
50
50
|
n_rows_to_read = len(idx)
|
51
51
|
else:
|
52
52
|
n_rows_to_read = ds_n_rows - start_row
|
53
|
-
|
54
|
-
n_rows_to_read = n_rows
|
53
|
+
n_rows_to_read = min(n_rows_to_read, n_rows)
|
55
54
|
|
56
55
|
if idx is None:
|
57
56
|
fspace.select_hyperslab(
|
@@ -112,6 +111,6 @@ def _h5_read_ndarray(
|
|
112
111
|
# special handling for bools
|
113
112
|
# (c and Julia store as uint8 so cast to bool)
|
114
113
|
if datatype.get_nested_datatype_string(attrs["datatype"]) == "bool":
|
115
|
-
nda = nda.astype(np.bool_)
|
114
|
+
nda = nda.astype(np.bool_, copy=False)
|
116
115
|
|
117
116
|
return (nda, attrs, n_rows_to_read)
|
{legend_pydataobj-1.10.0 → legend_pydataobj-1.10.2}/src/lgdo/lh5/_serializers/read/scalar.py
RENAMED
@@ -7,7 +7,7 @@ import numpy as np
|
|
7
7
|
|
8
8
|
from ....types import Scalar
|
9
9
|
from ...exceptions import LH5DecodeError
|
10
|
-
from .
|
10
|
+
from . import utils
|
11
11
|
|
12
12
|
log = logging.getLogger(__name__)
|
13
13
|
|
@@ -22,7 +22,7 @@ def _h5_read_scalar(
|
|
22
22
|
sp = h5py.h5s.create(h5py.h5s.SCALAR)
|
23
23
|
h5d.read(sp, sp, value)
|
24
24
|
value = value[()]
|
25
|
-
attrs = read_attrs(h5d, fname, oname)
|
25
|
+
attrs = utils.read_attrs(h5d, fname, oname)
|
26
26
|
|
27
27
|
# special handling for bools
|
28
28
|
# (c and Julia store as uint8 so cast to bool)
|
@@ -0,0 +1,174 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import logging
|
4
|
+
|
5
|
+
import h5py
|
6
|
+
import numpy as np
|
7
|
+
|
8
|
+
from .... import types
|
9
|
+
from ... import datatype
|
10
|
+
from ...exceptions import LH5DecodeError
|
11
|
+
from . import scalar
|
12
|
+
|
13
|
+
log = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
def check_obj_buf_attrs(attrs, new_attrs, fname, oname):
|
17
|
+
if set(attrs.keys()) != set(new_attrs.keys()):
|
18
|
+
msg = (
|
19
|
+
f"existing buffer and new data chunk have different attributes: "
|
20
|
+
f"obj_buf.attrs={attrs} != {fname}[{oname}].attrs={new_attrs}"
|
21
|
+
)
|
22
|
+
raise LH5DecodeError(msg, fname, oname)
|
23
|
+
|
24
|
+
|
25
|
+
def read_attrs(h5o, fname, oname):
|
26
|
+
"""Read all attributes for an hdf5 dataset or group using low level API
|
27
|
+
and return them as a dict. Assume all are strings or scalar types."""
|
28
|
+
attrs = {}
|
29
|
+
for i_attr in range(h5py.h5a.get_num_attrs(h5o)):
|
30
|
+
h5a = h5py.h5a.open(h5o, index=i_attr)
|
31
|
+
name = h5a.get_name().decode()
|
32
|
+
if h5a.shape != ():
|
33
|
+
msg = f"attribute {oname} is not a string or scalar"
|
34
|
+
raise LH5DecodeError(msg, fname, oname)
|
35
|
+
val = np.empty((), h5a.dtype)
|
36
|
+
h5a.read(val)
|
37
|
+
if h5a.get_type().get_class() == h5py.h5t.STRING:
|
38
|
+
attrs[name] = val.item().decode()
|
39
|
+
else:
|
40
|
+
attrs[name] = val.item()
|
41
|
+
h5a.close()
|
42
|
+
return attrs
|
43
|
+
|
44
|
+
|
45
|
+
def read_n_rows(h5o, fname, oname):
|
46
|
+
"""Read number of rows in LH5 object"""
|
47
|
+
if not h5py.h5a.exists(h5o, b"datatype"):
|
48
|
+
msg = "missing 'datatype' attribute"
|
49
|
+
raise LH5DecodeError(msg, fname, oname)
|
50
|
+
|
51
|
+
h5a = h5py.h5a.open(h5o, b"datatype")
|
52
|
+
type_attr = np.empty((), h5a.dtype)
|
53
|
+
h5a.read(type_attr)
|
54
|
+
type_attr = type_attr.item().decode()
|
55
|
+
lgdotype = datatype.datatype(type_attr)
|
56
|
+
|
57
|
+
# scalars are dim-0 datasets
|
58
|
+
if lgdotype is types.Scalar:
|
59
|
+
return None
|
60
|
+
|
61
|
+
# structs don't have rows
|
62
|
+
if lgdotype is types.Struct:
|
63
|
+
return None
|
64
|
+
|
65
|
+
# tables should have elements with all the same length
|
66
|
+
if lgdotype is types.Table:
|
67
|
+
# read out each of the fields
|
68
|
+
rows_read = None
|
69
|
+
for field in datatype.get_struct_fields(type_attr):
|
70
|
+
obj = h5py.h5o.open(h5o, field.encode())
|
71
|
+
n_rows_read = read_n_rows(obj, fname, field)
|
72
|
+
obj.close()
|
73
|
+
if not rows_read:
|
74
|
+
rows_read = n_rows_read
|
75
|
+
elif rows_read != n_rows_read:
|
76
|
+
log.warning(
|
77
|
+
f"'{field}' field in table '{oname}' has {rows_read} rows, "
|
78
|
+
f"{n_rows_read} was expected"
|
79
|
+
)
|
80
|
+
|
81
|
+
return rows_read
|
82
|
+
|
83
|
+
# length of vector of vectors is the length of its cumulative_length
|
84
|
+
if lgdotype is types.VectorOfVectors:
|
85
|
+
obj = h5py.h5o.open(h5o, b"cumulative_length")
|
86
|
+
n_rows = read_n_rows(obj, fname, "cumulative_length")
|
87
|
+
obj.close()
|
88
|
+
return n_rows
|
89
|
+
|
90
|
+
# length of vector of encoded vectors is the length of its decoded_size
|
91
|
+
if lgdotype in (types.VectorOfEncodedVectors, types.ArrayOfEncodedEqualSizedArrays):
|
92
|
+
obj = h5py.h5o.open(h5o, b"encoded_data")
|
93
|
+
n_rows = read_n_rows(obj, fname, "encoded_data")
|
94
|
+
obj.close()
|
95
|
+
return n_rows
|
96
|
+
|
97
|
+
# return array length (without reading the array!)
|
98
|
+
if issubclass(lgdotype, types.Array):
|
99
|
+
# compute the number of rows to read
|
100
|
+
return h5o.get_space().shape[0]
|
101
|
+
|
102
|
+
msg = f"don't know how to read rows of LGDO {lgdotype.__name__}"
|
103
|
+
raise LH5DecodeError(msg, fname, oname)
|
104
|
+
|
105
|
+
|
106
|
+
def read_size_in_bytes(h5o, fname, oname, field_mask=None):
|
107
|
+
"""Read number size in LH5 object in memory (in B)"""
|
108
|
+
if not h5py.h5a.exists(h5o, b"datatype"):
|
109
|
+
msg = "missing 'datatype' attribute"
|
110
|
+
raise LH5DecodeError(msg, fname, oname)
|
111
|
+
|
112
|
+
h5a = h5py.h5a.open(h5o, b"datatype")
|
113
|
+
type_attr = np.empty((), h5a.dtype)
|
114
|
+
h5a.read(type_attr)
|
115
|
+
type_attr = type_attr.item().decode()
|
116
|
+
lgdotype = datatype.datatype(type_attr)
|
117
|
+
|
118
|
+
# scalars are dim-0 datasets
|
119
|
+
if lgdotype in (
|
120
|
+
types.Scalar,
|
121
|
+
types.Array,
|
122
|
+
types.ArrayOfEqualSizedArrays,
|
123
|
+
types.FixedSizeArray,
|
124
|
+
):
|
125
|
+
return int(np.prod(h5o.shape) * h5o.dtype.itemsize)
|
126
|
+
|
127
|
+
# structs don't have rows
|
128
|
+
if lgdotype in (types.Struct, types.Histogram, types.Histogram.Axis):
|
129
|
+
size = 0
|
130
|
+
for key in h5o:
|
131
|
+
obj = h5py.h5o.open(h5o, key)
|
132
|
+
size += read_size_in_bytes(obj, fname, oname, field_mask)
|
133
|
+
obj.close()
|
134
|
+
return size
|
135
|
+
|
136
|
+
# tables should have elements with all the same length
|
137
|
+
if lgdotype in (types.Table, types.WaveformTable):
|
138
|
+
# read out each of the fields
|
139
|
+
size = 0
|
140
|
+
if not field_mask:
|
141
|
+
field_mask = datatype.get_struct_fields(type_attr)
|
142
|
+
for field in field_mask:
|
143
|
+
obj = h5py.h5o.open(h5o, field.encode())
|
144
|
+
size += read_size_in_bytes(obj, fname, field)
|
145
|
+
obj.close()
|
146
|
+
return size
|
147
|
+
|
148
|
+
# length of vector of vectors is the length of its cumulative_length
|
149
|
+
if lgdotype is types.VectorOfVectors:
|
150
|
+
size = 0
|
151
|
+
obj = h5py.h5o.open(h5o, b"cumulative_length")
|
152
|
+
size += read_size_in_bytes(obj, fname, "cumulative_length")
|
153
|
+
obj.close()
|
154
|
+
obj = h5py.h5o.open(h5o, b"flattened_data")
|
155
|
+
size += read_size_in_bytes(obj, fname, "flattened_data")
|
156
|
+
obj.close()
|
157
|
+
return size
|
158
|
+
|
159
|
+
# length of vector of encoded vectors is the length of its decoded_size
|
160
|
+
if lgdotype is types.ArrayOfEncodedEqualSizedArrays:
|
161
|
+
obj = h5py.h5o.open(h5o, b"decoded_size")
|
162
|
+
size = scalar._h5_read_scalar(obj, fname, "decoded_size")[0].value
|
163
|
+
obj.close()
|
164
|
+
|
165
|
+
obj = h5py.h5o.open(h5o, b"encoded_data")
|
166
|
+
cl = h5py.h5o.open(obj, b"cumulative_length")
|
167
|
+
size *= cl.shape[0]
|
168
|
+
size *= 4 # TODO: UPDATE WHEN CODECS SUPPORT MORE DTYPES
|
169
|
+
obj.close()
|
170
|
+
|
171
|
+
return size
|
172
|
+
|
173
|
+
msg = f"don't know how to read size of LGDO {lgdotype.__name__}"
|
174
|
+
raise LH5DecodeError(msg, fname, oname)
|
@@ -156,7 +156,7 @@ def _h5_read_vector_of_vectors(
|
|
156
156
|
# grow fd_buf if necessary to hold the data
|
157
157
|
fdb_size = fd_buf_start + fd_n_rows
|
158
158
|
if len(fd_buf) < fdb_size:
|
159
|
-
fd_buf.resize(fdb_size)
|
159
|
+
fd_buf.nda.resize(fdb_size, refcheck=False)
|
160
160
|
|
161
161
|
# now read
|
162
162
|
h5o = h5py.h5o.open(h5g, b"flattened_data")
|
@@ -120,6 +120,7 @@ def read(
|
|
120
120
|
lh5_obj = lh5_file[name]
|
121
121
|
else:
|
122
122
|
lh5_files = list(lh5_file)
|
123
|
+
|
123
124
|
n_rows_read = 0
|
124
125
|
obj_buf_is_new = False
|
125
126
|
|
@@ -175,6 +176,9 @@ def read(
|
|
175
176
|
|
176
177
|
if isinstance(idx, (list, tuple)) and len(idx) > 0 and not np.isscalar(idx[0]):
|
177
178
|
idx = idx[0]
|
179
|
+
if isinstance(idx, np.ndarray) and idx.dtype == np.dtype("?"):
|
180
|
+
idx = np.where(idx)[0]
|
181
|
+
|
178
182
|
obj, n_rows_read = _serializers._h5_read_lgdo(
|
179
183
|
lh5_obj.id,
|
180
184
|
lh5_obj.file.filename,
|
@@ -350,5 +354,8 @@ def read_as(
|
|
350
354
|
# NOTE: providing a buffer does not make much sense
|
351
355
|
obj = read(name, lh5_file, **kwargs1)
|
352
356
|
|
357
|
+
if isinstance(obj, tuple):
|
358
|
+
obj = obj[0]
|
359
|
+
|
353
360
|
# and finally return a view
|
354
361
|
return obj.view_as(library, **kwargs2)
|