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