16
16
H5DataLoc = namedtuple (
17
17
"H5DataLoc" , ("file" , "group" , "table_fmt" ), defaults = 3 * (None ,)
18
18
)
19
-
20
- DataInfo = namedtuple (
21
- "DataInfo" , ("raw" , "tcm" , "dsp" , "hit" , "evt" ), defaults = 5 * (None ,)
22
- )
19
+ DataInfo = namedtuple ("DataInfo" , ("raw" , "tcm" , "evt" ), defaults = 3 * (None ,))
23
20
24
21
TCMData = namedtuple ("TCMData" , ("id" , "idx" , "cumulative_length" ))
25
22
26
23
27
24
def make_files_config (data : dict ):
28
- if not isinstance (data , DataInfo ):
25
+ if not isinstance (data , tuple ):
26
+ if "raw" not in data :
27
+ data ["raw" ] = (None ,)
28
+ if "tcm" not in data :
29
+ data ["tcm" ] = (None ,)
30
+ if "evt" not in data :
31
+ data ["evt" ] = (None ,)
32
+ DataInfo = namedtuple (
33
+ "DataInfo" , tuple (data .keys ()), defaults = len (data .keys ()) * (None ,)
34
+ )
29
35
return DataInfo (
30
36
* [
31
37
H5DataLoc (* data [tier ]) if tier in data else H5DataLoc ()
@@ -72,7 +78,7 @@ def find_parameters(
72
78
idx_ch ,
73
79
field_list ,
74
80
) -> dict :
75
- """Finds and returns parameters from `hit` and `dsp ` tiers.
81
+ """Finds and returns parameters from non `tcm`, `evt ` tiers.
76
82
77
83
Parameters
78
84
----------
@@ -83,43 +89,38 @@ def find_parameters(
83
89
idx_ch
84
90
index array of entries to be read from datainfo.
85
91
field_list
86
- list of tuples ``(tier, field)`` to be found in the `hit/dsp ` tiers.
92
+ list of tuples ``(tier, field)`` to be found in non `tcm`, `evt ` tiers.
87
93
"""
88
94
f = make_files_config (datainfo )
89
95
90
- # find fields in either dsp, hit
91
- dsp_flds = [e [1 ] for e in field_list if e [0 ] == f .dsp .group ]
92
- hit_flds = [e [1 ] for e in field_list if e [0 ] == f .hit .group ]
96
+ final_dict = {}
93
97
94
- hit_dict , dsp_dict = {}, {}
98
+ for name , tier in f ._asdict ().items ():
99
+ if name not in ["tcm" , "evt" ] and tier .file is not None : # skip other tables
100
+ keys = [
101
+ k .split ("/" )[- 1 ]
102
+ for k in lh5 .ls (tier .file , f"{ ch .replace ('/' , '' )} /{ tier .group } /" )
103
+ ]
104
+ flds = [e [1 ] for e in field_list if e [0 ] == name and e [1 ] in keys ]
95
105
96
- if len (hit_flds ) > 0 :
97
- hit_ak = lh5 .read_as (
98
- f"{ ch .replace ('/' , '' )} /{ f . hit .group } /" ,
99
- f . hit .file ,
100
- field_mask = hit_flds ,
101
- idx = idx_ch ,
102
- library = "ak" ,
103
- )
106
+ if len (flds ) > 0 :
107
+ tier_ak = lh5 .read_as (
108
+ f"{ ch .replace ('/' , '' )} /{ tier .group } /" ,
109
+ tier .file ,
110
+ field_mask = flds ,
111
+ idx = idx_ch ,
112
+ library = "ak" ,
113
+ )
104
114
105
- hit_dict = dict (
106
- zip ([f"{ f .hit .group } _" + e for e in ak .fields (hit_ak )], ak .unzip (hit_ak ))
107
- )
115
+ tier_dict = dict (
116
+ zip (
117
+ [f"{ name } _" + e for e in ak .fields (tier_ak )],
118
+ ak .unzip (tier_ak ),
119
+ )
120
+ )
121
+ final_dict = final_dict | tier_dict
108
122
109
- if len (dsp_flds ) > 0 :
110
- dsp_ak = lh5 .read_as (
111
- f"{ ch .replace ('/' , '' )} /{ f .dsp .group } /" ,
112
- f .dsp .file ,
113
- field_mask = dsp_flds ,
114
- idx = idx_ch ,
115
- library = "ak" ,
116
- )
117
-
118
- dsp_dict = dict (
119
- zip ([f"{ f .dsp .group } _" + e for e in ak .fields (dsp_ak )], ak .unzip (dsp_ak ))
120
- )
121
-
122
- return hit_dict | dsp_dict
123
+ return final_dict
123
124
124
125
125
126
def get_data_at_channel (
@@ -178,10 +179,16 @@ def get_data_at_channel(
178
179
179
180
# evaluate expression
180
181
# move tier+dots in expression to underscores (e.g. evt.foo -> evt_foo)
182
+
183
+ new_expr = expr
184
+ for name in f ._asdict ():
185
+ if name == "evt" :
186
+ new_expr = new_expr .replace (f"{ name } ." , "" )
187
+ elif name not in ["tcm" , "raw" ]:
188
+ new_expr = new_expr .replace (f"{ name } ." , f"{ name } _" )
189
+
181
190
res = eval (
182
- expr .replace (f"{ f .dsp .group } ." , f"{ f .dsp .group } _" )
183
- .replace (f"{ f .hit .group } ." , f"{ f .hit .group } _" )
184
- .replace (f"{ f .evt .group } ." , "" ),
191
+ new_expr ,
185
192
var ,
186
193
)
187
194
@@ -231,17 +238,23 @@ def get_mask_from_query(
231
238
232
239
# get sub evt based query condition if needed
233
240
if isinstance (query , str ):
234
- query_lst = re .findall (r"(hit|dsp).([a-zA-Z_$][\w$]*)" , query )
241
+ query_lst = re .findall (
242
+ rf"({ '|' .join (f ._asdict ().keys ())} ).([a-zA-Z_$][\w$]*)" , query
243
+ )
235
244
query_var = find_parameters (
236
245
datainfo = datainfo ,
237
246
ch = ch ,
238
247
idx_ch = idx_ch ,
239
248
field_list = query_lst ,
240
249
)
250
+
251
+ new_query = query
252
+ for name in f ._asdict ():
253
+ if name not in ["tcm" , "evt" ]:
254
+ new_query = new_query .replace (f"{ name } ." , f"{ name } _" )
255
+
241
256
limarr = eval (
242
- query .replace (f"{ f .dsp .group } ." , f"{ f .dsp .group } _" ).replace (
243
- f"{ f .hit .group } ." , f"{ f .hit .group } _"
244
- ),
257
+ new_query ,
245
258
query_var ,
246
259
)
247
260
0 commit comments