legend-pydataobj 1.10.0__tar.gz → 1.10.1__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.
Files changed (94) hide show
  1. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/PKG-INFO +1 -1
  2. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/pyproject.toml +2 -0
  3. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/legend_pydataobj.egg-info/PKG-INFO +1 -1
  4. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/_version.py +2 -2
  5. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/compression/radware.py +8 -16
  6. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/read/composite.py +1 -2
  7. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/read/ndarray.py +4 -5
  8. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/read/scalar.py +2 -2
  9. legend_pydataobj-1.10.1/src/lgdo/lh5/_serializers/read/utils.py +174 -0
  10. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/read/vector_of_vectors.py +1 -1
  11. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/core.py +3 -0
  12. legend_pydataobj-1.10.1/src/lgdo/lh5/iterator.py +498 -0
  13. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/store.py +16 -2
  14. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/utils.py +16 -42
  15. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/histogram.py +104 -3
  16. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/table.py +2 -2
  17. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/vectorofvectors.py +1 -1
  18. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/compression/conftest.py +1 -1
  19. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/lh5/test_lh5_iterator.py +83 -2
  20. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/lh5/test_lh5_store.py +87 -0
  21. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/lh5/test_lh5_write.py +1 -1
  22. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_histogram.py +97 -1
  23. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_vectorofvectors.py +1 -1
  24. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_vovutils.py +1 -1
  25. legend_pydataobj-1.10.0/src/lgdo/lh5/_serializers/read/utils.py +0 -35
  26. legend_pydataobj-1.10.0/src/lgdo/lh5/iterator.py +0 -314
  27. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/LICENSE +0 -0
  28. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/README.md +0 -0
  29. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/setup.cfg +0 -0
  30. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/legend_pydataobj.egg-info/SOURCES.txt +0 -0
  31. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/legend_pydataobj.egg-info/dependency_links.txt +0 -0
  32. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/legend_pydataobj.egg-info/entry_points.txt +0 -0
  33. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/legend_pydataobj.egg-info/not-zip-safe +0 -0
  34. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/legend_pydataobj.egg-info/requires.txt +0 -0
  35. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/legend_pydataobj.egg-info/top_level.txt +0 -0
  36. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/__init__.py +0 -0
  37. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/cli.py +0 -0
  38. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/compression/__init__.py +0 -0
  39. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/compression/base.py +0 -0
  40. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/compression/generic.py +0 -0
  41. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/compression/utils.py +0 -0
  42. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/compression/varlen.py +0 -0
  43. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lgdo_utils.py +0 -0
  44. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/__init__.py +0 -0
  45. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/__init__.py +0 -0
  46. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/read/__init__.py +0 -0
  47. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/read/array.py +0 -0
  48. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/read/encoded.py +0 -0
  49. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/write/__init__.py +0 -0
  50. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/write/array.py +0 -0
  51. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/write/composite.py +0 -0
  52. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/write/scalar.py +0 -0
  53. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/_serializers/write/vector_of_vectors.py +0 -0
  54. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/datatype.py +0 -0
  55. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/exceptions.py +0 -0
  56. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5/tools.py +0 -0
  57. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/lh5_store.py +0 -0
  58. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/logging.py +0 -0
  59. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/__init__.py +0 -0
  60. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/array.py +0 -0
  61. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/arrayofequalsizedarrays.py +0 -0
  62. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/encoded.py +0 -0
  63. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/fixedsizearray.py +0 -0
  64. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/lgdo.py +0 -0
  65. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/scalar.py +0 -0
  66. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/struct.py +0 -0
  67. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/vovutils.py +0 -0
  68. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/types/waveformtable.py +0 -0
  69. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/units.py +0 -0
  70. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/src/lgdo/utils.py +0 -0
  71. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/compression/sigcompress/LDQTA_r117_20200110T105115Z_cal_geds_raw-0.dat +0 -0
  72. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/compression/sigcompress/special-wf-clipped.dat +0 -0
  73. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/compression/test_compression.py +0 -0
  74. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/compression/test_radware_sigcompress.py +0 -0
  75. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/compression/test_str2wfcodec.py +0 -0
  76. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/compression/test_uleb128_zigzag_diff.py +0 -0
  77. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/conftest.py +0 -0
  78. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/lh5/conftest.py +0 -0
  79. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/lh5/test_core.py +0 -0
  80. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/lh5/test_lh5_datatype.py +0 -0
  81. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/lh5/test_lh5_tools.py +0 -0
  82. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/lh5/test_lh5_utils.py +0 -0
  83. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/test_cli.py +0 -0
  84. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/test_lgdo_utils.py +0 -0
  85. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_array.py +0 -0
  86. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_arrayofequalsizedarrays.py +0 -0
  87. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_encoded.py +0 -0
  88. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_fixedsizearray.py +0 -0
  89. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_representations.py +0 -0
  90. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_scalar.py +0 -0
  91. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_struct.py +0 -0
  92. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_table.py +0 -0
  93. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_table_eval.py +0 -0
  94. {legend_pydataobj-1.10.0 → legend_pydataobj-1.10.1}/tests/types/test_waveformtable.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: legend_pydataobj
3
- Version: 1.10.0
3
+ Version: 1.10.1
4
4
  Summary: LEGEND Python Data Objects
5
5
  Author: The LEGEND Collaboration
6
6
  Maintainer: The LEGEND Collaboration
@@ -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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: legend_pydataobj
3
- Version: 1.10.0
3
+ Version: 1.10.1
4
4
  Summary: LEGEND Python Data Objects
5
5
  Author: The LEGEND Collaboration
6
6
  Maintainer: The LEGEND Collaboration
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.10.0'
16
- __version_tuple__ = version_tuple = (1, 10, 0)
15
+ __version__ = version = '1.10.1'
16
+ __version_tuple__ = version_tuple = (1, 10, 1)
@@ -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
- if max1 < si_i:
445
- max1 = si_i
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
- if max2 < ds:
450
- max2 = ds
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
- if max1 < si_i:
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
- if min1 > si_i:
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
- if max2 < ds:
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
- if min2 > ds:
492
- min2 = ds
484
+ min2 = min(min2, ds)
493
485
  nw += 1
494
486
  i += 1
495
487
 
@@ -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
- if n_rows > len(idx):
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
@@ -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[0], ds_n_rows)
47
- idx = (idx[:n_rows_to_read],)
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
- if n_rows_to_read > n_rows:
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)
@@ -7,7 +7,7 @@ import numpy as np
7
7
 
8
8
  from ....types import Scalar
9
9
  from ...exceptions import LH5DecodeError
10
- from .utils import read_attrs
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")
@@ -175,6 +175,9 @@ def read(
175
175
 
176
176
  if isinstance(idx, (list, tuple)) and len(idx) > 0 and not np.isscalar(idx[0]):
177
177
  idx = idx[0]
178
+ if isinstance(idx, np.ndarray) and idx.dtype == np.dtype("?"):
179
+ idx = np.where(idx)[0]
180
+
178
181
  obj, n_rows_read = _serializers._h5_read_lgdo(
179
182
  lh5_obj.id,
180
183
  lh5_obj.file.filename,