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": "INVM-eEMs-2DISAMB-jJs",#"110INVM150-eEM50s-eEM10s-2DISAMB-jJ60s",
750 "disamb" : [2, 2],
751 "minInvm" : [110, 110],
752 "maxInvm" : [150, 150],
753 "otype1" : "eEM",
754 "ocut1a" : [50, 40],
755 "ocut1b" : [10, 10],
756 "olist1": "s",
757 "nleading1": HW.eEmOutputWidthSort,
758 "inputwidth1": HW.eEmOutputWidthSort,
759 "otype2" : "jJ",
760 "ocut2" : [60, 60],
761 "nleading2": 3,
762 "inputwidth2": HW.jJetOutputWidthSort,
763 "olist2": "s",
764 "numResultBits": 2,
765 }
766 ]
767 for x in INVM_DISAMB_Map:
768 class d:
769 pass
770 for k in x:
771 setattr(d,k,x[k])
772 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
773
774 toponames = []
775 for bitId in range(d.numResultBits):
776 obj1a = "-%s%s%s" % (d.otype1, str(d.ocut1a[bitId]), d.olist1)
777 obj1b = "-%s%s%s" % (d.otype1, str(d.ocut1b[bitId]), d.olist1)
778 obj2 = "%s%s%s" % (d.otype2, str(d.ocut2[bitId]), d.olist2)
779 toponames.append( "%iINVM%i%s%s-%sDISAMB-%s" % (d.minInvm[bitId], d.maxInvm[bitId], obj1a, obj1b, str(d.disamb[bitId]) if d.disamb[bitId]>0 else "", obj2) )
780
781 alg = AlgConf.InvariantMassInclusive1Disambiguation2( name = d.algoname, inputs = inputList, outputs = toponames )
782 alg.addgeneric('InputWidth1', d.inputwidth1)
783 alg.addgeneric('InputWidth2', d.inputwidth2)
784 alg.addgeneric('MaxTob1', d.nleading1)
785 alg.addgeneric('MaxTob2', d.nleading2)
786 alg.addgeneric('NumResultBits', d.numResultBits)
787
788 for bitId in range(d.numResultBits):
789 alg.addvariable('MinET1a', get_threshold_cut(d.otype1, d.ocut1a[bitId])*_et_conversion, bitId)
790 alg.addvariable('MinET1b', get_threshold_cut(d.otype1, d.ocut1b[bitId])*_et_conversion, bitId)
791 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2[bitId])*_et_conversion, bitId)
792 alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
793 alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
794 alg.addvariable('DisambDRSqrMin', d.disamb[bitId]*d.disamb[bitId]*_dr_conversion*_dr_conversion, bitId)
795
796 tm.registerTopoAlgo(alg)
797
798 # Boosted DM/DPHI for eEM
799 # output lines = 0INVM70-0DPHI12-eEM9sl1-eEM9sl6,
800 # 0INVM70-0DPHI12-eEM12sl1-eEM12sl6,
801 # 0INVM70-0DPHI12-eEM15sl1-eEM15sl6
802 # Parameter ordering
803 # 1. MinEt1
804 # 2. MinEt2
805 # 3. MinMSqr
806 # 4. MaxMSqr
807 # 5. MinDeltaPhi
808 # 6. MaxDeltaPhi
809 eINVM_DPHIMap = [
810 {
811 "algoname" : "INVM_INVDPHI_eEMsl6",
812 "minInvm" : 0,
813 "maxInvm" : 70,
814 "minDphi" : 0,
815 "maxDphi" : 12,
816 "otype1" : "eEM",
817 "olist1" : "sl",
818 "ocut1List" : [ 9, 12],
819 "nleading1" : 1,
820 "otype2" : "eEM",
821 "ocut2List" : [ 9, 12 ],
822 "olist2" : "sl",
823 "nleading2" : 6
824 }
825 ]
826
827 for x in eINVM_DPHIMap:
828 class d:
829 pass
830 for k in x:
831 setattr (d, k, x[k])
832 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
833 toponames=[]
834 for bitId, ocut1Value in enumerate(d.ocut1List):
835 toponames.append ("%iINVM%i-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDphi, d.maxDphi,
836 d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
837 d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
838 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = d.algoname, inputs = inputList, outputs = toponames )
839
840 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
841 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
842 alg.addgeneric('MaxTob1', d.nleading1)
843 alg.addgeneric('MaxTob2', d.nleading2)
844 alg.addgeneric('NumResultBits', len(toponames))
845 for bitId in range(len(toponames)):
846 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
847 alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
848 alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
849 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
850 alg.addvariable('MinDeltaPhi', d.minDphi * _phi_conversion, bitId)
851 alg.addvariable('MaxDeltaPhi', d.maxDphi * _phi_conversion, bitId)
852
853 tm.registerTopoAlgo(alg)
854
855
856 # DM/DR for eEM
857 # output lines = 0INVM70-2DR15-eEM9sl1-eEM9sl6,
858 # 0INVM70-2DR15-eEM12sl1-eEM12sl6,
859 #
860 # Parameter ordering
861 # 1. MinEt1
862 # 2. MinEt2
863 # 3. MinMSqr
864 # 4. MaxMSqr
865 # 5. MinDeltaR
866 # 6. MaxDeltaR
867 eINVM_DRMap = [
868 {
869 "algoname" : "INVM_BOOSTDR_eEMsl6",
870 "minInvm" : 0,
871 "maxInvm" : 70,
872 "minDR" : 2,
873 "maxDR" : 15,
874 "otype1" : "eEM",
875 "olist1" : "sl",
876 "ocut1List" : [ 9, 12 ],
877 "nleading1" : 1,
878 "otype2" : "eEM",
879 "ocut2List" : [ 9, 12 ],
880 "olist2" : "sl",
881 "nleading2" : 6
882 }
883 ]
884
885 for x in eINVM_DRMap:
886 class d:
887 pass
888 for k in x:
889 setattr (d, k, x[k])
890 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
891 toponames=[]
892 for bitId, ocut1Value in enumerate(d.ocut1List):
893 toponames.append ("%iINVM%i-%iDR%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDR, d.maxDR,
894 d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
895 d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
896
897 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
898 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
899 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
900 alg.addgeneric('MaxTob1', d.nleading1)
901 alg.addgeneric('MaxTob2', d.nleading2)
902 alg.addgeneric('NumResultBits', len(toponames))
903 for bitId in range(len(toponames)):
904 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
905 alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
906 alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
907 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
908 alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
909 alg.addvariable('DeltaRMax', d.maxDR*d.maxDR*_dr_conversion*_dr_conversion, bitId)
910
911 tm.registerTopoAlgo(alg)
912
913 # DM/DR Ranges for eEM12
914 # output lines = 0INVM30-2DR15-eEM12sl1-eEM12sl6,
915 # 25INVM70-13DR25-eEM12sl1-eEM12sl6,
916 #
917 # Parameter ordering
918 # 1. MinEt1
919 # 2. MinEt2
920 # 3. MinMSqr
921 # 4. MaxMSqr
922 # 5. MinDeltaR
923 # 6. MaxDeltaR
924 eINVM_Ranges_DRMap = [
925 {
926 "algoname" : "INVM_BOOSTDR_Ranges_eEM12sl6",
927 "minInvm" : [0, 25],
928 "maxInvm" : [30,70],
929 "minDR" : [2,13],
930 "maxDR" : [15,25],
931 "otype1" : "eEM",
932 "olist1" : "sl",
933 "ocut1List" : [12,12],
934 "nleading1" : 1,
935 "otype2" : "eEM",
936 "ocut2List" : [12,12],
937 "olist2" : "sl",
938 "nleading2" : 6
939 }
940 ]
941
942 for x in eINVM_Ranges_DRMap:
943 class d:
944 pass
945 for k in x:
946 setattr (d, k, x[k])
947 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
948 toponames=[]
949 for bitId, ocut1Value in enumerate(d.ocut1List):
950 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],
951 d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
952 d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
953
954 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
955 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
956 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
957 alg.addgeneric('MaxTob1', d.nleading1)
958 alg.addgeneric('MaxTob2', d.nleading2)
959 alg.addgeneric('NumResultBits', len(toponames))
960 for bitId in range(len(toponames)):
961 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
962 alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
963 alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
964 alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
965 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
966 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
967
968 tm.registerTopoAlgo(alg)
969
970
971 # DM/DR Ranges for asymmetric eEM12LeEM9L
972 # output lines = 0INVM30-2DR15-eEM12sl1-eEM9sl6,
973 # 25INVM70-13DR25-eEM12sl1-eEM9sl6,
974 #
975 # Parameter ordering
976 # 1. MinEt1
977 # 2. MinEt2
978 # 3. MinMSqr
979 # 4. MaxMSqr
980 # 5. MinDeltaR
981 # 6. MaxDeltaR
982 eINVM_Ranges_Asymm_DRMap = [
983 {
984 "algoname" : "INVM_BOOSTDR_Ranges_Asymm_eEMsl6",
985 "minInvm" : [0, 25],
986 "maxInvm" : [30,70],
987 "minDR" : [2,13],
988 "maxDR" : [15,25],
989 "otype1" : "eEM",
990 "olist1" : "sl",
991 "ocut1List" : [12,12],
992 "nleading1" : 1,
993 "otype2" : "eEM",
994 "ocut2List" : [9,9],
995 "olist2" : "sl",
996 "nleading2" : 6
997 }
998 ]
999
1000 for x in eINVM_Ranges_Asymm_DRMap:
1001 class d:
1002 pass
1003 for k in x:
1004 setattr (d, k, x[k])
1005 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
1006 toponames=[]
1007 for bitId, ocut1Value in enumerate(d.ocut1List):
1008 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],
1009 d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
1010 d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
1011
1012 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
1013 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
1014 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
1015 alg.addgeneric('MaxTob1', d.nleading1)
1016 alg.addgeneric('MaxTob2', d.nleading2)
1017 alg.addgeneric('NumResultBits', len(toponames))
1018 for bitId in range(len(toponames)):
1019 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
1020 alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
1021 alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
1022 alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
1023 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1024 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1025
1026 tm.registerTopoAlgo(alg)
1027
1028
1029 # INVM_DR for 2MU5VFab
1030 # output lines = 2INVM9-2DR15-2MU5VFab and 8INVM15-0DR22-2MU5VFab
1031 INVM_DR_2MU5VFabMap = [
1032 {
1033 "algoname": "INVM_DR_2MU5VFab",
1034 "minInvm" : [2,8],
1035 "maxInvm" : [9,15],
1036 "minDR" : [2,0],
1037 "maxDR" : [15,22],
1038 "otype1" : "MU5VFab",
1039 "mult1" : 2
1040 }
1041 ]
1042 for x in INVM_DR_2MU5VFabMap:
1043 class d:
1044 pass
1045 for k in x:
1046 setattr(d,k,x[k])
1047 inputList = d.otype1
1048 toponames = []
1049 for bitId in range(len(d.minDR)):
1050 toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm[bitId], d.maxInvm[bitId],
1051 d.minDR[bitId] , d.maxDR[bitId],
1052 d.mult1, d.otype1
1053 )
1054 )
1055 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
1056 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1057 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1058 alg.addgeneric('NumResultBits', len(toponames))
1059 for bitId in range(len(toponames)):
1060 alg.addvariable('MinET1', 0*_et_conversion, bitId)
1061 alg.addvariable('MinET2', 0*_et_conversion, bitId)
1062 alg.addvariable('MinMSqr', d.minInvm[bitId]*d.minInvm[bitId]*_et_conversion*_et_conversion, bitId)
1063 alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
1064 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1065 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1066 tm.registerTopoAlgo(alg)
1067
1068
1069 # INVM for 2MU3VFab
1070 # output lines = '7INVM14-2MU3VFab', '7INVM22-2MU3VFab'
1071 INVM_2MU3VFab_Map = [
1072 {
1073 "algoname": "INVM_2MU3VFab",
1074 "minInvm" : 7,
1075 "maxInvm" : [14,22],
1076 "otype1" : "MU3VFab",
1077 "mult1" : 2
1078 }
1079 ]
1080 for x in INVM_2MU3VFab_Map:
1081 class d:
1082 pass
1083 for k in x:
1084 setattr(d,k,x[k])
1085 inputList = d.otype1
1086 toponames = []
1087 for bitId in range(len(d.maxInvm)):
1088 toponames.append("%iINVM%i-%i%s" % ( d.minInvm, d.maxInvm[bitId],
1089 d.mult1, d.otype1
1090 )
1091 )
1092 alg = AlgConf.InvariantMassInclusive1( name = d.algoname, inputs = inputList, outputs = toponames)
1093 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1094 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1095 alg.addgeneric('NumResultBits', len(toponames))
1096 for bitId in range(len(toponames)):
1097 alg.addvariable('MinET1', 0*_et_conversion, bitId)
1098 alg.addvariable('MinET2', 0*_et_conversion, bitId)
1099 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
1100 alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
1101 tm.registerTopoAlgo(alg)
1102
1103
1104
1105 # INVM_EM for Jpsi
1106 invm_map = { "algoname": 'INVM_eEMs6' , "ocutlist": [ 9, 15 ], "minInvm": 1, "maxInvm": 5, "otype" : "eEM", "olist" : "s",
1107 "nleading" : 1, "inputwidth": HW.eEmOutputWidthSort}
1108 for x in [ invm_map ]:
1109 class d:
1110 pass
1111 for k in x:
1112 setattr (d, k, x[k])
1113 inputList = d.otype + d.olist
1114 toponames=[]
1115 for ocut in d.ocutlist:
1116 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 "")
1117 toponames.append(toponame)
1118 alg = AlgConf.InvariantMassInclusive2( name = d.algoname, inputs = [inputList, 'eEMs'], outputs = toponames)
1119 alg.addgeneric('InputWidth1', d.inputwidth)
1120 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
1121 alg.addgeneric('MaxTob1', d.nleading)
1122 alg.addgeneric('MaxTob2', HW.eEmOutputWidthSort)
1123 alg.addgeneric('NumResultBits', len(toponames))
1124 for bitid, ocut in enumerate(d.ocutlist):
1125 alg.addvariable('MinET1', get_threshold_cut('eEM', ocut)*_et_conversion, bitid)
1126 alg.addvariable('MinET2', 0*_et_conversion, bitid)
1127 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
1128 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitid)
1129 tm.registerTopoAlgo(alg)
1130
1131
1132 # added for muon-jet:
1133 algoList = [
1134 {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04-MU5VFab-CjJ40ab
1135 {"minDr": 0, "maxDr": 4, "otype1" : "MU3Vab" , "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04-MU3Vab-CjJ40ab
1136 {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 80, "olist2" : "ab"}, #0DR04-MU5VFab-CjJ80ab
1137 {"minDr": 0, "maxDr": 4, "otype1" : "MU3VFab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04_MU3VFab_CjJ40ab
1138 {"minDr": 0, "maxDr": 4, "otype1" : "MU3VFab", "otype2" : "CjJ", "ocut2": 20, "olist2" : "ab"}, #0DR04_MU3VFab_CjJ20ab
1139 {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 20, "olist2" : "ab"}, #0DR04_MU5VFab_CjJ20ab
1140 ]
1141 for x in algoList:
1142 class d:
1143 pass
1144 for k in x:
1145 setattr (d, k, x[k])
1146 toponame = "%iDR%02d-%s-%s%s%s" % (d.minDr, d.maxDr, d.otype1, d.otype2, str(d.ocut2), d.olist2)
1147 log.debug("Define %s", toponame)
1148 inputList = [d.otype1, d.otype2 + d.olist2]
1149 alg = AlgConf.DeltaRSqrIncl2( name = toponame, inputs = inputList, outputs = [ toponame ])
1150 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1151 alg.addgeneric('InputWidth2', HW.jJetOutputWidthSelect)
1152 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1153 alg.addgeneric('MaxTob2', HW.jJetOutputWidthSelect)
1154 alg.addgeneric('NumResultBits', 1)
1155 alg.addvariable('MinET1', 0*_et_conversion, 0)
1156 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1157 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1158 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1159 tm.registerTopoAlgo(alg)
1160
1161 # dimu INVM items
1162 # Parameter ordering
1163 # 1. MinEt1
1164 # 2. MinEt2
1165 # 3. MinMSqr
1166 # 4. MaxMSqr
1167 listofalgos = [
1168 {"minInvm": 2, "maxInvm": 8, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #2INVM8-2MU3Vab
1169 {"minInvm": 2, "maxInvm": 9, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #2INVM9-2MU3Vab
1170 {"minInvm": 8, "maxInvm": 15, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #8INVM15-MU5VFab-MU3Vab
1171 {"minInvm": 2, "maxInvm": 8, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #2INVM8-MU5VFab-MU3Vab
1172 {"minInvm": 2, "maxInvm": 9, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #2INVM9-MU5VFab-MU3Vab
1173 {"minInvm": 8, "maxInvm": 15, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #8INVM15-2MU5VFab
1174 {"minInvm": 2, "maxInvm": 9, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #2INVM9-2MU5VFab
1175 {"minInvm": 7, "maxInvm": 15, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM15-2MU3Vab
1176 {"minInvm": 7, "maxInvm": 22, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3VFab",}, #7INVM22-MU5VFab-MU3VFab, ATR-21566
1177 {"minInvm": 7, "maxInvm": 14, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3VFab",}, #7INVM14-MU5VFab-MU3VFab, ATR-22782
1178 {"minInvm": 7, "maxInvm": 14, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM14-2MU3Vab, ATR-22782
1179 ]
1180 for x in listofalgos:
1181 class d:
1182 pass
1183 for k in x:
1184 setattr (d, k, x[k])
1185 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1186 obj2 = "-%s" % (d.otype2)
1187 toponame = "%iINVM%i-%s%s" % (d.minInvm, d.maxInvm, obj1, "" if d.mult>1 else obj2)
1188 log.debug("Define %s", toponame)
1189 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1190 algoname = AlgConf.InvariantMassInclusive1 if (d.mult>1) else AlgConf.InvariantMassInclusive2
1191 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1192 if (d.mult>1):
1193 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1194 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1195 else:
1196 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1197 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1198 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1199 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1200 alg.addgeneric('NumResultBits', 1)
1201 alg.addvariable('MinET1', 0*_et_conversion)
1202 alg.addvariable('MinET2', 0*_et_conversion)
1203 alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
1204 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
1205 tm.registerTopoAlgo(alg)
1206
1207 toponame = "8INVM15-2CMU3Vab"
1208 log.debug("Define %s", toponame)
1209 inputList = ['CMU3Vab']
1210 alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame )
1211 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1212 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1213 alg.addgeneric('NumResultBits', 1)
1214 alg.addvariable('MinET1', 0*_et_conversion)
1215 alg.addvariable('MinET2', 0*_et_conversion)
1216 alg.addvariable('MinMSqr', 8*8*_et_conversion*_et_conversion)
1217 alg.addvariable('MaxMSqr', 15*15*_et_conversion*_et_conversion)
1218 tm.registerTopoAlgo(alg)
1219
1220 algolist=[
1221 {"minInvm": 2, "maxInvm": 8, "mult": 1, "otype1" : "CMU3Vab", "otype2" :"MU3Vab"}, # 2INVM8-CMU3Vab-MU3Vab
1222 ]
1223 for x in algolist:
1224 class d:
1225 pass
1226 for k in x:
1227 setattr (d, k, x[k])
1228 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1229 obj2 = "-%s" % (d.otype2)
1230 toponame = "%iINVM%i-%s%s" % (d.minInvm, d.maxInvm, obj1, "" if d.mult>1 else obj2)
1231 log.debug("Define %s", toponame)
1232 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1233 algoname = AlgConf.InvariantMassInclusive1 if (d.mult>1) else AlgConf.InvariantMassInclusive2
1234 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1235 if (d.mult>1):
1236 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1237 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1238 alg.addgeneric('RequireOneBarrel', d.onebarrel)
1239 else:
1240 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1241 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1242 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1243 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1244 alg.addgeneric('NumResultBits', 1)
1245 alg.addvariable('MinET1', 0*_et_conversion)
1246 alg.addvariable('MinET2', 0*_et_conversion)
1247 alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
1248 alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
1249 tm.registerTopoAlgo(alg)
1250
1251 # dimu DR items
1252 algolist = [
1253 {"minDr": 0, "maxDr": 24, "mult": 2, "otype1" : "CMU3Vab", "otype2" : "", }, #0DR24-2CMU3Vab
1254 {"minDr": 1, "maxDr": 24, "mult": 1, "otype1" : "CMU3Vab", "otype2" : "MU3Vab", }, #1DR24-CMU3Vab-MU3Vab
1255 ]
1256 for x in algolist:
1257 class d:
1258 pass
1259 for k in x:
1260 setattr (d, k, x[k])
1261 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1262 obj2 = "-%s" % (d.otype2)
1263 toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
1264 log.debug("Define %s", toponame)
1265 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1266 algoname = AlgConf.DeltaRSqrIncl1 if (d.mult>1) else AlgConf.DeltaRSqrIncl2
1267 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1268 if (d.mult>1):
1269 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1270 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1271 else:
1272 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1273 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1274 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1275 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1276 alg.addgeneric('NumResultBits', 1)
1277 alg.addvariable('MinET1', 0*_et_conversion)
1278 alg.addvariable('MinET2', 0*_et_conversion)
1279 alg.addvariable('DeltaRMin', d.minDr*d.minDr *_dr_conversion*_dr_conversion)
1280 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr *_dr_conversion*_dr_conversion)
1281 tm.registerTopoAlgo(alg)
1282
1283
1284 # RATIO MATCH dedicated to Exotic #TODO: are eTAU correct to use here (and below)?
1285 toponame = '100RATIO-0MATCH-eTAU40si2-eEMall'
1286 alg = AlgConf.RatioMatch( name = toponame, inputs = [ 'eTAUs', 'eEMall'], outputs = [ toponame ] )
1287 alg.addgeneric('InputWidth1', HW.eTauOutputWidthSort)
1288 alg.addgeneric('InputWidth2', HW.eEmInputWidth)
1289 alg.addgeneric('MaxTob1', 2)
1290 alg.addgeneric('MaxTob2', HW.eEmInputWidth)
1291 alg.addgeneric('NumResultBits', 1)
1292 alg.addvariable('MinET1', get_threshold_cut('eTAU', 40)*_et_conversion)
1293 alg.addvariable('MinET2', 0*_et_conversion)
1294 alg.addvariable('Ratio', 100, 0)
1295 tm.registerTopoAlgo(alg)
1296
1297 # NOT MATCH dedicated to Exotic
1298 toponame = 'NOT-0MATCH-eTAU40si1-eEMall'
1299 alg = AlgConf.NotMatch( name = toponame, inputs = [ 'eTAUs', 'eEMall'], outputs = [ toponame ] )
1300 alg.addgeneric('InputWidth1', HW.eTauOutputWidthSort)
1301 alg.addgeneric('InputWidth2', HW.eEmInputWidth)
1302 alg.addgeneric('MaxTob1', 1)
1303 alg.addgeneric('MaxTob2', HW.eEmInputWidth)
1304 alg.addgeneric('NumResultBits', 1)
1305 alg.addvariable('MinET1', get_threshold_cut('eTAU', 40)*_et_conversion)
1306 alg.addvariable('MinET2', 0*_et_conversion)
1307 alg.addvariable('EtaMin1', 0*_eta_conversion)
1308 alg.addvariable('EtaMax1', 49*_eta_conversion)
1309 alg.addvariable('EtaMin2', 0*_eta_conversion)
1310 alg.addvariable('EtaMax2', 49*_eta_conversion)
1311 alg.addvariable('DRCut', 0) #TODO: conversion needed here?
1312 tm.registerTopoAlgo(alg)
1313
1314 # TODO: to be updated with phase1 met, jets
1315 xemap = [{"etcut": 0, "Threlist": [55, 60, 65, 75 ]}]
1316 for x in xemap:
1317 class d:
1318 pass
1319 for k in x:
1320 setattr (d, k, x[k])
1321 log.debug("Define %s", toponame)
1322 inputList = ['jXENoSort_1BC', 'AjJall_1BC']
1323 toponames=[]
1324 for minxe in d.Threlist:
1325 toponames.append("KF-jXE%s-AjJall" % (minxe))
1326 alg = AlgConf.KalmanMETCorrection( name = "KF-jXE-AjJall", inputs = inputList, outputs = toponames )
1327 alg.addgeneric('InputWidth', HW.jJetInputWidth)
1328 alg.addgeneric('NumResultBits', len(toponames))
1329 for key, value in KFMETweightParameters.items():
1330 # add weight (scale factor) parameters
1331 # these weights are compacted into 32bit words in order to limit the number
1332 # of registers needed to load them in firmware
1333 alg.addvariable(key, value)
1334 alg.addvariable('MinET', 0)
1335 for bitid,minxe in enumerate(d.Threlist):
1336 alg.addvariable('KFXE', str(minxe*_et_conversion), bitid)
1337 tm.registerTopoAlgo(alg)
1338
1339
1340 # LATE MUON : LATE-MU10s1
1341 for x in [
1342 #{"otype" : "LATE-MU", "ocut" : 10, "inputwidth": HW.muonOutputWidthSort},
1343 {"otype" : "LATE-MU", "ocut" : 10, "inputwidth": HW.NumberOfDelayedMuons},
1344 ]:
1345
1346 class d:
1347 pass
1348 for k in x:
1349 setattr (d, k, x[k])
1350
1351 toponame = "%s%ss1" % ( d.otype, str(d.ocut) )
1352
1353 log.debug("Define %s", toponame)
1354
1355 inputList = 'LMUs'
1356
1357 alg = AlgConf.EtCut( name = toponame, inputs = inputList, outputs = toponame )
1358 alg.addgeneric('InputWidth', d.inputwidth)
1359 alg.addgeneric('MaxTob', 1)
1360 alg.addgeneric('NumResultBits', 1)
1361 alg.addvariable('MinET', str(d.ocut*_et_conversion))
1362 tm.registerTopoAlgo(alg)
1363
1364
1365 # (ATR-12748) fat jet trigger with Simple Cone algo
1366 algoList = [ #name (SC175) is rounded on purpose to avoid more name changes in case the actual threshold is slightly tweaked later on
1367 {"itemNameMinHT": 175, "minHT": 176, "otype" : "SCjJ", "ocut" : 10, "olist" : "ab", "nleading" : HW.jJetOutputWidthSelect, "inputwidth": HW.jJetOutputWidthSelect, "oeta" : 26}, #SC175-SCjJ10abpETA26
1368 ]
1369 for x in algoList:
1370 class d:
1371 pass
1372 for k in x:
1373 setattr (d, k, x[k])
1374 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))
1375 log.debug("Define %s", toponame)
1376 inputList = d.otype + d.olist
1377 alg = AlgConf.SimpleCone( name = toponame, inputs = inputList, outputs = [toponame] )
1378 alg.addgeneric('InputWidth', d.inputwidth)
1379 alg.addgeneric('NumResultBits', 1)
1380 alg.addvariable('MinET', d.ocut*_et_conversion)
1381 alg.addvariable('MinSumET', d.minHT*_et_conversion)
1382 alg.addvariable('MaxRSqr', 15*15*_dr_conversion*_dr_conversion)
1383 tm.registerTopoAlgo(alg)
1384
1385 # 0INVM9-eEM9ab-eEMab
1386 algoList = [
1387 {"minInvm" : 0, "maxInvm": 9, "otype" : "eEM", "ocut1" : 9, "olist" : "ab", "inputwidth": HW.eEmOutputWidthSelect, "ocut2" : 0},
1388 ]
1389 for x in algoList:
1390 class d:
1391 pass
1392 for k in x:
1393 setattr (d, k, x[k])
1394 inputList = d.otype + d.olist
1395 toponame = "%iINVM%i-%s%s%s-%s%s" % (d.minInvm, d.maxInvm,
1396 d.otype, str(d.ocut1) , d.olist,
1397 d.otype, d.olist)
1398 alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame)
1399 alg.addgeneric('InputWidth', d.inputwidth)
1400 alg.addgeneric('MaxTob', HW.eEmOutputWidthSelect)
1401 alg.addgeneric('NumResultBits', 1)
1402 alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion)
1403 alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion)
1404 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
1405 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
1406 tm.registerTopoAlgo(alg)
1407
1408
1409 # added for b-phys, 0DR03-eEM9ab-CjJ40ab
1410 algoList = [
1411 {"minDr": 0, "maxDr": 3, "otype1" : "eEM" ,"ocut1": 9, "olist1" : "ab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}
1412 ]
1413 for x in algoList:
1414 class d:
1415 pass
1416 for k in x:
1417 setattr (d, k, x[k])
1418 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)
1419 log.debug("Define %s", toponame)
1420 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
1421 alg = AlgConf.DeltaRSqrIncl2( name = toponame, inputs = inputList, outputs = [ toponame ])
1422 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSelect)
1423 alg.addgeneric('InputWidth2', HW.jJetOutputWidthSelect)
1424 alg.addgeneric('MaxTob1', HW.eEmOutputWidthSelect)
1425 alg.addgeneric('MaxTob2', HW.jJetOutputWidthSelect)
1426 alg.addgeneric('NumResultBits', 1)
1427 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1428 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1429 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1430 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1431 tm.registerTopoAlgo(alg)
1432
1433
1434 # Axion 2EM DPHI
1435 #27DPHI32-eEMs1-eEMs6
1436 algoList = [
1437 {"minDphi": 27, "maxDphi": 32, "otype" : "eEM", "ocut1" : 0, "olist" : "s", "nleading1" : 1, "inputwidth1": HW.eEmOutputWidthSort, "ocut2" : 0, "nleading2": 6},
1438 ]
1439 for x in algoList:
1440 class d:
1441 pass
1442 for k in x:
1443 setattr (d, k, x[k])
1444 toponame = "%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minDphi, d.maxDphi,
1445 d.otype, str(d.ocut1) if d.ocut1 > 0 else "", d.olist, str(d.nleading1) if d.olist=="s" else "",
1446 d.otype, str(d.ocut2) if d.ocut2 > 0 else "", d.olist, str(d.nleading2) if d.olist=="s" else "")
1447 log.debug("Define %s", toponame)
1448 inputList = d.otype + d.olist
1449 alg = AlgConf.DeltaPhiIncl1( name = toponame, inputs = inputList, outputs = toponame )
1450 alg.addgeneric('InputWidth', d.inputwidth1)
1451 alg.addgeneric('MaxTob', d.nleading2)
1452 alg.addgeneric('NumResultBits', 1)
1453 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)
1454 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)
1455 alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion, 0)
1456 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, 0)
1457 tm.registerTopoAlgo(alg)
1458
1459 # Tau dR chains
1460 algolist=[
1461 { "minDr": 0, "maxDr": 28, "otype1" : "eTAU" ,"ocut1": 30, "olist1" : "abl",
1462 "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,"otype2" : "eTAU", "ocut2": 20, "olist2" : "abl",
1463 "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect}, # 0DR28-eTAU30abl-eTAU20abl
1464 { "minDr": 0, "maxDr": 28, "otype1" : "eTAU" ,"ocut1": 30, "olist1" : "abm",
1465 "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,"otype2" : "eTAU", "ocut2": 20, "olist2" : "abm",
1466 "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect}, # 0DR28-eTAU30abm-eTAU20abm
1467 ]
1468 for x in algolist:
1469 class d:
1470 pass
1471 for k in x:
1472 setattr (d, k, x[k])
1473 obj1 = "%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1474 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1475 toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, obj2)
1476 log.debug("Define %s", toponame)
1477 inputList = [d.otype1 + d.olist1] if d.otype1==d.otype2 else [d.otype1 + d.olist1, d.otype2 + d.olist2]
1478 algoname = AlgConf.DeltaRSqrIncl1 if d.otype1==d.otype2 else AlgConf.DeltaRSqrIncl2
1479 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1480 if d.otype1==d.otype2:
1481 alg.addgeneric('InputWidth', d.inputwidth1)
1482 alg.addgeneric('MaxTob', d.nleading1)
1483 else:
1484 alg.addgeneric('InputWidth1', d.inputwidth1)
1485 alg.addgeneric('InputWidth2', d.inputwidth2)
1486 alg.addgeneric('MaxTob1', d.nleading1)
1487 alg.addgeneric('MaxTob2', d.nleading2)
1488 alg.addgeneric('NumResultBits', 1)
1489 if d.otype1==d.otype2:
1490 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion )
1491 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion )
1492 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
1493 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
1494 else:
1495 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , 0)
1496 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , 0)
1497 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1498 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1499 tm.registerTopoAlgo(alg)
1500
1501
1502 DISAMB_DR_jJ_eTau_eTau_Map = [
1503 {
1504 "algoname": "2DISAMB_jJ55ab_DR_eTAU_eTAU",
1505 "disamb" : 2,
1506 "minDR" : 0,
1507 "maxDR" : [28],
1508 "otype1" : "eTAU",
1509 "ocut1" : 30,
1510 "olist1": "ab",
1511 "nleading1": HW.eTauOutputWidthSelect,
1512 "inputwidth1": HW.eTauOutputWidthSelect,
1513 "otype2" : "eTAU",
1514 "ocut2" : 20,
1515 "nleading2": HW.eTauOutputWidthSelect,
1516 "inputwidth2": HW.eTauOutputWidthSelect,
1517 "olist2": "ab",
1518 "otype3" : "jJ",
1519 "ocut3" : 55,
1520 "nleading3": HW.jJetOutputWidthSelect,
1521 "inputwidth3": HW.jJetOutputWidthSelect,
1522 "olist3": "ab",
1523 },
1524 {
1525 "algoname": "2DISAMB_jJ50ab_DR_eTAU_eTAU",
1526 "disamb" : 2,
1527 "minDR" : 0,
1528 "maxDR" : [28],
1529 "otype1" : "eTAU",
1530 "ocut1" : 30,
1531 "olist1": "ab",
1532 "nleading1": HW.eTauOutputWidthSelect,
1533 "inputwidth1": HW.eTauOutputWidthSelect,
1534 "otype2" : "eTAU",
1535 "ocut2" : 20,
1536 "nleading2": HW.eTauOutputWidthSelect,
1537 "inputwidth2": HW.eTauOutputWidthSelect,
1538 "olist2": "ab",
1539 "otype3" : "jJ",
1540 "ocut3" : 50,
1541 "nleading3": HW.jJetOutputWidthSelect,
1542 "inputwidth3": HW.jJetOutputWidthSelect,
1543 "olist3": "ab",
1544 },
1545 {
1546 "algoname": "2DISAMB_jJ40ab_DR_eTAU_eTAU",
1547 "disamb" : 2,
1548 "minDR" : 0,
1549 "maxDR" : [28],
1550 "otype1" : "eTAU",
1551 "ocut1" : 30,
1552 "olist1": "ab",
1553 "nleading1": HW.eTauOutputWidthSelect,
1554 "inputwidth1": HW.eTauOutputWidthSelect,
1555 "otype2" : "eTAU",
1556 "ocut2" : 20,
1557 "nleading2": HW.eTauOutputWidthSelect,
1558 "inputwidth2": HW.eTauOutputWidthSelect,
1559 "olist2": "ab",
1560 "otype3" : "jJ",
1561 "ocut3" : 40,
1562 "nleading3": HW.jJetOutputWidthSelect,
1563 "inputwidth3": HW.jJetOutputWidthSelect,
1564 "olist3": "ab",
1565 },
1566 {
1567 "algoname": "2DISAMB_jJ30ab_DR_eTAU_eTAU",
1568 "disamb" : 2,
1569 "minDR" : 0,
1570 "maxDR" : [28],
1571 "otype1" : "eTAU",
1572 "ocut1" : 30,
1573 "olist1": "ab",
1574 "nleading1": HW.eTauOutputWidthSelect,
1575 "inputwidth1": HW.eTauOutputWidthSelect,
1576 "otype2" : "eTAU",
1577 "ocut2" : 20,
1578 "nleading2": HW.eTauOutputWidthSelect,
1579 "inputwidth2": HW.eTauOutputWidthSelect,
1580 "olist2": "ab",
1581 "otype3" : "jJ",
1582 "ocut3" : 30,
1583 "nleading3": HW.jJetOutputWidthSelect,
1584 "inputwidth3": HW.jJetOutputWidthSelect,
1585 "olist3": "ab",
1586 }
1587 ]
1588 for x in DISAMB_DR_jJ_eTau_eTau_Map:
1589 class d:
1590 pass
1591 for k in x:
1592 setattr(d,k,x[k])
1593 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1594 toponames = []
1595 for bitId in range(len(d.maxDR)):
1596 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1597 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1598 obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1599 toponames.append("%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "",
1600 obj3, d.minDR, d.maxDR[bitId], obj1, obj2))
1601
1602 alg = AlgConf.DisambiguationDRIncl3( name = d.algoname, inputs = inputList, outputs = toponames )
1603 alg.addgeneric('InputWidth1', d.inputwidth1)
1604 alg.addgeneric('InputWidth2', d.inputwidth2)
1605 alg.addgeneric('InputWidth3', d.inputwidth3)
1606 alg.addgeneric('MaxTob1', d.nleading1)
1607 alg.addgeneric('MaxTob2', d.nleading2)
1608 alg.addgeneric('MaxTob3', d.nleading3)
1609 alg.addgeneric('NumResultBits', len(toponames))
1610
1611 for bitId in range(len(toponames)):
1612 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitId)
1613 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, bitId)
1614 alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, bitId)
1615 alg.addvariable('DisambDRSqrMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
1616 alg.addvariable('DisambDRSqrMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1617 alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, bitId)
1618
1619 tm.registerTopoAlgo(alg)
1620
1621
1622 # DR for eTAU30ab_eTAU20ab
1623 # output lines : '0DR25-eTAU30ab-eTAU20ab'
1624 # '0DR28-eTAU30ab-eTAU20ab'
1625 DR_eTau30_eTau20_Map = [
1626 {
1627 "algoname": "DR_eTAU30ab_eTAU20ab",
1628 "minDR" : 0,
1629 "maxDR" : [28],
1630 "otype1" : "eTAU",
1631 "ocut1" : 30,
1632 "olist1": "ab",
1633 "otype2" : "eTAU",
1634 "ocut2" : 20,
1635 "inputwidth": HW.eTauOutputWidthSelect,
1636 "olist2": "ab",
1637 }
1638 ]
1639 for x in DR_eTau30_eTau20_Map:
1640 class d:
1641 pass
1642 for k in x:
1643 setattr(d,k,x[k])
1644 inputList = [d.otype1 + d.olist1]
1645 toponames = []
1646 for bitId in range(len(d.maxDR)):
1647 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1648 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1649 toponames.append("%dDR%d%s%s" % ( d.minDR, d.maxDR[bitId], obj1, obj2))
1650
1651 alg = AlgConf.DeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames )
1652
1653 alg.addgeneric('InputWidth', d.inputwidth)
1654 alg.addgeneric('MaxTob', HW.eTauOutputWidthSelect)
1655 alg.addgeneric('NumResultBits', len(toponames) )
1656
1657 for bitId in range(len(toponames)):
1658 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitId)
1659 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, bitId)
1660 alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
1661 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1662
1663
1664 tm.registerTopoAlgo(alg)
1665
1666 # DISAMB 3 lists with DR cut to 2nd and 3rd lists
1667 algolist=[
1668 { "disamb": 2,
1669 "otype1" : "eTAU", "ocut1": 30, "olist1": "abl", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1670 "otype2" : "eTAU", "ocut2": 20, "olist2": "abl", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1671 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1672 "drcutmin": 0, "drcutmax": 28}, # 2DISAMB-jJ55ab-0DR28-eTAU30abl-eTAU20abl
1673 { "disamb": 2,
1674 "otype1" : "eTAU", "ocut1": 30, "olist1": "abm", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1675 "otype2" : "eTAU", "ocut2": 20, "olist2": "abm", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1676 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1677 "drcutmin": 0, "drcutmax": 28}, # 2DISAMB-jJ55ab-0DR28-eTAU30abm-eTAU20abm
1678 { "disamb" : 2,
1679 "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1680 "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1681 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1682 "drcutmin": 4 , "drcutmax": 28}, # 2DISAMB-jJ55ab-4DR28-eTAU30ab-eTAU20ab
1683 { "disamb" : 2,
1684 "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1685 "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1686 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1687 "drcutmin": 4 , "drcutmax": 32}, # 2DISAMB-jJ55ab-4DR32-eTAU30ab-eTAU20ab
1688 { "disamb" : 2,
1689 "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1690 "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1691 "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1692 "drcutmin": 10 , "drcutmax": 32}, # 2DISAMB-jJ55ab-10DR32-eTAU30ab-eTAU20ab
1693 ]
1694 for x in algolist:
1695 class d:
1696 pass
1697 for k in x:
1698 setattr (d, k, x[k])
1699 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1700 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1701 obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1702 toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
1703 log.debug("Define %s", toponame)
1704 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1705 alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
1706 alg.addgeneric('InputWidth1', d.inputwidth1)
1707 alg.addgeneric('InputWidth2', d.inputwidth2)
1708 alg.addgeneric('InputWidth3', d.inputwidth3)
1709 alg.addgeneric('MaxTob1', d.nleading1)
1710 alg.addgeneric('MaxTob2', d.nleading2)
1711 alg.addgeneric('MaxTob3', d.nleading3)
1712 alg.addgeneric('NumResultBits', 1)
1713 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1714 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1715 alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
1716 alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
1717 alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
1718 alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
1719 tm.registerTopoAlgo(alg)
1720
1721
1722 #TLA deta
1723 algoList = [
1724 { "minDeta": 0, "maxDeta": 20, "otype" : "jJ", "ocut1" : 90, "olist" : "s",
1725 "nleading1" : 1, "inputwidth1": HW.jJetOutputWidthSort, "ocut2" : 0, "nleading2": 2}, #0DETA20-jJ90s1-jJs2
1726 { "minDeta": 0, "maxDeta" : 24, "otype" : "eTAU" , "olist" : "s", "inputwidth1": HW.eTauOutputWidthSort,
1727 "ocut1" : 30, "nleading1": 2,
1728 "ocut2" : 12, "nleading2": 2}, #0DETA24_eTAU30s2_eTAU12s2
1729 ]
1730 for x in algoList:
1731 class d:
1732 pass
1733 for k in x:
1734 setattr (d, k, x[k])
1735 toponame = "%iDETA%i-%s%s%s%s-%s%s%s%s" % (d.minDeta, d.maxDeta,
1736 d.otype, d.ocut1 if d.ocut1 > 0 else "", d.olist, d.nleading1,
1737 d.otype, d.ocut2 if d.ocut2 > 0 else "", d.olist, d.nleading2)
1738 log.debug("Define %s", toponame)
1739 inputList = d.otype + d.olist
1740 alg = AlgConf.DeltaEtaIncl1( name = toponame, inputs = inputList, outputs = toponame )
1741 alg.addgeneric('InputWidth', d.inputwidth1)
1742 alg.addgeneric('MaxTob', d.nleading2)
1743 alg.addgeneric('NumResultBits', 1)
1744 alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion, 0)
1745 alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion, 0)
1746 alg.addvariable('MinDeltaEta', d.minDeta*_eta_conversion, 0)
1747 alg.addvariable('MaxDeltaEta', d.maxDeta*_eta_conversion, 0)
1748 tm.registerTopoAlgo(alg)
1749
1750 # ATR-30401 and ATR-32084
1751 # topoitems will be the following:
1752 # 0DPHI10_jXE40delay_jJ40s
1753 # 0DPHI99_jXE40delay_jJ40s
1754 DPHI_jXE40delay_jJ40s_map = [
1755 {
1756 "algoname" : "DPHI_jXE40delay%s_jJ40s",
1757 "Delay1" : [1,2,3],
1758 "Delay2" : 0,
1759 "InputWidth1": HW.metOutputWidth,
1760 "InputWidth2": HW.jJetOutputWidthSort,
1761 "MaxTob1" : 1,
1762 "MaxTob2" : 6,
1763 "MinET1" : 40*_et_conversion,
1764 "MinET2" : 40*_et_conversion,
1765 "MinDeltaPhi": 0*_phi_conversion,
1766 "phi_thresholds": [10, 99],
1767 }
1768 ]
1769
1770 for x in DPHI_jXE40delay_jJ40s_map:
1771 class d:
1772 pass
1773 for k in x:
1774 setattr(d,k,x[k])
1775 inputList = ['jXEs', 'jJs']
1776
1777 for delay1 in d.Delay1:
1778 toponames = []
1779 delaySuffix = str(delay1) if delay1 > 1 else ""
1780 for bitId in range(len(d.phi_thresholds)):
1781 toponames.append("0DPHI%d-jXE40delay%s-jJ40s" % (d.phi_thresholds[bitId], delaySuffix) )
1782
1783 algName = d.algoname % delaySuffix
1784 alg = AlgConf.DeltaPhiIncl2( name = algName, inputs = inputList, outputs = toponames )
1785
1786 alg.addgeneric('InputWidth1', d.InputWidth1)
1787 alg.addgeneric('InputWidth2', d.InputWidth2)
1788 alg.addgeneric('MaxTob1', d.MaxTob1)
1789 alg.addgeneric('MaxTob2', d.MaxTob2)
1790 alg.addgeneric('NumResultBits', len(toponames) )
1791 alg.addgeneric('Delay1', delay1)
1792 alg.addgeneric('Delay2', d.Delay2)
1793
1794
1795 for bitId in range(len(toponames)):
1796 alg.addvariable('MinET1', d.MinET1, bitId)
1797 alg.addvariable('MinET2', d.MinET2, bitId)
1798 alg.addvariable('MinDeltaPhi', d.MinDeltaPhi, bitId)
1799 alg.addvariable('MaxDeltaPhi', d.phi_thresholds[bitId]*_phi_conversion, bitId)
1800 tm.registerTopoAlgo(alg)
1801
1802 # ATR-31097
1803 TeAsymmetry_map = [
1804 {
1805 "algoname" : "TeAsymmetry-jTENoSort",
1806 "deltaAbsMin" : [5, 5, 3, 7],
1807 "asymFactor" : [1, 1.05, 1, 0.9],
1808 "asymOffset" : [-5, -24, -5, -7],
1809 "maxTeProduct": [200, 200, 200, 200],
1810 }
1811 ]
1812
1813 for x in TeAsymmetry_map:
1814 class d:
1815 pass
1816 for k in x:
1817 setattr(d,k,x[k])
1818 inputList = ['jTENoSort_1BC']
1819 # To update with correct names
1820 toponames = []
1821 for bitId in range(len(d.deltaAbsMin)):
1822 toponames.append("TeAsymmetry_jTENoSort_ParamSet%d" % (bitId))
1823
1824 alg = AlgConf.TeAsymmetry( name = d.algoname, inputs = inputList, outputs = toponames )
1825 alg.addgeneric('InputWidth', 1)
1826 alg.addgeneric('NumResultBits', len(toponames))
1827 alg.addgeneric("Delay", 1)
1828
1829 for bitId in range(len(toponames)):
1830 #Update with the correct algo parameters
1831 alg.addvariable('deltaAbsMin', d.deltaAbsMin[bitId]*_et_conversion, bitId) #Units of 100MeV
1832 alg.addvariable('asymFactor', d.asymFactor[bitId], bitId)
1833 alg.addvariable('asymOffset', d.asymOffset[bitId]*_et_conversion, bitId) #Units of 100MeV
1834 alg.addvariable('maxTeProduct', d.maxTeProduct[bitId]*_et_conversion*_et_conversion, bitId) #Units of (100MeV)^2
1835 tm.registerTopoAlgo(alg)
1836
1837 #TeATIME
1838 TeATIME_map = [
1839 {
1840 "algoname" : "TeATIME-jTENoSort",
1841 "teFlavor" : [2,1,2,3], # 0 = off, 1 = full jTE, 2 = central jTE, 3 = forward jTE (A+C side)
1842 "combination" : [0,0,0,1], # 0 = require both, 1 = require factor, 2 = require offset, 3 = require any of the two criteria
1843 "nextBcOffset" : [-2.5,10,10,10], # offset added to upcoming BC's jTE (in GeV, fractional values down to 100 MeV are possible).
1844 # The 'offset' criterion is considered as passed if this sum exceeds the current BC's jTE value,
1845 # i.e., to require a minimum *increase* in jTE in the next BC this should be a *negative* value!
1846 "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
1847 }
1848 ]
1849
1850 for x in TeATIME_map:
1851 class d:
1852 pass
1853 for k in x:
1854 setattr(d,k,x[k])
1855 inputList = ['jTENoSort_1BC']
1856 # To update with correct names
1857 toponames = []
1858 for bitId in range(4):
1859 toponames.append("TeATIME_jTENoSort_ParamSet%d" % (bitId))
1860
1861
1862 alg = AlgConf.TeATIME( name = d.algoname, inputs = inputList, outputs = toponames )
1863 alg.addgeneric('InputWidth', 1)
1864 alg.addgeneric('NumResultBits', len(toponames))
1865 for bitId in range(len(d.teFlavor)):
1866 alg.addvariable('algoLogic', d.teFlavor[bitId] + ( d.combination[bitId] << 2 ) , bitId) #two bit fields (of 2 bits each) merged into on FW register
1867 alg.addvariable('nextBcFactor', round(d.nextBcFactor[bitId] * pow(2,8)), bitId) #integer representation of factor corresponding to 8 fractional bits
1868 alg.addvariable('nextBcOffset', round(d.nextBcOffset[bitId] * _et_conversion), bitId) #converted to units of 100MeV
1869 tm.registerTopoAlgo(alg)
1870
1871
1872
1873 # DISAMB 3 lists with DR cut to 2nd and 3rd lists
1874 algolist=[
1875 { "disamb": 2,
1876 "otype1" : "eTAU", "ocut1": 20, "olist1": "ab","nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1877 "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1878 "otype3" : "jJ", "ocut3": 40, "olist3": "ab", "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1879 "drcutmin": 0, "drcutmax": 10}, # 2DISAMB-jJ40ab-0DR10-eTAU20ab-eTAU12ab
1880 ]
1881 for x in algolist:
1882 class d:
1883 pass
1884 for k in x:
1885 setattr (d, k, x[k])
1886 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1887 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1888 obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1889 toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
1890 log.debug("Define %s", toponame)
1891 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1892 alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
1893 alg.addgeneric('InputWidth1', d.inputwidth1)
1894 alg.addgeneric('InputWidth2', d.inputwidth2)
1895 alg.addgeneric('InputWidth3', d.inputwidth3)
1896 alg.addgeneric('MaxTob1', d.nleading1)
1897 alg.addgeneric('MaxTob2', d.nleading2)
1898 alg.addgeneric('MaxTob3', d.nleading3)
1899 alg.addgeneric('NumResultBits', 1)
1900 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1901 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1902 alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
1903 alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
1904 alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
1905 alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
1906 tm.registerTopoAlgo(alg)
1907
1908 # AnomalyDetectionBDT muon-only anomaly trigger
1909 algo = {
1910 "algoname": "ADBDT-MU0s",
1911 "otype1": "MU", "olist1": "s", "inputwidth1": 6, "nleading1": 3,
1912 "WPList": ["Tight", "Loose"],
1913 "MinET1": 0,#min muon1 threshold in GeV, the 0 sets the muon to the min TOB threshold avaiable in Topo
1914 "MinET2": 0,#min muon2 threshold in Gev
1915 "ScoreThreshold": [40, 25]
1916 }
1917
1918 class d:
1919 pass
1920
1921 for k in algo:
1922 setattr(d, k, algo[k])
1923
1924 toponames = [f"ADBDT-{d.nleading1}{d.otype1}0{d.olist1}-{wp}" for wp in d.WPList]
1925
1926 alg = AlgConf.AnomalyDetectionBDT(
1927 name=d.algoname,
1928 inputs=[d.otype1 + d.olist1],
1929 outputs=toponames
1930 )
1931 alg.addgeneric('NumResultBits', 2)
1932 alg.addgeneric('MaxTob',d.nleading1) #Set the number of Tobs to 3 (leading pT 3 muons)
1933
1934 alg.addvariable('MinET1',d.MinET1*_et_conversion)
1935 alg.addvariable('MinET2',d.MinET2*_et_conversion)
1936 for bitId in range(len(toponames)):
1937 alg.addvariable('ScoreThreshold', d.ScoreThreshold[bitId], bitId)
1938
1939 tm.registerTopoAlgo(alg)
1940
1941
1942 #VAE-based anomaly trigger
1943 # output lines: 'ADVAE2A-6jJ0s-4eTAU0s-4MU0s-jXE0s-Tight',
1944 # 'ADVAE2A-6jJ0s-4eTAU0s-4MU0s-jXE0s-Loose'
1945 #Ordering -
1946 #1. jJetx6
1947 #2. eTAUx4
1948 #3. MUx4
1949 #4. jXEx1
1950 algo = {
1951 "algoname" : "ADVAE2A-jJ0s-eTAU0s-MU0s-jXE0s",
1952 "otype1" : "jJ", "olist1": "s", "inputwidth1": 6, "nleading1": 6,
1953 "otype2" : "eTAU", "olist2": "s", "inputwidth2": 6, "nleading2": 4,
1954 "otype3" : "MU", "olist3": "s", "inputwidth3": 6, "nleading3": 4,
1955 "otype4" : "jXE", "olist4": "s", "inputwidth4": 1, "nleading4": 1,
1956 "WPList" : ["Tight", "Loose"],
1957 "MinET1" : 15, # jJets in GeV (= 100MeV steps after conversion)
1958 "MinET2" : 0, # eTaus
1959 "MinET3" : 0, # muons
1960 "MinET4" : 0, # jXE
1961 "ScaleSqr1" : [128, 128], #corresponds to Tight and Loose WPs
1962 "ScaleSqr2" : [128, 128], #corresponds to Tight and Loose WPs
1963 "ScaleSqr3" : [128, 128], #corresponds to Tight and Loose WPs
1964 "AnomalyScoreThresh" : [1521991, 1333204], #corresponds to Tight and Loose WPs (500Hz,1kHz est.)
1965 }
1966 class d:
1967 pass
1968 for k in algo:
1969 setattr (d, k, algo[k])
1970 toponames = []
1971 for WP in d.WPList:
1972 toponames.append("ADVAE2A-%s%s0%s-%s%s0%s-%s%s0%s-%s0%s-%s" %(str(d.nleading1), d.otype1, d.olist1,
1973 str(d.nleading2), d.otype2, d.olist2,
1974 str(d.nleading3), d.otype3, d.olist3,
1975 d.otype4, d.olist4,
1976 WP) )
1977 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3, d.otype4 + d.olist4]
1978 alg = AlgConf.ADVAE_2A( name = d.algoname, inputs = inputList, outputs = toponames)
1979 alg.addgeneric('InputWidth1', d.inputwidth1)
1980 alg.addgeneric('InputWidth2', d.inputwidth2)
1981 alg.addgeneric('InputWidth3', d.inputwidth3)
1982 alg.addgeneric('InputWidth4', d.inputwidth4)
1983 alg.addgeneric('MaxTob1', d.nleading1)
1984 alg.addgeneric('MaxTob2', d.nleading2)
1985 alg.addgeneric('MaxTob3', d.nleading3)
1986 alg.addgeneric('MaxTob4', d.nleading4)
1987 alg.addgeneric('NumResultBits', len(toponames))
1988 alg.addgeneric('ADVAEVersion', 1)
1989 alg.addvariable('MinET1', d.MinET1 * _et_conversion)
1990 alg.addvariable('MinET2', d.MinET2 * _et_conversion)
1991 alg.addvariable('MinET3', d.MinET3 * _et_conversion)
1992 alg.addvariable('MinET4', d.MinET4 * _et_conversion)
1993 for bitId in range(len(toponames)):
1994 alg.addvariable('ScaleSqr1', d.ScaleSqr1[bitId], bitId)
1995 alg.addvariable('ScaleSqr2', d.ScaleSqr2[bitId], bitId)
1996 alg.addvariable('ScaleSqr3', d.ScaleSqr3[bitId], bitId)
1997 alg.addvariable('AnomalyScoreThresh', d.AnomalyScoreThresh[bitId], bitId)
1998 tm.registerTopoAlgo(alg)
1999
2000
2001 #ARTEMIS (VAE-based anomaly trigger)
2002 # output lines: 'ARTEMIS-6jJ0s-4eTAU0s-4MU0s-jXE0s-Tight',
2003 # 'ARTEMIS-6jJ0s-4eTAU0s-4MU0s-jXE0s-Loose'
2004 #Ordering -
2005 #1. jJetx6
2006 #2. eTAUx4
2007 #3. MUx4
2008 #4. jXEx1
2009 algo = {
2010 "algoname" : "ARTEMIS-jJ0s-eTAU0s-MU0s-jXE0s",
2011 "otype1" : "jJ", "olist1": "s", "inputwidth1": 6, "nleading1": 6,
2012 "otype2" : "eTAU", "olist2": "s", "inputwidth2": 6, "nleading2": 4,
2013 "otype3" : "MU", "olist3": "s", "inputwidth3": 6, "nleading3": 4,
2014 "otype4" : "jXE", "olist4": "s", "inputwidth4": 1, "nleading4": 1,
2015 "WPList" : ["Tight", "Loose"],
2016 "MinET1" : 15, # jJets in GeV (= 100MeV steps after conversion)
2017 "MinET2" : 0, # eTaus
2018 "MinET3" : 0, # muons
2019 "MinET4" : 0, # jXE
2020 "MaxET1" : 90, # jJets in GeV (= 100MeV steps after conversion)
2021 "MaxET2" : 0, # eTaus
2022 "MaxET3" : 0, # muons
2023 "MaxET4" : 0, # jXE
2024 "AnomalyScoreThresh" : [1521991, 1333204], #corresponds to Tight and Loose WPs (500Hz,1kHz est.)
2025 }
2026 class d:
2027 pass
2028 for k in algo:
2029 setattr (d, k, algo[k])
2030 toponames = []
2031 for WP in d.WPList:
2032 toponames.append("ARTEMIS-%s%s0%s-%s%s0%s-%s%s0%s-%s0%s-%s" %(str(d.nleading1), d.otype1, d.olist1,
2033 str(d.nleading2), d.otype2, d.olist2,
2034 str(d.nleading3), d.otype3, d.olist3,
2035 d.otype4, d.olist4,
2036 WP) )
2037 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3, d.otype4 + d.olist4]
2038 alg = AlgConf.ARTEMIS_2A( name = d.algoname, inputs = inputList, outputs = toponames)
2039 alg.addgeneric('InputWidth1', d.inputwidth1)
2040 alg.addgeneric('InputWidth2', d.inputwidth2)
2041 alg.addgeneric('InputWidth3', d.inputwidth3)
2042 alg.addgeneric('InputWidth4', d.inputwidth4)
2043 alg.addgeneric('MaxTob1', d.nleading1)
2044 alg.addgeneric('MaxTob2', d.nleading2)
2045 alg.addgeneric('MaxTob3', d.nleading3)
2046 alg.addgeneric('MaxTob4', d.nleading4)
2047 alg.addgeneric('NumResultBits', len(toponames))
2048 alg.addgeneric('Version', 1)
2049 alg.addvariable('MinET1', d.MinET1 * _et_conversion)
2050 alg.addvariable('MinET2', d.MinET2 * _et_conversion)
2051 alg.addvariable('MinET3', d.MinET3 * _et_conversion)
2052 alg.addvariable('MinET4', d.MinET4 * _et_conversion)
2053 alg.addvariable('MaxET1', d.MinET1 * _et_conversion)
2054 alg.addvariable('MaxET2', d.MinET2 * _et_conversion)
2055 alg.addvariable('MaxET3', d.MinET3 * _et_conversion)
2056 alg.addvariable('MaxET4', d.MinET4 * _et_conversion)
2057 for bitId in range(len(toponames)):
2058 alg.addvariable('AnomalyScoreThresh', d.AnomalyScoreThresh[bitId], bitId)
2059 tm.registerTopoAlgo(alg)
2060
2061
2062 algolist=[
2063 { "disamb": 2,
2064 "otype1" : "eTAU", "ocut1": 20, "olist1": "ab","nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
2065 "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
2066 "otype3" : "jJ", "ocut3": 30, "olist3": "ab", "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
2067 "drcutmin": 0, "drcutmax": 10}, # 2DISAMB-jJ30ab-0DR10-eTAU20ab-eTAU12ab
2068 ]
2069 for x in algolist:
2070 class d:
2071 pass
2072 for k in x:
2073 setattr (d, k, x[k])
2074 obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
2075 obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
2076 obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
2077 toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
2078 log.debug("Define %s", toponame)
2079 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
2080 alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
2081 alg.addgeneric('InputWidth1', d.inputwidth1)
2082 alg.addgeneric('InputWidth2', d.inputwidth2)
2083 alg.addgeneric('InputWidth3', d.inputwidth3)
2084 alg.addgeneric('MaxTob1', d.nleading1)
2085 alg.addgeneric('MaxTob2', d.nleading2)
2086 alg.addgeneric('MaxTob3', d.nleading3)
2087 alg.addgeneric('NumResultBits', 1)
2088 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
2089 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
2090 alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
2091 alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
2092 alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
2093 alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
2094 tm.registerTopoAlgo(alg)
2095
2096 # jINVM + DPHI
2097 NFFDphimap = [
2098 { "itemNameMinInvm": 400, "minInvm": 640 , "minDphi": 0, "maxDphiList": [26, 24, 22, 20],
2099 "otype1" : "AjJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
2100 "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
2101 ]
2102 for x in NFFDphimap:
2103 class d:
2104 pass
2105 for k in x:
2106 setattr (d, k, x[k])
2107 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
2108 toponames=[]
2109 for maxDphi in d.maxDphiList:
2110 toponames.append ("%iINVM-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.itemNameMinInvm, d.minDphi, maxDphi,
2111 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2112 d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
2113 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'jINVM_DPHI', inputs = inputList, outputs = toponames)
2114 alg.addgeneric('InputWidth1', d.inputwidth)
2115 alg.addgeneric('InputWidth2', d.inputwidth)
2116 alg.addgeneric('MaxTob1', d.nleading1)
2117 alg.addgeneric('MaxTob2', d.nleading2)
2118 alg.addgeneric('NumResultBits', len(toponames))
2119 for bitid,maxDphi in enumerate(d.maxDphiList):
2120 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
2121 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
2122 alg.addvariable('MinMSqr', d.minInvm*d.minInvm *_et_conversion*_et_conversion , bitid)
2123 alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
2124 alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion , bitid)
2125 alg.addvariable('MaxDeltaPhi', maxDphi*_phi_conversion, bitid)
2126 tm.registerTopoAlgo(alg)
2127
2128
2129 # CF
2130 algoList = [
2131 { "itemNameMinInvm": 400, "minInvm": 640, "otype1" : "AjJ", "ocut1": 60, "olist1" : "s", "nleading1" : 6, "inputwidth1": HW.jJetOutputWidthSort,
2132 "otype2" : "AjJ", "ocut2": 50, "olist2" : "s", "nleading2" : 6, "inputwidth2": HW.jJetOutputWidthSort, "applyEtaCut":1,
2133 "minEta1": 0 ,"maxEta1": 32 , "minEta2": 30 ,"maxEta2": 49 , }, #400INVM-AjJ60s6pETA32-AjJ50s6p30ETA49
2134 ]
2135 for x in algoList:
2136 class d:
2137 pass
2138 for k in x:
2139 setattr (d, k, x[k])
2140 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)
2141 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)
2142 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
2143 toponame = "%iINVM-%s%s" % (d.itemNameMinInvm, obj1, obj2)
2144 alg = AlgConf.InvariantMassInclusive2( name = toponame, inputs = inputList, outputs = toponame)
2145 alg.addgeneric('InputWidth1', d.inputwidth1)
2146 alg.addgeneric('InputWidth2', d.inputwidth2)
2147 alg.addgeneric('MaxTob1', d.nleading1)
2148 alg.addgeneric('MaxTob2', d.nleading2)
2149 alg.addgeneric('NumResultBits', 1)
2150 if (d.applyEtaCut>0):
2151 alg.addgeneric('ApplyEtaCut', d.applyEtaCut)
2152 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion )
2153 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion )
2154 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion )
2155 alg.addvariable('MaxMSqr', _no_m_upper_threshold )
2156 if (d.applyEtaCut>0):
2157 alg.addvariable('MinEta1', d.minEta1*_eta_conversion )
2158 alg.addvariable('MaxEta1', d.maxEta1*_eta_conversion )
2159 alg.addvariable('MinEta2', d.minEta2*_eta_conversion )
2160 alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion )
2161 tm.registerTopoAlgo(alg)
2162
2163 # jINVM
2164 NFFmap = [
2165 { "itemNameMinInvmList": [300, 400, 500, 700], "minInvmList": [480, 640, 800, 1100] ,
2166 "otype1" : "AjJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
2167 "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
2168 ]
2169 for x in NFFmap:
2170 class d:
2171 pass
2172 for k in x:
2173 setattr (d, k, x[k])
2174 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
2175 toponames=[]
2176 for minInvm in d.itemNameMinInvmList:
2177 toponames.append ("%iINVM-%s%s%s%s-%s%s%s%s" % (minInvm,
2178 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2179 d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
2180 alg = AlgConf.InvariantMassInclusive2( name = 'jINVM', inputs = inputList, outputs = toponames)
2181 alg.addgeneric('InputWidth1', d.inputwidth)
2182 alg.addgeneric('InputWidth2', d.inputwidth)
2183 alg.addgeneric('MaxTob1', d.nleading1)
2184 alg.addgeneric('MaxTob2', d.nleading2)
2185 alg.addgeneric('NumResultBits', len(toponames))
2186 for bitid,minInvm in enumerate(d.minInvmList):
2187 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
2188 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
2189 alg.addvariable('MinMSqr', minInvm*minInvm*_et_conversion*_et_conversion , bitid)
2190 alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
2191 tm.registerTopoAlgo(alg)
2192
2193 # jINVM_NFF
2194 NFFmap = [
2195 { "itemNameMinInvmList": [300, 400, 500, 700], "minInvmList": [480, 640, 800, 1100] ,
2196 "otype1" : "jJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
2197 "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
2198 ]
2199 for x in NFFmap:
2200 class d:
2201 pass
2202 for k in x:
2203 setattr (d, k, x[k])
2204 inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
2205 toponames=[]
2206 for minInvm in d.itemNameMinInvmList:
2207 toponames.append ("%iINVM-%s%s%s%s-%s%s%s%s" % (minInvm,
2208 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2209 d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
2210 alg = AlgConf.InvariantMassInclusive2( name = 'jINVM_NFF', inputs = inputList, outputs = toponames)
2211 alg.addgeneric('InputWidth1', d.inputwidth)
2212 alg.addgeneric('InputWidth2', d.inputwidth)
2213 alg.addgeneric('MaxTob1', d.nleading1)
2214 alg.addgeneric('MaxTob2', d.nleading2)
2215 alg.addgeneric('NumResultBits', len(toponames))
2216 for bitid,minInvm in enumerate(d.minInvmList):
2217 alg.addvariable('MinET1', get_threshold_cut("CjJ", d.ocut1)*_et_conversion , bitid)
2218 alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
2219 alg.addvariable('MinMSqr', minInvm*minInvm*_et_conversion*_et_conversion , bitid)
2220 alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
2221 tm.registerTopoAlgo(alg)
2222
2223 #ATR-19355
2224 # Parameter ordering
2225 # 1. MinEt
2226 # 2. MinMSqr
2227 # 3. MaxMSqr
2228 toponame = "0INVM10-3MU3Vab"
2229 log.debug("Define %s", toponame)
2230 inputList = 'MU3Vab'
2231 alg = AlgConf.InvariantMassThreeTOBsIncl1( name = toponame, inputs = inputList, outputs = toponame )
2232 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2233 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2234 alg.addgeneric('NumResultBits', 1)
2235 alg.addvariable('MinET1', 0*_et_conversion)
2236 alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
2237 alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
2238 tm.registerTopoAlgo(alg)
2239
2240 toponame = "0INVM10-3MU3VFab"
2241 log.debug("Define %s", toponame)
2242 inputList = 'MU3VFab'
2243 alg = AlgConf.InvariantMassThreeTOBsIncl1( name = toponame, inputs = inputList, outputs = toponame )
2244 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2245 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2246 alg.addgeneric('NumResultBits', 1)
2247 alg.addvariable('MinET1', 0*_et_conversion)
2248 alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
2249 alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
2250 tm.registerTopoAlgo(alg)
2251
2252 #ATR-19638, 3muon, not all with the same charge
2253 toponame = "0INVM10C-3MU3Vab"
2254 log.debug("Define %s", toponame)
2255 inputList = 'MU3Vab'
2256 alg = AlgConf.InvariantMassThreeTOBsIncl1Charge( name = toponame, inputs = inputList, outputs = toponame )
2257 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2258 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2259 alg.addgeneric('NumResultBits', 1)
2260 alg.addvariable('MinET1', 0*_et_conversion)
2261 alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
2262 alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
2263 tm.registerTopoAlgo(alg)
2264
2265
2266 # LFV
2267 # output lines: 0INVM10-0DR15-eEM10abl-MU8Fab, 0INVM10-0DR15-eEM15abl-MU5VFab
2268 # Parameter ordering
2269 # 1. MinEt1
2270 # 2. MinEt2
2271 # 3. MinMSqr
2272 # 4. MaxMSqr
2273 # 5. MinEta1
2274 # 6. MaxEta1
2275 # 7. MinEta2
2276 # 8. MaxEta2
2277 # 9. DeltaRMin
2278 # 10. DeltaRMax
2279 INVM_DR_eEM_MU_Map = [{
2280 "algoname": "INVM_DR_eEM_MU",
2281 "minInvm" : 0,
2282 "maxInvm" : 10,
2283 "minDR" : 0,
2284 "maxDR" : 15,
2285 "otype1" : "eEM",
2286 "ocut1" : [10,15],
2287 "olist1": "abl",
2288 "otype2" : "MU",
2289 "olist2": ["Fab","VFab"],
2290 "ocut2" : 5,
2291 "ocut2Offset" : [3,0]
2292
2293 }]
2294
2295 for x in INVM_DR_eEM_MU_Map:
2296 class d:
2297 pass
2298 for k in x:
2299 setattr(d,k,x[k])
2300 inputList = [d.otype1 + d.olist1, d.otype2 + str(d.ocut2) + d.olist2[1] ]
2301 toponames = []
2302 for bitId in range(len(d.ocut1)):
2303 obj1 = "-%s%s%s" % (d.otype1, str( d.ocut1[bitId] ) , d.olist1)
2304 obj2 = "-%s%s%s" % (d.otype2, str( d.ocut2 + d.ocut2Offset[bitId] ) , d.olist2[bitId])
2305 toponames.append("%dINVM%d-%dDR%d%s%s" % ( d.minInvm, d.maxInvm, d.minDR, d.maxDR, obj1, obj2))
2306
2307 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
2308
2309 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSelect)
2310 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2311 alg.addgeneric('MaxTob1', HW.eEmOutputWidthSelect)
2312 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2313 alg.addgeneric('ApplyEtaCut', 1)
2314
2315 alg.addgeneric('NumResultBits', len(toponames) )
2316
2317 for bitId in range(len(toponames)):
2318 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1[bitId])*_et_conversion, bitId)
2319 alg.addvariable('MinET2', (d.ocut2 + d.ocut2Offset[bitId])*_et_conversion, bitId)
2320 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
2321 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitId)
2322 alg.addvariable('MinEta1', 0*_eta_conversion, bitId)
2323 alg.addvariable('MaxEta1', 49*_eta_conversion, bitId)
2324 alg.addvariable('MinEta2', 0*_eta_conversion, bitId)
2325 alg.addvariable('MaxEta2', 49*_eta_conversion, bitId)
2326 alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
2327 alg.addvariable('DeltaRMax', d.maxDR*d.maxDR*_dr_conversion*_dr_conversion, bitId)
2328
2329
2330 tm.registerTopoAlgo(alg)
2331
2332 #ATR-18824 ZAFB-DPHI
2333 # TODO: update with fwd electrons
2334 # Parameter ordering
2335 # 1. MinEt1
2336 # 2. MinEt2
2337 # 3. MinMSqr
2338 # 4. MaxMSqr
2339 # 5. MinEta1
2340 # 6. MaxEta1
2341 # 7. MinEta2
2342 # 8. MaxEta2
2343 # 9. MinDeltaPhi
2344 # 10. MaxDeltaPhi
2345 ZAFBDphimap = [
2346 { "minInvm": 60 , "minDphiList": [4, 25], "maxDphi": 32, "minEta2": 25, "maxEta2": 49,
2347 "inputwidth1": HW.eEmOutputWidthSelect, "otype1" : "eEM", "ocut1" : 18, "olist1" : "abm",
2348 "nleading1" : HW.eEmOutputWidthSelect, "inputwidth2": HW.jEmOutputWidthSort, "ocut2" : 20, "ocut3" : 25, "nleading2" : 6 }
2349 ]
2350 for x in ZAFBDphimap:
2351 class d:
2352 pass
2353 for k in x:
2354 setattr (d, k, x[k])
2355 inputList = [d.otype1 + d.olist1, 'jEMs25ETA49']
2356 toponames=[]
2357 for minDphi in d.minDphiList:
2358 toponames.append ("%iINVM-%02dDPHI%i-%s%s%s%s-jEM%ss%s%iETA%i" % (d.minInvm, minDphi, d.maxDphi,
2359 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2360 str(d.ocut3) , str(d.nleading2) , d.minEta2, d.maxEta2))
2361 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'ZAFB_DPHI', inputs = inputList, outputs = toponames)
2362 alg.addgeneric('InputWidth1', d.inputwidth1)
2363 alg.addgeneric('InputWidth2', d.inputwidth2)
2364 alg.addgeneric('MaxTob1', d.nleading1)
2365 alg.addgeneric('MaxTob2', d.nleading2)
2366 alg.addgeneric('NumResultBits', len(toponames))
2367 alg.addgeneric('ApplyEtaCut', 1)
2368 for bitid,minDphi in enumerate(d.minDphiList):
2369 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitid)
2370 alg.addvariable('MinET2', get_threshold_cut('jEM', d.ocut3)*_et_conversion, bitid)
2371 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
2372 alg.addvariable('MaxMSqr', _no_m_upper_threshold, bitid)
2373 alg.addvariable('MinEta1', 0*_eta_conversion, bitid)
2374 alg.addvariable('MaxEta1', 49*_eta_conversion, bitid)
2375 alg.addvariable('MinEta2', d.minEta2*_eta_conversion, bitid)
2376 alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion, bitid)
2377 alg.addvariable('MinDeltaPhi', minDphi*_phi_conversion, bitid)
2378 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, bitid)
2379 tm.registerTopoAlgo(alg)
2380
2381 inputList = [d.otype1 + d.olist1, 'jEMsm25ETA49']
2382 toponames=[]
2383 for minDphi in d.minDphiList:
2384 toponames.append ("%iINVM-%02dDPHI%i-%s%s%s%s-jEM%ssm%s%iETA%i" % (d.minInvm, minDphi, d.maxDphi,
2385 d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2386 str(d.ocut2) , str(d.nleading2) , d.minEta2, d.maxEta2))
2387 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'ZAFB_DPHIM', inputs = inputList, outputs = toponames)
2388 alg.addgeneric('InputWidth1', d.inputwidth1)
2389 alg.addgeneric('InputWidth2', d.inputwidth2)
2390 alg.addgeneric('MaxTob1', d.nleading1)
2391 alg.addgeneric('MaxTob2', d.nleading2)
2392 alg.addgeneric('NumResultBits', len(toponames))
2393 alg.addgeneric('ApplyEtaCut', 1)
2394 for bitid,minDphi in enumerate(d.minDphiList):
2395 alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitid)
2396 alg.addvariable('MinET2', get_threshold_cut('jEM', d.ocut2)*_et_conversion, bitid)
2397 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
2398 alg.addvariable('MaxMSqr', _no_m_upper_threshold, bitid)
2399 alg.addvariable('MinEta1', 0*_eta_conversion, bitid)
2400 alg.addvariable('MaxEta1', 49*_eta_conversion, bitid)
2401 alg.addvariable('MinEta2', d.minEta2*_eta_conversion, bitid)
2402 alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion, bitid)
2403 alg.addvariable('MinDeltaPhi', minDphi*_phi_conversion, bitid)
2404 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, bitid)
2405 tm.registerTopoAlgo(alg)
2406
2407 # ATR-19302, ATR-21637
2408 listofalgos=[
2409 {"minInvm": 0,"maxInvm": 70,"minDphi": 27,"maxDphi": 32,"otype":"eEM","olist":"s","ocut1":9,"nleading1":1,"ocut2":9,"nleading2":6,}, #0INVM70-27DPHI32-eEM9s1-eEM9s6
2410 {"minInvm": 0,"maxInvm": 70,"minDphi": 27,"maxDphi": 32,"otype":"eEM","olist":"sl","ocut1":9,"nleading1":1,"ocut2":9,"nleading2":6,}, #0INVM70-27DPHI32-eEM9sl1-eEM9sl6
2411 ]
2412 for x in listofalgos:
2413 class d:
2414 pass
2415 for k in x:
2416 setattr (d, k, x[k])
2417 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))
2418 log.debug("Define %s", toponame)
2419 inputList = [d.otype + d.olist, d.otype + d.olist]
2420 alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = toponame, inputs = inputList, outputs = toponame )
2421 alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
2422 alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
2423 alg.addgeneric('MaxTob1', d.nleading1)
2424 alg.addgeneric('MaxTob2', d.nleading2)
2425 alg.addgeneric('NumResultBits', 1)
2426 alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion)
2427 alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion)
2428 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2429 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2430 alg.addgeneric('ApplyEtaCut', 1)
2431 alg.addvariable('MinEta1', 0*_eta_conversion)
2432 alg.addvariable('MaxEta1',49*_eta_conversion)
2433 alg.addvariable('MinEta2', 0*_eta_conversion)
2434 alg.addvariable('MaxEta2',49*_eta_conversion)
2435 alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
2436 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
2437 tm.registerTopoAlgo(alg)
2438
2439
2440 # DR Map for INVM_DR_2MU3 Trigger. Output lines:
2441 #'7INVM22-0DR20-2MU3Vab'
2442 #'7INVM22-0DR12-2MU3Vab'
2443 INVM_DR_2MU3Vab_Map = [
2444 {
2445 "algoname": "7INVM22_DR_2MU3Vab",
2446 "minInvm" : 7,
2447 "maxInvm" : 22,
2448 "minDR" : [0,0],
2449 "maxDR" : [12,20],
2450 "otype1" : "MU3Vab",
2451 "mult1" : 2
2452 }
2453 ]
2454 for x in INVM_DR_2MU3Vab_Map:
2455 class d:
2456 pass
2457 for k in x:
2458 setattr(d,k,x[k])
2459 inputList = d.otype1
2460 toponames = []
2461 for bitId in range(len(d.minDR)):
2462 toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm, d.maxInvm,
2463 d.minDR[bitId] , d.maxDR[bitId],
2464 d.mult1, d.otype1
2465 )
2466 )
2467 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
2468 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2469 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2470 alg.addgeneric('NumResultBits', len(toponames))
2471 for bitId in range(len(toponames)):
2472 alg.addvariable('MinET1', 0*_et_conversion, bitId)
2473 alg.addvariable('MinET2', 0*_et_conversion, bitId)
2474 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
2475 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitId)
2476 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2477 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2478 tm.registerTopoAlgo(alg)
2479
2480
2481 # INVM_DR_2MU3VFab
2482 # Output lines: '2INVM9-0DR15-2MU3VFab'
2483 # '7INVM11-25DR99-2MU3VFab',
2484
2485
2486 INVM_DR_2MU3VFab_Map = [
2487 {
2488 "algoname": "INVM_DR_2MU3VFab",
2489 "minInvm" : [2,7],
2490 "maxInvm" : [9,11,22],
2491 "minDR" : [0,25],
2492 "maxDR" : [15,99],
2493 "otype1" : "MU3VFab",
2494 "mult1" : 2
2495 }
2496 ]
2497 for x in INVM_DR_2MU3VFab_Map:
2498 class d:
2499 pass
2500 for k in x:
2501 setattr(d,k,x[k])
2502 inputList = d.otype1
2503 toponames = []
2504 for bitId in range(len(d.minDR)):
2505 toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm[bitId], d.maxInvm[bitId],
2506 d.minDR[bitId] , d.maxDR[bitId],
2507 d.mult1, d.otype1
2508 )
2509 )
2510 alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
2511 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2512 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2513 alg.addgeneric('NumResultBits', len(toponames))
2514 for bitId in range(len(toponames)):
2515 alg.addvariable('MinET1', 0*_et_conversion, bitId)
2516 alg.addvariable('MinET2', 0*_et_conversion, bitId)
2517 alg.addvariable('MinMSqr', d.minInvm[bitId]*d.minInvm[bitId]*_et_conversion*_et_conversion, bitId)
2518 alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
2519 alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2520 alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2521 tm.registerTopoAlgo(alg)
2522
2523
2524
2525 #ATR-19720 and ATR-22782, BPH DR+M dimuon
2526 listofalgos=[
2527 {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #2INVM9-0DR15-MU5VFab-MU3Vab
2528 {"minInvm": 8, "maxInvm": 15, "minDr": 0, "maxDr": 22, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #8INVM15-0DR22-MU5VFab-MU3Vab
2529 {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 2, "otype1" : "MU3Vab", "otype2": "", }, #2INVM9-0DR15-2MU3Vab
2530
2531
2532 {"minInvm": 0, "maxInvm": 16, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #0INVM16-20DR99-2MU3Vab
2533 {"minInvm": 0, "maxInvm": 16, "minDr": 15, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #0INVM16-15DR99-2MU3Vab
2534 {"minInvm": 8, "maxInvm": 15, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-20DR99-2MU3Vab
2535 {"minInvm": 8, "maxInvm": 15, "minDr": 15, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-15DR99-2MU3Vab
2536
2537 {"minInvm": 7, "maxInvm": 22, "minDr": 0, "maxDr": 20, "mult": 2, "otype1" : "MU3VFab", "otype2": "",}, #7INVM22-0DR20-2MU3VFab, ATR-21566
2538
2539 {"minInvm": 8, "maxInvm": 15, "minDr": 0, "maxDr": 22, "mult": 1, "otype1" : "CMU5VFab","otype2": "CMU3Vab",}, #8INVM15-0DR22-CMU5VFab-CMU3Vab
2540
2541 {"minInvm": 7, "maxInvm": 14, "minDr": 0, "maxDr": 25, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #7INVM14-0DR25-MU5VFab-MU3Vab
2542 {"minInvm": 7, "maxInvm": 11, "minDr": 25, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #7INVM11-25DR99-2MU3Vab
2543 {"minInvm": 7, "maxInvm": 14, "minDr": 0, "maxDr": 25, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3VFab", }, #7INVM14-0DR25-MU5VFab-MU3VFab
2544
2545
2546 ]
2547 for x in listofalgos:
2548 class d:
2549 pass
2550 for k in x:
2551 setattr (d, k, x[k])
2552 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
2553 obj2 = "-%s" % (d.otype2)
2554 toponame = "%iINVM%i-%iDR%i-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
2555 log.debug("Define %s", toponame)
2556 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
2557 algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1 if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2
2558 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2559 if (d.mult>1):
2560 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2561 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2562 else:
2563 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
2564 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2565 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
2566 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2567 alg.addgeneric('NumResultBits', 1)
2568 alg.addvariable('MinET1', 0*_et_conversion)
2569 alg.addvariable('MinET2', 0*_et_conversion)
2570 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2571 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2572 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
2573 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
2574 tm.registerTopoAlgo(alg)
2575
2576 #ATR-19639, BPH DR+M+OS dimuon
2577 listofalgos=[
2578 {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab",}, #2INVM9-0DR15-C-MU5VFab-MU3Vab
2579 {"minInvm": 8, "maxInvm": 15, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-20DR99-C-2MU3Vab
2580 ]
2581 for x in listofalgos:
2582 class d:
2583 pass
2584 for k in x:
2585 setattr (d, k, x[k])
2586 obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
2587 obj2 = "-%s" % (d.otype2)
2588 toponame = "%iINVM%i-%iDR%i-C-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
2589 log.debug("Define %s", toponame)
2590 inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
2591 algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2Charge
2592 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2593 if (d.mult>1):
2594 alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2595 alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2596 else:
2597 alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
2598 alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2599 alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
2600 alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2601 alg.addgeneric('NumResultBits', 1)
2602 alg.addvariable('MinET1', 0*_et_conversion)
2603 alg.addvariable('MinET2', 0*_et_conversion)
2604 alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2605 alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2606 alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
2607 alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
2608 tm.registerTopoAlgo(alg)
2609
2610
2611 # dphi with s+s #ATR-29784
2612 # Parameter ordering:
2613 # 1. MinEt1
2614 # 2. MinEt2
2615 # 3. DeltaPhiMin
2616 # 4. DeltaPhiMax
2617 algolist=[
2618 { "minDphi": 23, "maxDphi": 32, "mult": 2, "otype1" : "eEM",
2619 "ocut1": 1, "olist1": "s", "nleading1": HW.eEmOutputWidthSort, "minET1":0.9, "otype2" : "", "minET2":0.8},#23DPHI32_2eEM1s
2620 { "minDphi": 26, "maxDphi": 32, "mult": 2, "otype1" : "eTAU",
2621 "ocut1": 1, "olist1": "s", "nleading1": HW.eTauOutputWidthSort,"minET1":0.8,"otype2" : "","minET2":0.8},#26DPHI32_2eTAU1s
2622 { "minDphi": 23, "maxDphi": 32, "mult": 2, "otype1" : "jTAU",
2623 "ocut1": 1, "olist1": "s", "nleading1": HW.jTauOutputWidthSort,"minET1":1.4,"otype2" : "","minET2":1.4},#23DPHI32_2jTAU1s
2624 ]
2625 for x in algolist:
2626 class d:
2627 pass
2628 for k in x:
2629 setattr (d, k, x[k])
2630 obj = "%s" % (str(d.mult)+d.otype1+str(d.ocut1)+str(d.olist1))
2631 toponame = "%sDPHI%s-%s" % (d.minDphi, d.maxDphi, obj)
2632 log.debug("Define %s", toponame)
2633 inputList = [d.otype1+d.olist1]
2634 algoname = AlgConf.DeltaPhiIncl1
2635 alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2636 alg.addgeneric('NumResultBits', 1)
2637 alg.addgeneric('InputWidth', d.nleading1)
2638 alg.addgeneric('MaxTob', d.nleading1)
2639 alg.addvariable('MinET1', d.minET1*_et_conversion)
2640 alg.addvariable('MinET2', d.minET2*_et_conversion)
2641 alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
2642 alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
2643 tm.registerTopoAlgo(alg)
2644
2645 # InvMass + DPHI (+ SumET) for ATR-30727 and ATR-30728
2646 from dataclasses import dataclass
2647
2648 @dataclass
2649 class InvMassDPhiSumETAlgoParams:
2650 """ Parameters for InvariantMassDeltaPhiInclusive1 and InvariantMassDeltaPhiSumEtInclusive1 Topo algorithms """
2651 MinEt1: float
2652 MinEt2: float
2653 DeltaPhiMin: int = 23
2654 DeltaPhiMax: int = 32
2655 MinInvMassSq: float = 0 # Algorithm uses MinMSqr
2656 MaxInvMassSq: float = 1000 ** 2 # Algorithm uses MaxMSqr
2657 MinSumEt: float = 0
2658 MaxSumEt: float = 1000
2659
2660 def AddInvMassDPhiSumETAlgos(otype: str, nleading, list_of_algos: list[InvMassDPhiSumETAlgoParams]):
2661 for x in list_of_algos:
2662 # Check which parameters are set and choose correct algorithm
2663 is_InvMass_set = x.MinInvMassSq != 0 or x.MaxInvMassSq != 1000 ** 2
2664 is_SumEt_set = x.MinSumEt != 0 or x.MaxSumEt != 1000
2665 algoname = AlgConf.InvariantMassDeltaPhiSumEtInclusive1 if is_SumEt_set else AlgConf.InvariantMassDeltaPhiInclusive1
2666
2667 if float(x.MinEt1) != int(x.MinEt1):
2668 obj = f'2{otype}0{round(x.MinEt1 * 10)}s' # e.g. MinEt1 = 0.7 → eTAU07
2669 else:
2670 obj = f'2{otype}{round(x.MinEt1)}s' # e.g. MinEt1 = 1 → eTAU1
2671 toponame = f'{x.DeltaPhiMin}DPHI{x.DeltaPhiMax}-{obj}' # Always present
2672 # Check Min/MaxSumEt only for algorithm which supports it
2673 if is_SumEt_set:
2674 toponame = f'{x.MinSumEt}SUM{x.MaxSumEt}-{toponame}'
2675 if is_InvMass_set:
2676 if float(x.MinInvMassSq) != int(x.MinInvMassSq) or float(x.MaxInvMassSq) != int(x.MaxInvMassSq):
2677 toponame = f'{round(x.MinInvMassSq * 10)}INVM{round(x.MaxInvMassSq * 10)}-{toponame}'
2678 else:
2679 toponame = f'{x.MinInvMassSq}INVM{x.MaxInvMassSq}-{toponame}'
2680 log.debug('Define %s', toponame)
2681
2682 alg = algoname(name=toponame, inputs=[f'{otype}s'], outputs=[toponame])
2683 alg.addgeneric('NumResultBits', 1)
2684 alg.addgeneric('InputWidth', nleading)
2685 alg.addgeneric('MaxTob', nleading)
2686 alg.addvariable('MinET1', x.MinEt1 * _et_conversion)
2687 alg.addvariable('MinET2', x.MinEt2 * _et_conversion)
2688 alg.addvariable('MinMSqr', x.MinInvMassSq * (_et_conversion ** 2)) # Algoritm uses InvMass squared
2689 alg.addvariable('MaxMSqr', x.MaxInvMassSq * (_et_conversion ** 2))
2690 alg.addvariable('MinDeltaPhi', x.DeltaPhiMin * _phi_conversion)
2691 alg.addvariable('MaxDeltaPhi', x.DeltaPhiMax * _phi_conversion)
2692 # Set Min/MaxSumEt only for algorithm which supports it
2693 if is_SumEt_set:
2694 alg.addvariable('MinSumEt', x.MinSumEt * _et_conversion)
2695 alg.addvariable('MaxSumEt', x.MaxSumEt * _et_conversion)
2696 tm.registerTopoAlgo(alg)
2697
2698 # From ATR-30728
2699 algo_list = [
2700 InvMassDPhiSumETAlgoParams(MinEt1=0.7, MinEt2=0.7, DeltaPhiMin=24, MinInvMassSq=2.3, MaxInvMassSq=200 ** 2), # 23INVM400000-24DPHI32-2eTAU07
2701 InvMassDPhiSumETAlgoParams(MinEt1=0.7, MinEt2=0.7, DeltaPhiMin=24, MinInvMassSq=2.8, MaxInvMassSq=200 ** 2), # 28INVM400000-24DPHI32-2eTAU07
2702 InvMassDPhiSumETAlgoParams(MinEt1=0.8, MinEt2=0.8, DeltaPhiMin=25, MinInvMassSq=2.3, MaxInvMassSq=200 ** 2), # 23INVM400000-25DPHI32-2eTAU08
2703 InvMassDPhiSumETAlgoParams(MinEt1=0.7, MinEt2=0.7, DeltaPhiMin=25, MinInvMassSq=3.3, MaxInvMassSq=200 ** 2), # 33INVM400000-25DPHI32-2eTAU07
2704 InvMassDPhiSumETAlgoParams(MinEt1=0.7, MinEt2=0.7, DeltaPhiMin=27, MinInvMassSq=2.3, MaxInvMassSq=200 ** 2), # 23INVM400000-27DPHI32-2eTAU07
2705 ]
2706 AddInvMassDPhiSumETAlgos('eTAU', HW.eTauOutputWidthSort, algo_list)
2707
2708 # From ATR-30727
2709 algo_list = []
2710 AddInvMassDPhiSumETAlgos('jJ', HW.jJetOutputWidthSort, algo_list)
2711
2712 # g-2 tau (ATR-30638)
2713 Algo = namedtuple('Algo', ['dPhiMin', 'dPhiMax', 'otype', 'olist', 'ocut1', 'ocut2', 'nTOB'])
2714 algolist=[
2715 Algo(dPhiMin=30, dPhiMax=32, otype='eTAU', olist='s', ocut1=50, ocut2=50, nTOB=HW.eTauOutputWidthSort), #30DPHI32-2eTAU50s
2716 ]
2717 for x in algolist:
2718 name = f'{x.dPhiMin}DPHI{x.dPhiMax}-'
2719 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}'
2720
2721 alg = AlgConf.DeltaPhiIncl1(name=name, inputs=[x.otype+x.olist], outputs=[name])
2722 alg.addgeneric('NumResultBits', 1)
2723 alg.addgeneric('InputWidth', x.nTOB)
2724 alg.addgeneric('MaxTob', x.nTOB)
2725 alg.addvariable('MinET1', get_threshold_cut(x.otype, x.ocut1)*_et_conversion)
2726 alg.addvariable('MinET2', get_threshold_cut(x.otype, x.ocut2)*_et_conversion)
2727 alg.addvariable('MinDeltaPhi', x.dPhiMin*_phi_conversion)
2728 alg.addvariable('MaxDeltaPhi', x.dPhiMax*_phi_conversion)
2729 tm.registerTopoAlgo(alg)
constexpr int pow(int base, int exp) noexcept