ATLAS Offline Software
Loading...
Searching...
No Matches
TopoAlgoDef.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2#
3# *** IMPORTANT ***
4# Menu parameter ordering must match that in the L1Topo
5# firmware generation, document this for every algorithm
6# and ensure that addvariable order matches
7# Refer to https://gitlab.cern.ch/atlas-l1calo/l1topo/ph1topo/-/tree/master/src/algo
8
9# algorithm python base classes generated from C++ code
10import L1TopoAlgorithms.L1TopoAlgConfig as AlgConf
11import L1TopoHardware.L1TopoHardware as HW
12from .L1CaloThresholdMapping import get_threshold_cut
13from .L1TopoKFMETweights import KFMETweightParameters
14
15from AthenaCommon.Logging import logging
16log = logging.getLogger(__name__)
17
18from collections import namedtuple
19
21
22 @staticmethod
24
25 # constants and conversions:
26 _no_m_upper_threshold = 1024*1024*10*10*10 # a check against this number in L1Topo FW and sim will disable the upper threshold on MaxMSqr
27 _dr_conversion = 4 # factor 10 already included to remove . from name
28 _et_conversion = 10 # 1 GeV -> 100 MeV. This is to be applied also on the pt threholds for muons. A correction is then done L1/Base/TopoAlgos.py
29 _eta_conversion = 4 # factor 10 already included to remove . from name
30 _phi_conversion = 2 # factor 10 already included to remove . from name
31
32 # eEM inputs
33 # ALL
34 # Parameter ordering:
35 # 1. REtaMin
36 # 2. RHadMin
37 # 3. WsTotMin
38 alg = AlgConf.eEmNoSort( name = 'eEMall', inputs = 'eEmTobs', outputs = 'eEMall' )
39 alg.addgeneric('InputWidth', HW.eEmInputWidth)
40 alg.addgeneric('OutputWidth', HW.eEmInputWidth)
41 alg.addvariable('REtaMin', 0)
42 alg.addvariable('RHadMin', 0)
43 alg.addvariable('WsTotMin', 0)
44 tm.registerTopoAlgo(alg)
45
46 # SORT
47 # Inherited from NoSort
48 alg = AlgConf.eEmSort( name = 'eEMs', inputs = 'eEmTobs', outputs = 'eEMs' )
49 alg.addgeneric('InputWidth', HW.eEmInputWidth)
50 alg.addgeneric('OutputWidth', HW.eEmOutputWidthSort)
51 alg.addvariable('REtaMin', 0)
52 alg.addvariable('RHadMin', 0)
53 alg.addvariable('WsTotMin', 0)
54 tm.registerTopoAlgo(alg)
55
56 alg = AlgConf.eEmSort( name = 'eEMsl', inputs = 'eEmTobs', outputs = 'eEMsl' )
57 alg.addgeneric('InputWidth', HW.eEmInputWidth)
58 alg.addgeneric('OutputWidth', HW.eEmOutputWidthSort)
59 alg.addvariable('REtaMin', 1)
60 alg.addvariable('RHadMin', 1)
61 alg.addvariable('WsTotMin', 1)
62 tm.registerTopoAlgo(alg)
63
64 alg = AlgConf.eEmSort( name = 'eEMsm', inputs = 'eEmTobs', outputs = 'eEMsm' )
65 alg.addgeneric('InputWidth', HW.eEmInputWidth)
66 alg.addgeneric('OutputWidth', HW.eEmOutputWidthSort)
67 alg.addvariable('REtaMin', 2)
68 alg.addvariable('RHadMin', 2)
69 alg.addvariable('WsTotMin', 2)
70 tm.registerTopoAlgo(alg)
71
72 # SELECT
73 # Inherited from NoSort
74 alg = AlgConf.eEmSelect( name = 'eEMab', inputs = 'eEmTobs', outputs = 'eEMab' )
75 alg.addgeneric('InputWidth', HW.eEmInputWidth)
76 alg.addgeneric('OutputWidth', HW.eEmOutputWidthSelect)
77 alg.addvariable('MinET', get_threshold_cut('eEM', 7)*_et_conversion)
78 alg.addvariable('REtaMin', 0)
79 alg.addvariable('RHadMin', 0)
80 alg.addvariable('WsTotMin', 0)
81 tm.registerTopoAlgo(alg)
82
83 alg = AlgConf.eEmSelect( name = 'eEMabl', inputs = 'eEmTobs', outputs = 'eEMabl' )
84 alg.addgeneric('InputWidth', HW.eEmInputWidth)
85 alg.addgeneric('OutputWidth', HW.eEmOutputWidthSelect)
86 alg.addvariable('MinET', get_threshold_cut('eEM', 10)*_et_conversion)
87 alg.addvariable('REtaMin', 1)
88 alg.addvariable('RHadMin', 1)
89 alg.addvariable('WsTotMin', 1)
90 tm.registerTopoAlgo(alg)
91
92 alg = AlgConf.eEmSelect( name = 'eEMabm', inputs = 'eEmTobs', outputs = 'eEMabm' )
93 alg.addgeneric('InputWidth', HW.eEmInputWidth)
94 alg.addgeneric('OutputWidth', HW.eEmOutputWidthSelect)
95 alg.addvariable('MinET', get_threshold_cut('eEM', 10)*_et_conversion)
96 alg.addvariable('REtaMin', 2)
97 alg.addvariable('RHadMin', 2)
98 alg.addvariable('WsTotMin', 2)
99 tm.registerTopoAlgo(alg)
100
101 # eTAU inputs
102 # all
103 # Parameter ordering:
104 # 1. RCoreMin
105 # 2. RHadMin
106 alg = AlgConf.eTauNoSort( name = 'eTAUall', inputs = 'eTauTobs', outputs = 'eTAUall')
107 alg.addgeneric('InputWidth', HW.eTauInputWidth)
108 alg.addgeneric('OutputWidth', HW.eTauInputWidth)
109 alg.addvariable('RCoreMin', 0)
110 alg.addvariable('RHadMin', 0)
111 tm.registerTopoAlgo(alg)
112
113 # SORT
114 # Inherited from NoSort
115 alg = AlgConf.eTauSort( name = 'eTAUs', inputs = 'eTauTobs', outputs = 'eTAUs' )
116 alg.addgeneric('InputWidth', HW.eTauInputWidth)
117 alg.addgeneric('OutputWidth', HW.eTauOutputWidthSort)
118 alg.addvariable('RCoreMin', 0)
119 alg.addvariable('RHadMin', 0)
120 tm.registerTopoAlgo(alg)
121
122 # SELECT
123 # Inherited from NoSort
124 alg = AlgConf.eTauSelect( name = 'eTAUab', inputs = 'eTauTobs', outputs = 'eTAUab' )
125 alg.addgeneric('InputWidth', HW.eTauInputWidth)
126 alg.addgeneric('OutputWidth', HW.eTauOutputWidthSelect)
127 alg.addvariable('MinET', get_threshold_cut('eTAU', 12)*_et_conversion)
128 alg.addvariable('RCoreMin', 0)
129 alg.addvariable('RHadMin', 0)
130 tm.registerTopoAlgo(alg)
131
132 alg = AlgConf.eTauSelect( name = 'eTAUabl', inputs = 'eTauTobs', outputs = 'eTAUabl' )
133 alg.addgeneric('InputWidth', HW.eTauInputWidth)
134 alg.addgeneric('OutputWidth', HW.eTauOutputWidthSelect)
135 alg.addvariable('MinET', get_threshold_cut('eTAU', 12)*_et_conversion)
136 alg.addvariable('RCoreMin', 1)
137 alg.addvariable('RHadMin', 0)
138 tm.registerTopoAlgo(alg)
139
140 alg = AlgConf.eTauSelect( name = 'eTAUabm', inputs = 'eTauTobs', outputs = 'eTAUabm' )
141 alg.addgeneric('InputWidth', HW.eTauInputWidth)
142 alg.addgeneric('OutputWidth', HW.eTauOutputWidthSelect)
143 alg.addvariable('MinET', get_threshold_cut('eTAU', 12)*_et_conversion)
144 alg.addvariable('RCoreMin', 2)
145 alg.addvariable('RHadMin', 0)
146 tm.registerTopoAlgo(alg)
147
148 # Muon inputs
149
150 # SELECT
151 # Parameter order:
152 # 1. MinEtRPC
153 # 2. MinEtTGC
154 # 3. MinEta
155 # 4. MaxEta
156 # 5. InnerCoinCut
157 # 6. FullStationCut
158 # 7. GoodMFieldCut
159
160 alg = AlgConf.MuonSelect( name = 'MU3Vab', inputs = 'MuonTobs', outputs = 'MU3Vab' )
161 alg.addgeneric('InputWidth', HW.muonInputWidth)
162 alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
163 alg.addvariable('MinEtRPC', 4*_et_conversion)
164 alg.addvariable('MinEtTGC', 3*_et_conversion)
165 alg.addvariable('MinEta', 0*_eta_conversion)
166 alg.addvariable('MaxEta', 25*_eta_conversion)
167 alg.addvariable('InnerCoinCut', 0)
168 alg.addvariable('FullStationCut',0)
169 alg.addvariable('GoodMFieldCut', 0)
170 tm.registerTopoAlgo(alg)
171
172 alg = AlgConf.MuonSelect( name = 'MU3VFab', inputs = 'MuonTobs', outputs = 'MU3VFab' )
173 alg.addgeneric('InputWidth', HW.muonInputWidth)
174 alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
175 alg.addvariable('MinEtRPC', 4*_et_conversion)
176 alg.addvariable('MinEtTGC', 3*_et_conversion)
177 alg.addvariable('MinEta', 0*_eta_conversion)
178 alg.addvariable('MaxEta', 25*_eta_conversion)
179 alg.addvariable('InnerCoinCut', 0)
180 alg.addvariable('FullStationCut',1)
181 alg.addvariable('GoodMFieldCut', 0)
182 tm.registerTopoAlgo(alg)
183
184 alg = AlgConf.MuonSelect( name = 'MU5VFab', inputs = 'MuonTobs', outputs = 'MU5VFab' )
185 alg.addgeneric('InputWidth', HW.muonInputWidth)
186 alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
187 alg.addvariable('MinEtRPC', 6*_et_conversion)
188 alg.addvariable('MinEtTGC', 5*_et_conversion)
189 alg.addvariable('MinEta', 0*_eta_conversion)
190 alg.addvariable('MaxEta', 25*_eta_conversion)
191 alg.addvariable('InnerCoinCut', 0)
192 alg.addvariable('FullStationCut',1)
193 alg.addvariable('GoodMFieldCut', 0)
194 tm.registerTopoAlgo(alg)
195
196 alg = AlgConf.MuonSelect( name = 'MU8Fab', inputs = 'MuonTobs', outputs = 'MU8Fab' )
197 alg.addgeneric('InputWidth', HW.muonInputWidth)
198 alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
199 alg.addvariable('MinEtRPC', 8*_et_conversion)
200 alg.addvariable('MinEtTGC', 8*_et_conversion)
201 alg.addvariable('MinEta', 0*_eta_conversion)
202 alg.addvariable('MaxEta', 25*_eta_conversion)
203 alg.addvariable('InnerCoinCut', 0)
204 alg.addvariable('FullStationCut',1)
205 alg.addvariable('GoodMFieldCut', 0)
206 tm.registerTopoAlgo(alg)
207
208 alg = AlgConf.MuonSelect( name = 'CMU3Vab', inputs = 'MuonTobs', outputs = 'CMU3Vab' )
209 alg.addgeneric('InputWidth', HW.muonInputWidth)
210 alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
211 alg.addvariable('MinEtRPC', 4*_et_conversion)
212 alg.addvariable('MinEtTGC', 3*_et_conversion)
213 alg.addvariable('MinEta', 0*_eta_conversion)
214 alg.addvariable('MaxEta', 10*_eta_conversion)
215 alg.addvariable('InnerCoinCut', 0)
216 alg.addvariable('FullStationCut',0)
217 alg.addvariable('GoodMFieldCut', 0)
218 tm.registerTopoAlgo(alg)
219
220 alg = AlgConf.MuonSelect( name = 'CMU5VFab', inputs = 'MuonTobs', outputs = 'CMU5VFab' )
221 alg.addgeneric('InputWidth', HW.muonInputWidth)
222 alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
223 alg.addvariable('MinEtRPC', 6*_et_conversion)
224 alg.addvariable('MinEtTGC', 5*_et_conversion)
225 alg.addvariable('MinEta', 0*_eta_conversion)
226 alg.addvariable('MaxEta', 10*_eta_conversion)
227 alg.addvariable('InnerCoinCut', 0)
228 alg.addvariable('FullStationCut',1)
229 alg.addvariable('GoodMFieldCut', 0)
230 tm.registerTopoAlgo(alg)
231
232 #Muon sort
233 alg = AlgConf.MuonSort( name = 'MUs', inputs = 'MuonTobs', outputs = 'MUs' )
234 alg.addgeneric('InputWidth', HW.muonInputWidth)
235 alg.addgeneric('OutputWidth', HW.muonOutputWidthSort)
236 # alg.addvariable('MinET', 4)
237 alg.addvariable('MinEta', 0*_eta_conversion)
238 alg.addvariable('MaxEta', 25*_eta_conversion)
239 alg.addvariable('InnerCoinCut', 0)
240 alg.addvariable('FullStationCut', 0)
241 alg.addvariable('GoodMFieldCut', 0)
242 tm.registerTopoAlgo(alg)
243
244 #LATE
245 alg = AlgConf.MuonSort_1BC( name = 'LMUs', inputs = 'LateMuonTobArray', outputs = 'LMUs' )
246 alg.addgeneric('InputWidth', HW.muonInputWidth)
247 alg.addgeneric('OutputWidth', 1)
248 alg.addgeneric('nDelayedMuons', 1)
249 alg.addvariable('MinEta', 0*_eta_conversion)
250 alg.addvariable('MaxEta', 25*_eta_conversion)
251 alg.addvariable('InnerCoinCut', 0)
252 alg.addvariable('FullStationCut', 1)
253 alg.addvariable('GoodMFieldCut', 0)
254 tm.registerTopoAlgo(alg)
255
256 #jJets inputs
257 alg = AlgConf.jJetNoSort( name = 'AjJall_1BC', inputs = 'jJetTobs', outputs = 'AjJall_1BC' )
258 alg.addgeneric('InputWidth', HW.jJetInputWidth)
259 alg.addgeneric('OutputWidth', HW.jJetInputWidth)
260 # reduce number of pipelining registers used in firmware to allow for more
261 # latency to be used inside the KFMET decision algorithm
262 alg.addgeneric('NumRegisters', 1)
263 tm.registerTopoAlgo(alg)
264
265 #jJ lists
266 # No additional parameters
267 algoList = [
268 {"otype" : "jJ", "ocut" : 50, "olist" : "ab", "etamin" : 0, "etamax" : 32}, # jJab
269 {"otype" : "CjJ", "ocut" : 20, "olist" : "ab", "etamin" : 0, "etamax" : 26}, # CjJab
270 {"otype" : "SCjJ", "ocut" : 10, "olist" : "ab", "etamin" : 0, "etamax" : 26}, # SCjJab
271 {"otype" : "FjJ", "ocut" : 40, "olist" : "ab", "etamin" : 30, "etamax" : 49}, # FjJab
272 ]
273 for x in algoList:
274 class d:
275 pass
276 for k in x:
277 setattr (d, k, x[k])
278 listname = "%s%s" % (d.otype,d.olist)
279 algoname = AlgConf.jJetSelect
280 alg = algoname( name = listname, inputs = 'jJetTobs', outputs = listname )
281 alg.addgeneric('InputWidth', HW.jJetInputWidth)
282 alg.addgeneric('OutputWidth', HW.jJetOutputWidthSelect)
283 if d.olist == "ab":
284 alg.addvariable('MinET', get_threshold_cut(d.otype, d.ocut)*_et_conversion)
285 alg.addvariable('MinEta', d.etamin*_eta_conversion)
286 alg.addvariable('MaxEta', d.etamax*_eta_conversion)
287 tm.registerTopoAlgo(alg)
288
289 algoList = [
290 {"otype" : "FjJ", "ocut" : 0, "olist" : "s", "etamin" : 30, "etamax" : 49}, # FjJs
291 {"otype" : "jJ", "ocut" : 0, "olist" : "s", "etamin" : 0, "etamax" : 32}, # jJs
292 {"otype" : "CjJ", "ocut" : 0, "olist" : "s", "etamin" : 0, "etamax" : 26}, # CjJs
293 {"otype" : "AjJ", "ocut" : 0, "olist" : "s", "etamin" : 0, "etamax" : 49}, # AjJs
294 ]
295 for x in algoList:
296 class d:
297 pass
298 for k in x:
299 setattr (d, k, x[k])
300 listname = "%s%s" % (d.otype,d.olist)
301 algoname = AlgConf.jJetSort
302 alg = algoname( name = listname, inputs = 'jJetTobs', outputs = listname )
303 alg.addgeneric('InputWidth', HW.jJetInputWidth)
304 alg.addgeneric('OutputWidth', HW.jJetOutputWidthSort)
305 if d.olist == "ab":
306 alg.addvariable('MinET', d.ocut*_et_conversion)
307 alg.addvariable('MinEta', d.etamin*_eta_conversion)
308 alg.addvariable('MaxEta', d.etamax*_eta_conversion)
309 tm.registerTopoAlgo(alg)
310
311
312 #input list needed for ATR-18824
313 # Forward electrons
314 alg = AlgConf.jEmSort( name = 'jEMs25ETA49', inputs = 'jEmTobs', outputs = 'jEMs25ETA49' )
315 alg.addgeneric('InputWidth', HW.jEmInputWidth)
316 alg.addgeneric('OutputWidth', HW.jEmOutputWidthSort)
317 alg.addvariable('MinEta', 25*_eta_conversion)
318 alg.addvariable('MaxEta', 49*_eta_conversion)
319 # Setting no WP, use 0-3 for None/L/M/T
320 alg.addvariable('IsoMin', 0) # see TypeWideThresholdConfig
321 alg.addvariable('Frac1Min', 0)
322 alg.addvariable('Frac2Min', 0)
323 tm.registerTopoAlgo(alg)
324
325 alg = AlgConf.jEmSort( name = 'jEMsm25ETA49', inputs = 'jEmTobs', outputs = 'jEMsm25ETA49' )
326 alg.addgeneric('InputWidth', HW.jEmInputWidth)
327 alg.addgeneric('OutputWidth', HW.jEmOutputWidthSort)
328 alg.addvariable('MinEta', 25*_eta_conversion)
329 alg.addvariable('MaxEta', 49*_eta_conversion)
330 # Setting medium WP , use 0-3 for None/L/M/T
331 alg.addvariable('IsoMin', 2) # see TypeWideThresholdConfig
332 alg.addvariable('Frac1Min', 2)
333 alg.addvariable('Frac2Min', 2)
334 tm.registerTopoAlgo(alg)
335
336 # jTAU inputs # for ATR-29784
337 # all
338 alg = AlgConf.jTauNoSort( name = 'jTAUall', inputs = 'jTauTobs', outputs = 'jTAUall')
339 alg.addgeneric('InputWidth', HW.jTauInputWidth)
340 alg.addgeneric('OutputWidth', HW.jTauInputWidth)
341 alg.addvariable('Isolation',0)
342 alg.addvariable('passIsolation', True) #if true, isolation requirement is ignored
343 tm.registerTopoAlgo(alg)
344
345 # SORT
346 alg = AlgConf.jTauSort( name = 'jTAUs', inputs = 'jTauTobs', outputs = 'jTAUs' )
347 alg.addgeneric('InputWidth', HW.jTauInputWidth)
348 alg.addgeneric('OutputWidth', HW.jTauOutputWidthSort)
349 alg.addvariable('MinEta', 0*_eta_conversion)
350 alg.addvariable('MaxEta', 32*_eta_conversion)
351 alg.addvariable('Isolation',0)
352 alg.addvariable('passIsolation', True) #if true, isolation requirement is ignored
353 tm.registerTopoAlgo(alg)
354
355 # MET
356 # No additional parameters
357 alg = AlgConf.jXENoSort( name = 'jXENoSort_1BC', inputs = 'jXETobs', outputs = 'jXENoSort_1BC' )
358 alg.addgeneric('InputWidth', HW.jMetInputWidth)
359 alg.addgeneric('OutputWidth', HW.metOutputWidth)
360 # reduce number of pipelining registers used in firmware to allow for more
361 # latency to be used inside the KFMET decision algorithm
362 alg.addgeneric('NumRegisters', 1)
363 tm.registerTopoAlgo(alg)
364
365 alg = AlgConf.jXESort( name = 'jXEs', inputs = 'jXETobs', outputs = 'jXEs' )
366 alg.addgeneric('InputWidth', HW.jMetInputWidth)
367 alg.addgeneric('OutputWidth', HW.metOutputWidth)
368 tm.registerTopoAlgo(alg)
369
370 # jTE - use the same widths as XE as single TE TOB
371 alg = AlgConf.jTENoSort( name = 'jTENoSort_1BC', inputs = 'jTETobs', outputs = 'jTENoSort_1BC' )
372 alg.addgeneric('InputWidth', HW.jSumEtTotalInputWidth)
373 alg.addgeneric('OutputWidth', 1)
374 alg.addgeneric('NumRegisters', 1)
375 tm.registerTopoAlgo(alg)
376
377 # Decision algorithms
378
379 # LAR ZEE
380 # Parameter ordering:
381 # 1. MinEt1
382 # 2. MinEt2
383 # 3. MinInvariantMassSqr
384 # 4. MaxInvariantMassSqr
385 algoList = [
386 {"otype" : "eEM", "ocut1" : 24, "ocut2" : 24, "olist" : "sm", "nleading1" : 2, "minInvm" : 60, "maxInvm" : 100, "inputwidth": HW.eEmOutputWidthSort},
387 ]
388 for x in algoList:
389 class d:
390 pass
391 for k in x:
392 setattr (d, k, x[k])
393 toponame = 'ZEE-eEM24sm2'
394 log.debug("Define %s", toponame)
395 inputList = d.otype + d.olist
396 alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame)
397 alg.addgeneric('InputWidth', d.inputwidth)
398 alg.addgeneric('MaxTob', d.nleading1)
399 alg.addgeneric('NumResultBits', 1)
400 alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion )
401 alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion )
402 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion )
403 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion )
404 tm.registerTopoAlgo(alg)
405
406
407
408 #ATR-30179
409 #Mu+Tau dR cut
410 algolist = [
411 {"minDr": 3, "maxDr": 99, "mult": 1, "otype1" : "MU8Fab" , "otype2" : "eTAU", "ocut2" : 30, "olist2" : "ab", }, #3DR99-MU8Fab-eTAU30ab
412 {"minDr": 3, "maxDr": 35, "mult": 1, "otype1" : "MU8Fab" , "otype2" : "eTAU", "ocut2" : 30, "olist2" : "ab", }, #3DR35-MU8Fab-eTAU30ab
413 {"minDr": 3, "maxDr": 30, "mult": 1, "otype1" : "MU8Fab" , "otype2" : "eTAU", "ocut2" : 30, "olist2" : "ab", }, #3DR30-MU8Fab-eTAU30ab
414 {"minDr": 3, "maxDr": 28, "mult": 1, "otype1" : "MU8Fab" , "otype2" : "eTAU", "ocut2" : 30, "olist2" : "ab", }, #3DR28-MU8Fab-eTAU30ab
415 ]
416
417 for x in algolist:
418 class d:
419 pass
420 for k in x:
421 setattr (d, k, x[k])
422 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
423 obj2 = "-%s%d%s" % (d.otype2, d.ocut2, d.olist2)
424 toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, obj2)
425 log.debug("Define %s", toponame)
426 inputList = [ d.otype1, 'eTAUs']
427 algoname = AlgConf.DeltaRSqrIncl2
428 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
429 #alg = AlgConf.NotMatch( name = toponame, inputs = [ d.otype1, 'eTAUs'], outputs = [ toponame ] )
430 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
431 alg.addgeneric('InputWidth2', HW.eTauOutputWidthSort)
432 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
433 alg.addgeneric('MaxTob2', 1)
434 alg.addgeneric('NumResultBits', 1)
435 alg.addvariable('MinET1', 0*_et_conversion)
436 alg.addvariable('MinET2', get_threshold_cut('eTAU', d.ocut2)*_et_conversion)
437 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
438 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
439 tm.registerTopoAlgo(alg)
440
441
442 # dimu DR items
443 # Parameter ordering:
444 # 1. MinEt1
445 # 2. MinEt2
446 # 3. MinDeltaRSqr
447 # 4. MaxDeltaRSqr
448 listofalgos=[
449 {"minDr": 0, "maxDr": 15, "mult": 2, "otype1" : "MU3Vab" , "otype2" : "", }, #0DR15-2MU3Vab
450 {"minDr": 0, "maxDr": 24, "mult": 2, "otype1" : "MU3Vab" , "otype2" : "", }, #0DR24-2MU3Vab
451 # a min dR cut is needed when using muons from two lists. Maybe 0.1 is too large
452 {"minDr": 1, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab", }, #1DR15-MU5VFab-MU3Vab
453 {"minDr": 1, "maxDr": 22, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab", }, #1DR22-MU5VFab-MU3Vab
454 {"minDr": 2, "maxDr": 15, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #2DR15-2MU5VFab
455 {"minDr": 0, "maxDr": 22, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #0DR22-2MU5VFab
456 {"minDr": 2, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab" , "otype2" : "", }, #2DR99-2MU3Vab
457 ]
458 for x in listofalgos:
459 class d:
460 pass
461 for k in x:
462 setattr (d, k, x[k])
463 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
464 obj2 = "-%s" % (d.otype2)
465 toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
466 log.debug("Define %s", toponame)
467 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
468 algoname = AlgConf.DeltaRSqrIncl1 if (d.mult>1) else AlgConf.DeltaRSqrIncl2
469 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
470 if (d.mult>1):
471 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
472 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
473 else:
474 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
475 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
476 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
477 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
478 alg.addgeneric('NumResultBits', 1)
479 alg.addvariable('MinET1', 0*_et_conversion)
480 alg.addvariable('MinET2', 0*_et_conversion)
481 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
482 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
483 tm.registerTopoAlgo(alg)
484
485 # dimu DR with opposite charge, ATR-23073
486 # Parameter ordering:
487 # 1. MinEt1
488 # 2. MinEt2
489 # 3. MinDeltaRSqr
490 # 4. MaxDeltaRSqr
491 listofalgos=[
492 {"minDr": 0, "maxDr": 12, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #0DR12C-2MU3Vab
493 ]
494 for x in listofalgos:
495 class d:
496 pass
497 for k in x:
498 setattr (d, k, x[k])
499 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
500 obj2 = "-%s" % (d.otype2)
501 toponame = "%iDR%iC-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
502 log.debug("Define %s", toponame)
503 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
504 algoname = AlgConf.DeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.DeltaRSqrIncl2Charge
505 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
506 if (d.mult>1):
507 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
508 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
509 else:
510 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
511 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
512 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
513 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
514 alg.addgeneric('NumResultBits', 1)
515 alg.addvariable('MinET1', 0*_et_conversion)
516 alg.addvariable('MinET2', 0*_et_conversion)
517 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
518 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
519 tm.registerTopoAlgo(alg)
520
521 # dimu INVM+DR with opposite charge, ATR-23073
522 # Parameter ordering:
523 # 1. MinEt1
524 # 2. MinEt2
525 # 3. MinInvariantMassSqr
526 # 4. MaxInvariantMassSqr
527 # 5. MinDeltaRSqr
528 # 6. MaxDeltaRSqr
529 listofalgos=[
530 {"minInvm":7, "maxInvm":22, "minDr": 0, "maxDr": 20, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM22-0DR20C-2MU3Vab
531 ]
532 for x in listofalgos:
533 class d:
534 pass
535 for k in x:
536 setattr (d, k, x[k])
537 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
538 obj2 = "-%s" % (d.otype2)
539 toponame = "%iINVM%i-%iDR%iC-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
540 log.debug("Define %s", toponame)
541 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
542 algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2Charge
543 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
544 if (d.mult>1):
545 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
546 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
547 else:
548 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
549 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
550 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
551 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
552 alg.addgeneric('NumResultBits', 1)
553 alg.addvariable('MinET1', 0*_et_conversion)
554 alg.addvariable('MinET2', 0*_et_conversion)
555 alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
556 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
557 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
558 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
559 tm.registerTopoAlgo(alg)
560
561 # deta-dphi with ab+ab
562 # Parameter ordering:
563 # 1. MinEt1
564 # 2. MinEt2
565 # 3. MinDeltaEta
566 # 4. MaxDeltaEta
567 # 5. DeltaPhiMin
568 # 6. DeltaPhiMax
569 algolist=[
570 {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 1,
571 "otype1" : "MU5VFab", "ocut1": "", "olist1": "", "nleading1": HW.muonOutputWidthSelect,
572 "otype2" : "MU3Vab" , "ocut2": "", "olist2": "", "nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-MU5VFab-MU3Vab
573 {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 2,
574 "otype1" : "MU5VFab", "ocut1": "", "olist1": "", "nleading1": HW.muonOutputWidthSelect,
575 "otype2" : "" , "ocut2": "", "olist2": "", "nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-2MU5VFab
576 {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 2,
577 "otype1" : "MU3Vab", "ocut1": "", "olist1": "", "nleading1": HW.muonOutputWidthSelect,
578 "otype2" : "" , "ocut2": "", "olist2": "", "nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-2MU3Vab
579 {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 2,
580 "otype1" : "MU3VFab", "ocut1": "", "olist1": "","nleading1": HW.muonOutputWidthSelect,
581 "otype2" : "" , "ocut2": "", "olist2": "","nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-2MU3VFab
582 { "minDeta": 0, "maxDeta": 24, "minDphi": 4, "maxDphi": 99, "mult": 1,
583 "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect,
584 "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect},#0DETA24_4DPHI99_eTAU30ab_eTAU20ab
585 { "minDeta": 0, "maxDeta": 24, "minDphi": 4, "maxDphi": 99, "mult": 1,
586 "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect,
587 "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect},#0DETA24_4DPHI99_eTAU30ab_eTAU12ab
588 { "minDeta": 0, "maxDeta": 24, "minDphi": 10, "maxDphi": 99, "mult": 1,
589 "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect,
590 "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect},#0DETA24_10DPHI99_eTAU30ab_eTAU12ab
591 ]
592 for x in algolist:
593 class d:
594 pass
595 for k in x:
596 setattr (d, k, x[k])
597 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1+str(d.ocut1)+str(d.olist1))
598 obj2 = "-%s" % (d.otype2+str(d.ocut2)+str(d.olist2))
599 toponame = "%sDETA%s-%sDPHI%s-%s%s" % (d.minDeta, d.maxDeta, d.minDphi, d.maxDphi, obj1, "" if d.mult>1 else obj2)
600 log.debug("Define %s", toponame)
601 inputList = [d.otype1+d.olist1] if (d.mult>1) else [d.otype1+d.olist1, d.otype2+d.olist2]
602 algoname = AlgConf.DeltaEtaPhiIncl1 if (d.mult>1) else AlgConf.DeltaEtaPhiIncl2
603 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
604 alg.addgeneric('NumResultBits', 1)
605 if (d.mult>1):
606 alg.addgeneric('InputWidth', d.nleading1)
607 alg.addgeneric('MaxTob', d.nleading1)
608 alg.addvariable('MinET1', 0*_et_conversion)
609 alg.addvariable('MinET2', 0*_et_conversion)
610 alg.addvariable('MinDeltaEta', d.minDeta*_eta_conversion)
611 alg.addvariable('MaxDeltaEta', d.maxDeta*_eta_conversion)
612 alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
613 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
614 else:
615 alg.addgeneric('InputWidth1', d.nleading1)
616 alg.addgeneric('InputWidth2', d.nleading2)
617 alg.addgeneric('MaxTob1', d.nleading1)
618 alg.addgeneric('MaxTob2', d.nleading2)
619 alg.addvariable('MinET1', 0*_et_conversion)
620 alg.addvariable('MinET2', 0*_et_conversion)
621 alg.addvariable('DeltaEtaMin', d.minDeta*_eta_conversion)
622 alg.addvariable('DeltaEtaMax', d.maxDeta*_eta_conversion)
623 alg.addvariable('DeltaPhiMin', d.minDphi*_phi_conversion)
624 alg.addvariable('DeltaPhiMax', d.maxDphi*_phi_conversion)
625 tm.registerTopoAlgo(alg)
626
627
628 # (ATR-8194) L1Topo HT Trigger
629 algoList = [
630 {"itemNameMinHT": 150, "minHT": 240, "otype" : "jJ", "ocut" : 50, "olist" : "s", "nleading" : 5, "inputwidth": HW.jJetOutputWidthSort, "oeta" : 32}, #HT150-jJ50s5pETA32
631 {"itemNameMinHT": 190, "minHT": 300, "otype" : "jJ", "ocut" : 40, "olist" : "s", "nleading" : 5, "inputwidth": HW.jJetOutputWidthSort, "oeta" : 21}, #HT190-jJ40s5pETA21
632 ]
633 for x in algoList:
634 class d:
635 pass
636 for k in x:
637 setattr (d, k, x[k])
638 toponame = "HT%d-%s%s%s%spETA%s" % (d.itemNameMinHT, d.otype, str(d.ocut), d.olist, str(d.nleading) if d.olist=="s" else "", str(d.oeta))
639 log.debug("Define %s", toponame)
640 inputList = d.otype + d.olist
641 alg = AlgConf.JetHT( name = toponame, inputs = inputList, outputs = [toponame] )
642 alg.addgeneric('InputWidth', d.inputwidth)
643 alg.addgeneric('MaxTob', d.nleading)
644 alg.addgeneric('NumRegisters', 2 if d.olist=="all" else 0)
645 alg.addgeneric('NumResultBits', 1)
646 alg.addvariable('MinET', get_threshold_cut(d.otype, d.ocut)*_et_conversion)
647 alg.addvariable('MinEta', 0*_eta_conversion)
648 alg.addvariable('MaxEta', d.oeta*_eta_conversion)
649 alg.addvariable('MinHt', d.minHT*_et_conversion)
650 tm.registerTopoAlgo(alg)
651
652 #DR for 2MU5
653 # Covers chains: 0DR15-2MU5VFab
654 # 10DR99-2MU5VFab
655 DR_2MU5FMap = [
656 {
657 "algoname" : "DR_2MU5VFab",
658 "minDR" : [0 ,10],
659 "maxDR" : [15,99],
660 "otype1" : "MU5VFab",
661 "mult1" : [2]*2
662 }
663 ]
664
665
666 for x in DR_2MU5FMap:
667 class d:
668 pass
669 for k in x:
670 setattr (d, k, x[k])
671 inputList = [ d.otype1 ]
672 toponames = []
673 for bitId in range(len(d.minDR)):
674 toponames.append("%iDR%i-%s%s" % (d.minDR[bitId], d.maxDR[bitId], str(d.mult1[bitId]),
675 d.otype1 )
676 )
677 alg = AlgConf.DeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
678 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
679 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
680 alg.addgeneric('NumResultBits', len(toponames) )
681
682 for bitId in range(len(toponames)):
683 alg.addvariable('MinET1', 0 * _et_conversion, bitId )
684 alg.addvariable('MinET2', 0 * _et_conversion, bitId )
685 alg.addvariable("DeltaRMin", d.minDR[bitId] * d.minDR[bitId] * _dr_conversion * _dr_conversion, bitId)
686 alg.addvariable("DeltaRMax", d.maxDR[bitId] * d.maxDR[bitId] * _dr_conversion * _dr_conversion, bitId)
687
688 tm.registerTopoAlgo(alg)
689
690
691 # DM/DPHI for eEM, ATR-19302 (0INVM70...) and ATR-32259 (2INVM4...)
692 # output lines = 0INVM70-27DPHI32-eEM12sm1-eEM12sm6, 0INVM70-27DPHI32-eEM15sm1-eEM15sm6, 2INVM4-0DPHI32-eEM9sm1-eEM6sm6
693 # Parameter ordering
694 # 1. MinEt1
695 # 2. MinEt2
696 # 3. MinMSqr
697 # 4. MaxMSqr
698 # 5. MinDeltaPhi
699 # 6. MaxDeltaPhi
700 eINVM_DPHIMap = [
701 {
702 "algoname" : "INVM_DPHI_eEMsm6",
703 "minInvm" : [0, 0, 2],
704 "maxInvm" : [70, 70, 5],
705 "minDphi" : [27, 27, 0],
706 "maxDphi" : [32, 32, 32],
707 "otype1" : "eEM",
708 "olist1" : "sm",
709 "ocut1List" : [ 12, 15, 9 ],
710 "nleading1" : 1,
711 "otype2" : "eEM",
712 "ocut2List" : [ 12, 15, 6 ],
713 "olist2" : "sm",
714 "nleading2" : 6
715
716 }
717 ]
718
719 for x in eINVM_DPHIMap:
720 class d:
721 pass
722 for k in x:
723 setattr (d, k, x[k])
724 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
725 toponames=[]
726 for bitId, ocut1Value in enumerate(d.ocut1List):
727 toponames.append ("%iINVM%i-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minInvm[bitId], d.maxInvm[bitId], d.minDphi[bitId], d.maxDphi[bitId],
728 d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sm" else "",
729 d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sm" else ""))
730 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = d.algoname, inputs = inputList, outputs = toponames )
731 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
732 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
733 alg.addgeneric('MaxTob1', d.nleading1)
734 alg.addgeneric('MaxTob2', d.nleading2)
735 alg.addgeneric('NumResultBits', len(toponames))
736 for bitId in range(len(toponames)):
737 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
738 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2List[bitId]) * _et_conversion, bitId)
739 alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
740 alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
741 alg.addvariable('MinDeltaPhi', d.minDphi[bitId] * _phi_conversion, bitId)
742 alg.addvariable('MaxDeltaPhi', d.maxDphi[bitId] * _phi_conversion, bitId)
743
744 tm.registerTopoAlgo(alg)
745
746 # ATR-31830
747 INVM_DISAMB_Map = [
748 {
749 "algoname": "110INVM150-eEM50s-eEM10s-2DISAMB-jJ60s",
750 "disamb" : 2,
751 "minInvm" : 110,
752 "maxInvm" : 150,
753 "otype1" : "eEM",
754 "ocut1a" : 50,
755 "ocut1b" : 10,
756 "olist1": "s",
757 "nleading1": HW.eEmOutputWidthSort,
758 "inputwidth1": HW.eEmOutputWidthSort,
759 "otype2" : "jJ",
760 "ocut2" : 60,
761 "nleading2": 3,
762 "inputwidth2": HW.jJetOutputWidthSort,
763 "olist2": "s",
764 }
765 ]
766 for x in INVM_DISAMB_Map:
767 class d:
768 pass
769 for k in x:
770 setattr(d,k,x[k])
771 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
772 obj1a = "-%s%s%s" % (d.otype1, str(d.ocut1a), d.olist1)
773 obj1b = "-%s%s%s" % (d.otype1, str(d.ocut1b), d.olist1)
774 obj2 = "%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
775 toponame = "%iINVM%i%s%s-%sDISAMB-%s" % (d.minInvm, d.maxInvm, obj1a, obj1b, str(d.disamb) if d.disamb>0 else "", obj2)
776
777 alg = AlgConf.InvariantMassInclusive1Disambiguation2( name = d.algoname, inputs = inputList, outputs = [ toponame ] )
778 alg.addgeneric('InputWidth1', d.inputwidth1)
779 alg.addgeneric('InputWidth2', d.inputwidth2)
780 alg.addgeneric('MaxTob1', d.nleading1)
781 alg.addgeneric('MaxTob2', d.nleading2)
782 alg.addgeneric('NumResultBits', 1)
783 alg.addvariable('MinET1a', get_threshold_cut(d.otype1, d.ocut1a)*_et_conversion, 0)
784 alg.addvariable('MinET1b', get_threshold_cut(d.otype1, d.ocut1b)*_et_conversion, 0)
785 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
786 alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, 0)
787 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, 0)
788 alg.addvariable('DisambDRSqrMin', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
789
790 tm.registerTopoAlgo(alg)
791
792 # Boosted DM/DPHI for eEM
793 # output lines = 0INVM70-0DPHI12-eEM9sl1-eEM9sl6,
794 # 0INVM70-0DPHI12-eEM12sl1-eEM12sl6,
795 # 0INVM70-0DPHI12-eEM15sl1-eEM15sl6
796 # Parameter ordering
797 # 1. MinEt1
798 # 2. MinEt2
799 # 3. MinMSqr
800 # 4. MaxMSqr
801 # 5. MinDeltaPhi
802 # 6. MaxDeltaPhi
803 eINVM_DPHIMap = [
804 {
805 "algoname" : "INVM_INVDPHI_eEMsl6",
806 "minInvm" : 0,
807 "maxInvm" : 70,
808 "minDphi" : 0,
809 "maxDphi" : 12,
810 "otype1" : "eEM",
811 "olist1" : "sl",
812 "ocut1List" : [ 9, 12],
813 "nleading1" : 1,
814 "otype2" : "eEM",
815 "ocut2List" : [ 9, 12 ],
816 "olist2" : "sl",
817 "nleading2" : 6
818 }
819 ]
820
821 for x in eINVM_DPHIMap:
822 class d:
823 pass
824 for k in x:
825 setattr (d, k, x[k])
826 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
827 toponames=[]
828 for bitId, ocut1Value in enumerate(d.ocut1List):
829 toponames.append ("%iINVM%i-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDphi, d.maxDphi,
830 d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
831 d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
832 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = d.algoname, inputs = inputList, outputs = toponames )
833
834 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
835 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
836 alg.addgeneric('MaxTob1', d.nleading1)
837 alg.addgeneric('MaxTob2', d.nleading2)
838 alg.addgeneric('NumResultBits', len(toponames))
839 for bitId in range(len(toponames)):
840 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
841 alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
842 alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
843 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
844 alg.addvariable('MinDeltaPhi', d.minDphi * _phi_conversion, bitId)
845 alg.addvariable('MaxDeltaPhi', d.maxDphi * _phi_conversion, bitId)
846
847 tm.registerTopoAlgo(alg)
848
849
850 # DM/DR for eEM
851 # output lines = 0INVM70-2DR15-eEM9sl1-eEM9sl6,
852 # 0INVM70-2DR15-eEM12sl1-eEM12sl6,
853 #
854 # Parameter ordering
855 # 1. MinEt1
856 # 2. MinEt2
857 # 3. MinMSqr
858 # 4. MaxMSqr
859 # 5. MinDeltaR
860 # 6. MaxDeltaR
861 eINVM_DRMap = [
862 {
863 "algoname" : "INVM_BOOSTDR_eEMsl6",
864 "minInvm" : 0,
865 "maxInvm" : 70,
866 "minDR" : 2,
867 "maxDR" : 15,
868 "otype1" : "eEM",
869 "olist1" : "sl",
870 "ocut1List" : [ 9, 12 ],
871 "nleading1" : 1,
872 "otype2" : "eEM",
873 "ocut2List" : [ 9, 12 ],
874 "olist2" : "sl",
875 "nleading2" : 6
876 }
877 ]
878
879 for x in eINVM_DRMap:
880 class d:
881 pass
882 for k in x:
883 setattr (d, k, x[k])
884 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
885 toponames=[]
886 for bitId, ocut1Value in enumerate(d.ocut1List):
887 toponames.append ("%iINVM%i-%iDR%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDR, d.maxDR,
888 d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
889 d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
890
891 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
892 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
893 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
894 alg.addgeneric('MaxTob1', d.nleading1)
895 alg.addgeneric('MaxTob2', d.nleading2)
896 alg.addgeneric('NumResultBits', len(toponames))
897 for bitId in range(len(toponames)):
898 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
899 alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
900 alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
901 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
902 alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
903 alg.addvariable('DeltaRMax', d.maxDR*d.maxDR*_dr_conversion*_dr_conversion, bitId)
904
905 tm.registerTopoAlgo(alg)
906
907 # DM/DR Ranges for eEM12
908 # output lines = 0INVM30-2DR15-eEM12sl1-eEM12sl6,
909 # 25INVM70-13DR25-eEM12sl1-eEM12sl6,
910 #
911 # Parameter ordering
912 # 1. MinEt1
913 # 2. MinEt2
914 # 3. MinMSqr
915 # 4. MaxMSqr
916 # 5. MinDeltaR
917 # 6. MaxDeltaR
918 eINVM_Ranges_DRMap = [
919 {
920 "algoname" : "INVM_BOOSTDR_Ranges_eEM12sl6",
921 "minInvm" : [0, 25],
922 "maxInvm" : [30,70],
923 "minDR" : [2,13],
924 "maxDR" : [15,25],
925 "otype1" : "eEM",
926 "olist1" : "sl",
927 "ocut1List" : [12,12],
928 "nleading1" : 1,
929 "otype2" : "eEM",
930 "ocut2List" : [12,12],
931 "olist2" : "sl",
932 "nleading2" : 6
933 }
934 ]
935
936 for x in eINVM_Ranges_DRMap:
937 class d:
938 pass
939 for k in x:
940 setattr (d, k, x[k])
941 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
942 toponames=[]
943 for bitId, ocut1Value in enumerate(d.ocut1List):
944 toponames.append ("%iINVM%i-%iDR%i-%s%s%s%s-%s%s%s%s" % (d.minInvm[bitId], d.maxInvm[bitId], d.minDR[bitId], d.maxDR[bitId],
945 d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
946 d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
947
948 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
949 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
950 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
951 alg.addgeneric('MaxTob1', d.nleading1)
952 alg.addgeneric('MaxTob2', d.nleading2)
953 alg.addgeneric('NumResultBits', len(toponames))
954 for bitId in range(len(toponames)):
955 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
956 alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
957 alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
958 alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
959 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
960 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
961
962 tm.registerTopoAlgo(alg)
963
964
965 # DM/DR Ranges for asymmetric eEM12LeEM9L
966 # output lines = 0INVM30-2DR15-eEM12sl1-eEM9sl6,
967 # 25INVM70-13DR25-eEM12sl1-eEM9sl6,
968 #
969 # Parameter ordering
970 # 1. MinEt1
971 # 2. MinEt2
972 # 3. MinMSqr
973 # 4. MaxMSqr
974 # 5. MinDeltaR
975 # 6. MaxDeltaR
976 eINVM_Ranges_Asymm_DRMap = [
977 {
978 "algoname" : "INVM_BOOSTDR_Ranges_Asymm_eEMsl6",
979 "minInvm" : [0, 25],
980 "maxInvm" : [30,70],
981 "minDR" : [2,13],
982 "maxDR" : [15,25],
983 "otype1" : "eEM",
984 "olist1" : "sl",
985 "ocut1List" : [12,12],
986 "nleading1" : 1,
987 "otype2" : "eEM",
988 "ocut2List" : [9,9],
989 "olist2" : "sl",
990 "nleading2" : 6
991 }
992 ]
993
994 for x in eINVM_Ranges_Asymm_DRMap:
995 class d:
996 pass
997 for k in x:
998 setattr (d, k, x[k])
999 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
1000 toponames=[]
1001 for bitId, ocut1Value in enumerate(d.ocut1List):
1002 toponames.append ("%iINVM%i-%iDR%i-%s%s%s%s-%s%s%s%s" % (d.minInvm[bitId], d.maxInvm[bitId], d.minDR[bitId], d.maxDR[bitId],
1003 d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
1004 d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
1005
1006 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
1007 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
1008 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
1009 alg.addgeneric('MaxTob1', d.nleading1)
1010 alg.addgeneric('MaxTob2', d.nleading2)
1011 alg.addgeneric('NumResultBits', len(toponames))
1012 for bitId in range(len(toponames)):
1013 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
1014 alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
1015 alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
1016 alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
1017 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1018 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1019
1020 tm.registerTopoAlgo(alg)
1021
1022
1023 # INVM_DR for 2MU5VFab
1024 # output lines = 2INVM9-2DR15-2MU5VFab and 8INVM15-0DR22-2MU5VFab
1025 INVM_DR_2MU5VFabMap = [
1026 {
1027 "algoname": "INVM_DR_2MU5VFab",
1028 "minInvm" : [2,8],
1029 "maxInvm" : [9,15],
1030 "minDR" : [2,0],
1031 "maxDR" : [15,22],
1032 "otype1" : "MU5VFab",
1033 "mult1" : 2
1034 }
1035 ]
1036 for x in INVM_DR_2MU5VFabMap:
1037 class d:
1038 pass
1039 for k in x:
1040 setattr(d,k,x[k])
1041 inputList = d.otype1
1042 toponames = []
1043 for bitId in range(len(d.minDR)):
1044 toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm[bitId], d.maxInvm[bitId],
1045 d.minDR[bitId] , d.maxDR[bitId],
1046 d.mult1, d.otype1
1047 )
1048 )
1049 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
1050 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1051 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1052 alg.addgeneric('NumResultBits', len(toponames))
1053 for bitId in range(len(toponames)):
1054 alg.addvariable('MinET1', 0*_et_conversion, bitId)
1055 alg.addvariable('MinET2', 0*_et_conversion, bitId)
1056 alg.addvariable('MinMSqr', d.minInvm[bitId]*d.minInvm[bitId]*_et_conversion*_et_conversion, bitId)
1057 alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
1058 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1059 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1060 tm.registerTopoAlgo(alg)
1061
1062
1063 # INVM for 2MU3VFab
1064 # output lines = '7INVM14-2MU3VFab', '7INVM22-2MU3VFab'
1065 INVM_2MU3VFab_Map = [
1066 {
1067 "algoname": "INVM_2MU3VFab",
1068 "minInvm" : 7,
1069 "maxInvm" : [14,22],
1070 "otype1" : "MU3VFab",
1071 "mult1" : 2
1072 }
1073 ]
1074 for x in INVM_2MU3VFab_Map:
1075 class d:
1076 pass
1077 for k in x:
1078 setattr(d,k,x[k])
1079 inputList = d.otype1
1080 toponames = []
1081 for bitId in range(len(d.maxInvm)):
1082 toponames.append("%iINVM%i-%i%s" % ( d.minInvm, d.maxInvm[bitId],
1083 d.mult1, d.otype1
1084 )
1085 )
1086 alg = AlgConf.InvariantMassInclusive1( name = d.algoname, inputs = inputList, outputs = toponames)
1087 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1088 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1089 alg.addgeneric('NumResultBits', len(toponames))
1090 for bitId in range(len(toponames)):
1091 alg.addvariable('MinET1', 0*_et_conversion, bitId)
1092 alg.addvariable('MinET2', 0*_et_conversion, bitId)
1093 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
1094 alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
1095 tm.registerTopoAlgo(alg)
1096
1097
1098
1099 # INVM_EM for Jpsi
1100 invm_map = { "algoname": 'INVM_eEMs6' , "ocutlist": [ 9, 15 ], "minInvm": 1, "maxInvm": 5, "otype" : "eEM", "olist" : "s",
1101 "nleading" : 1, "inputwidth": HW.eEmOutputWidthSort}
1102 for x in [ invm_map ]:
1103 class d:
1104 pass
1105 for k in x:
1106 setattr (d, k, x[k])
1107 inputList = d.otype + d.olist
1108 toponames=[]
1109 for ocut in d.ocutlist:
1110 toponame = "%iINVM%i-%s%s%s%s-eEMs6" % (d.minInvm, d.maxInvm, d.otype, str(ocut) if ocut > 0 else "", d.olist, str(d.nleading) if d.olist=="s" else "")
1111 toponames.append(toponame)
1112 alg = AlgConf.InvariantMassInclusive2( name = d.algoname, inputs = [inputList, 'eEMs'], outputs = toponames)
1113 alg.addgeneric('InputWidth1', d.inputwidth)
1114 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
1115 alg.addgeneric('MaxTob1', d.nleading)
1116 alg.addgeneric('MaxTob2', HW.eEmOutputWidthSort)
1117 alg.addgeneric('NumResultBits', len(toponames))
1118 for bitid, ocut in enumerate(d.ocutlist):
1119 alg.addvariable('MinET1', get_threshold_cut('eEM', ocut)*_et_conversion, bitid)
1120 alg.addvariable('MinET2', 0*_et_conversion, bitid)
1121 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
1122 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitid)
1123 tm.registerTopoAlgo(alg)
1124
1125
1126 # added for muon-jet:
1127 algoList = [
1128 {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04-MU5VFab-CjJ40ab
1129 {"minDr": 0, "maxDr": 4, "otype1" : "MU3Vab" , "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04-MU3Vab-CjJ40ab
1130 {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 80, "olist2" : "ab"}, #0DR04-MU5VFab-CjJ80ab
1131 {"minDr": 0, "maxDr": 4, "otype1" : "MU3VFab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04_MU3VFab_CjJ40ab
1132 {"minDr": 0, "maxDr": 4, "otype1" : "MU3VFab", "otype2" : "CjJ", "ocut2": 20, "olist2" : "ab"}, #0DR04_MU3VFab_CjJ20ab
1133 {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 20, "olist2" : "ab"}, #0DR04_MU5VFab_CjJ20ab
1134 ]
1135 for x in algoList:
1136 class d:
1137 pass
1138 for k in x:
1139 setattr (d, k, x[k])
1140 toponame = "%iDR%02d-%s-%s%s%s" % (d.minDr, d.maxDr, d.otype1, d.otype2, str(d.ocut2), d.olist2)
1141 log.debug("Define %s", toponame)
1142 inputList = [d.otype1, d.otype2 + d.olist2]
1143 alg = AlgConf.DeltaRSqrIncl2( name = toponame, inputs = inputList, outputs = [ toponame ])
1144 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1145 alg.addgeneric('InputWidth2', HW.jJetOutputWidthSelect)
1146 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1147 alg.addgeneric('MaxTob2', HW.jJetOutputWidthSelect)
1148 alg.addgeneric('NumResultBits', 1)
1149 alg.addvariable('MinET1', 0*_et_conversion, 0)
1150 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1151 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1152 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1153 tm.registerTopoAlgo(alg)
1154
1155 # dimu INVM items
1156 # Parameter ordering
1157 # 1. MinEt1
1158 # 2. MinEt2
1159 # 3. MinMSqr
1160 # 4. MaxMSqr
1161 listofalgos = [
1162 {"minInvm": 2, "maxInvm": 8, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #2INVM8-2MU3Vab
1163 {"minInvm": 2, "maxInvm": 9, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #2INVM9-2MU3Vab
1164 {"minInvm": 8, "maxInvm": 15, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #8INVM15-MU5VFab-MU3Vab
1165 {"minInvm": 2, "maxInvm": 8, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #2INVM8-MU5VFab-MU3Vab
1166 {"minInvm": 2, "maxInvm": 9, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #2INVM9-MU5VFab-MU3Vab
1167 {"minInvm": 8, "maxInvm": 15, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #8INVM15-2MU5VFab
1168 {"minInvm": 2, "maxInvm": 9, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #2INVM9-2MU5VFab
1169 {"minInvm": 7, "maxInvm": 15, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM15-2MU3Vab
1170 {"minInvm": 7, "maxInvm": 22, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3VFab",}, #7INVM22-MU5VFab-MU3VFab, ATR-21566
1171 {"minInvm": 7, "maxInvm": 14, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3VFab",}, #7INVM14-MU5VFab-MU3VFab, ATR-22782
1172 {"minInvm": 7, "maxInvm": 14, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM14-2MU3Vab, ATR-22782
1173 ]
1174 for x in listofalgos:
1175 class d:
1176 pass
1177 for k in x:
1178 setattr (d, k, x[k])
1179 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1180 obj2 = "-%s" % (d.otype2)
1181 toponame = "%iINVM%i-%s%s" % (d.minInvm, d.maxInvm, obj1, "" if d.mult>1 else obj2)
1182 log.debug("Define %s", toponame)
1183 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1184 algoname = AlgConf.InvariantMassInclusive1 if (d.mult>1) else AlgConf.InvariantMassInclusive2
1185 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1186 if (d.mult>1):
1187 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1188 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1189 else:
1190 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1191 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1192 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1193 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1194 alg.addgeneric('NumResultBits', 1)
1195 alg.addvariable('MinET1', 0*_et_conversion)
1196 alg.addvariable('MinET2', 0*_et_conversion)
1197 alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
1198 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
1199 tm.registerTopoAlgo(alg)
1200
1201 toponame = "8INVM15-2CMU3Vab"
1202 log.debug("Define %s", toponame)
1203 inputList = ['CMU3Vab']
1204 alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame )
1205 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1206 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1207 alg.addgeneric('NumResultBits', 1)
1208 alg.addvariable('MinET1', 0*_et_conversion)
1209 alg.addvariable('MinET2', 0*_et_conversion)
1210 alg.addvariable('MinMSqr', 8*8*_et_conversion*_et_conversion)
1211 alg.addvariable('MaxMSqr', 15*15*_et_conversion*_et_conversion)
1212 tm.registerTopoAlgo(alg)
1213
1214 algolist=[
1215 {"minInvm": 2, "maxInvm": 8, "mult": 1, "otype1" : "CMU3Vab", "otype2" :"MU3Vab"}, # 2INVM8-CMU3Vab-MU3Vab
1216 ]
1217 for x in algolist:
1218 class d:
1219 pass
1220 for k in x:
1221 setattr (d, k, x[k])
1222 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1223 obj2 = "-%s" % (d.otype2)
1224 toponame = "%iINVM%i-%s%s" % (d.minInvm, d.maxInvm, obj1, "" if d.mult>1 else obj2)
1225 log.debug("Define %s", toponame)
1226 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1227 algoname = AlgConf.InvariantMassInclusive1 if (d.mult>1) else AlgConf.InvariantMassInclusive2
1228 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1229 if (d.mult>1):
1230 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1231 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1232 alg.addgeneric('RequireOneBarrel', d.onebarrel)
1233 else:
1234 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1235 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1236 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1237 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1238 alg.addgeneric('NumResultBits', 1)
1239 alg.addvariable('MinET1', 0*_et_conversion)
1240 alg.addvariable('MinET2', 0*_et_conversion)
1241 alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
1242 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
1243 tm.registerTopoAlgo(alg)
1244
1245 # dimu DR items
1246 algolist = [
1247 {"minDr": 0, "maxDr": 24, "mult": 2, "otype1" : "CMU3Vab", "otype2" : "", }, #0DR24-2CMU3Vab
1248 {"minDr": 1, "maxDr": 24, "mult": 1, "otype1" : "CMU3Vab", "otype2" : "MU3Vab", }, #1DR24-CMU3Vab-MU3Vab
1249 ]
1250 for x in algolist:
1251 class d:
1252 pass
1253 for k in x:
1254 setattr (d, k, x[k])
1255 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1256 obj2 = "-%s" % (d.otype2)
1257 toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
1258 log.debug("Define %s", toponame)
1259 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1260 algoname = AlgConf.DeltaRSqrIncl1 if (d.mult>1) else AlgConf.DeltaRSqrIncl2
1261 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1262 if (d.mult>1):
1263 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1264 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1265 else:
1266 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1267 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1268 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1269 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1270 alg.addgeneric('NumResultBits', 1)
1271 alg.addvariable('MinET1', 0*_et_conversion)
1272 alg.addvariable('MinET2', 0*_et_conversion)
1273 alg.addvariable('DeltaRMin', d.minDr*d.minDr *_dr_conversion*_dr_conversion)
1274 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr *_dr_conversion*_dr_conversion)
1275 tm.registerTopoAlgo(alg)
1276
1277
1278 # RATIO MATCH dedicated to Exotic #TODO: are eTAU correct to use here (and below)?
1279 toponame = '100RATIO-0MATCH-eTAU40si2-eEMall'
1280 alg = AlgConf.RatioMatch( name = toponame, inputs = [ 'eTAUs', 'eEMall'], outputs = [ toponame ] )
1281 alg.addgeneric('InputWidth1', HW.eTauOutputWidthSort)
1282 alg.addgeneric('InputWidth2', HW.eEmInputWidth)
1283 alg.addgeneric('MaxTob1', 2)
1284 alg.addgeneric('MaxTob2', HW.eEmInputWidth)
1285 alg.addgeneric('NumResultBits', 1)
1286 alg.addvariable('MinET1', get_threshold_cut('eTAU', 40)*_et_conversion)
1287 alg.addvariable('MinET2', 0*_et_conversion)
1288 alg.addvariable('Ratio', 100, 0)
1289 tm.registerTopoAlgo(alg)
1290
1291 # NOT MATCH dedicated to Exotic
1292 toponame = 'NOT-0MATCH-eTAU40si1-eEMall'
1293 alg = AlgConf.NotMatch( name = toponame, inputs = [ 'eTAUs', 'eEMall'], outputs = [ toponame ] )
1294 alg.addgeneric('InputWidth1', HW.eTauOutputWidthSort)
1295 alg.addgeneric('InputWidth2', HW.eEmInputWidth)
1296 alg.addgeneric('MaxTob1', 1)
1297 alg.addgeneric('MaxTob2', HW.eEmInputWidth)
1298 alg.addgeneric('NumResultBits', 1)
1299 alg.addvariable('MinET1', get_threshold_cut('eTAU', 40)*_et_conversion)
1300 alg.addvariable('MinET2', 0*_et_conversion)
1301 alg.addvariable('EtaMin1', 0*_eta_conversion)
1302 alg.addvariable('EtaMax1', 49*_eta_conversion)
1303 alg.addvariable('EtaMin2', 0*_eta_conversion)
1304 alg.addvariable('EtaMax2', 49*_eta_conversion)
1305 alg.addvariable('DRCut', 0) #TODO: conversion needed here?
1306 tm.registerTopoAlgo(alg)
1307
1308 # TODO: to be updated with phase1 met, jets
1309 xemap = [{"etcut": 0, "Threlist": [55, 60, 65, 75 ]}]
1310 for x in xemap:
1311 class d:
1312 pass
1313 for k in x:
1314 setattr (d, k, x[k])
1315 log.debug("Define %s", toponame)
1316 inputList = ['jXENoSort_1BC', 'AjJall_1BC']
1317 toponames=[]
1318 for minxe in d.Threlist:
1319 toponames.append("KF-jXE%s-AjJall" % (minxe))
1320 alg = AlgConf.KalmanMETCorrection( name = "KF-jXE-AjJall", inputs = inputList, outputs = toponames )
1321 alg.addgeneric('InputWidth', HW.jJetInputWidth)
1322 alg.addgeneric('NumResultBits', len(toponames))
1323 for key, value in KFMETweightParameters.items():
1324 # add weight (scale factor) parameters
1325 # these weights are compacted into 32bit words in order to limit the number
1326 # of registers needed to load them in firmware
1327 alg.addvariable(key, value)
1328 alg.addvariable('MinET', 0)
1329 for bitid,minxe in enumerate(d.Threlist):
1330 alg.addvariable('KFXE', str(minxe*_et_conversion), bitid)
1331 tm.registerTopoAlgo(alg)
1332
1333
1334 # LATE MUON : LATE-MU10s1
1335 for x in [
1336 #{"otype" : "LATE-MU", "ocut" : 10, "inputwidth": HW.muonOutputWidthSort},
1337 {"otype" : "LATE-MU", "ocut" : 10, "inputwidth": HW.NumberOfDelayedMuons},
1338 ]:
1339
1340 class d:
1341 pass
1342 for k in x:
1343 setattr (d, k, x[k])
1344
1345 toponame = "%s%ss1" % ( d.otype, str(d.ocut) )
1346
1347 log.debug("Define %s", toponame)
1348
1349 inputList = 'LMUs'
1350
1351 alg = AlgConf.EtCut( name = toponame, inputs = inputList, outputs = toponame )
1352 alg.addgeneric('InputWidth', d.inputwidth)
1353 alg.addgeneric('MaxTob', 1)
1354 alg.addgeneric('NumResultBits', 1)
1355 alg.addvariable('MinET', str(d.ocut*_et_conversion))
1356 tm.registerTopoAlgo(alg)
1357
1358
1359 # (ATR-12748) fat jet trigger with Simple Cone algo
1360 algoList = [ #name (SC175) is rounded on purpose to avoid more name changes in case the actual threshold is slightly tweaked later on
1361 {"itemNameMinHT": 175, "minHT": 176, "otype" : "SCjJ", "ocut" : 10, "olist" : "ab", "nleading" : HW.jJetOutputWidthSelect, "inputwidth": HW.jJetOutputWidthSelect, "oeta" : 26}, #SC175-SCjJ10abpETA26
1362 ]
1363 for x in algoList:
1364 class d:
1365 pass
1366 for k in x:
1367 setattr (d, k, x[k])
1368 toponame = "SC%d-%s%s%s%spETA%s" % (d.itemNameMinHT, d.otype, str(d.ocut), d.olist, str(d.nleading) if d.olist=="s" else "", str(d.oeta))
1369 log.debug("Define %s", toponame)
1370 inputList = d.otype + d.olist
1371 alg = AlgConf.SimpleCone( name = toponame, inputs = inputList, outputs = [toponame] )
1372 alg.addgeneric('InputWidth', d.inputwidth)
1373 alg.addgeneric('NumResultBits', 1)
1374 alg.addvariable('MinET', d.ocut*_et_conversion)
1375 alg.addvariable('MinSumET', d.minHT*_et_conversion)
1376 alg.addvariable('MaxRSqr', 15*15*_dr_conversion*_dr_conversion)
1377 tm.registerTopoAlgo(alg)
1378
1379 # 0INVM9-eEM9ab-eEMab
1380 algoList = [
1381 {"minInvm" : 0, "maxInvm": 9, "otype" : "eEM", "ocut1" : 9, "olist" : "ab", "inputwidth": HW.eEmOutputWidthSelect, "ocut2" : 0},
1382 ]
1383 for x in algoList:
1384 class d:
1385 pass
1386 for k in x:
1387 setattr (d, k, x[k])
1388 inputList = d.otype + d.olist
1389 toponame = "%iINVM%i-%s%s%s-%s%s" % (d.minInvm, d.maxInvm,
1390 d.otype, str(d.ocut1) , d.olist,
1391 d.otype, d.olist)
1392 alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame)
1393 alg.addgeneric('InputWidth', d.inputwidth)
1394 alg.addgeneric('MaxTob', HW.eEmOutputWidthSelect)
1395 alg.addgeneric('NumResultBits', 1)
1396 alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion)
1397 alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion)
1398 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
1399 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
1400 tm.registerTopoAlgo(alg)
1401
1402
1403 # added for b-phys, 0DR03-eEM9ab-CjJ40ab
1404 algoList = [
1405 {"minDr": 0, "maxDr": 3, "otype1" : "eEM" ,"ocut1": 9, "olist1" : "ab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}
1406 ]
1407 for x in algoList:
1408 class d:
1409 pass
1410 for k in x:
1411 setattr (d, k, x[k])
1412 toponame = "%iDR%02d-%s%s%s-%s%s%s" % (d.minDr, d.maxDr, d.otype1, str(d.ocut1), d.olist1, d.otype2, str(d.ocut2), d.olist2)
1413 log.debug("Define %s", toponame)
1414 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
1415 alg = AlgConf.DeltaRSqrIncl2( name = toponame, inputs = inputList, outputs = [ toponame ])
1416 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSelect)
1417 alg.addgeneric('InputWidth2', HW.jJetOutputWidthSelect)
1418 alg.addgeneric('MaxTob1', HW.eEmOutputWidthSelect)
1419 alg.addgeneric('MaxTob2', HW.jJetOutputWidthSelect)
1420 alg.addgeneric('NumResultBits', 1)
1421 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1422 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1423 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1424 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1425 tm.registerTopoAlgo(alg)
1426
1427
1428 # Axion 2EM DPHI
1429 #27DPHI32-eEMs1-eEMs6
1430 algoList = [
1431 {"minDphi": 27, "maxDphi": 32, "otype" : "eEM", "ocut1" : 0, "olist" : "s", "nleading1" : 1, "inputwidth1": HW.eEmOutputWidthSort, "ocut2" : 0, "nleading2": 6},
1432 ]
1433 for x in algoList:
1434 class d:
1435 pass
1436 for k in x:
1437 setattr (d, k, x[k])
1438 toponame = "%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minDphi, d.maxDphi,
1439 d.otype, str(d.ocut1) if d.ocut1 > 0 else "", d.olist, str(d.nleading1) if d.olist=="s" else "",
1440 d.otype, str(d.ocut2) if d.ocut2 > 0 else "", d.olist, str(d.nleading2) if d.olist=="s" else "")
1441 log.debug("Define %s", toponame)
1442 inputList = d.otype + d.olist
1443 alg = AlgConf.DeltaPhiIncl1( name = toponame, inputs = inputList, outputs = toponame )
1444 alg.addgeneric('InputWidth', d.inputwidth1)
1445 alg.addgeneric('MaxTob', d.nleading2)
1446 alg.addgeneric('NumResultBits', 1)
1447 alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion if d.ocut1 > 0 else get_threshold_cut(d.otype, 5)*_et_conversion, 0)
1448 alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion if d.ocut2 > 0 else get_threshold_cut(d.otype, 5)*_et_conversion, 0)
1449 alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion, 0)
1450 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, 0)
1451 tm.registerTopoAlgo(alg)
1452
1453 # Tau dR chains
1454 algolist=[
1455 { "minDr": 0, "maxDr": 28, "otype1" : "eTAU" ,"ocut1": 30, "olist1" : "abl",
1456 "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,"otype2" : "eTAU", "ocut2": 20, "olist2" : "abl",
1457 "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect}, # 0DR28-eTAU30abl-eTAU20abl
1458 { "minDr": 0, "maxDr": 28, "otype1" : "eTAU" ,"ocut1": 30, "olist1" : "abm",
1459 "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,"otype2" : "eTAU", "ocut2": 20, "olist2" : "abm",
1460 "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect}, # 0DR28-eTAU30abm-eTAU20abm
1461 ]
1462 for x in algolist:
1463 class d:
1464 pass
1465 for k in x:
1466 setattr (d, k, x[k])
1467 obj1 = "%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1468 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1469 toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, obj2)
1470 log.debug("Define %s", toponame)
1471 inputList = [d.otype1 + d.olist1] if d.otype1==d.otype2 else [d.otype1 + d.olist1, d.otype2 + d.olist2]
1472 algoname = AlgConf.DeltaRSqrIncl1 if d.otype1==d.otype2 else AlgConf.DeltaRSqrIncl2
1473 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1474 if d.otype1==d.otype2:
1475 alg.addgeneric('InputWidth', d.inputwidth1)
1476 alg.addgeneric('MaxTob', d.nleading1)
1477 else:
1478 alg.addgeneric('InputWidth1', d.inputwidth1)
1479 alg.addgeneric('InputWidth2', d.inputwidth2)
1480 alg.addgeneric('MaxTob1', d.nleading1)
1481 alg.addgeneric('MaxTob2', d.nleading2)
1482 alg.addgeneric('NumResultBits', 1)
1483 if d.otype1==d.otype2:
1484 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion )
1485 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion )
1486 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
1487 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
1488 else:
1489 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , 0)
1490 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , 0)
1491 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1492 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1493 tm.registerTopoAlgo(alg)
1494
1495
1496 DISAMB_DR_jJ_eTau_eTau_Map = [
1497 {
1498 "algoname": "2DISAMB_jJ55ab_DR_eTAU_eTAU",
1499 "disamb" : 2,
1500 "minDR" : 0,
1501 "maxDR" : [28],
1502 "otype1" : "eTAU",
1503 "ocut1" : 30,
1504 "olist1": "ab",
1505 "nleading1": HW.eTauOutputWidthSelect,
1506 "inputwidth1": HW.eTauOutputWidthSelect,
1507 "otype2" : "eTAU",
1508 "ocut2" : 20,
1509 "nleading2": HW.eTauOutputWidthSelect,
1510 "inputwidth2": HW.eTauOutputWidthSelect,
1511 "olist2": "ab",
1512 "otype3" : "jJ",
1513 "ocut3" : 55,
1514 "nleading3": HW.jJetOutputWidthSelect,
1515 "inputwidth3": HW.jJetOutputWidthSelect,
1516 "olist3": "ab",
1517 },
1518 {
1519 "algoname": "2DISAMB_jJ50ab_DR_eTAU_eTAU",
1520 "disamb" : 2,
1521 "minDR" : 0,
1522 "maxDR" : [28],
1523 "otype1" : "eTAU",
1524 "ocut1" : 30,
1525 "olist1": "ab",
1526 "nleading1": HW.eTauOutputWidthSelect,
1527 "inputwidth1": HW.eTauOutputWidthSelect,
1528 "otype2" : "eTAU",
1529 "ocut2" : 20,
1530 "nleading2": HW.eTauOutputWidthSelect,
1531 "inputwidth2": HW.eTauOutputWidthSelect,
1532 "olist2": "ab",
1533 "otype3" : "jJ",
1534 "ocut3" : 50,
1535 "nleading3": HW.jJetOutputWidthSelect,
1536 "inputwidth3": HW.jJetOutputWidthSelect,
1537 "olist3": "ab",
1538 },
1539 {
1540 "algoname": "2DISAMB_jJ40ab_DR_eTAU_eTAU",
1541 "disamb" : 2,
1542 "minDR" : 0,
1543 "maxDR" : [28],
1544 "otype1" : "eTAU",
1545 "ocut1" : 30,
1546 "olist1": "ab",
1547 "nleading1": HW.eTauOutputWidthSelect,
1548 "inputwidth1": HW.eTauOutputWidthSelect,
1549 "otype2" : "eTAU",
1550 "ocut2" : 20,
1551 "nleading2": HW.eTauOutputWidthSelect,
1552 "inputwidth2": HW.eTauOutputWidthSelect,
1553 "olist2": "ab",
1554 "otype3" : "jJ",
1555 "ocut3" : 40,
1556 "nleading3": HW.jJetOutputWidthSelect,
1557 "inputwidth3": HW.jJetOutputWidthSelect,
1558 "olist3": "ab",
1559 },
1560 {
1561 "algoname": "2DISAMB_jJ30ab_DR_eTAU_eTAU",
1562 "disamb" : 2,
1563 "minDR" : 0,
1564 "maxDR" : [28],
1565 "otype1" : "eTAU",
1566 "ocut1" : 30,
1567 "olist1": "ab",
1568 "nleading1": HW.eTauOutputWidthSelect,
1569 "inputwidth1": HW.eTauOutputWidthSelect,
1570 "otype2" : "eTAU",
1571 "ocut2" : 20,
1572 "nleading2": HW.eTauOutputWidthSelect,
1573 "inputwidth2": HW.eTauOutputWidthSelect,
1574 "olist2": "ab",
1575 "otype3" : "jJ",
1576 "ocut3" : 30,
1577 "nleading3": HW.jJetOutputWidthSelect,
1578 "inputwidth3": HW.jJetOutputWidthSelect,
1579 "olist3": "ab",
1580 }
1581 ]
1582 for x in DISAMB_DR_jJ_eTau_eTau_Map:
1583 class d:
1584 pass
1585 for k in x:
1586 setattr(d,k,x[k])
1587 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1588 toponames = []
1589 for bitId in range(len(d.maxDR)):
1590 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1591 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1592 obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1593 toponames.append("%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "",
1594 obj3, d.minDR, d.maxDR[bitId], obj1, obj2))
1595
1596 alg = AlgConf.DisambiguationDRIncl3( name = d.algoname, inputs = inputList, outputs = toponames )
1597 alg.addgeneric('InputWidth1', d.inputwidth1)
1598 alg.addgeneric('InputWidth2', d.inputwidth2)
1599 alg.addgeneric('InputWidth3', d.inputwidth3)
1600 alg.addgeneric('MaxTob1', d.nleading1)
1601 alg.addgeneric('MaxTob2', d.nleading2)
1602 alg.addgeneric('MaxTob3', d.nleading3)
1603 alg.addgeneric('NumResultBits', len(toponames))
1604
1605 for bitId in range(len(toponames)):
1606 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitId)
1607 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, bitId)
1608 alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, bitId)
1609 alg.addvariable('DisambDRSqrMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
1610 alg.addvariable('DisambDRSqrMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1611 alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, bitId)
1612
1613 tm.registerTopoAlgo(alg)
1614
1615
1616 # DR for eTAU30ab_eTAU20ab
1617 # output lines : '0DR25-eTAU30ab-eTAU20ab'
1618 # '0DR28-eTAU30ab-eTAU20ab'
1619 DR_eTau30_eTau20_Map = [
1620 {
1621 "algoname": "DR_eTAU30ab_eTAU20ab",
1622 "minDR" : 0,
1623 "maxDR" : [28],
1624 "otype1" : "eTAU",
1625 "ocut1" : 30,
1626 "olist1": "ab",
1627 "otype2" : "eTAU",
1628 "ocut2" : 20,
1629 "inputwidth": HW.eTauOutputWidthSelect,
1630 "olist2": "ab",
1631 }
1632 ]
1633 for x in DR_eTau30_eTau20_Map:
1634 class d:
1635 pass
1636 for k in x:
1637 setattr(d,k,x[k])
1638 inputList = [d.otype1 + d.olist1]
1639 toponames = []
1640 for bitId in range(len(d.maxDR)):
1641 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1642 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1643 toponames.append("%dDR%d%s%s" % ( d.minDR, d.maxDR[bitId], obj1, obj2))
1644
1645 alg = AlgConf.DeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames )
1646
1647 alg.addgeneric('InputWidth', d.inputwidth)
1648 alg.addgeneric('MaxTob', HW.eTauOutputWidthSelect)
1649 alg.addgeneric('NumResultBits', len(toponames) )
1650
1651 for bitId in range(len(toponames)):
1652 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitId)
1653 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, bitId)
1654 alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
1655 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1656
1657
1658 tm.registerTopoAlgo(alg)
1659
1660 # DISAMB 3 lists with DR cut to 2nd and 3rd lists
1661 algolist=[
1662 { "disamb": 2,
1663 "otype1" : "eTAU", "ocut1": 30, "olist1": "abl", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1664 "otype2" : "eTAU", "ocut2": 20, "olist2": "abl", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1665 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1666 "drcutmin": 0, "drcutmax": 28}, # 2DISAMB-jJ55ab-0DR28-eTAU30abl-eTAU20abl
1667 { "disamb": 2,
1668 "otype1" : "eTAU", "ocut1": 30, "olist1": "abm", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1669 "otype2" : "eTAU", "ocut2": 20, "olist2": "abm", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1670 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1671 "drcutmin": 0, "drcutmax": 28}, # 2DISAMB-jJ55ab-0DR28-eTAU30abm-eTAU20abm
1672 { "disamb" : 2,
1673 "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1674 "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1675 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1676 "drcutmin": 4 , "drcutmax": 28}, # 2DISAMB-jJ55ab-4DR28-eTAU30ab-eTAU20ab
1677 { "disamb" : 2,
1678 "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1679 "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1680 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1681 "drcutmin": 4 , "drcutmax": 32}, # 2DISAMB-jJ55ab-4DR32-eTAU30ab-eTAU20ab
1682 { "disamb" : 2,
1683 "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1684 "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1685 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1686 "drcutmin": 10 , "drcutmax": 32}, # 2DISAMB-jJ55ab-10DR32-eTAU30ab-eTAU20ab
1687 ]
1688 for x in algolist:
1689 class d:
1690 pass
1691 for k in x:
1692 setattr (d, k, x[k])
1693 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1694 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1695 obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1696 toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
1697 log.debug("Define %s", toponame)
1698 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1699 alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
1700 alg.addgeneric('InputWidth1', d.inputwidth1)
1701 alg.addgeneric('InputWidth2', d.inputwidth2)
1702 alg.addgeneric('InputWidth3', d.inputwidth3)
1703 alg.addgeneric('MaxTob1', d.nleading1)
1704 alg.addgeneric('MaxTob2', d.nleading2)
1705 alg.addgeneric('MaxTob3', d.nleading3)
1706 alg.addgeneric('NumResultBits', 1)
1707 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1708 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1709 alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
1710 alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
1711 alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
1712 alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
1713 tm.registerTopoAlgo(alg)
1714
1715
1716 #TLA deta
1717 algoList = [
1718 { "minDeta": 0, "maxDeta": 20, "otype" : "jJ", "ocut1" : 90, "olist" : "s",
1719 "nleading1" : 1, "inputwidth1": HW.jJetOutputWidthSort, "ocut2" : 0, "nleading2": 2}, #0DETA20-jJ90s1-jJs2
1720 { "minDeta": 0, "maxDeta" : 24, "otype" : "eTAU" , "olist" : "s", "inputwidth1": HW.eTauOutputWidthSort,
1721 "ocut1" : 30, "nleading1": 2,
1722 "ocut2" : 12, "nleading2": 2}, #0DETA24_eTAU30s2_eTAU12s2
1723 ]
1724 for x in algoList:
1725 class d:
1726 pass
1727 for k in x:
1728 setattr (d, k, x[k])
1729 toponame = "%iDETA%i-%s%s%s%s-%s%s%s%s" % (d.minDeta, d.maxDeta,
1730 d.otype, d.ocut1 if d.ocut1 > 0 else "", d.olist, d.nleading1,
1731 d.otype, d.ocut2 if d.ocut2 > 0 else "", d.olist, d.nleading2)
1732 log.debug("Define %s", toponame)
1733 inputList = d.otype + d.olist
1734 alg = AlgConf.DeltaEtaIncl1( name = toponame, inputs = inputList, outputs = toponame )
1735 alg.addgeneric('InputWidth', d.inputwidth1)
1736 alg.addgeneric('MaxTob', d.nleading2)
1737 alg.addgeneric('NumResultBits', 1)
1738 alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion, 0)
1739 alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion, 0)
1740 alg.addvariable('MinDeltaEta', d.minDeta*_eta_conversion, 0)
1741 alg.addvariable('MaxDeltaEta', d.maxDeta*_eta_conversion, 0)
1742 tm.registerTopoAlgo(alg)
1743
1744 # ATR-30401
1745 # topoitems will be the following:
1746 # 0DPHI10_jXE40delay_jJ40s
1747 # 0DPHI99_jXE40delay_jJ40s
1748 DPHI_jXE40delay_jJ40s_map = [
1749 {
1750 "algoname" : "DPHI_jXE40delay_jJ40s",
1751 "Delay1" : 1,
1752 "Delay2" : 0,
1753 "InputWidth1": HW.metOutputWidth,
1754 "InputWidth2": HW.jJetOutputWidthSort,
1755 "MaxTob1" : 1,
1756 "MaxTob2" : 6,
1757 "MinET1" : 40*_et_conversion,
1758 "MinET2" : 40*_et_conversion,
1759 "MinDeltaPhi": 0*_phi_conversion,
1760 "phi_thresholds": [10, 99],
1761 }
1762 ]
1763
1764 for x in DPHI_jXE40delay_jJ40s_map:
1765 class d:
1766 pass
1767 for k in x:
1768 setattr(d,k,x[k])
1769 inputList = ['jXEs', 'jJs']
1770 toponames = []
1771 for bitId in range(len(d.phi_thresholds)):
1772 toponames.append("0DPHI%d-jXE40delay-jJ40s" % (d.phi_thresholds[bitId]))
1773
1774 alg = AlgConf.DeltaPhiIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
1775
1776 alg.addgeneric('InputWidth1', d.InputWidth1)
1777 alg.addgeneric('InputWidth2', d.InputWidth2)
1778 alg.addgeneric('MaxTob1', d.MaxTob1)
1779 alg.addgeneric('MaxTob2', d.MaxTob2)
1780 alg.addgeneric('NumResultBits', len(toponames) )
1781 alg.addgeneric('Delay1', d.Delay1)
1782 alg.addgeneric('Delay2', d.Delay2)
1783
1784
1785 for bitId in range(len(toponames)):
1786 alg.addvariable('MinET1', d.MinET1, bitId)
1787 alg.addvariable('MinET2', d.MinET2, bitId)
1788 alg.addvariable('MinDeltaPhi', d.MinDeltaPhi, bitId)
1789 alg.addvariable('MaxDeltaPhi', d.phi_thresholds[bitId]*_phi_conversion, bitId)
1790 tm.registerTopoAlgo(alg)
1791
1792 # ATR-31097
1793 TeAsymmetry_map = [
1794 {
1795 "algoname" : "TeAsymmetry-jTENoSort",
1796 "deltaAbsMin" : [5, 5, 3, 7],
1797 "asymFactor" : [1, 1.05, 1, 0.9],
1798 "asymOffset" : [-5, -24, -5, -7],
1799 "maxTeProduct": [200, 200, 200, 200],
1800 }
1801 ]
1802
1803 for x in TeAsymmetry_map:
1804 class d:
1805 pass
1806 for k in x:
1807 setattr(d,k,x[k])
1808 inputList = ['jTENoSort_1BC']
1809 # To update with correct names
1810 toponames = []
1811 for bitId in range(len(d.deltaAbsMin)):
1812 toponames.append("TeAsymmetry_jTENoSort_ParamSet%d" % (bitId))
1813
1814 alg = AlgConf.TeAsymmetry( name = d.algoname, inputs = inputList, outputs = toponames )
1815 alg.addgeneric('InputWidth', 1)
1816 alg.addgeneric('NumResultBits', len(toponames))
1817 alg.addgeneric("Delay", 1)
1818
1819 for bitId in range(len(toponames)):
1820 #Update with the correct algo parameters
1821 alg.addvariable('deltaAbsMin', d.deltaAbsMin[bitId]*_et_conversion, bitId) #Units of 100MeV
1822 alg.addvariable('asymFactor', d.asymFactor[bitId], bitId)
1823 alg.addvariable('asymOffset', d.asymOffset[bitId]*_et_conversion, bitId) #Units of 100MeV
1824 alg.addvariable('maxTeProduct', d.maxTeProduct[bitId]*_et_conversion*_et_conversion, bitId) #Units of (100MeV)^2
1825 tm.registerTopoAlgo(alg)
1826
1827 #TeATIME
1828 TeATIME_map = [
1829 {
1830 "algoname" : "TeATIME-jTENoSort",
1831 "teFlavor" : [2,1,2,3], # 0 = off, 1 = full jTE, 2 = central jTE, 3 = forward jTE (A+C side)
1832 "combination" : [0,0,0,1], # 0 = require both, 1 = require factor, 2 = require offset, 3 = require any of the two criteria
1833 "nextBcOffset" : [-2.5,10,10,10], # offset added to upcoming BC's jTE (in GeV, fractional values down to 100 MeV are possible).
1834 # The 'offset' criterion is considered as passed if this sum exceeds the current BC's jTE value,
1835 # i.e., to require a minimum *increase* in jTE in the next BC this should be a *negative* value!
1836 "nextBcFactor" : [0.9,2.5,2.5,2.5] # factor by which upcoming BC's jTE must be larger than current BC's jTE value
1837 }
1838 ]
1839
1840 for x in TeATIME_map:
1841 class d:
1842 pass
1843 for k in x:
1844 setattr(d,k,x[k])
1845 inputList = ['jTENoSort_1BC']
1846 # To update with correct names
1847 toponames = []
1848 for bitId in range(4):
1849 toponames.append("TeATIME_jTENoSort_ParamSet%d" % (bitId))
1850
1851
1852 alg = AlgConf.TeATIME( name = d.algoname, inputs = inputList, outputs = toponames )
1853 alg.addgeneric('InputWidth', 1)
1854 alg.addgeneric('NumResultBits', len(toponames))
1855 for bitId in range(len(d.teFlavor)):
1856 alg.addvariable('algoLogic', d.teFlavor[bitId] + ( d.combination[bitId] << 2 ) , bitId) #two bit fields (of 2 bits each) merged into on FW register
1857 alg.addvariable('nextBcFactor', round(d.nextBcFactor[bitId] * pow(2,8)), bitId) #integer representation of factor corresponding to 8 fractional bits
1858 alg.addvariable('nextBcOffset', round(d.nextBcOffset[bitId] * _et_conversion), bitId) #converted to units of 100MeV
1859 tm.registerTopoAlgo(alg)
1860
1861
1862
1863 # DISAMB 3 lists with DR cut to 2nd and 3rd lists
1864 algolist=[
1865 { "disamb": 2,
1866 "otype1" : "eTAU", "ocut1": 20, "olist1": "ab","nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1867 "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1868 "otype3" : "jJ", "ocut3": 40, "olist3": "ab", "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1869 "drcutmin": 0, "drcutmax": 10}, # 2DISAMB-jJ40ab-0DR10-eTAU20ab-eTAU12ab
1870 ]
1871 for x in algolist:
1872 class d:
1873 pass
1874 for k in x:
1875 setattr (d, k, x[k])
1876 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1877 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1878 obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1879 toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
1880 log.debug("Define %s", toponame)
1881 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1882 alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
1883 alg.addgeneric('InputWidth1', d.inputwidth1)
1884 alg.addgeneric('InputWidth2', d.inputwidth2)
1885 alg.addgeneric('InputWidth3', d.inputwidth3)
1886 alg.addgeneric('MaxTob1', d.nleading1)
1887 alg.addgeneric('MaxTob2', d.nleading2)
1888 alg.addgeneric('MaxTob3', d.nleading3)
1889 alg.addgeneric('NumResultBits', 1)
1890 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1891 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1892 alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
1893 alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
1894 alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
1895 alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
1896 tm.registerTopoAlgo(alg)
1897
1898 # AnomalyDetectionBDT muon-only anomaly trigger
1899 algo = {
1900 "algoname": "ADBDT-MU0s",
1901 "otype1": "MU", "olist1": "s", "inputwidth1": 6, "nleading1": 3,
1902 "WPList": ["Tight", "Loose"],
1903 "MinET1": 0,#min muon1 threshold in GeV, the 0 sets the muon to the min TOB threshold avaiable in Topo
1904 "MinET2": 0,#min muon2 threshold in Gev
1905 "ScoreThreshold": [40, 25]
1906 }
1907
1908 class d:
1909 pass
1910
1911 for k in algo:
1912 setattr(d, k, algo[k])
1913
1914 toponames = [f"ADBDT-{d.nleading1}{d.otype1}0{d.olist1}-{wp}" for wp in d.WPList]
1915
1916 alg = AlgConf.AnomalyDetectionBDT(
1917 name=d.algoname,
1918 inputs=[d.otype1 + d.olist1],
1919 outputs=toponames
1920 )
1921 alg.addgeneric('NumResultBits', 2)
1922 alg.addgeneric('MaxTob',d.nleading1) #Set the number of Tobs to 3 (leading pT 3 muons)
1923
1924 alg.addvariable('MinET1',d.MinET1*_et_conversion)
1925 alg.addvariable('MinET2',d.MinET2*_et_conversion)
1926 for bitId in range(len(toponames)):
1927 alg.addvariable('ScoreThreshold', d.ScoreThreshold[bitId], bitId)
1928
1929 tm.registerTopoAlgo(alg)
1930
1931
1932 #VAE-based anomaly trigger
1933 # output lines: 'ADVAE2A-6jJ0s-4eTAU0s-4MU0s-jXE0s-Tight',
1934 # 'ADVAE2A-6jJ0s-4eTAU0s-4MU0s-jXE0s-Loose'
1935 #Ordering -
1936 #1. jJetx6
1937 #2. eTAUx4
1938 #3. MUx4
1939 #4. jXEx1
1940 algo = {
1941 "algoname" : "ADVAE2A-jJ0s-eTAU0s-MU0s-jXE0s",
1942 "otype1" : "jJ", "olist1": "s", "inputwidth1": 6, "nleading1": 6,
1943 "otype2" : "eTAU", "olist2": "s", "inputwidth2": 6, "nleading2": 4,
1944 "otype3" : "MU", "olist3": "s", "inputwidth3": 6, "nleading3": 4,
1945 "otype4" : "jXE", "olist4": "s", "inputwidth4": 1, "nleading4": 1,
1946 "WPList" : ["Tight", "Loose"],
1947 "MinET1" : 15, # jJets in GeV (= 100MeV steps after conversion)
1948 "MinET2" : 0, # eTaus
1949 "MinET3" : 0, # muons
1950 "MinET4" : 0, # jXE
1951 "ScaleSqr1" : [128, 128], #corresponds to Tight and Loose WPs
1952 "ScaleSqr2" : [128, 128], #corresponds to Tight and Loose WPs
1953 "ScaleSqr3" : [128, 128], #corresponds to Tight and Loose WPs
1954 "AnomalyScoreThresh" : [1521991, 1333204], #corresponds to Tight and Loose WPs (500Hz,1kHz est.)
1955 }
1956 class d:
1957 pass
1958 for k in algo:
1959 setattr (d, k, algo[k])
1960 toponames = []
1961 for WP in d.WPList:
1962 toponames.append("ADVAE2A-%s%s0%s-%s%s0%s-%s%s0%s-%s0%s-%s" %(str(d.nleading1), d.otype1, d.olist1,
1963 str(d.nleading2), d.otype2, d.olist2,
1964 str(d.nleading3), d.otype3, d.olist3,
1965 d.otype4, d.olist4,
1966 WP) )
1967 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3, d.otype4 + d.olist4]
1968 alg = AlgConf.ADVAE_2A( name = d.algoname, inputs = inputList, outputs = toponames)
1969 alg.addgeneric('InputWidth1', d.inputwidth1)
1970 alg.addgeneric('InputWidth2', d.inputwidth2)
1971 alg.addgeneric('InputWidth3', d.inputwidth3)
1972 alg.addgeneric('InputWidth4', d.inputwidth4)
1973 alg.addgeneric('MaxTob1', d.nleading1)
1974 alg.addgeneric('MaxTob2', d.nleading2)
1975 alg.addgeneric('MaxTob3', d.nleading3)
1976 alg.addgeneric('MaxTob4', d.nleading4)
1977 alg.addgeneric('NumResultBits', len(toponames))
1978 alg.addgeneric('ADVAEVersion', 1)
1979 alg.addvariable('MinET1', d.MinET1 * _et_conversion)
1980 alg.addvariable('MinET2', d.MinET2 * _et_conversion)
1981 alg.addvariable('MinET3', d.MinET3 * _et_conversion)
1982 alg.addvariable('MinET4', d.MinET4 * _et_conversion)
1983 for bitId in range(len(toponames)):
1984 alg.addvariable('ScaleSqr1', d.ScaleSqr1[bitId], bitId)
1985 alg.addvariable('ScaleSqr2', d.ScaleSqr2[bitId], bitId)
1986 alg.addvariable('ScaleSqr3', d.ScaleSqr3[bitId], bitId)
1987 alg.addvariable('AnomalyScoreThresh', d.AnomalyScoreThresh[bitId], bitId)
1988 tm.registerTopoAlgo(alg)
1989
1990 algolist=[
1991 { "disamb": 2,
1992 "otype1" : "eTAU", "ocut1": 20, "olist1": "ab","nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1993 "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1994 "otype3" : "jJ", "ocut3": 30, "olist3": "ab", "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1995 "drcutmin": 0, "drcutmax": 10}, # 2DISAMB-jJ30ab-0DR10-eTAU20ab-eTAU12ab
1996 ]
1997 for x in algolist:
1998 class d:
1999 pass
2000 for k in x:
2001 setattr (d, k, x[k])
2002 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
2003 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
2004 obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
2005 toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
2006 log.debug("Define %s", toponame)
2007 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
2008 alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
2009 alg.addgeneric('InputWidth1', d.inputwidth1)
2010 alg.addgeneric('InputWidth2', d.inputwidth2)
2011 alg.addgeneric('InputWidth3', d.inputwidth3)
2012 alg.addgeneric('MaxTob1', d.nleading1)
2013 alg.addgeneric('MaxTob2', d.nleading2)
2014 alg.addgeneric('MaxTob3', d.nleading3)
2015 alg.addgeneric('NumResultBits', 1)
2016 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
2017 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
2018 alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
2019 alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
2020 alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
2021 alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
2022 tm.registerTopoAlgo(alg)
2023
2024 # jINVM + DPHI
2025 NFFDphimap = [
2026 { "itemNameMinInvm": 400, "minInvm": 640 , "minDphi": 0, "maxDphiList": [26, 24, 22, 20],
2027 "otype1" : "AjJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
2028 "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
2029 ]
2030 for x in NFFDphimap:
2031 class d:
2032 pass
2033 for k in x:
2034 setattr (d, k, x[k])
2035 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
2036 toponames=[]
2037 for maxDphi in d.maxDphiList:
2038 toponames.append ("%iINVM-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.itemNameMinInvm, d.minDphi, maxDphi,
2039 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2040 d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
2041 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'jINVM_DPHI', inputs = inputList, outputs = toponames)
2042 alg.addgeneric('InputWidth1', d.inputwidth)
2043 alg.addgeneric('InputWidth2', d.inputwidth)
2044 alg.addgeneric('MaxTob1', d.nleading1)
2045 alg.addgeneric('MaxTob2', d.nleading2)
2046 alg.addgeneric('NumResultBits', len(toponames))
2047 for bitid,maxDphi in enumerate(d.maxDphiList):
2048 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
2049 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
2050 alg.addvariable('MinMSqr', d.minInvm*d.minInvm *_et_conversion*_et_conversion , bitid)
2051 alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
2052 alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion , bitid)
2053 alg.addvariable('MaxDeltaPhi', maxDphi*_phi_conversion, bitid)
2054 tm.registerTopoAlgo(alg)
2055
2056
2057 # CF
2058 algoList = [
2059 { "itemNameMinInvm": 400, "minInvm": 640, "otype1" : "AjJ", "ocut1": 60, "olist1" : "s", "nleading1" : 6, "inputwidth1": HW.jJetOutputWidthSort,
2060 "otype2" : "AjJ", "ocut2": 50, "olist2" : "s", "nleading2" : 6, "inputwidth2": HW.jJetOutputWidthSort, "applyEtaCut":1,
2061 "minEta1": 0 ,"maxEta1": 32 , "minEta2": 30 ,"maxEta2": 49 , }, #400INVM-AjJ60s6pETA32-AjJ50s6p30ETA49
2062 ]
2063 for x in algoList:
2064 class d:
2065 pass
2066 for k in x:
2067 setattr (d, k, x[k])
2068 obj1 = "%s%s%sp%sETA%i" % (d.otype1, str(d.ocut1), d.olist1 + (str(d.nleading1) if d.olist1.find('s')>=0 else ""),str(d.minEta1) if d.minEta1>0 else "", d.maxEta1)
2069 obj2 = "-%s%s%sp%sETA%i" % (d.otype2, str(d.ocut2), d.olist2 + (str(d.nleading2) if d.olist2.find('s')>=0 else ""),str(d.minEta2) if d.minEta2>0 else "", d.maxEta2)
2070 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
2071 toponame = "%iINVM-%s%s" % (d.itemNameMinInvm, obj1, obj2)
2072 alg = AlgConf.InvariantMassInclusive2( name = toponame, inputs = inputList, outputs = toponame)
2073 alg.addgeneric('InputWidth1', d.inputwidth1)
2074 alg.addgeneric('InputWidth2', d.inputwidth2)
2075 alg.addgeneric('MaxTob1', d.nleading1)
2076 alg.addgeneric('MaxTob2', d.nleading2)
2077 alg.addgeneric('NumResultBits', 1)
2078 if (d.applyEtaCut>0):
2079 alg.addgeneric('ApplyEtaCut', d.applyEtaCut)
2080 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion )
2081 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion )
2082 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion )
2083 alg.addvariable('MaxMSqr', _no_m_upper_threshold )
2084 if (d.applyEtaCut>0):
2085 alg.addvariable('MinEta1', d.minEta1*_eta_conversion )
2086 alg.addvariable('MaxEta1', d.maxEta1*_eta_conversion )
2087 alg.addvariable('MinEta2', d.minEta2*_eta_conversion )
2088 alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion )
2089 tm.registerTopoAlgo(alg)
2090
2091 # jINVM
2092 NFFmap = [
2093 { "itemNameMinInvmList": [300, 400, 500, 700], "minInvmList": [480, 640, 800, 1100] ,
2094 "otype1" : "AjJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
2095 "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
2096 ]
2097 for x in NFFmap:
2098 class d:
2099 pass
2100 for k in x:
2101 setattr (d, k, x[k])
2102 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
2103 toponames=[]
2104 for minInvm in d.itemNameMinInvmList:
2105 toponames.append ("%iINVM-%s%s%s%s-%s%s%s%s" % (minInvm,
2106 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2107 d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
2108 alg = AlgConf.InvariantMassInclusive2( name = 'jINVM', inputs = inputList, outputs = toponames)
2109 alg.addgeneric('InputWidth1', d.inputwidth)
2110 alg.addgeneric('InputWidth2', d.inputwidth)
2111 alg.addgeneric('MaxTob1', d.nleading1)
2112 alg.addgeneric('MaxTob2', d.nleading2)
2113 alg.addgeneric('NumResultBits', len(toponames))
2114 for bitid,minInvm in enumerate(d.minInvmList):
2115 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
2116 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
2117 alg.addvariable('MinMSqr', minInvm*minInvm*_et_conversion*_et_conversion , bitid)
2118 alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
2119 tm.registerTopoAlgo(alg)
2120
2121 # jINVM_NFF
2122 NFFmap = [
2123 { "itemNameMinInvmList": [300, 400, 500, 700], "minInvmList": [480, 640, 800, 1100] ,
2124 "otype1" : "jJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
2125 "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
2126 ]
2127 for x in NFFmap:
2128 class d:
2129 pass
2130 for k in x:
2131 setattr (d, k, x[k])
2132 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
2133 toponames=[]
2134 for minInvm in d.itemNameMinInvmList:
2135 toponames.append ("%iINVM-%s%s%s%s-%s%s%s%s" % (minInvm,
2136 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2137 d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
2138 alg = AlgConf.InvariantMassInclusive2( name = 'jINVM_NFF', inputs = inputList, outputs = toponames)
2139 alg.addgeneric('InputWidth1', d.inputwidth)
2140 alg.addgeneric('InputWidth2', d.inputwidth)
2141 alg.addgeneric('MaxTob1', d.nleading1)
2142 alg.addgeneric('MaxTob2', d.nleading2)
2143 alg.addgeneric('NumResultBits', len(toponames))
2144 for bitid,minInvm in enumerate(d.minInvmList):
2145 alg.addvariable('MinET1', get_threshold_cut("CjJ", d.ocut1)*_et_conversion , bitid)
2146 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
2147 alg.addvariable('MinMSqr', minInvm*minInvm*_et_conversion*_et_conversion , bitid)
2148 alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
2149 tm.registerTopoAlgo(alg)
2150
2151 #ATR-19355
2152 # Parameter ordering
2153 # 1. MinEt
2154 # 2. MinMSqr
2155 # 3. MaxMSqr
2156 toponame = "0INVM10-3MU3Vab"
2157 log.debug("Define %s", toponame)
2158 inputList = 'MU3Vab'
2159 alg = AlgConf.InvariantMassThreeTOBsIncl1( name = toponame, inputs = inputList, outputs = toponame )
2160 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2161 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2162 alg.addgeneric('NumResultBits', 1)
2163 alg.addvariable('MinET1', 0*_et_conversion)
2164 alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
2165 alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
2166 tm.registerTopoAlgo(alg)
2167
2168 toponame = "0INVM10-3MU3VFab"
2169 log.debug("Define %s", toponame)
2170 inputList = 'MU3VFab'
2171 alg = AlgConf.InvariantMassThreeTOBsIncl1( name = toponame, inputs = inputList, outputs = toponame )
2172 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2173 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2174 alg.addgeneric('NumResultBits', 1)
2175 alg.addvariable('MinET1', 0*_et_conversion)
2176 alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
2177 alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
2178 tm.registerTopoAlgo(alg)
2179
2180 #ATR-19638, 3muon, not all with the same charge
2181 toponame = "0INVM10C-3MU3Vab"
2182 log.debug("Define %s", toponame)
2183 inputList = 'MU3Vab'
2184 alg = AlgConf.InvariantMassThreeTOBsIncl1Charge( name = toponame, inputs = inputList, outputs = toponame )
2185 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2186 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2187 alg.addgeneric('NumResultBits', 1)
2188 alg.addvariable('MinET1', 0*_et_conversion)
2189 alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
2190 alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
2191 tm.registerTopoAlgo(alg)
2192
2193
2194 # LFV
2195 # output lines: 0INVM10-0DR15-eEM10abl-MU8Fab, 0INVM10-0DR15-eEM15abl-MU5VFab
2196 # Parameter ordering
2197 # 1. MinEt1
2198 # 2. MinEt2
2199 # 3. MinMSqr
2200 # 4. MaxMSqr
2201 # 5. MinEta1
2202 # 6. MaxEta1
2203 # 7. MinEta2
2204 # 8. MaxEta2
2205 # 9. DeltaRMin
2206 # 10. DeltaRMax
2207 INVM_DR_eEM_MU_Map = [{
2208 "algoname": "INVM_DR_eEM_MU",
2209 "minInvm" : 0,
2210 "maxInvm" : 10,
2211 "minDR" : 0,
2212 "maxDR" : 15,
2213 "otype1" : "eEM",
2214 "ocut1" : [10,15],
2215 "olist1": "abl",
2216 "otype2" : "MU",
2217 "olist2": ["Fab","VFab"],
2218 "ocut2" : 5,
2219 "ocut2Offset" : [3,0]
2220
2221 }]
2222
2223 for x in INVM_DR_eEM_MU_Map:
2224 class d:
2225 pass
2226 for k in x:
2227 setattr(d,k,x[k])
2228 inputList = [d.otype1 + d.olist1, d.otype2 + str(d.ocut2) + d.olist2[1] ]
2229 toponames = []
2230 for bitId in range(len(d.ocut1)):
2231 obj1 = "-%s%s%s" % (d.otype1, str( d.ocut1[bitId] ) , d.olist1)
2232 obj2 = "-%s%s%s" % (d.otype2, str( d.ocut2 + d.ocut2Offset[bitId] ) , d.olist2[bitId])
2233 toponames.append("%dINVM%d-%dDR%d%s%s" % ( d.minInvm, d.maxInvm, d.minDR, d.maxDR, obj1, obj2))
2234
2235 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
2236
2237 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSelect)
2238 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2239 alg.addgeneric('MaxTob1', HW.eEmOutputWidthSelect)
2240 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2241 alg.addgeneric('ApplyEtaCut', 1)
2242
2243 alg.addgeneric('NumResultBits', len(toponames) )
2244
2245 for bitId in range(len(toponames)):
2246 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1[bitId])*_et_conversion, bitId)
2247 alg.addvariable('MinET2', (d.ocut2 + d.ocut2Offset[bitId])*_et_conversion, bitId)
2248 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
2249 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitId)
2250 alg.addvariable('MinEta1', 0*_eta_conversion, bitId)
2251 alg.addvariable('MaxEta1', 49*_eta_conversion, bitId)
2252 alg.addvariable('MinEta2', 0*_eta_conversion, bitId)
2253 alg.addvariable('MaxEta2', 49*_eta_conversion, bitId)
2254 alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
2255 alg.addvariable('DeltaRMax', d.maxDR*d.maxDR*_dr_conversion*_dr_conversion, bitId)
2256
2257
2258 tm.registerTopoAlgo(alg)
2259
2260 #ATR-18824 ZAFB-DPHI
2261 # TODO: update with fwd electrons
2262 # Parameter ordering
2263 # 1. MinEt1
2264 # 2. MinEt2
2265 # 3. MinMSqr
2266 # 4. MaxMSqr
2267 # 5. MinEta1
2268 # 6. MaxEta1
2269 # 7. MinEta2
2270 # 8. MaxEta2
2271 # 9. MinDeltaPhi
2272 # 10. MaxDeltaPhi
2273 ZAFBDphimap = [
2274 { "minInvm": 60 , "minDphiList": [4, 25], "maxDphi": 32, "minEta2": 25, "maxEta2": 49,
2275 "inputwidth1": HW.eEmOutputWidthSelect, "otype1" : "eEM", "ocut1" : 18, "olist1" : "abm",
2276 "nleading1" : HW.eEmOutputWidthSelect, "inputwidth2": HW.jEmOutputWidthSort, "ocut2" : 20, "ocut3" : 25, "nleading2" : 6 }
2277 ]
2278 for x in ZAFBDphimap:
2279 class d:
2280 pass
2281 for k in x:
2282 setattr (d, k, x[k])
2283 inputList = [d.otype1 + d.olist1, 'jEMs25ETA49']
2284 toponames=[]
2285 for minDphi in d.minDphiList:
2286 toponames.append ("%iINVM-%02dDPHI%i-%s%s%s%s-jEM%ss%s%iETA%i" % (d.minInvm, minDphi, d.maxDphi,
2287 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2288 str(d.ocut3) , str(d.nleading2) , d.minEta2, d.maxEta2))
2289 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'ZAFB_DPHI', inputs = inputList, outputs = toponames)
2290 alg.addgeneric('InputWidth1', d.inputwidth1)
2291 alg.addgeneric('InputWidth2', d.inputwidth2)
2292 alg.addgeneric('MaxTob1', d.nleading1)
2293 alg.addgeneric('MaxTob2', d.nleading2)
2294 alg.addgeneric('NumResultBits', len(toponames))
2295 alg.addgeneric('ApplyEtaCut', 1)
2296 for bitid,minDphi in enumerate(d.minDphiList):
2297 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitid)
2298 alg.addvariable('MinET2', get_threshold_cut('jEM', d.ocut3)*_et_conversion, bitid)
2299 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
2300 alg.addvariable('MaxMSqr', _no_m_upper_threshold, bitid)
2301 alg.addvariable('MinEta1', 0*_eta_conversion, bitid)
2302 alg.addvariable('MaxEta1', 49*_eta_conversion, bitid)
2303 alg.addvariable('MinEta2', d.minEta2*_eta_conversion, bitid)
2304 alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion, bitid)
2305 alg.addvariable('MinDeltaPhi', minDphi*_phi_conversion, bitid)
2306 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, bitid)
2307 tm.registerTopoAlgo(alg)
2308
2309 inputList = [d.otype1 + d.olist1, 'jEMsm25ETA49']
2310 toponames=[]
2311 for minDphi in d.minDphiList:
2312 toponames.append ("%iINVM-%02dDPHI%i-%s%s%s%s-jEM%ssm%s%iETA%i" % (d.minInvm, minDphi, d.maxDphi,
2313 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2314 str(d.ocut2) , str(d.nleading2) , d.minEta2, d.maxEta2))
2315 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'ZAFB_DPHIM', inputs = inputList, outputs = toponames)
2316 alg.addgeneric('InputWidth1', d.inputwidth1)
2317 alg.addgeneric('InputWidth2', d.inputwidth2)
2318 alg.addgeneric('MaxTob1', d.nleading1)
2319 alg.addgeneric('MaxTob2', d.nleading2)
2320 alg.addgeneric('NumResultBits', len(toponames))
2321 alg.addgeneric('ApplyEtaCut', 1)
2322 for bitid,minDphi in enumerate(d.minDphiList):
2323 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitid)
2324 alg.addvariable('MinET2', get_threshold_cut('jEM', d.ocut2)*_et_conversion, bitid)
2325 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
2326 alg.addvariable('MaxMSqr', _no_m_upper_threshold, bitid)
2327 alg.addvariable('MinEta1', 0*_eta_conversion, bitid)
2328 alg.addvariable('MaxEta1', 49*_eta_conversion, bitid)
2329 alg.addvariable('MinEta2', d.minEta2*_eta_conversion, bitid)
2330 alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion, bitid)
2331 alg.addvariable('MinDeltaPhi', minDphi*_phi_conversion, bitid)
2332 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, bitid)
2333 tm.registerTopoAlgo(alg)
2334
2335 # ATR-19302, ATR-21637
2336 listofalgos=[
2337 {"minInvm": 0,"maxInvm": 70,"minDphi": 27,"maxDphi": 32,"otype":"eEM","olist":"s","ocut1":9,"nleading1":1,"ocut2":9,"nleading2":6,}, #0INVM70-27DPHI32-eEM9s1-eEM9s6
2338 {"minInvm": 0,"maxInvm": 70,"minDphi": 27,"maxDphi": 32,"otype":"eEM","olist":"sl","ocut1":9,"nleading1":1,"ocut2":9,"nleading2":6,}, #0INVM70-27DPHI32-eEM9sl1-eEM9sl6
2339 ]
2340 for x in listofalgos:
2341 class d:
2342 pass
2343 for k in x:
2344 setattr (d, k, x[k])
2345 toponame = "%iINVM%i-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDphi, d.maxDphi, d.otype, str(d.ocut1), d.olist, str(d.nleading1), d.otype, str(d.ocut2), d.olist,str(d.nleading2))
2346 log.debug("Define %s", toponame)
2347 inputList = [d.otype + d.olist, d.otype + d.olist]
2348 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = toponame, inputs = inputList, outputs = toponame )
2349 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
2350 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
2351 alg.addgeneric('MaxTob1', d.nleading1)
2352 alg.addgeneric('MaxTob2', d.nleading2)
2353 alg.addgeneric('NumResultBits', 1)
2354 alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion)
2355 alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion)
2356 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2357 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2358 alg.addgeneric('ApplyEtaCut', 1)
2359 alg.addvariable('MinEta1', 0*_eta_conversion)
2360 alg.addvariable('MaxEta1',49*_eta_conversion)
2361 alg.addvariable('MinEta2', 0*_eta_conversion)
2362 alg.addvariable('MaxEta2',49*_eta_conversion)
2363 alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
2364 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
2365 tm.registerTopoAlgo(alg)
2366
2367
2368 # DR Map for INVM_DR_2MU3 Trigger. Output lines:
2369 #'7INVM22-0DR20-2MU3Vab'
2370 #'7INVM22-0DR12-2MU3Vab'
2371 INVM_DR_2MU3Vab_Map = [
2372 {
2373 "algoname": "7INVM22_DR_2MU3Vab",
2374 "minInvm" : 7,
2375 "maxInvm" : 22,
2376 "minDR" : [0,0],
2377 "maxDR" : [12,20],
2378 "otype1" : "MU3Vab",
2379 "mult1" : 2
2380 }
2381 ]
2382 for x in INVM_DR_2MU3Vab_Map:
2383 class d:
2384 pass
2385 for k in x:
2386 setattr(d,k,x[k])
2387 inputList = d.otype1
2388 toponames = []
2389 for bitId in range(len(d.minDR)):
2390 toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm, d.maxInvm,
2391 d.minDR[bitId] , d.maxDR[bitId],
2392 d.mult1, d.otype1
2393 )
2394 )
2395 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
2396 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2397 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2398 alg.addgeneric('NumResultBits', len(toponames))
2399 for bitId in range(len(toponames)):
2400 alg.addvariable('MinET1', 0*_et_conversion, bitId)
2401 alg.addvariable('MinET2', 0*_et_conversion, bitId)
2402 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
2403 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitId)
2404 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2405 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2406 tm.registerTopoAlgo(alg)
2407
2408
2409 # INVM_DR_2MU3VFab
2410 # Output lines: '2INVM9-0DR15-2MU3VFab'
2411 # '7INVM11-25DR99-2MU3VFab',
2412
2413
2414 INVM_DR_2MU3VFab_Map = [
2415 {
2416 "algoname": "INVM_DR_2MU3VFab",
2417 "minInvm" : [2,7],
2418 "maxInvm" : [9,11,22],
2419 "minDR" : [0,25],
2420 "maxDR" : [15,99],
2421 "otype1" : "MU3VFab",
2422 "mult1" : 2
2423 }
2424 ]
2425 for x in INVM_DR_2MU3VFab_Map:
2426 class d:
2427 pass
2428 for k in x:
2429 setattr(d,k,x[k])
2430 inputList = d.otype1
2431 toponames = []
2432 for bitId in range(len(d.minDR)):
2433 toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm[bitId], d.maxInvm[bitId],
2434 d.minDR[bitId] , d.maxDR[bitId],
2435 d.mult1, d.otype1
2436 )
2437 )
2438 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
2439 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2440 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2441 alg.addgeneric('NumResultBits', len(toponames))
2442 for bitId in range(len(toponames)):
2443 alg.addvariable('MinET1', 0*_et_conversion, bitId)
2444 alg.addvariable('MinET2', 0*_et_conversion, bitId)
2445 alg.addvariable('MinMSqr', d.minInvm[bitId]*d.minInvm[bitId]*_et_conversion*_et_conversion, bitId)
2446 alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
2447 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2448 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2449 tm.registerTopoAlgo(alg)
2450
2451
2452
2453 #ATR-19720 and ATR-22782, BPH DR+M dimuon
2454 listofalgos=[
2455 {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #2INVM9-0DR15-MU5VFab-MU3Vab
2456 {"minInvm": 8, "maxInvm": 15, "minDr": 0, "maxDr": 22, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #8INVM15-0DR22-MU5VFab-MU3Vab
2457 {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 2, "otype1" : "MU3Vab", "otype2": "", }, #2INVM9-0DR15-2MU3Vab
2458
2459
2460 {"minInvm": 0, "maxInvm": 16, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #0INVM16-20DR99-2MU3Vab
2461 {"minInvm": 0, "maxInvm": 16, "minDr": 15, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #0INVM16-15DR99-2MU3Vab
2462 {"minInvm": 8, "maxInvm": 15, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-20DR99-2MU3Vab
2463 {"minInvm": 8, "maxInvm": 15, "minDr": 15, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-15DR99-2MU3Vab
2464
2465 {"minInvm": 7, "maxInvm": 22, "minDr": 0, "maxDr": 20, "mult": 2, "otype1" : "MU3VFab", "otype2": "",}, #7INVM22-0DR20-2MU3VFab, ATR-21566
2466
2467 {"minInvm": 8, "maxInvm": 15, "minDr": 0, "maxDr": 22, "mult": 1, "otype1" : "CMU5VFab","otype2": "CMU3Vab",}, #8INVM15-0DR22-CMU5VFab-CMU3Vab
2468
2469 {"minInvm": 7, "maxInvm": 14, "minDr": 0, "maxDr": 25, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #7INVM14-0DR25-MU5VFab-MU3Vab
2470 {"minInvm": 7, "maxInvm": 11, "minDr": 25, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #7INVM11-25DR99-2MU3Vab
2471 {"minInvm": 7, "maxInvm": 14, "minDr": 0, "maxDr": 25, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3VFab", }, #7INVM14-0DR25-MU5VFab-MU3VFab
2472
2473
2474 ]
2475 for x in listofalgos:
2476 class d:
2477 pass
2478 for k in x:
2479 setattr (d, k, x[k])
2480 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
2481 obj2 = "-%s" % (d.otype2)
2482 toponame = "%iINVM%i-%iDR%i-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
2483 log.debug("Define %s", toponame)
2484 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
2485 algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1 if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2
2486 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2487 if (d.mult>1):
2488 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2489 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2490 else:
2491 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
2492 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2493 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
2494 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2495 alg.addgeneric('NumResultBits', 1)
2496 alg.addvariable('MinET1', 0*_et_conversion)
2497 alg.addvariable('MinET2', 0*_et_conversion)
2498 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2499 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2500 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
2501 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
2502 tm.registerTopoAlgo(alg)
2503
2504 #ATR-19639, BPH DR+M+OS dimuon
2505 listofalgos=[
2506 {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab",}, #2INVM9-0DR15-C-MU5VFab-MU3Vab
2507 {"minInvm": 8, "maxInvm": 15, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-20DR99-C-2MU3Vab
2508 ]
2509 for x in listofalgos:
2510 class d:
2511 pass
2512 for k in x:
2513 setattr (d, k, x[k])
2514 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
2515 obj2 = "-%s" % (d.otype2)
2516 toponame = "%iINVM%i-%iDR%i-C-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
2517 log.debug("Define %s", toponame)
2518 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
2519 algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2Charge
2520 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2521 if (d.mult>1):
2522 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2523 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2524 else:
2525 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
2526 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2527 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
2528 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2529 alg.addgeneric('NumResultBits', 1)
2530 alg.addvariable('MinET1', 0*_et_conversion)
2531 alg.addvariable('MinET2', 0*_et_conversion)
2532 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2533 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2534 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
2535 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
2536 tm.registerTopoAlgo(alg)
2537
2538
2539 # dphi with s+s #ATR-29784
2540 # Parameter ordering:
2541 # 1. MinEt1
2542 # 2. MinEt2
2543 # 3. DeltaPhiMin
2544 # 4. DeltaPhiMax
2545 algolist=[
2546 { "minDphi": 23, "maxDphi": 32, "mult": 2, "otype1" : "eEM",
2547 "ocut1": 1, "olist1": "s", "nleading1": HW.eEmOutputWidthSort, "minET1":0.9, "otype2" : "", "minET2":0.8},#23DPHI32_2eEM1s
2548 { "minDphi": 26, "maxDphi": 32, "mult": 2, "otype1" : "eTAU",
2549 "ocut1": 1, "olist1": "s", "nleading1": HW.eTauOutputWidthSort,"minET1":0.8,"otype2" : "","minET2":0.8},#26DPHI32_2eTAU1s
2550 { "minDphi": 23, "maxDphi": 32, "mult": 2, "otype1" : "jTAU",
2551 "ocut1": 1, "olist1": "s", "nleading1": HW.jTauOutputWidthSort,"minET1":1.4,"otype2" : "","minET2":1.4},#23DPHI32_2jTAU1s
2552 ]
2553 for x in algolist:
2554 class d:
2555 pass
2556 for k in x:
2557 setattr (d, k, x[k])
2558 obj = "%s" % (str(d.mult)+d.otype1+str(d.ocut1)+str(d.olist1))
2559 toponame = "%sDPHI%s-%s" % (d.minDphi, d.maxDphi, obj)
2560 log.debug("Define %s", toponame)
2561 inputList = [d.otype1+d.olist1]
2562 algoname = AlgConf.DeltaPhiIncl1
2563 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2564 alg.addgeneric('NumResultBits', 1)
2565 alg.addgeneric('InputWidth', d.nleading1)
2566 alg.addgeneric('MaxTob', d.nleading1)
2567 alg.addvariable('MinET1', d.minET1*_et_conversion)
2568 alg.addvariable('MinET2', d.minET2*_et_conversion)
2569 alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
2570 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
2571 tm.registerTopoAlgo(alg)
2572
2573 # InvMass + DPHI (+ SumET) for ATR-30727 and ATR-30728
2574 from dataclasses import dataclass
2575
2576 @dataclass
2577 class InvMassDPhiSumETAlgoParams:
2578 """ Parameters for InvariantMassDeltaPhiInclusive1 and InvariantMassDeltaPhiSumEtInclusive1 Topo algorithms """
2579 MinEt1: float
2580 MinEt2: float
2581 DeltaPhiMin: int = 23
2582 DeltaPhiMax: int = 32
2583 MinInvMassSq: float = 0 # Algorithm uses MinMSqr
2584 MaxInvMassSq: float = 1000 ** 2 # Algorithm uses MaxMSqr
2585 MinSumEt: float = 0
2586 MaxSumEt: float = 1000
2587
2588 def AddInvMassDPhiSumETAlgos(otype: str, nleading, list_of_algos: list[InvMassDPhiSumETAlgoParams]):
2589 for x in list_of_algos:
2590 # Check which parameters are set and choose correct algorithm
2591 is_InvMass_set = x.MinInvMassSq != 0 or x.MaxInvMassSq != 1000 ** 2
2592 is_SumEt_set = x.MinSumEt != 0 or x.MaxSumEt != 1000
2593 algoname = AlgConf.InvariantMassDeltaPhiSumEtInclusive1 if is_SumEt_set else AlgConf.InvariantMassDeltaPhiInclusive1
2594
2595 if float(x.MinEt1) != int(x.MinEt1):
2596 obj = f'2{otype}0{round(x.MinEt1 * 10)}s' # e.g. MinEt1 = 0.7 → eTAU07
2597 else:
2598 obj = f'2{otype}{round(x.MinEt1)}s' # e.g. MinEt1 = 1 → eTAU1
2599 toponame = f'{x.DeltaPhiMin}DPHI{x.DeltaPhiMax}-{obj}' # Always present
2600 # Check Min/MaxSumEt only for algorithm which supports it
2601 if is_SumEt_set:
2602 toponame = f'{x.MinSumEt}SUM{x.MaxSumEt}-{toponame}'
2603 if is_InvMass_set:
2604 if float(x.MinInvMassSq) != int(x.MinInvMassSq) or float(x.MaxInvMassSq) != int(x.MaxInvMassSq):
2605 toponame = f'{round(x.MinInvMassSq * 10)}INVM{round(x.MaxInvMassSq * 10)}-{toponame}'
2606 else:
2607 toponame = f'{x.MinInvMassSq}INVM{x.MaxInvMassSq}-{toponame}'
2608 log.debug('Define %s', toponame)
2609
2610 alg = algoname(name=toponame, inputs=[f'{otype}s'], outputs=[toponame])
2611 alg.addgeneric('NumResultBits', 1)
2612 alg.addgeneric('InputWidth', nleading)
2613 alg.addgeneric('MaxTob', nleading)
2614 alg.addvariable('MinET1', x.MinEt1 * _et_conversion)
2615 alg.addvariable('MinET2', x.MinEt2 * _et_conversion)
2616 alg.addvariable('MinMSqr', x.MinInvMassSq * (_et_conversion ** 2)) # Algoritm uses InvMass squared
2617 alg.addvariable('MaxMSqr', x.MaxInvMassSq * (_et_conversion ** 2))
2618 alg.addvariable('MinDeltaPhi', x.DeltaPhiMin * _phi_conversion)
2619 alg.addvariable('MaxDeltaPhi', x.DeltaPhiMax * _phi_conversion)
2620 # Set Min/MaxSumEt only for algorithm which supports it
2621 if is_SumEt_set:
2622 alg.addvariable('MinSumEt', x.MinSumEt * _et_conversion)
2623 alg.addvariable('MaxSumEt', x.MaxSumEt * _et_conversion)
2624 tm.registerTopoAlgo(alg)
2625
2626 # From ATR-30728
2627 algo_list = [
2628 InvMassDPhiSumETAlgoParams(MinEt1=0.7, MinEt2=0.7, DeltaPhiMin=24, MinInvMassSq=2.3, MaxInvMassSq=200 ** 2), # 23INVM400000-24DPHI32-2eTAU07
2629 InvMassDPhiSumETAlgoParams(MinEt1=0.7, MinEt2=0.7, DeltaPhiMin=24, MinInvMassSq=2.8, MaxInvMassSq=200 ** 2), # 28INVM400000-24DPHI32-2eTAU07
2630 InvMassDPhiSumETAlgoParams(MinEt1=0.8, MinEt2=0.8, DeltaPhiMin=25, MinInvMassSq=2.3, MaxInvMassSq=200 ** 2), # 23INVM400000-25DPHI32-2eTAU08
2631 InvMassDPhiSumETAlgoParams(MinEt1=0.7, MinEt2=0.7, DeltaPhiMin=25, MinInvMassSq=3.3, MaxInvMassSq=200 ** 2), # 33INVM400000-25DPHI32-2eTAU07
2632 InvMassDPhiSumETAlgoParams(MinEt1=0.7, MinEt2=0.7, DeltaPhiMin=27, MinInvMassSq=2.3, MaxInvMassSq=200 ** 2), # 23INVM400000-27DPHI32-2eTAU07
2633 ]
2634 AddInvMassDPhiSumETAlgos('eTAU', HW.eTauOutputWidthSort, algo_list)
2635
2636 # From ATR-30727
2637 algo_list = []
2638 AddInvMassDPhiSumETAlgos('jJ', HW.jJetOutputWidthSort, algo_list)
2639
2640 # g-2 tau (ATR-30638)
2641 Algo = namedtuple('Algo', ['dPhiMin', 'dPhiMax', 'otype', 'olist', 'ocut1', 'ocut2', 'nTOB'])
2642 algolist=[
2643 Algo(dPhiMin=30, dPhiMax=32, otype='eTAU', olist='s', ocut1=50, ocut2=50, nTOB=HW.eTauOutputWidthSort), #30DPHI32-2eTAU50s
2644 ]
2645 for x in algolist:
2646 name = f'{x.dPhiMin}DPHI{x.dPhiMax}-'
2647 name += f'2{x.otype}{x.ocut1}{x.olist}' if x.ocut1 == x.ocut2 else f'{x.otype}{x.ocut1}{x.olist}-{x.otype}{x.ocut2}{x.olist}'
2648
2649 alg = AlgConf.DeltaPhiIncl1(name=name, inputs=[x.otype+x.olist], outputs=[name])
2650 alg.addgeneric('NumResultBits', 1)
2651 alg.addgeneric('InputWidth', x.nTOB)
2652 alg.addgeneric('MaxTob', x.nTOB)
2653 alg.addvariable('MinET1', get_threshold_cut(x.otype, x.ocut1)*_et_conversion)
2654 alg.addvariable('MinET2', get_threshold_cut(x.otype, x.ocut2)*_et_conversion)
2655 alg.addvariable('MinDeltaPhi', x.dPhiMin*_phi_conversion)
2656 alg.addvariable('MaxDeltaPhi', x.dPhiMax*_phi_conversion)
2657 tm.registerTopoAlgo(alg)
constexpr int pow(int base, int exp) noexcept