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