reboost 0.4.3__py3-none-any.whl → 0.5.1__py3-none-any.whl

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.
reboost/__init__.py CHANGED
@@ -1,5 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from lgdo import lh5
4
+
3
5
  from . import build_hit, core, iterator, math, shape
4
6
  from ._version import version as __version__
5
7
 
@@ -15,3 +17,5 @@ __all__ = [
15
17
  "optmap",
16
18
  "shape",
17
19
  ]
20
+
21
+ lh5.settings.DEFAULT_HDF5_SETTINGS = {"shuffle": True, "compression": "lzf"}
reboost/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.4.3'
21
- __version_tuple__ = version_tuple = (0, 4, 3)
20
+ __version__ = version = '0.5.1'
21
+ __version_tuple__ = version_tuple = (0, 5, 1)
reboost/build_evt.py CHANGED
@@ -102,9 +102,9 @@ def build_evt(
102
102
  elif isinstance(info, list):
103
103
  channels[group] = info
104
104
 
105
- for tcm_lh5, _, n_rows_read in LH5Iterator(tcm_file, "tcm", buffer_len=buffer):
105
+ for tcm_lh5 in LH5Iterator(tcm_file, "tcm", buffer_len=buffer):
106
106
  tcm_lh5_sel = tcm_lh5
107
- tcm_ak = tcm_lh5_sel.view_as("ak")[:n_rows_read]
107
+ tcm_ak = tcm_lh5_sel.view_as("ak")
108
108
 
109
109
  tcm = TCMData(
110
110
  id=np.array(ak.flatten(tcm_ak.array_id)),
reboost/build_glm.py CHANGED
@@ -146,13 +146,14 @@ def get_stp_evtids(
146
146
 
147
147
  while start_row < n_rows_tot:
148
148
  # read the file
149
- lh5_obj, n_read = store.read(
149
+ lh5_obj = store.read(
150
150
  f"{lh5_table}/{id_name}",
151
151
  stp_file,
152
152
  start_row=start_row,
153
153
  n_rows=stp_buffer,
154
154
  )
155
155
  evtids = lh5_obj.view_as("ak")
156
+ n_read = len(evtids)
156
157
 
157
158
  # pick the first evtid
158
159
  if evtids.ndim > 1:
@@ -247,9 +248,9 @@ def build_glm(
247
248
  vfield = f"vtx/{id_name}"
248
249
 
249
250
  # iterate over the vertex table
250
- for vert_obj, vidx, n_evtid in LH5Iterator(stp_file, vfield, buffer_len=evtid_buffer):
251
+ for vidx, vert_obj in enumerate(LH5Iterator(stp_file, vfield, buffer_len=evtid_buffer)):
251
252
  # range of vertices
252
- vert_ak = vert_obj.view_as("ak")[:n_evtid]
253
+ vert_ak = vert_obj.view_as("ak")
253
254
 
254
255
  msg = f"... read chunk {vidx}"
255
256
  log.debug(msg)
reboost/build_hit.py CHANGED
@@ -41,10 +41,6 @@ A :func:`build_hit` to parse the following configuration file:
41
41
  phyvol: OBJECTS.geometry.physical_volume_dict[DETECTOR]
42
42
  drift_time_map: lgdo.lh5.read(DETECTOR, ARGS.dtmap_file)
43
43
 
44
- # this defines "hits", i.e. layout of the output hit table
45
- # group steps by time and evtid with 10us window
46
- hit_table_layout: reboost.shape.group_by_time(STEPS, window=10)
47
-
48
44
  # finally, the processing chain
49
45
  operations:
50
46
 
@@ -190,7 +186,6 @@ def build_hit(
190
186
  *,
191
187
  start_evtid: int = 0,
192
188
  n_evtid: int | None = None,
193
- in_field: str = "stp",
194
189
  out_field: str = "hit",
195
190
  buffer: int = int(5e6),
196
191
  overwrite: bool = False,
@@ -214,8 +209,6 @@ def build_hit(
214
209
  first evtid to read.
215
210
  n_evtid
216
211
  number of evtid to read, if `None` read all.
217
- in_field
218
- name of the input field in the remage output.
219
212
  out_field
220
213
  name of the output field
221
214
  buffer
@@ -280,13 +273,17 @@ def build_hit(
280
273
  time_dict=time_dict[proc_name],
281
274
  )
282
275
 
276
+ lh5_group = proc_group.get("lh5_group", "stp")
277
+ if lh5_group is None:
278
+ lh5_group = "/"
279
+
283
280
  # begin iterating over the glm
284
281
  iterator = GLMIterator(
285
282
  glm_file,
286
283
  stp_file,
287
284
  lh5_group=in_detector,
288
285
  start_row=start_evtid,
289
- stp_field=in_field,
286
+ stp_field=lh5_group,
290
287
  n_rows=n_evtid,
291
288
  buffer=buffer,
292
289
  time_dict=time_dict[proc_name],
@@ -396,7 +393,7 @@ def build_hit(
396
393
  lh5.read(obj, stp_file),
397
394
  obj,
398
395
  files.hit[file_idx],
399
- wo_mode="write_safe",
396
+ wo_mode="write_safe" if file_idx == 0 else "append",
400
397
  )
401
398
  except LH5EncodeError as e:
402
399
  msg = f"cannot forward object {obj} as it has been already processed by reboost"
reboost/cli.py CHANGED
@@ -103,7 +103,6 @@ def cli(args=None) -> None:
103
103
  hit_parser.add_argument(
104
104
  "--n-evtid", type=int, default=None, help="Number of event id to process."
105
105
  )
106
- hit_parser.add_argument("--in-field", type=str, default="stp", help="Input field name.")
107
106
  hit_parser.add_argument("--out-field", type=str, default="hit", help="Output field name.")
108
107
  hit_parser.add_argument("--buffer", type=int, default=int(5e6), help="Buffer size.")
109
108
 
@@ -174,7 +173,6 @@ def cli(args=None) -> None:
174
173
  msg += f" hit files: {hit_files}\n"
175
174
  msg += f" start_evtid: {args.start_evtid}\n"
176
175
  msg += f" n_evtid: {args.n_evtid}\n"
177
- msg += f" in_field: {args.in_field}\n"
178
176
  msg += f" out_field: {args.out_field}\n"
179
177
  msg += f" buffer: {args.buffer} \n"
180
178
  msg += f" overwrite: {args.overwrite} \n"
@@ -189,7 +187,6 @@ def cli(args=None) -> None:
189
187
  hit_files=hit_files,
190
188
  start_evtid=args.start_evtid,
191
189
  n_evtid=args.n_evtid,
192
- in_field=args.in_field,
193
190
  out_field=args.out_field,
194
191
  buffer=args.buffer,
195
192
  overwrite=args.overwrite,
reboost/iterator.py CHANGED
@@ -139,12 +139,14 @@ class GLMIterator:
139
139
 
140
140
  if self.use_glm:
141
141
  if self.glm_file is not None:
142
- glm_rows, n_rows_read = self.sto.read(
142
+ glm_rows = self.sto.read(
143
143
  f"glm/{self.lh5_group}",
144
144
  self.glm_file,
145
145
  start_row=self.start_row_tmp,
146
146
  n_rows=n_rows,
147
147
  )
148
+ n_rows_read = len(glm_rows.view_as("ak"))
149
+
148
150
  else:
149
151
  # get the maximum row to read
150
152
  max_row = self.start_row_tmp + n_rows
@@ -198,12 +200,14 @@ class GLMIterator:
198
200
  time_start = time.time()
199
201
 
200
202
  try:
201
- stp_rows, n_steps = self.sto.read(
203
+ stp_rows = self.sto.read(
202
204
  f"{self.stp_field}/{self.lh5_group}",
203
205
  self.stp_file,
204
206
  start_row=int(start),
205
207
  n_rows=int(n),
206
208
  )
209
+ n_steps = len(stp_rows.view_as("ak"))
210
+
207
211
  except OverflowError:
208
212
  raise StopIteration from None
209
213
 
@@ -356,9 +356,9 @@ def convolve(
356
356
 
357
357
  log.info("opening energy deposition hit output %s", edep_file)
358
358
  it = LH5Iterator(edep_file, edep_path, buffer_len=buffer_len)
359
- for it_count, (edep_lgdo, edep_events, edep_n_rows) in enumerate(it):
360
- assert (it_count == 0) == (edep_events == 0)
361
- edep_df = edep_lgdo.view_as("pd").iloc[0:edep_n_rows].to_records()
359
+
360
+ for it_count, edep_lgdo in enumerate(it):
361
+ edep_df = edep_lgdo.view_as("pd").iloc.to_records()
362
362
 
363
363
  log.info("start event processing (%d)", it_count)
364
364
  output_map = iterate_stepwise_depositions(
reboost/optmap/create.py CHANGED
@@ -130,9 +130,8 @@ def _create_optical_maps_chunk(
130
130
 
131
131
  hits_per_primary = np.zeros(10, dtype=np.int64)
132
132
  hits_per_primary_len = 0
133
- for it_count, (events_lgdo, events_entry, event_n_rows) in enumerate(optmap_events_it):
134
- assert (it_count == 0) == (events_entry == 0)
135
- optmap_events = events_lgdo.view_as("pd").iloc[0:event_n_rows]
133
+ for it_count, events_lgdo in enumerate(optmap_events_it):
134
+ optmap_events = events_lgdo.view_as("pd").iloc
136
135
  hitcounts = optmap_events[all_det_ids].to_numpy()
137
136
  loc = optmap_events[["xloc", "yloc", "zloc"]].to_numpy()
138
137
 
reboost/optmap/evt.py CHANGED
@@ -80,8 +80,8 @@ def build_optmap_evt(
80
80
  _store_vert_df()
81
81
 
82
82
  # read the next vertex chunk into memory.
83
- (vert_lgdo, vert_entry, vert_n_rows) = next(vert_it)
84
- vert_df = vert_lgdo.view_as("pd").iloc[0:vert_n_rows]
83
+ (vert_lgdo, vert_entry) = next(vert_it)
84
+ vert_df = vert_lgdo.view_as("pd").iloc
85
85
 
86
86
  # prepare vertex coordinates.
87
87
  vert_df = vert_df.set_index("evtid", drop=True).drop(["n_part", "time"], axis=1)
@@ -94,9 +94,8 @@ def build_optmap_evt(
94
94
  log.info("prepare evt table")
95
95
  # use smaller integer type uint8 to spare RAM when storing types.
96
96
  hit_count_type = np.uint8
97
- for opti_it_count, (opti_lgdo, opti_entry, opti_n_rows) in enumerate(opti_it):
98
- assert (opti_it_count == 0) == (opti_entry == 0)
99
- opti_df = opti_lgdo.view_as("pd").iloc[0:opti_n_rows]
97
+ for opti_it_count, opti_lgdo in enumerate(opti_it):
98
+ opti_df = opti_lgdo.view_as("pd").iloc
100
99
 
101
100
  log.info("build evt table (%d)", opti_it_count)
102
101
  for t in opti_df[["evtid", "det_uid"]].itertuples(name=None, index=False):
reboost/utils.py CHANGED
@@ -30,7 +30,9 @@ def get_wo_mode(
30
30
  return "overwrite_file" if overwrite else "write_safe"
31
31
 
32
32
  # if we have a detector not the first and chunk 0 append column
33
- if ((in_det > 0) or (out_det > 0)) & (chunk == 0):
33
+ is_append = ((in_det > 0) or (out_det > 0)) & (chunk == 0)
34
+ is_append = is_append or (in_det == 0 and out_det == 0 and chunk == 0 and group > 0)
35
+ if is_append:
34
36
  return "append_column"
35
37
  return "append"
36
38
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reboost
3
- Version: 0.4.3
3
+ Version: 0.5.1
4
4
  Summary: New LEGEND Monte-Carlo simulation post-processing
5
5
  Author-email: Manuel Huber <info@manuelhu.de>, Toby Dixon <toby.dixon.23@ucl.ac.uk>, Luigi Pertoldi <gipert@pm.me>
6
6
  Maintainer: The LEGEND Collaboration
@@ -700,7 +700,7 @@ Requires-Dist: colorlog
700
700
  Requires-Dist: numpy
701
701
  Requires-Dist: scipy
702
702
  Requires-Dist: numba
703
- Requires-Dist: legend-pydataobj>=1.11.10
703
+ Requires-Dist: legend-pydataobj>=1.12.0
704
704
  Requires-Dist: legend-pygeom-optics>=0.6.5
705
705
  Requires-Dist: hist
706
706
  Requires-Dist: dbetto
@@ -1,16 +1,15 @@
1
- reboost/__init__.py,sha256=2Lc9Idexf1S3IQvHQS1LPD-SCud7Mnmpr2dJ6U-ThvU,303
2
- reboost/_version.py,sha256=zJwW9_MgFPmVYNh3YnSsdJ4y2EqGvu1bzYeID1Rrd0A,511
3
- reboost/build_evt.py,sha256=NuI5HRaA4vQApZWPTzfNeUxUhzLfaubLKr6ZT7KWCEI,4809
4
- reboost/build_glm.py,sha256=-MbPTaUdXlmBml1yzvDB1ddfCh2Vjtvblo3GWo_KzrY,9537
5
- reboost/build_hit.py,sha256=e0aSNIlbYIsO43jVXTEIJIMHAOGEnkHieWS1XGgpOkc,15247
6
- reboost/build_tcm.py,sha256=jeuyyVpXYMmvJp2lUKewhbU2diV-_d5fFlkA3Zv2JFU,2956
7
- reboost/cli.py,sha256=YZvCaxkU0VA_xMAeyw1PN_x17RUkl8uzv19nkNkz3kE,6509
1
+ reboost/__init__.py,sha256=0xtTxM_T8Sp6U3-EJRgFZ6WuqPk31QGQms7jhwouhvs,403
2
+ reboost/_version.py,sha256=HAyT1n_bawwWJ8KZ9BPQ7noEsDs3TEVVzFKchoJw0NQ,511
3
+ reboost/build_evt.py,sha256=TnJRiZ2O6eChorZeh-_SGgWa9jZQYAl_SsmJsM-wYrY,4779
4
+ reboost/build_glm.py,sha256=uYoKl8U5gHy4oW1Neik5F_1jy5yhnFKS1ezVBA-vQaQ,9550
5
+ reboost/build_hit.py,sha256=z3ZpQ18ihOPlurdgOeR471woOgCs6wtZrAN8AWDL9Io,15120
6
+ reboost/cli.py,sha256=HZgqUZK0tSmnlGqoXjrbmLitW_i001TzibxvDrRxLLg,6324
8
7
  reboost/core.py,sha256=B577b5KzAYpGI7c4eCxIRKgt9tq6hwVr2-DtYTml1e8,12826
9
- reboost/iterator.py,sha256=YFsNjC2Onsyhvkogbs79eD8iqstCdCAfFEaEOMr_ujg,6810
8
+ reboost/iterator.py,sha256=J--4f7ANW15Nb4kL_OQ0kbIw7U0ks73asefLd-uGoV4,6898
10
9
  reboost/log_utils.py,sha256=VqS_9OC5NeNU3jcowVOBB0NJ6ssYvNWnirEY-JVduEA,766
11
10
  reboost/profile.py,sha256=EOTmjmS8Rm_nYgBWNh6Rntl2XDsxdyed7yEdWtsZEeg,2598
12
11
  reboost/units.py,sha256=3EH8XlpbsObdu5vLgxhm1600L6UNYD5jng4SjJT_1QE,2202
13
- reboost/utils.py,sha256=MjnZNXP80gD3DGFfNEdT-WyiTsA1GRMElYsoW5hX4v8,9705
12
+ reboost/utils.py,sha256=0xU68p0YSnDKTyLdso8zX4JYrGTVCjIiTBx7cuSCz98,9820
14
13
  reboost/hpge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
14
  reboost/hpge/psd.py,sha256=jAUAoQ_PMz76wyA1NXYHNKtOwoCnRT3My8_LCFrKi-U,13860
16
15
  reboost/hpge/surface.py,sha256=lbWcFnFFWKxtFKs755GyM9US_IfyxaoM6MpOIZgIMM0,7478
@@ -20,9 +19,9 @@ reboost/math/functions.py,sha256=OymiYTcA0NXxxm-MBDw5kqyNwHoLCmuv4J48AwnSrbU,563
20
19
  reboost/math/stats.py,sha256=iiOEi87x93kqPWeSmlRiA5Oe-R8XR-plm6Z532PhC9M,1401
21
20
  reboost/optmap/__init__.py,sha256=imvuyld-GLw8qdwqW-lXCg2feptcTyQo3wIzPvDHwmY,93
22
21
  reboost/optmap/cli.py,sha256=SzbPRgsbR5Llm3aSJubH02Ym8FQyTH7kvuLjK7faLiY,9572
23
- reboost/optmap/convolve.py,sha256=jCH_d04yioB8hsJEPunm0zynA0ne4lx0ldSC1GJG_eY,14129
24
- reboost/optmap/create.py,sha256=Nm5-xEe8M9q2GFQnUv8oN8qpAz9nZArIrQcPboqRmCQ,17153
25
- reboost/optmap/evt.py,sha256=9rfAdN9MqL6UuUxUcMDGVwpcuqRVc2RwmEmd87jgYww,4698
22
+ reboost/optmap/convolve.py,sha256=vj5Wl2M5BeyvLbcnLo8xzaOAIKXUHUu023sXIP7xTCI,14034
23
+ reboost/optmap/create.py,sha256=gd9VWceU0AOX_ABuLvmnAi2GkUdiugNF6CMUT2CbDbE,17053
24
+ reboost/optmap/evt.py,sha256=CRhUXpgnV3nTA6gY-e6V2W2C4K6nJ8AEoW2ffa2ww9s,4571
26
25
  reboost/optmap/mapview.py,sha256=73kpe0_SKDj9bIhEx1ybX1sBP8TyvufiLfps84A_ijA,6798
27
26
  reboost/optmap/numba_pdg.py,sha256=y8cXR5PWE2Liprp4ou7vl9do76dl84vXU52ZJD9_I7A,731
28
27
  reboost/optmap/optmap.py,sha256=j4rfbQ84PYSpE-BvP4Rdt96ZjPdwy8P4e4eZz1mATys,12817
@@ -30,9 +29,9 @@ reboost/shape/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
29
  reboost/shape/cluster.py,sha256=RIvBlhHzp88aaUZGofp5SD9bimnoiqIOddhQ84jiwoM,8135
31
30
  reboost/shape/group.py,sha256=_z2qCOret3E-kj-nrp1-J5j2lEwQpgfYdQp2pgpDHR8,4449
32
31
  reboost/shape/reduction.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- reboost-0.4.3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
34
- reboost-0.4.3.dist-info/METADATA,sha256=KeW1VoCUjCxRuz8nRD5gnkYF-2Z4H53x87V586TmUwM,44251
35
- reboost-0.4.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
- reboost-0.4.3.dist-info/entry_points.txt,sha256=DxhD6BidSWNot9BrejHJjQ7RRLmrMaBIl52T75oWTwM,93
37
- reboost-0.4.3.dist-info/top_level.txt,sha256=q-IBsDepaY_AbzbRmQoW8EZrITXRVawVnNrB-_zyXZs,8
38
- reboost-0.4.3.dist-info/RECORD,,
32
+ reboost-0.5.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
33
+ reboost-0.5.1.dist-info/METADATA,sha256=P9dBK9bEPeiEEzYWtrzjiDf5q14NKG9GRCYzLYT0piU,44250
34
+ reboost-0.5.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
35
+ reboost-0.5.1.dist-info/entry_points.txt,sha256=DxhD6BidSWNot9BrejHJjQ7RRLmrMaBIl52T75oWTwM,93
36
+ reboost-0.5.1.dist-info/top_level.txt,sha256=q-IBsDepaY_AbzbRmQoW8EZrITXRVawVnNrB-_zyXZs,8
37
+ reboost-0.5.1.dist-info/RECORD,,
reboost/build_tcm.py DELETED
@@ -1,111 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import logging
4
- import re
5
-
6
- import awkward as ak
7
- from lgdo import Table, lh5
8
-
9
- from .shape import group
10
-
11
- log = logging.getLogger(__name__)
12
-
13
-
14
- def build_tcm(
15
- hit_file: str,
16
- out_file: str,
17
- channels: list[str],
18
- time_name: str = "t0",
19
- idx_name: str = "global_evtid",
20
- time_window_in_us: float = 10,
21
- ) -> None:
22
- """Build the (Time Coincidence Map) TCM from the hit tier.
23
-
24
- Parameters
25
- ----------
26
- hit_file
27
- path to hit tier file.
28
- out_file
29
- output path for tcm.
30
- channels
31
- list of channel names to include.
32
- time_name
33
- name of the hit tier field used for time grouping.
34
- idx_name
35
- name of the hit tier field used for index grouping.
36
- time_window_in_us
37
- time window used to define the grouping.
38
- """
39
- hash_func = r"\d+"
40
-
41
- msg = "start building time-coincidence map"
42
- log.info(msg)
43
-
44
- chan_ids = [re.search(hash_func, channel).group() for channel in channels]
45
-
46
- hit_data = []
47
- for channel in channels:
48
- hit_data.append(
49
- lh5.read(f"{channel}/hit", hit_file, field_mask=[idx_name, time_name]).view_as("ak")
50
- )
51
- tcm = get_tcm_from_ak(
52
- hit_data, chan_ids, window=time_window_in_us, time_name=time_name, idx_name=idx_name
53
- )
54
-
55
- if tcm is not None:
56
- lh5.write(tcm, "tcm", out_file, wo_mode="overwrite_file")
57
-
58
-
59
- def get_tcm_from_ak(
60
- hit_data: list[ak.Array],
61
- channels: list[int],
62
- *,
63
- window: float = 10,
64
- time_name: str = "t0",
65
- idx_name: str = "global_evtid",
66
- ) -> Table:
67
- """Builds a time-coincidence map from a hit of hit data Tables.
68
-
69
- - build an ak.Array of the data merging channels with fields base on "time_name", and "idx_name" and adding a field `rawid` from the channel idx, also add the row (`hit_idx`)
70
- - sorts this array by "idx_name" then "time_name" fields
71
- - group by "idx_name" and "time_name" based on the window parameter
72
-
73
- Parameters
74
- ----------
75
- hit_data
76
- list of hit tier data for each channel
77
- channels
78
- list of channel indices
79
- window
80
- time window for selecting coincidences (in us)
81
- time_name
82
- name of the field for time information
83
- idx_name
84
- name of the decay index field
85
-
86
- Returns
87
- -------
88
- an LGDO.VectorOfVectors containing the time-coincidence map
89
- """
90
- # build ak_obj for sorting
91
- sort_objs = []
92
-
93
- for ch_idx, data_tmp in zip(channels, hit_data):
94
- obj_tmp = ak.copy(data_tmp)
95
- obj_tmp = obj_tmp[[time_name, idx_name]]
96
- hit_idx = ak.local_index(obj_tmp)
97
-
98
- obj_tmp = ak.with_field(obj_tmp, hit_idx, "array_idx")
99
-
100
- obj_tmp["array_id"] = int(ch_idx)
101
- sort_objs.append(obj_tmp)
102
-
103
- obj_tot = ak.concatenate(sort_objs)
104
-
105
- return group.group_by_time(
106
- obj_tot,
107
- time_name=time_name,
108
- evtid_name=idx_name,
109
- window=window,
110
- fields=["array_id", "array_idx"],
111
- )