Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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" : 40, "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 
371  # Decision algorithms
372 
373  # LAR ZEE
374  # Parameter ordering:
375  # 1. MinEt1
376  # 2. MinEt2
377  # 3. MinInvariantMassSqr
378  # 4. MaxInvariantMassSqr
379  algoList = [
380  {"otype" : "eEM", "ocut1" : 24, "ocut2" : 24, "olist" : "sm", "nleading1" : 2, "minInvm" : 60, "maxInvm" : 100, "inputwidth": HW.eEmOutputWidthSort},
381  ]
382  for x in algoList:
383  class d:
384  pass
385  for k in x:
386  setattr (d, k, x[k])
387  toponame = 'ZEE-eEM24sm2'
388  log.debug("Define %s", toponame)
389  inputList = d.otype + d.olist
390  alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame)
391  alg.addgeneric('InputWidth', d.inputwidth)
392  alg.addgeneric('MaxTob', d.nleading1)
393  alg.addgeneric('NumResultBits', 1)
394  alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion )
395  alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion )
396  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion )
397  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion )
398  tm.registerTopoAlgo(alg)
399 
400 
401 
402  #ATR-30179
403  #Mu+Tau dR cut
404  algolist = [
405  {"minDr": 3, "maxDr": 99, "mult": 1, "otype1" : "MU8Fab" , "otype2" : "eTAU", "ocut2" : 30, "olist2" : "ab", }, #3DR99-MU8Fab-eTAU30ab
406  {"minDr": 3, "maxDr": 35, "mult": 1, "otype1" : "MU8Fab" , "otype2" : "eTAU", "ocut2" : 30, "olist2" : "ab", }, #3DR35-MU8Fab-eTAU30ab
407  {"minDr": 3, "maxDr": 30, "mult": 1, "otype1" : "MU8Fab" , "otype2" : "eTAU", "ocut2" : 30, "olist2" : "ab", }, #3DR30-MU8Fab-eTAU30ab
408  {"minDr": 3, "maxDr": 28, "mult": 1, "otype1" : "MU8Fab" , "otype2" : "eTAU", "ocut2" : 30, "olist2" : "ab", }, #3DR28-MU8Fab-eTAU30ab
409  ]
410 
411  for x in algolist:
412  class d:
413  pass
414  for k in x:
415  setattr (d, k, x[k])
416  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
417  obj2 = "-%s%d%s" % (d.otype2, d.ocut2, d.olist2)
418  toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, obj2)
419  log.debug("Define %s", toponame)
420  inputList = [ d.otype1, 'eTAUs']
421  algoname = AlgConf.DeltaRSqrIncl2
422  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
423  #alg = AlgConf.NotMatch( name = toponame, inputs = [ d.otype1, 'eTAUs'], outputs = [ toponame ] )
424  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
425  alg.addgeneric('InputWidth2', HW.eTauOutputWidthSort)
426  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
427  alg.addgeneric('MaxTob2', 1)
428  alg.addgeneric('NumResultBits', 1)
429  alg.addvariable('MinET1', 0*_et_conversion)
430  alg.addvariable('MinET2', get_threshold_cut('eTAU', d.ocut2)*_et_conversion)
431  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
432  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
433  tm.registerTopoAlgo(alg)
434 
435 
436  # dimu DR items
437  # Parameter ordering:
438  # 1. MinEt1
439  # 2. MinEt2
440  # 3. MinDeltaRSqr
441  # 4. MaxDeltaRSqr
442  listofalgos=[
443  {"minDr": 0, "maxDr": 15, "mult": 2, "otype1" : "MU3Vab" , "otype2" : "", }, #0DR15-2MU3Vab
444  {"minDr": 0, "maxDr": 24, "mult": 2, "otype1" : "MU3Vab" , "otype2" : "", }, #0DR24-2MU3Vab
445  # a min dR cut is needed when using muons from two lists. Maybe 0.1 is too large
446  {"minDr": 1, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab", }, #1DR15-MU5VFab-MU3Vab
447  {"minDr": 1, "maxDr": 22, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab", }, #1DR22-MU5VFab-MU3Vab
448  {"minDr": 2, "maxDr": 15, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #2DR15-2MU5VFab
449  {"minDr": 0, "maxDr": 22, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #0DR22-2MU5VFab
450  {"minDr": 2, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab" , "otype2" : "", }, #2DR99-2MU3Vab
451  ]
452  for x in listofalgos:
453  class d:
454  pass
455  for k in x:
456  setattr (d, k, x[k])
457  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
458  obj2 = "-%s" % (d.otype2)
459  toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
460  log.debug("Define %s", toponame)
461  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
462  algoname = AlgConf.DeltaRSqrIncl1 if (d.mult>1) else AlgConf.DeltaRSqrIncl2
463  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
464  if (d.mult>1):
465  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
466  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
467  else:
468  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
469  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
470  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
471  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
472  alg.addgeneric('NumResultBits', 1)
473  alg.addvariable('MinET1', 0*_et_conversion)
474  alg.addvariable('MinET2', 0*_et_conversion)
475  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
476  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
477  tm.registerTopoAlgo(alg)
478 
479  # dimu DR with opposite charge, ATR-23073
480  # Parameter ordering:
481  # 1. MinEt1
482  # 2. MinEt2
483  # 3. MinDeltaRSqr
484  # 4. MaxDeltaRSqr
485  listofalgos=[
486  {"minDr": 0, "maxDr": 12, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #0DR12C-2MU3Vab
487  ]
488  for x in listofalgos:
489  class d:
490  pass
491  for k in x:
492  setattr (d, k, x[k])
493  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
494  obj2 = "-%s" % (d.otype2)
495  toponame = "%iDR%iC-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
496  log.debug("Define %s", toponame)
497  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
498  algoname = AlgConf.DeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.DeltaRSqrIncl2Charge
499  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
500  if (d.mult>1):
501  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
502  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
503  else:
504  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
505  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
506  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
507  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
508  alg.addgeneric('NumResultBits', 1)
509  alg.addvariable('MinET1', 0*_et_conversion)
510  alg.addvariable('MinET2', 0*_et_conversion)
511  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
512  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
513  tm.registerTopoAlgo(alg)
514 
515  # dimu INVM+DR with opposite charge, ATR-23073
516  # Parameter ordering:
517  # 1. MinEt1
518  # 2. MinEt2
519  # 3. MinInvariantMassSqr
520  # 4. MaxInvariantMassSqr
521  # 5. MinDeltaRSqr
522  # 6. MaxDeltaRSqr
523  listofalgos=[
524  {"minInvm":7, "maxInvm":22, "minDr": 0, "maxDr": 20, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM22-0DR20C-2MU3Vab
525  ]
526  for x in listofalgos:
527  class d:
528  pass
529  for k in x:
530  setattr (d, k, x[k])
531  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
532  obj2 = "-%s" % (d.otype2)
533  toponame = "%iINVM%i-%iDR%iC-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
534  log.debug("Define %s", toponame)
535  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
536  algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2Charge
537  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
538  if (d.mult>1):
539  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
540  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
541  else:
542  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
543  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
544  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
545  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
546  alg.addgeneric('NumResultBits', 1)
547  alg.addvariable('MinET1', 0*_et_conversion)
548  alg.addvariable('MinET2', 0*_et_conversion)
549  alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
550  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
551  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
552  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
553  tm.registerTopoAlgo(alg)
554 
555  # deta-dphi with ab+ab
556  # Parameter ordering:
557  # 1. MinEt1
558  # 2. MinEt2
559  # 3. MinDeltaEta
560  # 4. MaxDeltaEta
561  # 5. DeltaPhiMin
562  # 6. DeltaPhiMax
563  algolist=[
564  {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 1,
565  "otype1" : "MU5VFab", "ocut1": "", "olist1": "", "nleading1": HW.muonOutputWidthSelect,
566  "otype2" : "MU3Vab" , "ocut2": "", "olist2": "", "nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-MU5VFab-MU3Vab
567  {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 2,
568  "otype1" : "MU5VFab", "ocut1": "", "olist1": "", "nleading1": HW.muonOutputWidthSelect,
569  "otype2" : "" , "ocut2": "", "olist2": "", "nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-2MU5VFab
570  {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 2,
571  "otype1" : "MU3Vab", "ocut1": "", "olist1": "", "nleading1": HW.muonOutputWidthSelect,
572  "otype2" : "" , "ocut2": "", "olist2": "", "nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-2MU3Vab
573  {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 2,
574  "otype1" : "MU3VFab", "ocut1": "", "olist1": "","nleading1": HW.muonOutputWidthSelect,
575  "otype2" : "" , "ocut2": "", "olist2": "","nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-2MU3VFab
576  { "minDeta": 0, "maxDeta": 24, "minDphi": 4, "maxDphi": 99, "mult": 1,
577  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect,
578  "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect},#0DETA24_4DPHI99_eTAU30ab_eTAU20ab
579  { "minDeta": 0, "maxDeta": 24, "minDphi": 4, "maxDphi": 99, "mult": 1,
580  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect,
581  "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect},#0DETA24_4DPHI99_eTAU30ab_eTAU12ab
582  { "minDeta": 0, "maxDeta": 24, "minDphi": 10, "maxDphi": 99, "mult": 1,
583  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect,
584  "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect},#0DETA24_10DPHI99_eTAU30ab_eTAU12ab
585  ]
586  for x in algolist:
587  class d:
588  pass
589  for k in x:
590  setattr (d, k, x[k])
591  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1+str(d.ocut1)+str(d.olist1))
592  obj2 = "-%s" % (d.otype2+str(d.ocut2)+str(d.olist2))
593  toponame = "%sDETA%s-%sDPHI%s-%s%s" % (d.minDeta, d.maxDeta, d.minDphi, d.maxDphi, obj1, "" if d.mult>1 else obj2)
594  log.debug("Define %s", toponame)
595  inputList = [d.otype1+d.olist1] if (d.mult>1) else [d.otype1+d.olist1, d.otype2+d.olist2]
596  algoname = AlgConf.DeltaEtaPhiIncl1 if (d.mult>1) else AlgConf.DeltaEtaPhiIncl2
597  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
598  alg.addgeneric('NumResultBits', 1)
599  if (d.mult>1):
600  alg.addgeneric('InputWidth', d.nleading1)
601  alg.addgeneric('MaxTob', d.nleading1)
602  alg.addvariable('MinET1', 0*_et_conversion)
603  alg.addvariable('MinET2', 0*_et_conversion)
604  alg.addvariable('MinDeltaEta', d.minDeta*_eta_conversion)
605  alg.addvariable('MaxDeltaEta', d.maxDeta*_eta_conversion)
606  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
607  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
608  else:
609  alg.addgeneric('InputWidth1', d.nleading1)
610  alg.addgeneric('InputWidth2', d.nleading2)
611  alg.addgeneric('MaxTob1', d.nleading1)
612  alg.addgeneric('MaxTob2', d.nleading2)
613  alg.addvariable('MinET1', 0*_et_conversion)
614  alg.addvariable('MinET2', 0*_et_conversion)
615  alg.addvariable('DeltaEtaMin', d.minDeta*_eta_conversion)
616  alg.addvariable('DeltaEtaMax', d.maxDeta*_eta_conversion)
617  alg.addvariable('DeltaPhiMin', d.minDphi*_phi_conversion)
618  alg.addvariable('DeltaPhiMax', d.maxDphi*_phi_conversion)
619  tm.registerTopoAlgo(alg)
620 
621 
622  # (ATR-8194) L1Topo HT Trigger
623  algoList = [
624  {"itemNameMinHT": 150, "minHT": 240, "otype" : "jJ", "ocut" : 50, "olist" : "s", "nleading" : 5, "inputwidth": HW.jJetOutputWidthSort, "oeta" : 32}, #HT150-jJ50s5pETA32
625  {"itemNameMinHT": 190, "minHT": 300, "otype" : "jJ", "ocut" : 40, "olist" : "s", "nleading" : 5, "inputwidth": HW.jJetOutputWidthSort, "oeta" : 21}, #HT190-jJ40s5pETA21
626  ]
627  for x in algoList:
628  class d:
629  pass
630  for k in x:
631  setattr (d, k, x[k])
632  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))
633  log.debug("Define %s", toponame)
634  inputList = d.otype + d.olist
635  alg = AlgConf.JetHT( name = toponame, inputs = inputList, outputs = [toponame] )
636  alg.addgeneric('InputWidth', d.inputwidth)
637  alg.addgeneric('MaxTob', d.nleading)
638  alg.addgeneric('NumRegisters', 2 if d.olist=="all" else 0)
639  alg.addgeneric('NumResultBits', 1)
640  alg.addvariable('MinET', get_threshold_cut(d.otype, d.ocut)*_et_conversion)
641  alg.addvariable('MinEta', 0*_eta_conversion)
642  alg.addvariable('MaxEta', d.oeta*_eta_conversion)
643  alg.addvariable('MinHt', d.minHT*_et_conversion)
644  tm.registerTopoAlgo(alg)
645 
646  #DR for 2MU5
647  # Covers chains: 0DR15-2MU5VFab
648  # 10DR99-2MU5VFab
649  DR_2MU5FMap = [
650  {
651  "algoname" : "DR_2MU5VFab",
652  "minDR" : [0 ,10],
653  "maxDR" : [15,99],
654  "otype1" : "MU5VFab",
655  "mult1" : [2]*2
656  }
657  ]
658 
659 
660  for x in DR_2MU5FMap:
661  class d:
662  pass
663  for k in x:
664  setattr (d, k, x[k])
665  inputList = [ d.otype1 ]
666  toponames = []
667  for bitId in range(len(d.minDR)):
668  toponames.append("%iDR%i-%s%s" % (d.minDR[bitId], d.maxDR[bitId], str(d.mult1[bitId]),
669  d.otype1 )
670  )
671  alg = AlgConf.DeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
672  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
673  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
674  alg.addgeneric('NumResultBits', len(toponames) )
675 
676  for bitId in range(len(toponames)):
677  alg.addvariable('MinET1', 0 * _et_conversion, bitId )
678  alg.addvariable('MinET2', 0 * _et_conversion, bitId )
679  alg.addvariable("DeltaRMin", d.minDR[bitId] * d.minDR[bitId] * _dr_conversion * _dr_conversion, bitId)
680  alg.addvariable("DeltaRMax", d.maxDR[bitId] * d.maxDR[bitId] * _dr_conversion * _dr_conversion, bitId)
681 
682  tm.registerTopoAlgo(alg)
683 
684 
685  # DM/DPHI for eEM
686  # output lines = 0INVM70-27DPHI32-eEM12sm1-eEM12sm6, 0INVM70-27DPHI32-eEM15sm1-eEM15sm6
687  # Parameter ordering
688  # 1. MinEt1
689  # 2. MinEt2
690  # 3. MinMSqr
691  # 4. MaxMSqr
692  # 5. MinDeltaPhi
693  # 6. MaxDeltaPhi
694  eINVM_DPHIMap = [
695  {
696  "algoname" : "INVM_DPHI_eEMsm6",
697  "minInvm" : 0,
698  "maxInvm" : 70,
699  "minDphi" : 27,
700  "maxDphi" : 32,
701  "otype1" : "eEM",
702  "olist1" : "sm",
703  "ocut1List" : [ 12, 15 ],
704  "nleading1" : 1,
705  "otype2" : "eEM",
706  "ocut2List" : [ 12, 15 ],
707  "olist2" : "sm",
708  "nleading2" : 6
709 
710  }
711  ]
712 
713  for x in eINVM_DPHIMap:
714  class d:
715  pass
716  for k in x:
717  setattr (d, k, x[k])
718  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
719  toponames=[]
720  for bitId, ocut1Value in enumerate(d.ocut1List):
721  toponames.append ("%iINVM%i-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDphi, d.maxDphi,
722  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sm" else "",
723  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sm" else ""))
724  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = d.algoname, inputs = inputList, outputs = toponames )
725  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
726  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
727  alg.addgeneric('MaxTob1', d.nleading1)
728  alg.addgeneric('MaxTob2', d.nleading2)
729  alg.addgeneric('NumResultBits', len(toponames))
730  for bitId in range(len(toponames)):
731  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
732  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
733  alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
734  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
735  alg.addvariable('MinDeltaPhi', d.minDphi * _phi_conversion, bitId)
736  alg.addvariable('MaxDeltaPhi', d.maxDphi * _phi_conversion, bitId)
737 
738  tm.registerTopoAlgo(alg)
739 
740 
741  # Boosted DM/DPHI for eEM
742  # output lines = 0INVM70-0DPHI12-eEM9sl1-eEM9sl6,
743  # 0INVM70-0DPHI12-eEM12sl1-eEM12sl6,
744  # 0INVM70-0DPHI12-eEM15sl1-eEM15sl6
745  # Parameter ordering
746  # 1. MinEt1
747  # 2. MinEt2
748  # 3. MinMSqr
749  # 4. MaxMSqr
750  # 5. MinDeltaPhi
751  # 6. MaxDeltaPhi
752  eINVM_DPHIMap = [
753  {
754  "algoname" : "INVM_INVDPHI_eEMsl6",
755  "minInvm" : 0,
756  "maxInvm" : 70,
757  "minDphi" : 0,
758  "maxDphi" : 12,
759  "otype1" : "eEM",
760  "olist1" : "sl",
761  "ocut1List" : [ 9, 12],
762  "nleading1" : 1,
763  "otype2" : "eEM",
764  "ocut2List" : [ 9, 12 ],
765  "olist2" : "sl",
766  "nleading2" : 6
767  }
768  ]
769 
770  for x in eINVM_DPHIMap:
771  class d:
772  pass
773  for k in x:
774  setattr (d, k, x[k])
775  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
776  toponames=[]
777  for bitId, ocut1Value in enumerate(d.ocut1List):
778  toponames.append ("%iINVM%i-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDphi, d.maxDphi,
779  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
780  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
781  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = d.algoname, inputs = inputList, outputs = toponames )
782 
783  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
784  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
785  alg.addgeneric('MaxTob1', d.nleading1)
786  alg.addgeneric('MaxTob2', d.nleading2)
787  alg.addgeneric('NumResultBits', len(toponames))
788  for bitId in range(len(toponames)):
789  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
790  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
791  alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
792  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
793  alg.addvariable('MinDeltaPhi', d.minDphi * _phi_conversion, bitId)
794  alg.addvariable('MaxDeltaPhi', d.maxDphi * _phi_conversion, bitId)
795 
796  tm.registerTopoAlgo(alg)
797 
798 
799  # DM/DR for eEM
800  # output lines = 0INVM70-2DR15-eEM9sl1-eEM9sl6,
801  # 0INVM70-2DR15-eEM12sl1-eEM12sl6,
802  #
803  # Parameter ordering
804  # 1. MinEt1
805  # 2. MinEt2
806  # 3. MinMSqr
807  # 4. MaxMSqr
808  # 5. MinDeltaR
809  # 6. MaxDeltaR
810  eINVM_DRMap = [
811  {
812  "algoname" : "INVM_BOOSTDR_eEMsl6",
813  "minInvm" : 0,
814  "maxInvm" : 70,
815  "minDR" : 2,
816  "maxDR" : 15,
817  "otype1" : "eEM",
818  "olist1" : "sl",
819  "ocut1List" : [ 9, 12 ],
820  "nleading1" : 1,
821  "otype2" : "eEM",
822  "ocut2List" : [ 9, 12 ],
823  "olist2" : "sl",
824  "nleading2" : 6
825  }
826  ]
827 
828  for x in eINVM_DRMap:
829  class d:
830  pass
831  for k in x:
832  setattr (d, k, x[k])
833  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
834  toponames=[]
835  for bitId, ocut1Value in enumerate(d.ocut1List):
836  toponames.append ("%iINVM%i-%iDR%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDR, d.maxDR,
837  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
838  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
839 
840  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
841  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
842  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
843  alg.addgeneric('MaxTob1', d.nleading1)
844  alg.addgeneric('MaxTob2', d.nleading2)
845  alg.addgeneric('NumResultBits', len(toponames))
846  for bitId in range(len(toponames)):
847  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
848  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
849  alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
850  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
851  alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
852  alg.addvariable('DeltaRMax', d.maxDR*d.maxDR*_dr_conversion*_dr_conversion, bitId)
853 
854  tm.registerTopoAlgo(alg)
855 
856  # DM/DR Ranges for eEM12
857  # output lines = 0INVM30-2DR15-eEM12sl1-eEM12sl6,
858  # 25INVM70-13DR25-eEM12sl1-eEM12sl6,
859  #
860  # Parameter ordering
861  # 1. MinEt1
862  # 2. MinEt2
863  # 3. MinMSqr
864  # 4. MaxMSqr
865  # 5. MinDeltaR
866  # 6. MaxDeltaR
867  eINVM_Ranges_DRMap = [
868  {
869  "algoname" : "INVM_BOOSTDR_Ranges_eEM12sl6",
870  "minInvm" : [0, 25],
871  "maxInvm" : [30,70],
872  "minDR" : [2,13],
873  "maxDR" : [15,25],
874  "otype1" : "eEM",
875  "olist1" : "sl",
876  "ocut1List" : [12,12],
877  "nleading1" : 1,
878  "otype2" : "eEM",
879  "ocut2List" : [12,12],
880  "olist2" : "sl",
881  "nleading2" : 6
882  }
883  ]
884 
885  for x in eINVM_Ranges_DRMap:
886  class d:
887  pass
888  for k in x:
889  setattr (d, k, x[k])
890  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
891  toponames=[]
892  for bitId, ocut1Value in enumerate(d.ocut1List):
893  toponames.append ("%iINVM%i-%iDR%i-%s%s%s%s-%s%s%s%s" % (d.minInvm[bitId], d.maxInvm[bitId], d.minDR[bitId], d.maxDR[bitId],
894  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
895  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
896 
897  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
898  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
899  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
900  alg.addgeneric('MaxTob1', d.nleading1)
901  alg.addgeneric('MaxTob2', d.nleading2)
902  alg.addgeneric('NumResultBits', len(toponames))
903  for bitId in range(len(toponames)):
904  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
905  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
906  alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
907  alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
908  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
909  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
910 
911  tm.registerTopoAlgo(alg)
912 
913 
914  # DM/DR Ranges for asymmetric eEM12LeEM9L
915  # output lines = 0INVM30-2DR15-eEM12sl1-eEM9sl6,
916  # 25INVM70-13DR25-eEM12sl1-eEM9sl6,
917  #
918  # Parameter ordering
919  # 1. MinEt1
920  # 2. MinEt2
921  # 3. MinMSqr
922  # 4. MaxMSqr
923  # 5. MinDeltaR
924  # 6. MaxDeltaR
925  eINVM_Ranges_Asymm_DRMap = [
926  {
927  "algoname" : "INVM_BOOSTDR_Ranges_Asymm_eEMsl6",
928  "minInvm" : [0, 25],
929  "maxInvm" : [30,70],
930  "minDR" : [2,13],
931  "maxDR" : [15,25],
932  "otype1" : "eEM",
933  "olist1" : "sl",
934  "ocut1List" : [12,12],
935  "nleading1" : 1,
936  "otype2" : "eEM",
937  "ocut2List" : [9,9],
938  "olist2" : "sl",
939  "nleading2" : 6
940  }
941  ]
942 
943  for x in eINVM_Ranges_Asymm_DRMap:
944  class d:
945  pass
946  for k in x:
947  setattr (d, k, x[k])
948  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
949  toponames=[]
950  for bitId, ocut1Value in enumerate(d.ocut1List):
951  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],
952  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
953  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
954 
955  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
956  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
957  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
958  alg.addgeneric('MaxTob1', d.nleading1)
959  alg.addgeneric('MaxTob2', d.nleading2)
960  alg.addgeneric('NumResultBits', len(toponames))
961  for bitId in range(len(toponames)):
962  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
963  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
964  alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
965  alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
966  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
967  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
968 
969  tm.registerTopoAlgo(alg)
970 
971 
972  # INVM_DR for 2MU5VFab
973  # output lines = 2INVM9-2DR15-2MU5VFab and 8INVM15-0DR22-2MU5VFab
974  INVM_DR_2MU5VFabMap = [
975  {
976  "algoname": "INVM_DR_2MU5VFab",
977  "minInvm" : [2,8],
978  "maxInvm" : [9,15],
979  "minDR" : [2,0],
980  "maxDR" : [15,22],
981  "otype1" : "MU5VFab",
982  "mult1" : 2
983  }
984  ]
985  for x in INVM_DR_2MU5VFabMap:
986  class d:
987  pass
988  for k in x:
989  setattr(d,k,x[k])
990  inputList = d.otype1
991  toponames = []
992  for bitId in range(len(d.minDR)):
993  toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm[bitId], d.maxInvm[bitId],
994  d.minDR[bitId] , d.maxDR[bitId],
995  d.mult1, d.otype1
996  )
997  )
998  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
999  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1000  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1001  alg.addgeneric('NumResultBits', len(toponames))
1002  for bitId in range(len(toponames)):
1003  alg.addvariable('MinET1', 0*_et_conversion, bitId)
1004  alg.addvariable('MinET2', 0*_et_conversion, bitId)
1005  alg.addvariable('MinMSqr', d.minInvm[bitId]*d.minInvm[bitId]*_et_conversion*_et_conversion, bitId)
1006  alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
1007  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1008  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1009  tm.registerTopoAlgo(alg)
1010 
1011 
1012  # INVM for 2MU3VFab
1013  # output lines = '7INVM14-2MU3VFab', '7INVM22-2MU3VFab'
1014  INVM_2MU3VFab_Map = [
1015  {
1016  "algoname": "INVM_2MU3VFab",
1017  "minInvm" : 7,
1018  "maxInvm" : [14,22],
1019  "otype1" : "MU3VFab",
1020  "mult1" : 2
1021  }
1022  ]
1023  for x in INVM_2MU3VFab_Map:
1024  class d:
1025  pass
1026  for k in x:
1027  setattr(d,k,x[k])
1028  inputList = d.otype1
1029  toponames = []
1030  for bitId in range(len(d.maxInvm)):
1031  toponames.append("%iINVM%i-%i%s" % ( d.minInvm, d.maxInvm[bitId],
1032  d.mult1, d.otype1
1033  )
1034  )
1035  alg = AlgConf.InvariantMassInclusive1( name = d.algoname, inputs = inputList, outputs = toponames)
1036  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1037  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1038  alg.addgeneric('NumResultBits', len(toponames))
1039  for bitId in range(len(toponames)):
1040  alg.addvariable('MinET1', 0*_et_conversion, bitId)
1041  alg.addvariable('MinET2', 0*_et_conversion, bitId)
1042  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
1043  alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
1044  tm.registerTopoAlgo(alg)
1045 
1046 
1047 
1048  # INVM_EM for Jpsi
1049  invm_map = { "algoname": 'INVM_eEMs6' , "ocutlist": [ 9, 15 ], "minInvm": 1, "maxInvm": 5, "otype" : "eEM", "olist" : "s",
1050  "nleading" : 1, "inputwidth": HW.eEmOutputWidthSort}
1051  for x in [ invm_map ]:
1052  class d:
1053  pass
1054  for k in x:
1055  setattr (d, k, x[k])
1056  inputList = d.otype + d.olist
1057  toponames=[]
1058  for ocut in d.ocutlist:
1059  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 "")
1060  toponames.append(toponame)
1061  alg = AlgConf.InvariantMassInclusive2( name = d.algoname, inputs = [inputList, 'eEMs'], outputs = toponames)
1062  alg.addgeneric('InputWidth1', d.inputwidth)
1063  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
1064  alg.addgeneric('MaxTob1', d.nleading)
1065  alg.addgeneric('MaxTob2', HW.eEmOutputWidthSort)
1066  alg.addgeneric('NumResultBits', len(toponames))
1067  for bitid, ocut in enumerate(d.ocutlist):
1068  alg.addvariable('MinET1', get_threshold_cut('eEM', ocut)*_et_conversion, bitid)
1069  alg.addvariable('MinET2', 0*_et_conversion, bitid)
1070  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
1071  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitid)
1072  tm.registerTopoAlgo(alg)
1073 
1074 
1075  # added for muon-jet:
1076  algoList = [
1077  {"minDr": 0, "maxDr": 4, "otype1" : "MU8Fab" , "otype2" : "CjJ", "ocut2": 30, "olist2" : "ab"}, #0DR04-MU8Fab-CjJ30ab
1078  {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04-MU5VFab-CjJ40ab
1079  {"minDr": 0, "maxDr": 4, "otype1" : "MU8Fab" , "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04-MU8Fab-CjJ40ab
1080  {"minDr": 0, "maxDr": 4, "otype1" : "MU3Vab" , "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04-MU3Vab-CjJ40ab
1081  {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 80, "olist2" : "ab"}, #0DR04-MU5VFab-CjJ80ab
1082  {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 90, "olist2" : "ab"}, #0DR04-MU5VFab-CjJ90ab
1083  {"minDr": 0, "maxDr": 4, "otype1" : "MU3VFab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04_MU3VFab_CjJ40ab
1084  ]
1085  for x in algoList:
1086  class d:
1087  pass
1088  for k in x:
1089  setattr (d, k, x[k])
1090  toponame = "%iDR%02d-%s-%s%s%s" % (d.minDr, d.maxDr, d.otype1, d.otype2, str(d.ocut2), d.olist2)
1091  log.debug("Define %s", toponame)
1092  inputList = [d.otype1, d.otype2 + d.olist2]
1093  alg = AlgConf.DeltaRSqrIncl2( name = toponame, inputs = inputList, outputs = [ toponame ])
1094  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1095  alg.addgeneric('InputWidth2', HW.jJetOutputWidthSelect)
1096  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1097  alg.addgeneric('MaxTob2', HW.jJetOutputWidthSelect)
1098  alg.addgeneric('NumResultBits', 1)
1099  alg.addvariable('MinET1', 0*_et_conversion, 0)
1100  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1101  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1102  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1103  tm.registerTopoAlgo(alg)
1104 
1105  # dimu INVM items
1106  # Parameter ordering
1107  # 1. MinEt1
1108  # 2. MinEt2
1109  # 3. MinMSqr
1110  # 4. MaxMSqr
1111  listofalgos = [
1112  {"minInvm": 2, "maxInvm": 8, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #2INVM8-2MU3Vab
1113  {"minInvm": 2, "maxInvm": 9, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #2INVM9-2MU3Vab
1114  {"minInvm": 8, "maxInvm": 15, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #8INVM15-MU5VFab-MU3Vab
1115  {"minInvm": 2, "maxInvm": 8, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #2INVM8-MU5VFab-MU3Vab
1116  {"minInvm": 2, "maxInvm": 9, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #2INVM9-MU5VFab-MU3Vab
1117  {"minInvm": 8, "maxInvm": 15, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #8INVM15-2MU5VFab
1118  {"minInvm": 2, "maxInvm": 9, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #2INVM9-2MU5VFab
1119  {"minInvm": 7, "maxInvm": 15, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM15-2MU3Vab
1120  {"minInvm": 7, "maxInvm": 22, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3VFab",}, #7INVM22-MU5VFab-MU3VFab, ATR-21566
1121  {"minInvm": 7, "maxInvm": 14, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3VFab",}, #7INVM14-MU5VFab-MU3VFab, ATR-22782
1122  {"minInvm": 7, "maxInvm": 14, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM14-2MU3Vab, ATR-22782
1123  ]
1124  for x in listofalgos:
1125  class d:
1126  pass
1127  for k in x:
1128  setattr (d, k, x[k])
1129  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1130  obj2 = "-%s" % (d.otype2)
1131  toponame = "%iINVM%i-%s%s" % (d.minInvm, d.maxInvm, obj1, "" if d.mult>1 else obj2)
1132  log.debug("Define %s", toponame)
1133  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1134  algoname = AlgConf.InvariantMassInclusive1 if (d.mult>1) else AlgConf.InvariantMassInclusive2
1135  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1136  if (d.mult>1):
1137  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1138  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1139  else:
1140  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1141  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1142  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1143  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1144  alg.addgeneric('NumResultBits', 1)
1145  alg.addvariable('MinET1', 0*_et_conversion)
1146  alg.addvariable('MinET2', 0*_et_conversion)
1147  alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
1148  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
1149  tm.registerTopoAlgo(alg)
1150 
1151  toponame = "8INVM15-2CMU3Vab"
1152  log.debug("Define %s", toponame)
1153  inputList = ['CMU3Vab']
1154  alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame )
1155  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1156  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1157  alg.addgeneric('NumResultBits', 1)
1158  alg.addvariable('MinET1', 0*_et_conversion)
1159  alg.addvariable('MinET2', 0*_et_conversion)
1160  alg.addvariable('MinMSqr', 8*8*_et_conversion*_et_conversion)
1161  alg.addvariable('MaxMSqr', 15*15*_et_conversion*_et_conversion)
1162  tm.registerTopoAlgo(alg)
1163 
1164  algolist=[
1165  {"minInvm": 2, "maxInvm": 8, "mult": 1, "otype1" : "CMU3Vab", "otype2" :"MU3Vab"}, # 2INVM8-CMU3Vab-MU3Vab
1166  ]
1167  for x in algolist:
1168  class d:
1169  pass
1170  for k in x:
1171  setattr (d, k, x[k])
1172  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1173  obj2 = "-%s" % (d.otype2)
1174  toponame = "%iINVM%i-%s%s" % (d.minInvm, d.maxInvm, obj1, "" if d.mult>1 else obj2)
1175  log.debug("Define %s", toponame)
1176  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1177  algoname = AlgConf.InvariantMassInclusive1 if (d.mult>1) else AlgConf.InvariantMassInclusive2
1178  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1179  if (d.mult>1):
1180  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1181  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1182  alg.addgeneric('RequireOneBarrel', d.onebarrel)
1183  else:
1184  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1185  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1186  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1187  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1188  alg.addgeneric('NumResultBits', 1)
1189  alg.addvariable('MinET1', 0*_et_conversion)
1190  alg.addvariable('MinET2', 0*_et_conversion)
1191  alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
1192  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
1193  tm.registerTopoAlgo(alg)
1194 
1195  # dimu DR items
1196  algolist = [
1197  {"minDr": 0, "maxDr": 24, "mult": 2, "otype1" : "CMU3Vab", "otype2" : "", }, #0DR24-2CMU3Vab
1198  {"minDr": 1, "maxDr": 24, "mult": 1, "otype1" : "CMU3Vab", "otype2" : "MU3Vab", }, #1DR24-CMU3Vab-MU3Vab
1199  ]
1200  for x in algolist:
1201  class d:
1202  pass
1203  for k in x:
1204  setattr (d, k, x[k])
1205  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1206  obj2 = "-%s" % (d.otype2)
1207  toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
1208  log.debug("Define %s", toponame)
1209  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1210  algoname = AlgConf.DeltaRSqrIncl1 if (d.mult>1) else AlgConf.DeltaRSqrIncl2
1211  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1212  if (d.mult>1):
1213  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1214  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1215  else:
1216  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1217  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1218  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1219  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1220  alg.addgeneric('NumResultBits', 1)
1221  alg.addvariable('MinET1', 0*_et_conversion)
1222  alg.addvariable('MinET2', 0*_et_conversion)
1223  alg.addvariable('DeltaRMin', d.minDr*d.minDr *_dr_conversion*_dr_conversion)
1224  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr *_dr_conversion*_dr_conversion)
1225  tm.registerTopoAlgo(alg)
1226 
1227 
1228  # RATIO MATCH dedicated to Exotic #TODO: are eTAU correct to use here (and below)?
1229  toponame = '100RATIO-0MATCH-eTAU40si2-eEMall'
1230  alg = AlgConf.RatioMatch( name = toponame, inputs = [ 'eTAUs', 'eEMall'], outputs = [ toponame ] )
1231  alg.addgeneric('InputWidth1', HW.eTauOutputWidthSort)
1232  alg.addgeneric('InputWidth2', HW.eEmInputWidth)
1233  alg.addgeneric('MaxTob1', 2)
1234  alg.addgeneric('MaxTob2', HW.eEmInputWidth)
1235  alg.addgeneric('NumResultBits', 1)
1236  alg.addvariable('MinET1', get_threshold_cut('eTAU', 40)*_et_conversion)
1237  alg.addvariable('MinET2', 0*_et_conversion)
1238  alg.addvariable('Ratio', 100, 0)
1239  tm.registerTopoAlgo(alg)
1240 
1241  # NOT MATCH dedicated to Exotic
1242  toponame = 'NOT-0MATCH-eTAU40si1-eEMall'
1243  alg = AlgConf.NotMatch( name = toponame, inputs = [ 'eTAUs', 'eEMall'], outputs = [ toponame ] )
1244  alg.addgeneric('InputWidth1', HW.eTauOutputWidthSort)
1245  alg.addgeneric('InputWidth2', HW.eEmInputWidth)
1246  alg.addgeneric('MaxTob1', 1)
1247  alg.addgeneric('MaxTob2', HW.eEmInputWidth)
1248  alg.addgeneric('NumResultBits', 1)
1249  alg.addvariable('MinET1', get_threshold_cut('eTAU', 40)*_et_conversion)
1250  alg.addvariable('MinET2', 0*_et_conversion)
1251  alg.addvariable('EtaMin1', 0*_eta_conversion)
1252  alg.addvariable('EtaMax1', 49*_eta_conversion)
1253  alg.addvariable('EtaMin2', 0*_eta_conversion)
1254  alg.addvariable('EtaMax2', 49*_eta_conversion)
1255  alg.addvariable('DRCut', 0) #TODO: conversion needed here?
1256  tm.registerTopoAlgo(alg)
1257 
1258  # TODO: to be updated with phase1 met, jets
1259  xemap = [{"etcut": 0, "Threlist": [ 40, 50, 55, 60, 65, 75 ]}]
1260  for x in xemap:
1261  class d:
1262  pass
1263  for k in x:
1264  setattr (d, k, x[k])
1265  log.debug("Define %s", toponame)
1266  inputList = ['jXENoSort_1BC', 'AjJall_1BC']
1267  toponames=[]
1268  for minxe in d.Threlist:
1269  toponames.append("KF-jXE%s-AjJall" % (minxe))
1270  alg = AlgConf.KalmanMETCorrection( name = "KF-jXE-AjJall", inputs = inputList, outputs = toponames )
1271  alg.addgeneric('InputWidth', HW.jJetInputWidth)
1272  alg.addgeneric('NumResultBits', len(toponames))
1273  for key, value in KFMETweightParameters.items():
1274  # add weight (scale factor) parameters
1275  # these weights are compacted into 32bit words in order to limit the number
1276  # of registers needed to load them in firmware
1277  alg.addvariable(key, value)
1278  alg.addvariable('MinET', 0)
1279  for bitid,minxe in enumerate(d.Threlist):
1280  alg.addvariable('KFXE', str(minxe*_et_conversion), bitid)
1281  tm.registerTopoAlgo(alg)
1282 
1283 
1284  # LATE MUON : LATE-MU10s1
1285  for x in [
1286  #{"otype" : "LATE-MU", "ocut" : 10, "inputwidth": HW.muonOutputWidthSort},
1287  {"otype" : "LATE-MU", "ocut" : 10, "inputwidth": HW.NumberOfDelayedMuons},
1288  ]:
1289 
1290  class d:
1291  pass
1292  for k in x:
1293  setattr (d, k, x[k])
1294 
1295  toponame = "%s%ss1" % ( d.otype, str(d.ocut) )
1296 
1297  log.debug("Define %s", toponame)
1298 
1299  inputList = 'LMUs'
1300 
1301  alg = AlgConf.EtCut( name = toponame, inputs = inputList, outputs = toponame )
1302  alg.addgeneric('InputWidth', d.inputwidth)
1303  alg.addgeneric('MaxTob', 1)
1304  alg.addgeneric('NumResultBits', 1)
1305  alg.addvariable('MinET', str(d.ocut*_et_conversion))
1306  tm.registerTopoAlgo(alg)
1307 
1308 
1309  # (ATR-12748) fat jet trigger with Simple Cone algo
1310  algoList = [ #name (SC175) is rounded on purpose to avoid more name changes in case the actual threshold is slightly tweaked later on
1311  {"itemNameMinHT": 175, "minHT": 176, "otype" : "SCjJ", "ocut" : 10, "olist" : "ab", "nleading" : HW.jJetOutputWidthSelect, "inputwidth": HW.jJetOutputWidthSelect, "oeta" : 26}, #SC175-SCjJ10abpETA26
1312  ]
1313  for x in algoList:
1314  class d:
1315  pass
1316  for k in x:
1317  setattr (d, k, x[k])
1318  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))
1319  log.debug("Define %s", toponame)
1320  inputList = d.otype + d.olist
1321  alg = AlgConf.SimpleCone( name = toponame, inputs = inputList, outputs = [toponame] )
1322  alg.addgeneric('InputWidth', d.inputwidth)
1323  alg.addgeneric('NumResultBits', 1)
1324  alg.addvariable('MinET', d.ocut*_et_conversion)
1325  alg.addvariable('MinSumET', d.minHT*_et_conversion)
1326  alg.addvariable('MaxRSqr', 15*15*_dr_conversion*_dr_conversion)
1327  tm.registerTopoAlgo(alg)
1328 
1329  # 0INVM9-eEM9ab-eEMab
1330  algoList = [
1331  {"minInvm" : 0, "maxInvm": 9, "otype" : "eEM", "ocut1" : 9, "olist" : "ab", "inputwidth": HW.eEmOutputWidthSelect, "ocut2" : 0},
1332  ]
1333  for x in algoList:
1334  class d:
1335  pass
1336  for k in x:
1337  setattr (d, k, x[k])
1338  inputList = d.otype + d.olist
1339  toponame = "%iINVM%i-%s%s%s-%s%s" % (d.minInvm, d.maxInvm,
1340  d.otype, str(d.ocut1) , d.olist,
1341  d.otype, d.olist)
1342  alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame)
1343  alg.addgeneric('InputWidth', d.inputwidth)
1344  alg.addgeneric('MaxTob', HW.eEmOutputWidthSelect)
1345  alg.addgeneric('NumResultBits', 1)
1346  alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion)
1347  alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion)
1348  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
1349  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
1350  tm.registerTopoAlgo(alg)
1351 
1352 
1353  # added for b-phys, 0DR03-eEM9ab-CjJ40ab
1354  algoList = [
1355  {"minDr": 0, "maxDr": 3, "otype1" : "eEM" ,"ocut1": 9, "olist1" : "ab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}
1356  ]
1357  for x in algoList:
1358  class d:
1359  pass
1360  for k in x:
1361  setattr (d, k, x[k])
1362  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)
1363  log.debug("Define %s", toponame)
1364  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
1365  alg = AlgConf.DeltaRSqrIncl2( name = toponame, inputs = inputList, outputs = [ toponame ])
1366  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSelect)
1367  alg.addgeneric('InputWidth2', HW.jJetOutputWidthSelect)
1368  alg.addgeneric('MaxTob1', HW.eEmOutputWidthSelect)
1369  alg.addgeneric('MaxTob2', HW.jJetOutputWidthSelect)
1370  alg.addgeneric('NumResultBits', 1)
1371  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1372  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1373  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1374  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1375  tm.registerTopoAlgo(alg)
1376 
1377 
1378  # Axion 2EM DPHI
1379  #27DPHI32-eEMs1-eEMs6
1380  algoList = [
1381  {"minDphi": 27, "maxDphi": 32, "otype" : "eEM", "ocut1" : 0, "olist" : "s", "nleading1" : 1, "inputwidth1": HW.eEmOutputWidthSort, "ocut2" : 0, "nleading2": 6},
1382  ]
1383  for x in algoList:
1384  class d:
1385  pass
1386  for k in x:
1387  setattr (d, k, x[k])
1388  toponame = "%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minDphi, d.maxDphi,
1389  d.otype, str(d.ocut1) if d.ocut1 > 0 else "", d.olist, str(d.nleading1) if d.olist=="s" else "",
1390  d.otype, str(d.ocut2) if d.ocut2 > 0 else "", d.olist, str(d.nleading2) if d.olist=="s" else "")
1391  log.debug("Define %s", toponame)
1392  inputList = d.otype + d.olist
1393  alg = AlgConf.DeltaPhiIncl1( name = toponame, inputs = inputList, outputs = toponame )
1394  alg.addgeneric('InputWidth', d.inputwidth1)
1395  alg.addgeneric('MaxTob', d.nleading2)
1396  alg.addgeneric('NumResultBits', 1)
1397  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)
1398  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)
1399  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion, 0)
1400  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, 0)
1401  tm.registerTopoAlgo(alg)
1402 
1403  # Tau dR chains
1404  algolist=[
1405  { "minDr": 0, "maxDr": 28, "otype1" : "eTAU" ,"ocut1": 30, "olist1" : "abl",
1406  "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,"otype2" : "eTAU", "ocut2": 20, "olist2" : "abl",
1407  "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect}, # 0DR28-eTAU30abl-eTAU20abl
1408  { "minDr": 0, "maxDr": 28, "otype1" : "eTAU" ,"ocut1": 30, "olist1" : "abm",
1409  "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,"otype2" : "eTAU", "ocut2": 20, "olist2" : "abm",
1410  "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect}, # 0DR28-eTAU30abm-eTAU20abm
1411  ]
1412  for x in algolist:
1413  class d:
1414  pass
1415  for k in x:
1416  setattr (d, k, x[k])
1417  obj1 = "%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1418  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1419  toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, obj2)
1420  log.debug("Define %s", toponame)
1421  inputList = [d.otype1 + d.olist1] if d.otype1==d.otype2 else [d.otype1 + d.olist1, d.otype2 + d.olist2]
1422  algoname = AlgConf.DeltaRSqrIncl1 if d.otype1==d.otype2 else AlgConf.DeltaRSqrIncl2
1423  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1424  if d.otype1==d.otype2:
1425  alg.addgeneric('InputWidth', d.inputwidth1)
1426  alg.addgeneric('MaxTob', d.nleading1)
1427  else:
1428  alg.addgeneric('InputWidth1', d.inputwidth1)
1429  alg.addgeneric('InputWidth2', d.inputwidth2)
1430  alg.addgeneric('MaxTob1', d.nleading1)
1431  alg.addgeneric('MaxTob2', d.nleading2)
1432  alg.addgeneric('NumResultBits', 1)
1433  if d.otype1==d.otype2:
1434  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion )
1435  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion )
1436  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
1437  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
1438  else:
1439  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , 0)
1440  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , 0)
1441  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1442  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1443  tm.registerTopoAlgo(alg)
1444 
1445 
1446  DISAMB_DR_jJ_eTau_eTau_Map = [
1447  {
1448  "algoname": "2DISAMB_jJ55ab_DR_eTAU_eTAU",
1449  "disamb" : 2,
1450  "minDR" : 0,
1451  "maxDR" : [28],
1452  "otype1" : "eTAU",
1453  "ocut1" : 30,
1454  "olist1": "ab",
1455  "nleading1": HW.eTauOutputWidthSelect,
1456  "inputwidth1": HW.eTauOutputWidthSelect,
1457  "otype2" : "eTAU",
1458  "ocut2" : 20,
1459  "nleading2": HW.eTauOutputWidthSelect,
1460  "inputwidth2": HW.eTauOutputWidthSelect,
1461  "olist2": "ab",
1462  "otype3" : "jJ",
1463  "ocut3" : 55,
1464  "nleading3": HW.jJetOutputWidthSelect,
1465  "inputwidth3": HW.jJetOutputWidthSelect,
1466  "olist3": "ab",
1467  },
1468  {
1469  "algoname": "2DISAMB_jJ50ab_DR_eTAU_eTAU",
1470  "disamb" : 2,
1471  "minDR" : 0,
1472  "maxDR" : [28],
1473  "otype1" : "eTAU",
1474  "ocut1" : 30,
1475  "olist1": "ab",
1476  "nleading1": HW.eTauOutputWidthSelect,
1477  "inputwidth1": HW.eTauOutputWidthSelect,
1478  "otype2" : "eTAU",
1479  "ocut2" : 20,
1480  "nleading2": HW.eTauOutputWidthSelect,
1481  "inputwidth2": HW.eTauOutputWidthSelect,
1482  "olist2": "ab",
1483  "otype3" : "jJ",
1484  "ocut3" : 50,
1485  "nleading3": HW.jJetOutputWidthSelect,
1486  "inputwidth3": HW.jJetOutputWidthSelect,
1487  "olist3": "ab",
1488  },
1489  {
1490  "algoname": "2DISAMB_jJ40ab_DR_eTAU_eTAU",
1491  "disamb" : 2,
1492  "minDR" : 0,
1493  "maxDR" : [28],
1494  "otype1" : "eTAU",
1495  "ocut1" : 30,
1496  "olist1": "ab",
1497  "nleading1": HW.eTauOutputWidthSelect,
1498  "inputwidth1": HW.eTauOutputWidthSelect,
1499  "otype2" : "eTAU",
1500  "ocut2" : 20,
1501  "nleading2": HW.eTauOutputWidthSelect,
1502  "inputwidth2": HW.eTauOutputWidthSelect,
1503  "olist2": "ab",
1504  "otype3" : "jJ",
1505  "ocut3" : 40,
1506  "nleading3": HW.jJetOutputWidthSelect,
1507  "inputwidth3": HW.jJetOutputWidthSelect,
1508  "olist3": "ab",
1509  },
1510  {
1511  "algoname": "2DISAMB_jJ30ab_DR_eTAU_eTAU",
1512  "disamb" : 2,
1513  "minDR" : 0,
1514  "maxDR" : [28],
1515  "otype1" : "eTAU",
1516  "ocut1" : 30,
1517  "olist1": "ab",
1518  "nleading1": HW.eTauOutputWidthSelect,
1519  "inputwidth1": HW.eTauOutputWidthSelect,
1520  "otype2" : "eTAU",
1521  "ocut2" : 20,
1522  "nleading2": HW.eTauOutputWidthSelect,
1523  "inputwidth2": HW.eTauOutputWidthSelect,
1524  "olist2": "ab",
1525  "otype3" : "jJ",
1526  "ocut3" : 30,
1527  "nleading3": HW.jJetOutputWidthSelect,
1528  "inputwidth3": HW.jJetOutputWidthSelect,
1529  "olist3": "ab",
1530  }
1531  ]
1532  for x in DISAMB_DR_jJ_eTau_eTau_Map:
1533  class d:
1534  pass
1535  for k in x:
1536  setattr(d,k,x[k])
1537  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1538  toponames = []
1539  for bitId in range(len(d.maxDR)):
1540  obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1541  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1542  obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1543  toponames.append("%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "",
1544  obj3, d.minDR, d.maxDR[bitId], obj1, obj2))
1545 
1546  alg = AlgConf.DisambiguationDRIncl3( name = d.algoname, inputs = inputList, outputs = toponames )
1547  alg.addgeneric('InputWidth1', d.inputwidth1)
1548  alg.addgeneric('InputWidth2', d.inputwidth2)
1549  alg.addgeneric('InputWidth3', d.inputwidth3)
1550  alg.addgeneric('MaxTob1', d.nleading1)
1551  alg.addgeneric('MaxTob2', d.nleading2)
1552  alg.addgeneric('MaxTob3', d.nleading3)
1553  alg.addgeneric('NumResultBits', len(toponames))
1554 
1555  for bitId in range(len(toponames)):
1556  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitId)
1557  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, bitId)
1558  alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, bitId)
1559  alg.addvariable('DisambDRSqrMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
1560  alg.addvariable('DisambDRSqrMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1561  alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, bitId)
1562 
1563  tm.registerTopoAlgo(alg)
1564 
1565 
1566  # DR for eTAU30ab_eTAU20ab
1567  # output lines : '0DR25-eTAU30ab-eTAU20ab'
1568  # '0DR28-eTAU30ab-eTAU20ab'
1569  DR_eTau30_eTau20_Map = [
1570  {
1571  "algoname": "DR_eTAU30ab_eTAU20ab",
1572  "minDR" : 0,
1573  "maxDR" : [28],
1574  "otype1" : "eTAU",
1575  "ocut1" : 30,
1576  "olist1": "ab",
1577  "otype2" : "eTAU",
1578  "ocut2" : 20,
1579  "inputwidth": HW.eTauOutputWidthSelect,
1580  "olist2": "ab",
1581  }
1582  ]
1583  for x in DR_eTau30_eTau20_Map:
1584  class d:
1585  pass
1586  for k in x:
1587  setattr(d,k,x[k])
1588  inputList = [d.otype1 + d.olist1]
1589  toponames = []
1590  for bitId in range(len(d.maxDR)):
1591  obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1592  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1593  toponames.append("%dDR%d%s%s" % ( d.minDR, d.maxDR[bitId], obj1, obj2))
1594 
1595  alg = AlgConf.DeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames )
1596 
1597  alg.addgeneric('InputWidth', d.inputwidth)
1598  alg.addgeneric('MaxTob', HW.eTauOutputWidthSelect)
1599  alg.addgeneric('NumResultBits', len(toponames) )
1600 
1601  for bitId in range(len(toponames)):
1602  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitId)
1603  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, bitId)
1604  alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
1605  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1606 
1607 
1608  tm.registerTopoAlgo(alg)
1609 
1610  # DISAMB 3 lists with DR cut to 2nd and 3rd lists
1611  algolist=[
1612  { "disamb": 2,
1613  "otype1" : "eTAU", "ocut1": 30, "olist1": "abl", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1614  "otype2" : "eTAU", "ocut2": 20, "olist2": "abl", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1615  "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1616  "drcutmin": 0, "drcutmax": 28}, # 2DISAMB-jJ55ab-0DR28-eTAU30abl-eTAU20abl
1617  { "disamb": 2,
1618  "otype1" : "eTAU", "ocut1": 30, "olist1": "abm", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1619  "otype2" : "eTAU", "ocut2": 20, "olist2": "abm", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1620  "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1621  "drcutmin": 0, "drcutmax": 28}, # 2DISAMB-jJ55ab-0DR28-eTAU30abm-eTAU20abm
1622  { "disamb" : 2,
1623  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1624  "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1625  "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1626  "drcutmin": 4 , "drcutmax": 28}, # 2DISAMB-jJ55ab-4DR28-eTAU30ab-eTAU20ab
1627  { "disamb" : 2,
1628  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1629  "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1630  "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1631  "drcutmin": 4 , "drcutmax": 32}, # 2DISAMB-jJ55ab-4DR32-eTAU30ab-eTAU20ab
1632  { "disamb" : 2,
1633  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1634  "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1635  "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1636  "drcutmin": 10 , "drcutmax": 32}, # 2DISAMB-jJ55ab-10DR32-eTAU30ab-eTAU20ab
1637  ]
1638  for x in algolist:
1639  class d:
1640  pass
1641  for k in x:
1642  setattr (d, k, x[k])
1643  obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1644  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1645  obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1646  toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
1647  log.debug("Define %s", toponame)
1648  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1649  alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
1650  alg.addgeneric('InputWidth1', d.inputwidth1)
1651  alg.addgeneric('InputWidth2', d.inputwidth2)
1652  alg.addgeneric('InputWidth3', d.inputwidth3)
1653  alg.addgeneric('MaxTob1', d.nleading1)
1654  alg.addgeneric('MaxTob2', d.nleading2)
1655  alg.addgeneric('MaxTob3', d.nleading3)
1656  alg.addgeneric('NumResultBits', 1)
1657  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1658  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1659  alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
1660  alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
1661  alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
1662  alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
1663  tm.registerTopoAlgo(alg)
1664 
1665 
1666  #TLA deta
1667  algoList = [
1668  { "minDeta": 0, "maxDeta": 20, "otype" : "jJ", "ocut1" : 90, "olist" : "s",
1669  "nleading1" : 1, "inputwidth1": HW.jJetOutputWidthSort, "ocut2" : 0, "nleading2": 2}, #0DETA20-jJ90s1-jJs2
1670  { "minDeta": 0, "maxDeta" : 24, "otype" : "eTAU" , "olist" : "s", "inputwidth1": HW.eTauOutputWidthSort,
1671  "ocut1" : 30, "nleading1": 2,
1672  "ocut2" : 12, "nleading2": 2}, #0DETA24_eTAU30s2_eTAU12s2
1673  ]
1674  for x in algoList:
1675  class d:
1676  pass
1677  for k in x:
1678  setattr (d, k, x[k])
1679  toponame = "%iDETA%i-%s%s%s%s-%s%s%s%s" % (d.minDeta, d.maxDeta,
1680  d.otype, d.ocut1 if d.ocut1 > 0 else "", d.olist, d.nleading1,
1681  d.otype, d.ocut2 if d.ocut2 > 0 else "", d.olist, d.nleading2)
1682  log.debug("Define %s", toponame)
1683  inputList = d.otype + d.olist
1684  alg = AlgConf.DeltaEtaIncl1( name = toponame, inputs = inputList, outputs = toponame )
1685  alg.addgeneric('InputWidth', d.inputwidth1)
1686  alg.addgeneric('MaxTob', d.nleading2)
1687  alg.addgeneric('NumResultBits', 1)
1688  alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion, 0)
1689  alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion, 0)
1690  alg.addvariable('MinDeltaEta', d.minDeta*_eta_conversion, 0)
1691  alg.addvariable('MaxDeltaEta', d.maxDeta*_eta_conversion, 0)
1692  tm.registerTopoAlgo(alg)
1693 
1694  # ATR-30401
1695  # topoitems will be the follwoing:
1696  # 0DPHI10_jXE40delay_jJ40s
1697  # 0DPHI99_jXE40delay_jJ40s
1698  DPHI_jXE40delay_jJ40s_map = [
1699  {
1700  "algoname" : "DPHI_jXE40delay_jJ40s",
1701  "Delay1" : 1,
1702  "Delay2" : 0,
1703  "InputWidth1": HW.metOutputWidth,
1704  "InputWidth2": HW.jJetOutputWidthSort,
1705  "MaxTob1" : 1,
1706  "MaxTob2" : 6,
1707  "MinET1" : 40*_et_conversion,
1708  "MinET2" : 40*_et_conversion,
1709  "MinDeltaPhi": 0*_phi_conversion,
1710  "phi_thresholds": [10, 99],
1711  }
1712  ]
1713 
1714  for x in DPHI_jXE40delay_jJ40s_map:
1715  class d:
1716  pass
1717  for k in x:
1718  setattr(d,k,x[k])
1719  inputList = ['jXEs', 'jJs']
1720  toponames = []
1721  for bitId in range(len(d.phi_thresholds)):
1722  toponames.append("0DPHI%d-jXE40delay-jJ40s" % (d.phi_thresholds[bitId]))
1723 
1724  alg = AlgConf.DeltaPhiIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
1725 
1726  alg.addgeneric('InputWidth1', d.InputWidth1)
1727  alg.addgeneric('InputWidth2', d.InputWidth2)
1728  alg.addgeneric('MaxTob1', d.MaxTob1)
1729  alg.addgeneric('MaxTob2', d.MaxTob2)
1730  alg.addgeneric('NumResultBits', len(toponames) )
1731 
1732  for bitId in range(len(toponames)):
1733  alg.addvariable('MinET1', d.MinET1, bitId)
1734  alg.addvariable('MinET2', d.MinET2, bitId)
1735  alg.addvariable('MinDeltaPhi', d.MinDeltaPhi, bitId)
1736  alg.addvariable('MaxDeltaPhi', d.phi_thresholds[bitId]*_phi_conversion, bitId)
1737  tm.registerTopoAlgo(alg)
1738 
1739  # DISAMB 3 lists with DR cut to 2nd and 3rd lists
1740  algolist=[
1741  { "disamb": 2,
1742  "otype1" : "eTAU", "ocut1": 20, "olist1": "ab","nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1743  "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1744  "otype3" : "jJ", "ocut3": 40, "olist3": "ab", "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1745  "drcutmin": 0, "drcutmax": 10}, # 2DISAMB-jJ40ab-0DR10-eTAU20ab-eTAU12ab
1746  ]
1747  for x in algolist:
1748  class d:
1749  pass
1750  for k in x:
1751  setattr (d, k, x[k])
1752  obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1753  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1754  obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1755  toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
1756  log.debug("Define %s", toponame)
1757  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1758  alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
1759  alg.addgeneric('InputWidth1', d.inputwidth1)
1760  alg.addgeneric('InputWidth2', d.inputwidth2)
1761  alg.addgeneric('InputWidth3', d.inputwidth3)
1762  alg.addgeneric('MaxTob1', d.nleading1)
1763  alg.addgeneric('MaxTob2', d.nleading2)
1764  alg.addgeneric('MaxTob3', d.nleading3)
1765  alg.addgeneric('NumResultBits', 1)
1766  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1767  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1768  alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
1769  alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
1770  alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
1771  alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
1772  tm.registerTopoAlgo(alg)
1773 
1774  #VAE-based anomaly trigger
1775  # output lines: 'ADVAE2A-6jJ0s-4eTAU0s-4MU0s-jXE0s-Tight',
1776  # 'ADVAE2A-6jJ0s-4eTAU0s-4MU0s-jXE0s-Loose'
1777  #Ordering -
1778  #1. jJetx6
1779  #2. eTAUx4
1780  #3. MUx4
1781  #4. jXEx1
1782  algo = {
1783  "algoname" : "ADVAE2A-jJ0s-eTAU0s-MU0s-jXE0s",
1784  "otype1" : "jJ", "olist1": "s", "inputwidth1": 6, "nleading1": 6,
1785  "otype2" : "eTAU", "olist2": "s", "inputwidth2": 6, "nleading2": 4,
1786  "otype3" : "MU", "olist3": "s", "inputwidth3": 6, "nleading3": 4,
1787  "otype4" : "jXE", "olist4": "s", "inputwidth4": 1, "nleading4": 1,
1788  "WPList" : ["Tight", "Loose"],
1789  "MinET1" : 15, # jJets in GeV (= 100MeV steps after conversion)
1790  "MinET2" : 0, # eTaus
1791  "MinET3" : 0, # muons
1792  "MinET4" : 0, # jXE
1793  "AnomalyScoreThresh" : [1521991, 1333204], #corresponds to Tight and Loose WPs (500Hz,1kHz est.)
1794  }
1795  class d:
1796  pass
1797  for k in algo:
1798  setattr (d, k, algo[k])
1799  toponames = []
1800  for WP in d.WPList:
1801  toponames.append("ADVAE2A-%s%s0%s-%s%s0%s-%s%s0%s-%s0%s-%s" %(str(d.nleading1), d.otype1, d.olist1,
1802  str(d.nleading2), d.otype2, d.olist2,
1803  str(d.nleading3), d.otype3, d.olist3,
1804  d.otype4, d.olist4,
1805  WP) )
1806  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3, d.otype4 + d.olist4]
1807  alg = AlgConf.ADVAE_2A( name = d.algoname, inputs = inputList, outputs = toponames)
1808  alg.addgeneric('InputWidth1', d.inputwidth1)
1809  alg.addgeneric('InputWidth2', d.inputwidth2)
1810  alg.addgeneric('InputWidth3', d.inputwidth3)
1811  alg.addgeneric('InputWidth4', d.inputwidth4)
1812  alg.addgeneric('MaxTob1', d.nleading1)
1813  alg.addgeneric('MaxTob2', d.nleading2)
1814  alg.addgeneric('MaxTob3', d.nleading3)
1815  alg.addgeneric('MaxTob4', d.nleading4)
1816  alg.addgeneric('NumResultBits', len(toponames))
1817  alg.addgeneric('ADVAEVersion', 1)
1818  alg.addvariable('MinET1', d.MinET1 * _et_conversion)
1819  alg.addvariable('MinET2', d.MinET2 * _et_conversion)
1820  alg.addvariable('MinET3', d.MinET3 * _et_conversion)
1821  alg.addvariable('MinET4', d.MinET4 * _et_conversion)
1822  for bitId in range(len(toponames)):
1823  alg.addvariable('AnomalyScoreThresh', d.AnomalyScoreThresh[bitId], bitId)
1824  tm.registerTopoAlgo(alg)
1825 
1826  algolist=[
1827  { "disamb": 2,
1828  "otype1" : "eTAU", "ocut1": 20, "olist1": "ab","nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1829  "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1830  "otype3" : "jJ", "ocut3": 30, "olist3": "ab", "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1831  "drcutmin": 0, "drcutmax": 10}, # 2DISAMB-jJ30ab-0DR10-eTAU20ab-eTAU12ab
1832  ]
1833  for x in algolist:
1834  class d:
1835  pass
1836  for k in x:
1837  setattr (d, k, x[k])
1838  obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1839  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1840  obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1841  toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
1842  log.debug("Define %s", toponame)
1843  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1844  alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
1845  alg.addgeneric('InputWidth1', d.inputwidth1)
1846  alg.addgeneric('InputWidth2', d.inputwidth2)
1847  alg.addgeneric('InputWidth3', d.inputwidth3)
1848  alg.addgeneric('MaxTob1', d.nleading1)
1849  alg.addgeneric('MaxTob2', d.nleading2)
1850  alg.addgeneric('MaxTob3', d.nleading3)
1851  alg.addgeneric('NumResultBits', 1)
1852  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1853  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1854  alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
1855  alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
1856  alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
1857  alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
1858  tm.registerTopoAlgo(alg)
1859 
1860  # jINVM + DPHI
1861  NFFDphimap = [
1862  { "itemNameMinInvm": 400, "minInvm": 640 , "minDphi": 0, "maxDphiList": [26, 24, 22, 20],
1863  "otype1" : "AjJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
1864  "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
1865  ]
1866  for x in NFFDphimap:
1867  class d:
1868  pass
1869  for k in x:
1870  setattr (d, k, x[k])
1871  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
1872  toponames=[]
1873  for maxDphi in d.maxDphiList:
1874  toponames.append ("%iINVM-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.itemNameMinInvm, d.minDphi, maxDphi,
1875  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
1876  d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
1877  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'jINVM_DPHI', inputs = inputList, outputs = toponames)
1878  alg.addgeneric('InputWidth1', d.inputwidth)
1879  alg.addgeneric('InputWidth2', d.inputwidth)
1880  alg.addgeneric('MaxTob1', d.nleading1)
1881  alg.addgeneric('MaxTob2', d.nleading2)
1882  alg.addgeneric('NumResultBits', len(toponames))
1883  for bitid,maxDphi in enumerate(d.maxDphiList):
1884  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
1885  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
1886  alg.addvariable('MinMSqr', d.minInvm*d.minInvm *_et_conversion*_et_conversion , bitid)
1887  alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
1888  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion , bitid)
1889  alg.addvariable('MaxDeltaPhi', maxDphi*_phi_conversion, bitid)
1890  tm.registerTopoAlgo(alg)
1891 
1892 
1893  # jINVM_NFF + DPHI
1894  NFFDphimap = [
1895  { "itemNameMinInvm": 400, "minInvm": 640 , "minDphi": 0, "maxDphiList": [26, 24, 22, 20],
1896  "otype1" : "jJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
1897  "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
1898  ]
1899  for x in NFFDphimap:
1900  class d:
1901  pass
1902  for k in x:
1903  setattr (d, k, x[k])
1904  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
1905  toponames=[]
1906  for maxDphi in d.maxDphiList:
1907  toponames.append ("%iINVM-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.itemNameMinInvm, d.minDphi, maxDphi,
1908  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
1909  d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
1910  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'jINVM_DPHI_NFF', inputs = inputList, outputs = toponames)
1911  alg.addgeneric('InputWidth1', d.inputwidth)
1912  alg.addgeneric('InputWidth2', d.inputwidth)
1913  alg.addgeneric('MaxTob1', d.nleading1)
1914  alg.addgeneric('MaxTob2', d.nleading2)
1915  alg.addgeneric('NumResultBits', len(toponames))
1916  for bitid,maxDphi in enumerate(d.maxDphiList):
1917  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
1918  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
1919  alg.addvariable('MinMSqr', d.minInvm*d.minInvm *_et_conversion*_et_conversion , bitid)
1920  alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
1921  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion , bitid)
1922  alg.addvariable('MaxDeltaPhi', maxDphi*_phi_conversion, bitid)
1923  tm.registerTopoAlgo(alg)
1924 
1925 
1926  # CF
1927  algoList = [
1928  { "itemNameMinInvm": 400, "minInvm": 640, "otype1" : "AjJ", "ocut1": 60, "olist1" : "s", "nleading1" : 6, "inputwidth1": HW.jJetOutputWidthSort,
1929  "otype2" : "AjJ", "ocut2": 50, "olist2" : "s", "nleading2" : 6, "inputwidth2": HW.jJetOutputWidthSort, "applyEtaCut":1,
1930  "minEta1": 0 ,"maxEta1": 32 , "minEta2": 30 ,"maxEta2": 49 , }, #400INVM-AjJ60s6pETA32-AjJ50s6p30ETA49
1931  ]
1932  for x in algoList:
1933  class d:
1934  pass
1935  for k in x:
1936  setattr (d, k, x[k])
1937  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)
1938  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)
1939  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
1940  toponame = "%iINVM-%s%s" % (d.itemNameMinInvm, obj1, obj2)
1941  alg = AlgConf.InvariantMassInclusive2( name = toponame, inputs = inputList, outputs = toponame)
1942  alg.addgeneric('InputWidth1', d.inputwidth1)
1943  alg.addgeneric('InputWidth2', d.inputwidth2)
1944  alg.addgeneric('MaxTob1', d.nleading1)
1945  alg.addgeneric('MaxTob2', d.nleading2)
1946  alg.addgeneric('NumResultBits', 1)
1947  if (d.applyEtaCut>0):
1948  alg.addgeneric('ApplyEtaCut', d.applyEtaCut)
1949  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion )
1950  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion )
1951  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion )
1952  alg.addvariable('MaxMSqr', _no_m_upper_threshold )
1953  if (d.applyEtaCut>0):
1954  alg.addvariable('MinEta1', d.minEta1*_eta_conversion )
1955  alg.addvariable('MaxEta1', d.maxEta1*_eta_conversion )
1956  alg.addvariable('MinEta2', d.minEta2*_eta_conversion )
1957  alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion )
1958  tm.registerTopoAlgo(alg)
1959 
1960  # jINVM
1961  NFFmap = [
1962  { "itemNameMinInvmList": [300, 400, 500, 700], "minInvmList": [480, 640, 800, 1100] ,
1963  "otype1" : "AjJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
1964  "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
1965  ]
1966  for x in NFFmap:
1967  class d:
1968  pass
1969  for k in x:
1970  setattr (d, k, x[k])
1971  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
1972  toponames=[]
1973  for minInvm in d.itemNameMinInvmList:
1974  toponames.append ("%iINVM-%s%s%s%s-%s%s%s%s" % (minInvm,
1975  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
1976  d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
1977  alg = AlgConf.InvariantMassInclusive2( name = 'jINVM', inputs = inputList, outputs = toponames)
1978  alg.addgeneric('InputWidth1', d.inputwidth)
1979  alg.addgeneric('InputWidth2', d.inputwidth)
1980  alg.addgeneric('MaxTob1', d.nleading1)
1981  alg.addgeneric('MaxTob2', d.nleading2)
1982  alg.addgeneric('NumResultBits', len(toponames))
1983  for bitid,minInvm in enumerate(d.minInvmList):
1984  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
1985  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
1986  alg.addvariable('MinMSqr', minInvm*minInvm*_et_conversion*_et_conversion , bitid)
1987  alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
1988  tm.registerTopoAlgo(alg)
1989 
1990  # jINVM_NFF
1991  NFFmap = [
1992  { "itemNameMinInvmList": [300, 400, 500, 700], "minInvmList": [480, 640, 800, 1100] ,
1993  "otype1" : "jJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
1994  "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
1995  ]
1996  for x in NFFmap:
1997  class d:
1998  pass
1999  for k in x:
2000  setattr (d, k, x[k])
2001  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
2002  toponames=[]
2003  for minInvm in d.itemNameMinInvmList:
2004  toponames.append ("%iINVM-%s%s%s%s-%s%s%s%s" % (minInvm,
2005  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2006  d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
2007  alg = AlgConf.InvariantMassInclusive2( name = 'jINVM_NFF', inputs = inputList, outputs = toponames)
2008  alg.addgeneric('InputWidth1', d.inputwidth)
2009  alg.addgeneric('InputWidth2', d.inputwidth)
2010  alg.addgeneric('MaxTob1', d.nleading1)
2011  alg.addgeneric('MaxTob2', d.nleading2)
2012  alg.addgeneric('NumResultBits', len(toponames))
2013  for bitid,minInvm in enumerate(d.minInvmList):
2014  alg.addvariable('MinET1', get_threshold_cut("CjJ", d.ocut1)*_et_conversion , bitid)
2015  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
2016  alg.addvariable('MinMSqr', minInvm*minInvm*_et_conversion*_et_conversion , bitid)
2017  alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
2018  tm.registerTopoAlgo(alg)
2019 
2020  #ATR-19355
2021  # Parameter ordering
2022  # 1. MinEt
2023  # 2. MinMSqr
2024  # 3. MaxMSqr
2025  toponame = "0INVM10-3MU3Vab"
2026  log.debug("Define %s", toponame)
2027  inputList = 'MU3Vab'
2028  alg = AlgConf.InvariantMassThreeTOBsIncl1( name = toponame, inputs = inputList, outputs = toponame )
2029  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2030  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2031  alg.addgeneric('NumResultBits', 1)
2032  alg.addvariable('MinET1', 0*_et_conversion)
2033  alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
2034  alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
2035  tm.registerTopoAlgo(alg)
2036 
2037  toponame = "0INVM10-3MU3VFab"
2038  log.debug("Define %s", toponame)
2039  inputList = 'MU3VFab'
2040  alg = AlgConf.InvariantMassThreeTOBsIncl1( name = toponame, inputs = inputList, outputs = toponame )
2041  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2042  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2043  alg.addgeneric('NumResultBits', 1)
2044  alg.addvariable('MinET1', 0*_et_conversion)
2045  alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
2046  alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
2047  tm.registerTopoAlgo(alg)
2048 
2049  #ATR-19638, 3muon, not all with the same charge
2050  toponame = "0INVM10C-3MU3Vab"
2051  log.debug("Define %s", toponame)
2052  inputList = 'MU3Vab'
2053  alg = AlgConf.InvariantMassThreeTOBsIncl1Charge( name = toponame, inputs = inputList, outputs = toponame )
2054  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2055  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2056  alg.addgeneric('NumResultBits', 1)
2057  alg.addvariable('MinET1', 0*_et_conversion)
2058  alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
2059  alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
2060  tm.registerTopoAlgo(alg)
2061 
2062 
2063  # LFV
2064  # output lines: 0INVM10-0DR15-eEM10abl-MU8Fab, 0INVM10-0DR15-eEM15abl-MU5VFab
2065  # Parameter ordering
2066  # 1. MinEt1
2067  # 2. MinEt2
2068  # 3. MinMSqr
2069  # 4. MaxMSqr
2070  # 5. MinEta1
2071  # 6. MaxEta1
2072  # 7. MinEta2
2073  # 8. MaxEta2
2074  # 9. DeltaRMin
2075  # 10. DeltaRMax
2076  INVM_DR_eEM_MU_Map = [{
2077  "algoname": "INVM_DR_eEM_MU",
2078  "minInvm" : 0,
2079  "maxInvm" : 10,
2080  "minDR" : 0,
2081  "maxDR" : 15,
2082  "otype1" : "eEM",
2083  "ocut1" : [10,15],
2084  "olist1": "abl",
2085  "otype2" : "MU",
2086  "olist2": ["Fab","VFab"],
2087  "ocut2" : 5,
2088  "ocut2Offset" : [3,0]
2089 
2090  }]
2091 
2092  for x in INVM_DR_eEM_MU_Map:
2093  class d:
2094  pass
2095  for k in x:
2096  setattr(d,k,x[k])
2097  inputList = [d.otype1 + d.olist1, d.otype2 + str(d.ocut2) + d.olist2[1] ]
2098  toponames = []
2099  for bitId in range(len(d.ocut1)):
2100  obj1 = "-%s%s%s" % (d.otype1, str( d.ocut1[bitId] ) , d.olist1)
2101  obj2 = "-%s%s%s" % (d.otype2, str( d.ocut2 + d.ocut2Offset[bitId] ) , d.olist2[bitId])
2102  toponames.append("%dINVM%d-%dDR%d%s%s" % ( d.minInvm, d.maxInvm, d.minDR, d.maxDR, obj1, obj2))
2103 
2104  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
2105 
2106  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSelect)
2107  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2108  alg.addgeneric('MaxTob1', HW.eEmOutputWidthSort)
2109  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2110  alg.addgeneric('ApplyEtaCut', 1)
2111 
2112  alg.addgeneric('NumResultBits', len(toponames) )
2113 
2114  for bitId in range(len(toponames)):
2115  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1[bitId])*_et_conversion, bitId)
2116  alg.addvariable('MinET2', (d.ocut2 + d.ocut2Offset[bitId])*_et_conversion, bitId)
2117  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
2118  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitId)
2119  alg.addvariable('MinEta1', 0*_eta_conversion, bitId)
2120  alg.addvariable('MaxEta1', 49*_eta_conversion, bitId)
2121  alg.addvariable('MinEta2', 0*_eta_conversion, bitId)
2122  alg.addvariable('MaxEta2', 49*_eta_conversion, bitId)
2123  alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
2124  alg.addvariable('DeltaRMax', d.maxDR*d.maxDR*_dr_conversion*_dr_conversion, bitId)
2125 
2126 
2127  tm.registerTopoAlgo(alg)
2128 
2129  #ATR-18824 ZAFB-DPHI
2130  # TODO: update with fwd electrons
2131  # Parameter ordering
2132  # 1. MinEt1
2133  # 2. MinEt2
2134  # 3. MinMSqr
2135  # 4. MaxMSqr
2136  # 5. MinEta1
2137  # 6. MaxEta1
2138  # 7. MinEta2
2139  # 8. MaxEta2
2140  # 9. MinDeltaPhi
2141  # 10. MaxDeltaPhi
2142  ZAFBDphimap = [
2143  { "minInvm": 60 , "minDphiList": [4, 25], "maxDphi": 32, "minEta2": 25, "maxEta2": 49,
2144  "inputwidth1": HW.eEmOutputWidthSelect, "otype1" : "eEM", "ocut1" : 18, "olist1" : "abm",
2145  "nleading1" : HW.eEmOutputWidthSelect, "inputwidth2": HW.jEmOutputWidthSort, "ocut2" : 20, "ocut3" : 25, "nleading2" : 6 }
2146  ]
2147  for x in ZAFBDphimap:
2148  class d:
2149  pass
2150  for k in x:
2151  setattr (d, k, x[k])
2152  inputList = [d.otype1 + d.olist1, 'jEMs25ETA49']
2153  toponames=[]
2154  for minDphi in d.minDphiList:
2155  toponames.append ("%iINVM-%02dDPHI%i-%s%s%s%s-jEM%ss%s%iETA%i" % (d.minInvm, minDphi, d.maxDphi,
2156  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2157  str(d.ocut3) , str(d.nleading2) , d.minEta2, d.maxEta2))
2158  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'ZAFB_DPHI', inputs = inputList, outputs = toponames)
2159  alg.addgeneric('InputWidth1', d.inputwidth1)
2160  alg.addgeneric('InputWidth2', d.inputwidth2)
2161  alg.addgeneric('MaxTob1', d.nleading1)
2162  alg.addgeneric('MaxTob2', d.nleading2)
2163  alg.addgeneric('NumResultBits', len(toponames))
2164  alg.addgeneric('ApplyEtaCut', 1)
2165  for bitid,minDphi in enumerate(d.minDphiList):
2166  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitid)
2167  alg.addvariable('MinET2', get_threshold_cut('jEM', d.ocut3)*_et_conversion, bitid)
2168  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
2169  alg.addvariable('MaxMSqr', _no_m_upper_threshold, bitid)
2170  alg.addvariable('MinEta1', 0*_eta_conversion, bitid)
2171  alg.addvariable('MaxEta1', 49*_eta_conversion, bitid)
2172  alg.addvariable('MinEta2', d.minEta2*_eta_conversion, bitid)
2173  alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion, bitid)
2174  alg.addvariable('MinDeltaPhi', minDphi*_phi_conversion, bitid)
2175  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, bitid)
2176  tm.registerTopoAlgo(alg)
2177 
2178  inputList = [d.otype1 + d.olist1, 'jEMsm25ETA49']
2179  toponames=[]
2180  for minDphi in d.minDphiList:
2181  toponames.append ("%iINVM-%02dDPHI%i-%s%s%s%s-jEM%ssm%s%iETA%i" % (d.minInvm, minDphi, d.maxDphi,
2182  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
2183  str(d.ocut2) , str(d.nleading2) , d.minEta2, d.maxEta2))
2184  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'ZAFB_DPHIM', inputs = inputList, outputs = toponames)
2185  alg.addgeneric('InputWidth1', d.inputwidth1)
2186  alg.addgeneric('InputWidth2', d.inputwidth2)
2187  alg.addgeneric('MaxTob1', d.nleading1)
2188  alg.addgeneric('MaxTob2', d.nleading2)
2189  alg.addgeneric('NumResultBits', len(toponames))
2190  alg.addgeneric('ApplyEtaCut', 1)
2191  for bitid,minDphi in enumerate(d.minDphiList):
2192  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitid)
2193  alg.addvariable('MinET2', get_threshold_cut('jEM', d.ocut2)*_et_conversion, bitid)
2194  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
2195  alg.addvariable('MaxMSqr', _no_m_upper_threshold, bitid)
2196  alg.addvariable('MinEta1', 0*_eta_conversion, bitid)
2197  alg.addvariable('MaxEta1', 49*_eta_conversion, bitid)
2198  alg.addvariable('MinEta2', d.minEta2*_eta_conversion, bitid)
2199  alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion, bitid)
2200  alg.addvariable('MinDeltaPhi', minDphi*_phi_conversion, bitid)
2201  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, bitid)
2202  tm.registerTopoAlgo(alg)
2203 
2204  # ATR-19302, ATR-21637
2205  listofalgos=[
2206  {"minInvm": 0,"maxInvm": 70,"minDphi": 27,"maxDphi": 32,"otype":"eEM","olist":"s","ocut1":9,"nleading1":1,"ocut2":9,"nleading2":6,}, #0INVM70-27DPHI32-eEM9s1-eEM9s6
2207  {"minInvm": 0,"maxInvm": 70,"minDphi": 27,"maxDphi": 32,"otype":"eEM","olist":"sl","ocut1":9,"nleading1":1,"ocut2":9,"nleading2":6,}, #0INVM70-27DPHI32-eEM9sl1-eEM9sl6
2208  ]
2209  for x in listofalgos:
2210  class d:
2211  pass
2212  for k in x:
2213  setattr (d, k, x[k])
2214  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))
2215  log.debug("Define %s", toponame)
2216  inputList = [d.otype + d.olist, d.otype + d.olist]
2217  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = toponame, inputs = inputList, outputs = toponame )
2218  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
2219  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
2220  alg.addgeneric('MaxTob1', d.nleading1)
2221  alg.addgeneric('MaxTob2', d.nleading2)
2222  alg.addgeneric('NumResultBits', 1)
2223  alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion)
2224  alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion)
2225  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2226  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2227  alg.addgeneric('ApplyEtaCut', 1)
2228  alg.addvariable('MinEta1', 0*_eta_conversion)
2229  alg.addvariable('MaxEta1',49*_eta_conversion)
2230  alg.addvariable('MinEta2', 0*_eta_conversion)
2231  alg.addvariable('MaxEta2',49*_eta_conversion)
2232  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
2233  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
2234  tm.registerTopoAlgo(alg)
2235 
2236 
2237  # DR Map for INVM_DR_2MU3 Trigger. Output lines:
2238  #'7INVM22-0DR20-2MU3Vab'
2239  #'7INVM22-0DR12-2MU3Vab'
2240  INVM_DR_2MU3Vab_Map = [
2241  {
2242  "algoname": "7INVM22_DR_2MU3Vab",
2243  "minInvm" : 7,
2244  "maxInvm" : 22,
2245  "minDR" : [0,0],
2246  "maxDR" : [12,20],
2247  "otype1" : "MU3Vab",
2248  "mult1" : 2
2249  }
2250  ]
2251  for x in INVM_DR_2MU3Vab_Map:
2252  class d:
2253  pass
2254  for k in x:
2255  setattr(d,k,x[k])
2256  inputList = d.otype1
2257  toponames = []
2258  for bitId in range(len(d.minDR)):
2259  toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm, d.maxInvm,
2260  d.minDR[bitId] , d.maxDR[bitId],
2261  d.mult1, d.otype1
2262  )
2263  )
2264  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
2265  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2266  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2267  alg.addgeneric('NumResultBits', len(toponames))
2268  for bitId in range(len(toponames)):
2269  alg.addvariable('MinET1', 0*_et_conversion, bitId)
2270  alg.addvariable('MinET2', 0*_et_conversion, bitId)
2271  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
2272  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitId)
2273  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2274  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2275  tm.registerTopoAlgo(alg)
2276 
2277 
2278  # INVM_DR_2MU3VFab
2279  # Output lines: '2INVM9-0DR15-2MU3VFab'
2280  # '7INVM11-25DR99-2MU3VFab',
2281 
2282 
2283  INVM_DR_2MU3VFab_Map = [
2284  {
2285  "algoname": "INVM_DR_2MU3VFab",
2286  "minInvm" : [2,7],
2287  "maxInvm" : [9,11,22],
2288  "minDR" : [0,25],
2289  "maxDR" : [15,99],
2290  "otype1" : "MU3VFab",
2291  "mult1" : 2
2292  }
2293  ]
2294  for x in INVM_DR_2MU3VFab_Map:
2295  class d:
2296  pass
2297  for k in x:
2298  setattr(d,k,x[k])
2299  inputList = d.otype1
2300  toponames = []
2301  for bitId in range(len(d.minDR)):
2302  toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm[bitId], d.maxInvm[bitId],
2303  d.minDR[bitId] , d.maxDR[bitId],
2304  d.mult1, d.otype1
2305  )
2306  )
2307  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
2308  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2309  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2310  alg.addgeneric('NumResultBits', len(toponames))
2311  for bitId in range(len(toponames)):
2312  alg.addvariable('MinET1', 0*_et_conversion, bitId)
2313  alg.addvariable('MinET2', 0*_et_conversion, bitId)
2314  alg.addvariable('MinMSqr', d.minInvm[bitId]*d.minInvm[bitId]*_et_conversion*_et_conversion, bitId)
2315  alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
2316  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2317  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2318  tm.registerTopoAlgo(alg)
2319 
2320 
2321 
2322  #ATR-19720 and ATR-22782, BPH DR+M dimuon
2323  listofalgos=[
2324  {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #2INVM9-0DR15-MU5VFab-MU3Vab
2325  {"minInvm": 8, "maxInvm": 15, "minDr": 0, "maxDr": 22, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #8INVM15-0DR22-MU5VFab-MU3Vab
2326  {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 2, "otype1" : "MU3Vab", "otype2": "", }, #2INVM9-0DR15-2MU3Vab
2327 
2328 
2329  {"minInvm": 0, "maxInvm": 16, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #0INVM16-20DR99-2MU3Vab
2330  {"minInvm": 0, "maxInvm": 16, "minDr": 15, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #0INVM16-15DR99-2MU3Vab
2331  {"minInvm": 8, "maxInvm": 15, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-20DR99-2MU3Vab
2332  {"minInvm": 8, "maxInvm": 15, "minDr": 15, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-15DR99-2MU3Vab
2333 
2334  {"minInvm": 7, "maxInvm": 22, "minDr": 0, "maxDr": 20, "mult": 2, "otype1" : "MU3VFab", "otype2": "",}, #7INVM22-0DR20-2MU3VFab, ATR-21566
2335 
2336  {"minInvm": 8, "maxInvm": 15, "minDr": 0, "maxDr": 22, "mult": 1, "otype1" : "CMU5VFab","otype2": "CMU3Vab",}, #8INVM15-0DR22-CMU5VFab-CMU3Vab
2337 
2338  {"minInvm": 7, "maxInvm": 14, "minDr": 0, "maxDr": 25, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #7INVM14-0DR25-MU5VFab-MU3Vab
2339  {"minInvm": 7, "maxInvm": 11, "minDr": 25, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #7INVM11-25DR99-2MU3Vab
2340  {"minInvm": 7, "maxInvm": 14, "minDr": 0, "maxDr": 25, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3VFab", }, #7INVM14-0DR25-MU5VFab-MU3VFab
2341 
2342 
2343  ]
2344  for x in listofalgos:
2345  class d:
2346  pass
2347  for k in x:
2348  setattr (d, k, x[k])
2349  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
2350  obj2 = "-%s" % (d.otype2)
2351  toponame = "%iINVM%i-%iDR%i-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
2352  log.debug("Define %s", toponame)
2353  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
2354  algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1 if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2
2355  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2356  if (d.mult>1):
2357  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2358  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2359  else:
2360  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
2361  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2362  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
2363  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2364  alg.addgeneric('NumResultBits', 1)
2365  alg.addvariable('MinET1', 0*_et_conversion)
2366  alg.addvariable('MinET2', 0*_et_conversion)
2367  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2368  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2369  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
2370  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
2371  tm.registerTopoAlgo(alg)
2372 
2373  #ATR-19639, BPH DR+M+OS dimuon
2374  listofalgos=[
2375  {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab",}, #2INVM9-0DR15-C-MU5VFab-MU3Vab
2376  {"minInvm": 8, "maxInvm": 15, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-20DR99-C-2MU3Vab
2377  ]
2378  for x in listofalgos:
2379  class d:
2380  pass
2381  for k in x:
2382  setattr (d, k, x[k])
2383  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
2384  obj2 = "-%s" % (d.otype2)
2385  toponame = "%iINVM%i-%iDR%i-C-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
2386  log.debug("Define %s", toponame)
2387  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
2388  algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2Charge
2389  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2390  if (d.mult>1):
2391  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2392  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2393  else:
2394  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
2395  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2396  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
2397  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2398  alg.addgeneric('NumResultBits', 1)
2399  alg.addvariable('MinET1', 0*_et_conversion)
2400  alg.addvariable('MinET2', 0*_et_conversion)
2401  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2402  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2403  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
2404  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
2405  tm.registerTopoAlgo(alg)
2406 
2407 
2408  # CEP_CjJ
2409  CEPmap = [
2410  {"algoname": 'CEP_CjJ', "minETlist": [90, 100]}
2411  ]
2412  for x in CEPmap:
2413  class d:
2414  pass
2415  for k in x:
2416  setattr (d, k, x[k])
2417  inputList = ['CjJs']
2418  toponames=[]
2419  for minET in d.minETlist: # noqa: F821
2420  toponames.append ("CEP-CjJ%is6" % (minET)) # noqa: F821
2421  alg = AlgConf.ExclusiveJets( name = d.algoname, inputs = inputList, outputs = toponames) # noqa: F821
2422  alg.addgeneric('InputWidth', HW.jJetOutputWidthSort) # noqa: F821
2423  alg.addgeneric('MaxTob', HW.jJetOutputWidthSort) # noqa: F821
2424  alg.addgeneric('NumResultBits', len(toponames)) # noqa: F821
2425  alg.addvariable('PtScale', 1.4*10) # noqa: F821
2426  alg.addvariable('PtShift', 20*_et_conversion) # noqa: F821
2427  for bitid,minET in enumerate(d.minETlist): # noqa: F821
2428  alg.addvariable('MinET1', get_threshold_cut('CjJ', minET)*_et_conversion, bitid)# noqa: F821
2429  alg.addvariable('MinXi', 13600.0*_et_conversion*0.02, bitid) # noqa: F821
2430  alg.addvariable('MaxXi', 13600.0*_et_conversion*0.05, bitid) # noqa: F821
2431  tm.registerTopoAlgo(alg)
2432 
2433  # dphi with s+s #ATR-29784
2434  # Parameter ordering:
2435  # 1. MinEt1
2436  # 2. MinEt2
2437  # 3. DeltaPhiMin
2438  # 4. DeltaPhiMax
2439  algolist=[
2440  { "minDphi": 23, "maxDphi": 32, "mult": 2, "otype1" : "eEM",
2441  "ocut1": 1, "olist1": "s", "nleading1": HW.eEmOutputWidthSort, "minET1":0.9, "otype2" : "", "minET2":0.8},#23DPHI32_2eEM1s
2442  { "minDphi": 23, "maxDphi": 32, "mult": 2, "otype1" : "eTAU",
2443  "ocut1": 1, "olist1": "s", "nleading1": HW.eTauOutputWidthSort,"minET1":0.8,"otype2" : "","minET2":0.8},#23DPHI32_2eTAU1s
2444  { "minDphi": 23, "maxDphi": 32, "mult": 2, "otype1" : "jTAU",
2445  "ocut1": 1, "olist1": "s", "nleading1": HW.jTauOutputWidthSort,"minET1":1.4,"otype2" : "","minET2":1.4},#23DPHI32_2jTAU1s
2446  ]
2447  for x in algolist:
2448  class d:
2449  pass
2450  for k in x:
2451  setattr (d, k, x[k])
2452  obj = "%s" % (str(d.mult)+d.otype1+str(d.ocut1)+str(d.olist1))
2453  toponame = "%sDPHI%s-%s" % (d.minDphi, d.maxDphi, obj)
2454  log.debug("Define %s", toponame)
2455  inputList = [d.otype1+d.olist1]
2456  algoname = AlgConf.DeltaPhiIncl1
2457  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2458  alg.addgeneric('NumResultBits', 1)
2459  alg.addgeneric('InputWidth', d.nleading1)
2460  alg.addgeneric('MaxTob', d.nleading1)
2461  alg.addvariable('MinET1', d.minET1*_et_conversion)
2462  alg.addvariable('MinET2', d.minET2*_et_conversion)
2463  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
2464  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
2465  tm.registerTopoAlgo(alg)
2466 
2467  # InvMass + DPHI (+ SumET) for ATR-30727 and ATR-30728
2468  from dataclasses import dataclass
2469 
2470  @dataclass
2471  class InvMassDPhiSumETAlgoParams:
2472  """ Parameters for InvariantMassDeltaPhiInclusive1 and InvariantMassDeltaPhiSumEtInclusive1 Topo algorithms """
2473  MinEt1: float
2474  MinEt2: float
2475  DeltaPhiMin: int = 23
2476  DeltaPhiMax: int = 32
2477  MinInvMass: int = 0 # Algorithm uses MinMSqr
2478  MaxInvMass : int = 1000 # Algorithm uses MaxMSqr
2479  MinSumEt: int = 0
2480  MaxSumEt: int = 1000
2481 
2482  def AddInvMassDPhiSumETAlgos(otype: str, nleading, list_of_algos: list[InvMassDPhiSumETAlgoParams]):
2483  for x in list_of_algos:
2484  # Check which parameters are set and choose correct algorithm
2485  is_InvMass_set = x.MinInvMass != 0 or x.MaxInvMass != 1000
2486  is_SumEt_set = x.MinSumEt != 0 or x.MaxSumEt != 1000
2487  algoname = AlgConf.InvariantMassDeltaPhiSumEtInclusive1 if is_SumEt_set else AlgConf.InvariantMassDeltaPhiInclusive1
2488 
2489  obj = f'2{otype}{round(x.MinEt1)}s'
2490  toponame = f'{x.DeltaPhiMin}DPHI{x.DeltaPhiMax}-{obj}' # Always present
2491  # Check Min/MaxSumEt only for algorithm which supports it
2492  if is_SumEt_set:
2493  toponame = f'{x.MinSumEt}SUM{x.MaxSumEt}-{toponame}'
2494  if is_InvMass_set:
2495  toponame = f'{x.MinInvMass}INVM{x.MaxInvMass}-{toponame}'
2496  log.debug('Define %s', toponame)
2497 
2498  alg = algoname(name=toponame, inputs=[f'{otype}s'], outputs=[toponame])
2499  alg.addgeneric('NumResultBits', 1)
2500  alg.addgeneric('InputWidth', nleading)
2501  alg.addgeneric('MaxTob', nleading)
2502  alg.addvariable('MinET1', x.MinEt1 * _et_conversion)
2503  alg.addvariable('MinET2', x.MinEt2 * _et_conversion)
2504  alg.addvariable('MinMSqr', (x.MinInvMass * _et_conversion) ** 2) # Algoritm uses InvMass squared
2505  alg.addvariable('MaxMSqr', (x.MaxInvMass * _et_conversion) ** 2)
2506  alg.addvariable('MinDeltaPhi', x.DeltaPhiMin * _phi_conversion)
2507  alg.addvariable('MaxDeltaPhi', x.DeltaPhiMax * _phi_conversion)
2508  # Set Min/MaxSumEt only for algorithm which supports it
2509  if is_SumEt_set:
2510  alg.addvariable('MinSumEt', x.MinSumEt * _et_conversion)
2511  alg.addvariable('MaxSumEt', x.MaxSumEt * _et_conversion)
2512  tm.registerTopoAlgo(alg)
2513 
2514  # From ATR-30728
2515  algo_list = [
2516  InvMassDPhiSumETAlgoParams(MinEt1=0.8, MinEt2=0.8, MinInvMass=1, MaxInvMass=200), # 1INVM200-23DPHI32_2eTAU1
2517  InvMassDPhiSumETAlgoParams(MinEt1=0.8, MinEt2=0.8, MinInvMass=2, MaxInvMass=200), # 2INVM200-23DPHI32_2eTAU1
2518  InvMassDPhiSumETAlgoParams(MinEt1=0.8, MinEt2=0.8, MinInvMass=3, MaxInvMass=200), # 3INVM200-23DPHI32_2eTAU1
2519  InvMassDPhiSumETAlgoParams(MinEt1=0.8, MinEt2=0.8, MinInvMass=4, MaxInvMass=200), # 4INVM200-23DPHI32_2eTAU1
2520  InvMassDPhiSumETAlgoParams(MinEt1=0.8, MinEt2=0.8, MinSumEt=3, MaxSumEt=200), # 3SUM200-23DPHI32_2eTAU1
2521  InvMassDPhiSumETAlgoParams(MinEt1=0.8, MinEt2=0.8, MinSumEt=4, MaxSumEt=200), # 4SUM200-23DPHI32_2eTAU1
2522  ]
2523  AddInvMassDPhiSumETAlgos('eTAU', HW.eTauOutputWidthSort, algo_list)
2524 
2525  # From ATR-30727
2526  algo_list = [
2527  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinInvMass=10, MaxInvMass=200), # 10INVM200-20DPHI32_2jJ5
2528  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinInvMass=15, MaxInvMass=200), # 15INVM200-20DPHI32_2jJ5
2529  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinInvMass=20, MaxInvMass=200), # 20INVM200-20DPHI32_2jJ5
2530  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinInvMass=25, MaxInvMass=200), # 25INVM200-20DPHI32_2jJ5
2531  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinSumEt=10, MaxSumEt=200), # 10SUM200-20DPHI32_2jJ5
2532  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinSumEt=15, MaxSumEt=200), # 15SUM200-20DPHI32_2jJ5
2533  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinSumEt=20, MaxSumEt=200), # 20SUM200-20DPHI32_2jJ5
2534  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinSumEt=25, MaxSumEt=200), # 25SUM200-20DPHI32_2jJ5
2535  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinInvMass=15, MaxInvMass=200, MinSumEt=15, MaxSumEt=200), # 15INVM200-15SUM200-20DPHI32_2jJ5
2536  InvMassDPhiSumETAlgoParams(MinEt1=5, MinEt2=5, DeltaPhiMin=20, MinInvMass=20, MaxInvMass=200, MinSumEt=20, MaxSumEt=200), # 20INVM200-20SUM200-20DPHI32_2jJ5
2537  ]
2538  AddInvMassDPhiSumETAlgos('jJ', HW.jJetOutputWidthSort, algo_list)
2539 
2540  # g-2 tau (ATR-30638)
2541  Algo = namedtuple('Algo', ['dPhiMin', 'dPhiMax', 'otype', 'olist', 'ocut1', 'ocut2', 'nTOB'])
2542  algolist=[
2543  Algo(dPhiMin=30, dPhiMax=32, otype='eTAU', olist='s', ocut1=50, ocut2=50, nTOB=HW.eTauOutputWidthSort), #30DPHI32-2eTAU50s
2544  ]
2545  for x in algolist:
2546  name = f'{x.dPhiMin}DPHI{x.dPhiMax}-'
2547  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}'
2548 
2549  alg = AlgConf.DeltaPhiIncl1(name=name, inputs=[x.otype+x.olist], outputs=[name])
2550  alg.addgeneric('NumResultBits', 1)
2551  alg.addgeneric('InputWidth', x.nTOB)
2552  alg.addgeneric('MaxTob', x.nTOB)
2553  alg.addvariable('MinET1', get_threshold_cut(x.otype, x.ocut1)*_et_conversion)
2554  alg.addvariable('MinET2', get_threshold_cut(x.otype, x.ocut2)*_et_conversion)
2555  alg.addvariable('MinDeltaPhi', x.dPhiMin*_phi_conversion)
2556  alg.addvariable('MaxDeltaPhi', x.dPhiMax*_phi_conversion)
2557  tm.registerTopoAlgo(alg)
hist_file_dump.d
d
Definition: hist_file_dump.py:143
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:186
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
str
Definition: BTagTrackIpAccessor.cxx:11
python.L1.Config.TopoAlgoDef.TopoAlgoDef
Definition: TopoAlgoDef.py:20