ATLAS Offline Software
TopoAlgoDef.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2022 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 
19 
20  @staticmethod
22 
23  # constants and conversions:
24  _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
25  _dr_conversion = 4 # factor 10 already included to remove . from name
26  _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
27  _eta_conversion = 4 # factor 10 already included to remove . from name
28  _phi_conversion = 2 # factor 10 already included to remove . from name
29 
30  # eEM inputs
31  # ALL
32  # Parameter ordering:
33  # 1. REtaMin
34  # 2. RHadMin
35  # 3. WsTotMin
36  alg = AlgConf.eEmNoSort( name = 'eEMall', inputs = 'eEmTobs', outputs = 'eEMall' )
37  alg.addgeneric('InputWidth', HW.eEmInputWidth)
38  alg.addgeneric('OutputWidth', HW.eEmInputWidth)
39  alg.addvariable('REtaMin', 0)
40  alg.addvariable('RHadMin', 0)
41  alg.addvariable('WsTotMin', 0)
42  tm.registerTopoAlgo(alg)
43 
44  # SORT
45  # Inherited from NoSort
46  alg = AlgConf.eEmSort( name = 'eEMs', inputs = 'eEmTobs', outputs = 'eEMs' )
47  alg.addgeneric('InputWidth', HW.eEmInputWidth)
48  alg.addgeneric('OutputWidth', HW.eEmOutputWidthSort)
49  alg.addvariable('REtaMin', 0)
50  alg.addvariable('RHadMin', 0)
51  alg.addvariable('WsTotMin', 0)
52  tm.registerTopoAlgo(alg)
53 
54  alg = AlgConf.eEmSort( name = 'eEMsl', inputs = 'eEmTobs', outputs = 'eEMsl' )
55  alg.addgeneric('InputWidth', HW.eEmInputWidth)
56  alg.addgeneric('OutputWidth', HW.eEmOutputWidthSort)
57  alg.addvariable('REtaMin', 1)
58  alg.addvariable('RHadMin', 1)
59  alg.addvariable('WsTotMin', 1)
60  tm.registerTopoAlgo(alg)
61 
62  alg = AlgConf.eEmSort( name = 'eEMsm', inputs = 'eEmTobs', outputs = 'eEMsm' )
63  alg.addgeneric('InputWidth', HW.eEmInputWidth)
64  alg.addgeneric('OutputWidth', HW.eEmOutputWidthSort)
65  alg.addvariable('REtaMin', 2)
66  alg.addvariable('RHadMin', 2)
67  alg.addvariable('WsTotMin', 2)
68  tm.registerTopoAlgo(alg)
69 
70  # SELECT
71  # Inherited from NoSort
72  alg = AlgConf.eEmSelect( name = 'eEMab', inputs = 'eEmTobs', outputs = 'eEMab' )
73  alg.addgeneric('InputWidth', HW.eEmInputWidth)
74  alg.addgeneric('OutputWidth', HW.eEmOutputWidthSelect)
75  alg.addvariable('MinET', get_threshold_cut('eEM', 7)*_et_conversion)
76  alg.addvariable('REtaMin', 0)
77  alg.addvariable('RHadMin', 0)
78  alg.addvariable('WsTotMin', 0)
79  tm.registerTopoAlgo(alg)
80 
81  alg = AlgConf.eEmSelect( name = 'eEMabl', inputs = 'eEmTobs', outputs = 'eEMabl' )
82  alg.addgeneric('InputWidth', HW.eEmInputWidth)
83  alg.addgeneric('OutputWidth', HW.eEmOutputWidthSelect)
84  alg.addvariable('MinET', get_threshold_cut('eEM', 10)*_et_conversion)
85  alg.addvariable('REtaMin', 1)
86  alg.addvariable('RHadMin', 1)
87  alg.addvariable('WsTotMin', 1)
88  tm.registerTopoAlgo(alg)
89 
90  alg = AlgConf.eEmSelect( name = 'eEMabm', inputs = 'eEmTobs', outputs = 'eEMabm' )
91  alg.addgeneric('InputWidth', HW.eEmInputWidth)
92  alg.addgeneric('OutputWidth', HW.eEmOutputWidthSelect)
93  alg.addvariable('MinET', get_threshold_cut('eEM', 10)*_et_conversion)
94  alg.addvariable('REtaMin', 2)
95  alg.addvariable('RHadMin', 2)
96  alg.addvariable('WsTotMin', 2)
97  tm.registerTopoAlgo(alg)
98 
99  # eTAU inputs
100  # all
101  # Parameter ordering:
102  # 1. RCoreMin
103  # 2. RHadMin
104  alg = AlgConf.eTauNoSort( name = 'eTAUall', inputs = 'eTauTobs', outputs = 'eTAUall')
105  alg.addgeneric('InputWidth', HW.eTauInputWidth)
106  alg.addgeneric('OutputWidth', HW.eTauInputWidth)
107  alg.addvariable('RCoreMin', 0)
108  alg.addvariable('RHadMin', 0)
109  tm.registerTopoAlgo(alg)
110 
111  # SORT
112  # Inherited from NoSort
113  alg = AlgConf.eTauSort( name = 'eTAUs', inputs = 'eTauTobs', outputs = 'eTAUs' )
114  alg.addgeneric('InputWidth', HW.eTauInputWidth)
115  alg.addgeneric('OutputWidth', HW.eTauOutputWidthSort)
116  alg.addvariable('RCoreMin', 0)
117  alg.addvariable('RHadMin', 0)
118  tm.registerTopoAlgo(alg)
119 
120  # SELECT
121  # Inherited from NoSort
122  alg = AlgConf.eTauSelect( name = 'eTAUab', inputs = 'eTauTobs', outputs = 'eTAUab' )
123  alg.addgeneric('InputWidth', HW.eTauInputWidth)
124  alg.addgeneric('OutputWidth', HW.eTauOutputWidthSelect)
125  alg.addvariable('MinET', get_threshold_cut('eTAU', 12)*_et_conversion)
126  alg.addvariable('RCoreMin', 0)
127  alg.addvariable('RHadMin', 0)
128  tm.registerTopoAlgo(alg)
129 
130  alg = AlgConf.eTauSelect( name = 'eTAUabm', inputs = 'eTauTobs', outputs = 'eTAUabm' )
131  alg.addgeneric('InputWidth', HW.eTauInputWidth)
132  alg.addgeneric('OutputWidth', HW.eTauOutputWidthSelect)
133  alg.addvariable('MinET', get_threshold_cut('eTAU', 12)*_et_conversion)
134  alg.addvariable('RCoreMin', 2)
135  alg.addvariable('RHadMin', 0)
136  tm.registerTopoAlgo(alg)
137 
138  # Muon inputs
139 
140  # SELECT
141  # Parameter order:
142  # 1. MinEtRPC
143  # 2. MinEtTGC
144  # 3. MinEta
145  # 4. MaxEta
146  # 5. InnerCoinCut
147  # 6. FullStationCut
148  # 7. GoodMFieldCut
149 
150  alg = AlgConf.MuonSelect( name = 'MU3Vab', inputs = 'MuonTobs', outputs = 'MU3Vab' )
151  alg.addgeneric('InputWidth', HW.muonInputWidth)
152  alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
153  alg.addvariable('MinEtRPC', 4*_et_conversion)
154  alg.addvariable('MinEtTGC', 3*_et_conversion)
155  alg.addvariable('MinEta', 0*_eta_conversion)
156  alg.addvariable('MaxEta', 25*_eta_conversion)
157  alg.addvariable('InnerCoinCut', 0)
158  alg.addvariable('FullStationCut',0)
159  alg.addvariable('GoodMFieldCut', 0)
160  tm.registerTopoAlgo(alg)
161 
162  alg = AlgConf.MuonSelect( name = 'MU3VFab', inputs = 'MuonTobs', outputs = 'MU3VFab' )
163  alg.addgeneric('InputWidth', HW.muonInputWidth)
164  alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
165  alg.addvariable('MinEtRPC', 4*_et_conversion)
166  alg.addvariable('MinEtTGC', 3*_et_conversion)
167  alg.addvariable('MinEta', 0*_eta_conversion)
168  alg.addvariable('MaxEta', 25*_eta_conversion)
169  alg.addvariable('InnerCoinCut', 0)
170  alg.addvariable('FullStationCut',1)
171  alg.addvariable('GoodMFieldCut', 0)
172  tm.registerTopoAlgo(alg)
173 
174  alg = AlgConf.MuonSelect( name = 'MU5VFab', inputs = 'MuonTobs', outputs = 'MU5VFab' )
175  alg.addgeneric('InputWidth', HW.muonInputWidth)
176  alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
177  alg.addvariable('MinEtRPC', 6*_et_conversion)
178  alg.addvariable('MinEtTGC', 5*_et_conversion)
179  alg.addvariable('MinEta', 0*_eta_conversion)
180  alg.addvariable('MaxEta', 25*_eta_conversion)
181  alg.addvariable('InnerCoinCut', 0)
182  alg.addvariable('FullStationCut',1)
183  alg.addvariable('GoodMFieldCut', 0)
184  tm.registerTopoAlgo(alg)
185 
186  alg = AlgConf.MuonSelect( name = 'MU8Fab', inputs = 'MuonTobs', outputs = 'MU8Fab' )
187  alg.addgeneric('InputWidth', HW.muonInputWidth)
188  alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
189  alg.addvariable('MinEtRPC', 8*_et_conversion)
190  alg.addvariable('MinEtTGC', 8*_et_conversion)
191  alg.addvariable('MinEta', 0*_eta_conversion)
192  alg.addvariable('MaxEta', 25*_eta_conversion)
193  alg.addvariable('InnerCoinCut', 0)
194  alg.addvariable('FullStationCut',1)
195  alg.addvariable('GoodMFieldCut', 0)
196  tm.registerTopoAlgo(alg)
197 
198  alg = AlgConf.MuonSelect( name = 'CMU3Vab', inputs = 'MuonTobs', outputs = 'CMU3Vab' )
199  alg.addgeneric('InputWidth', HW.muonInputWidth)
200  alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
201  alg.addvariable('MinEtRPC', 4*_et_conversion)
202  alg.addvariable('MinEtTGC', 3*_et_conversion)
203  alg.addvariable('MinEta', 0*_eta_conversion)
204  alg.addvariable('MaxEta', 10*_eta_conversion)
205  alg.addvariable('InnerCoinCut', 0)
206  alg.addvariable('FullStationCut',0)
207  alg.addvariable('GoodMFieldCut', 0)
208  tm.registerTopoAlgo(alg)
209 
210  alg = AlgConf.MuonSelect( name = 'CMU5VFab', inputs = 'MuonTobs', outputs = 'CMU5VFab' )
211  alg.addgeneric('InputWidth', HW.muonInputWidth)
212  alg.addgeneric('OutputWidth', HW.muonOutputWidthSelect)
213  alg.addvariable('MinEtRPC', 6*_et_conversion)
214  alg.addvariable('MinEtTGC', 5*_et_conversion)
215  alg.addvariable('MinEta', 0*_eta_conversion)
216  alg.addvariable('MaxEta', 10*_eta_conversion)
217  alg.addvariable('InnerCoinCut', 0)
218  alg.addvariable('FullStationCut',1)
219  alg.addvariable('GoodMFieldCut', 0)
220  tm.registerTopoAlgo(alg)
221 
222  #LATE
223  alg = AlgConf.MuonSort_1BC( name = 'LMUs', inputs = 'LateMuonTobArray', outputs = 'LMUs' )
224  alg.addgeneric('InputWidth', HW.muonInputWidth)
225  alg.addgeneric('OutputWidth', 1)
226  alg.addgeneric('nDelayedMuons', 1)
227  alg.addvariable('MinEta', 0*_eta_conversion)
228  alg.addvariable('MaxEta', 25*_eta_conversion)
229  alg.addvariable('InnerCoinCut', 0)
230  alg.addvariable('FullStationCut', 1)
231  alg.addvariable('GoodMFieldCut', 0)
232  tm.registerTopoAlgo(alg)
233 
234  #jJets inputs
235  alg = AlgConf.jJetNoSort( name = 'AjJall_1BC', inputs = 'jJetTobs', outputs = 'AjJall_1BC' )
236  alg.addgeneric('InputWidth', HW.jJetInputWidth)
237  alg.addgeneric('OutputWidth', HW.jJetInputWidth)
238  # reduce number of pipelining registers used in firmware to allow for more
239  # latency to be used inside the KFMET decision algorithm
240  alg.addgeneric('NumRegisters', 1)
241  tm.registerTopoAlgo(alg)
242 
243  #jJ lists
244  # No additional parameters
245  algoList = [
246  {"otype" : "jJ", "ocut" : 50, "olist" : "ab", "etamin" : 0, "etamax" : 32}, # jJab
247  {"otype" : "CjJ", "ocut" : 40, "olist" : "ab", "etamin" : 0, "etamax" : 26}, # CjJab
248  {"otype" : "FjJ", "ocut" : 40, "olist" : "ab", "etamin" : 30, "etamax" : 49}, # FjJab
249  ]
250  for x in algoList:
251  class d:
252  pass
253  for k in x:
254  setattr (d, k, x[k])
255  listname = "%s%s" % (d.otype,d.olist)
256  algoname = AlgConf.jJetSelect
257  alg = algoname( name = listname, inputs = 'jJetTobs', outputs = listname )
258  alg.addgeneric('InputWidth', HW.jJetInputWidth)
259  alg.addgeneric('OutputWidth', HW.jJetOutputWidthSelect)
260  if d.olist == "ab":
261  alg.addvariable('MinET', get_threshold_cut(d.otype, d.ocut)*_et_conversion)
262  alg.addvariable('MinEta', d.etamin*_eta_conversion)
263  alg.addvariable('MaxEta', d.etamax*_eta_conversion)
264  tm.registerTopoAlgo(alg)
265 
266  algoList = [
267  {"otype" : "FjJ", "ocut" : 0, "olist" : "s", "etamin" : 30, "etamax" : 49}, # FjJs
268  {"otype" : "jJ", "ocut" : 0, "olist" : "s", "etamin" : 0, "etamax" : 32}, # jJs
269  {"otype" : "CjJ", "ocut" : 0, "olist" : "s", "etamin" : 0, "etamax" : 26}, # CjJs
270  {"otype" : "AjJ", "ocut" : 0, "olist" : "s", "etamin" : 0, "etamax" : 49}, # AjJs
271  ]
272  for x in algoList:
273  class d:
274  pass
275  for k in x:
276  setattr (d, k, x[k])
277  listname = "%s%s" % (d.otype,d.olist)
278  algoname = AlgConf.jJetSort
279  alg = algoname( name = listname, inputs = 'jJetTobs', outputs = listname )
280  alg.addgeneric('InputWidth', HW.jJetInputWidth)
281  alg.addgeneric('OutputWidth', HW.jJetOutputWidthSort)
282  if d.olist == "ab":
283  alg.addvariable('MinET', d.ocut*_et_conversion)
284  alg.addvariable('MinEta', d.etamin*_eta_conversion)
285  alg.addvariable('MaxEta', d.etamax*_eta_conversion)
286  tm.registerTopoAlgo(alg)
287 
288 
289  #input list needed for ATR-18824
290  # Forward electrons
291  alg = AlgConf.jEmSort( name = 'jEMs25ETA49', inputs = 'jEmTobs', outputs = 'jEMs25ETA49' )
292  alg.addgeneric('InputWidth', HW.jEmInputWidth)
293  alg.addgeneric('OutputWidth', HW.jEmOutputWidthSort)
294  alg.addvariable('MinEta', 25*_eta_conversion)
295  alg.addvariable('MaxEta', 49*_eta_conversion)
296  # Setting no WP for now, use 0-3 for None/L/M/T when optimised
297  alg.addvariable('IsoMin', 0) # Placeholder, see TypeWideThresholdConfig
298  alg.addvariable('Frac1Min', 0)
299  alg.addvariable('Frac2Min', 0)
300  tm.registerTopoAlgo(alg)
301 
302  # MET
303  # No additional parameters
304  alg = AlgConf.jXENoSort( name = 'jXENoSort_1BC', inputs = 'jXETobs', outputs = 'jXENoSort_1BC' )
305  alg.addgeneric('InputWidth', HW.jMetInputWidth)
306  alg.addgeneric('OutputWidth', HW.metOutputWidth)
307  # reduce number of pipelining registers used in firmware to allow for more
308  # latency to be used inside the KFMET decision algorithm
309  alg.addgeneric('NumRegisters', 1)
310  tm.registerTopoAlgo(alg)
311 
312  alg = AlgConf.jXESort( name = 'jXEs', inputs = 'jXETobs', outputs = 'jXEs' )
313  alg.addgeneric('InputWidth', HW.jMetInputWidth)
314  alg.addgeneric('OutputWidth', HW.metOutputWidth)
315  tm.registerTopoAlgo(alg)
316 
317 
318  # Decision algorithms
319 
320  # LAR ZEE
321  # Parameter ordering:
322  # 1. MinEt1
323  # 2. MinEt2
324  # 3. MinInvariantMassSqr
325  # 4. MaxInvariantMassSqr
326  algoList = [
327  {"otype" : "eEM", "ocut1" : 24, "ocut2" : 24, "olist" : "sm", "nleading1" : 2, "minInvm" : 60, "maxInvm" : 100, "inputwidth": HW.eEmOutputWidthSort},
328  ]
329  for x in algoList:
330  class d:
331  pass
332  for k in x:
333  setattr (d, k, x[k])
334  toponame = 'ZEE-eEM24sm2'
335  log.debug("Define %s", toponame)
336  inputList = d.otype + d.olist
337  alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame)
338  alg.addgeneric('InputWidth', d.inputwidth)
339  alg.addgeneric('MaxTob', d.nleading1)
340  alg.addgeneric('NumResultBits', 1)
341  alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion )
342  alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion )
343  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion )
344  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion )
345  tm.registerTopoAlgo(alg)
346 
347  # dimu DR items
348  # Parameter ordering:
349  # 1. MinEt1
350  # 2. MinEt2
351  # 3. MinDeltaRSqr
352  # 4. MaxDeltaRSqr
353  listofalgos=[
354  {"minDr": 0, "maxDr": 15, "mult": 2, "otype1" : "MU3Vab" , "otype2" : "", }, #0DR15-2MU3Vab
355  {"minDr": 0, "maxDr": 24, "mult": 2, "otype1" : "MU3Vab" , "otype2" : "", }, #0DR24-2MU3Vab
356  # a min dR cut is needed when using muons from two lists. Maybe 0.1 is too large
357  {"minDr": 1, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab", }, #1DR15-MU5VFab-MU3Vab
358  {"minDr": 1, "maxDr": 22, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab", }, #1DR22-MU5VFab-MU3Vab
359  {"minDr": 2, "maxDr": 15, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #2DR15-2MU5VFab
360  {"minDr": 0, "maxDr": 22, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #0DR22-2MU5VFab
361  {"minDr": 2, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab" , "otype2" : "", }, #2DR99-2MU3Vab
362 
363  ]
364  for x in listofalgos:
365  class d:
366  pass
367  for k in x:
368  setattr (d, k, x[k])
369  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
370  obj2 = "-%s" % (d.otype2)
371  toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
372  log.debug("Define %s", toponame)
373  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
374  algoname = AlgConf.DeltaRSqrIncl1 if (d.mult>1) else AlgConf.DeltaRSqrIncl2
375  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
376  if (d.mult>1):
377  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
378  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
379  else:
380  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
381  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
382  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
383  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
384  alg.addgeneric('NumResultBits', 1)
385  alg.addvariable('MinET1', 0*_et_conversion)
386  alg.addvariable('MinET2', 0*_et_conversion)
387  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
388  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
389  tm.registerTopoAlgo(alg)
390 
391  # dimu DR with opposite charge, ATR-23073
392  # Parameter ordering:
393  # 1. MinEt1
394  # 2. MinEt2
395  # 3. MinDeltaRSqr
396  # 4. MaxDeltaRSqr
397  listofalgos=[
398  {"minDr": 0, "maxDr": 12, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #0DR12C-2MU3Vab
399  ]
400  for x in listofalgos:
401  class d:
402  pass
403  for k in x:
404  setattr (d, k, x[k])
405  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
406  obj2 = "-%s" % (d.otype2)
407  toponame = "%iDR%iC-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
408  log.debug("Define %s", toponame)
409  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
410  algoname = AlgConf.DeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.DeltaRSqrIncl2Charge
411  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
412  if (d.mult>1):
413  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
414  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
415  else:
416  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
417  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
418  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
419  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
420  alg.addgeneric('NumResultBits', 1)
421  alg.addvariable('MinET1', 0*_et_conversion)
422  alg.addvariable('MinET2', 0*_et_conversion)
423  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
424  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
425  tm.registerTopoAlgo(alg)
426 
427  # dimu INVM+DR with opposite charge, ATR-23073
428  # Parameter ordering:
429  # 1. MinEt1
430  # 2. MinEt2
431  # 3. MinInvariantMassSqr
432  # 4. MaxInvariantMassSqr
433  # 5. MinDeltaRSqr
434  # 6. MaxDeltaRSqr
435  listofalgos=[
436  {"minInvm":7, "maxInvm":22, "minDr": 0, "maxDr": 20, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM22-0DR20C-2MU3Vab
437  ]
438  for x in listofalgos:
439  class d:
440  pass
441  for k in x:
442  setattr (d, k, x[k])
443  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
444  obj2 = "-%s" % (d.otype2)
445  toponame = "%iINVM%i-%iDR%iC-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
446  log.debug("Define %s", toponame)
447  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
448  algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2Charge
449  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
450  if (d.mult>1):
451  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
452  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
453  else:
454  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
455  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
456  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
457  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
458  alg.addgeneric('NumResultBits', 1)
459  alg.addvariable('MinET1', 0*_et_conversion)
460  alg.addvariable('MinET2', 0*_et_conversion)
461  alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
462  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
463  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
464  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
465  tm.registerTopoAlgo(alg)
466 
467  # deta-dphi with ab+ab
468  # Parameter ordering:
469  # 1. MinEt1
470  # 2. MinEt2
471  # 3. MinDeltaEta
472  # 4. MaxDeltaEta
473  # 5. DeltaPhiMin
474  # 6. DeltaPhiMax
475  algolist=[
476  {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 1,
477  "otype1" : "MU5VFab", "ocut1": "", "olist1": "", "nleading1": HW.muonOutputWidthSelect,
478  "otype2" : "MU3Vab" , "ocut2": "", "olist2": "", "nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-MU5VFab-MU3Vab
479  {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 2,
480  "otype1" : "MU5VFab", "ocut1": "", "olist1": "", "nleading1": HW.muonOutputWidthSelect,
481  "otype2" : "" , "ocut2": "", "olist2": "", "nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-2MU5VFab
482  {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 2,
483  "otype1" : "MU3Vab", "ocut1": "", "olist1": "", "nleading1": HW.muonOutputWidthSelect,
484  "otype2" : "" , "ocut2": "", "olist2": "", "nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-2MU3Vab
485  {"minDeta": 5, "maxDeta": 99, "minDphi": 5, "maxDphi": 99, "mult": 2,
486  "otype1" : "MU3VFab", "ocut1": "", "olist1": "","nleading1": HW.muonOutputWidthSelect,
487  "otype2" : "" , "ocut2": "", "olist2": "","nleading2": HW.muonOutputWidthSelect}, #5DETA99-5DPHI99-2MU3VFab
488  { "minDeta": 0, "maxDeta": 24, "minDphi": 4, "maxDphi": 99, "mult": 1,
489  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect,
490  "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect},#0DETA24_4DPHI99_eTAU30ab_eTAU20ab
491  { "minDeta": 0, "maxDeta": 24, "minDphi": 4, "maxDphi": 99, "mult": 1,
492  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect,
493  "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect},#0DETA24_4DPHI99_eTAU30ab_eTAU12ab
494  { "minDeta": 0, "maxDeta": 24, "minDphi": 10, "maxDphi": 99, "mult": 1,
495  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect,
496  "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect},#0DETA24_10DPHI99_eTAU30ab_eTAU12ab
497  ]
498  for x in algolist:
499  class d:
500  pass
501  for k in x:
502  setattr (d, k, x[k])
503  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1+str(d.ocut1)+str(d.olist1))
504  obj2 = "-%s" % (d.otype2+str(d.ocut2)+str(d.olist2))
505  toponame = "%sDETA%s-%sDPHI%s-%s%s" % (d.minDeta, d.maxDeta, d.minDphi, d.maxDphi, obj1, "" if d.mult>1 else obj2)
506  log.debug("Define %s", toponame)
507  inputList = [d.otype1+d.olist1] if (d.mult>1) else [d.otype1+d.olist1, d.otype2+d.olist2]
508  algoname = AlgConf.DeltaEtaPhiIncl1 if (d.mult>1) else AlgConf.DeltaEtaPhiIncl2
509  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
510  alg.addgeneric('NumResultBits', 1)
511  if (d.mult>1):
512  alg.addgeneric('InputWidth', d.nleading1)
513  alg.addgeneric('MaxTob', d.nleading1)
514  alg.addvariable('MinET1', 0*_et_conversion)
515  alg.addvariable('MinET2', 0*_et_conversion)
516  alg.addvariable('MinDeltaEta', d.minDeta*_eta_conversion)
517  alg.addvariable('MaxDeltaEta', d.maxDeta*_eta_conversion)
518  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
519  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
520  else:
521  alg.addgeneric('InputWidth1', d.nleading1)
522  alg.addgeneric('InputWidth2', d.nleading2)
523  alg.addgeneric('MaxTob1', d.nleading1)
524  alg.addgeneric('MaxTob2', d.nleading2)
525  alg.addvariable('MinET1', 0*_et_conversion)
526  alg.addvariable('MinET2', 0*_et_conversion)
527  alg.addvariable('DeltaEtaMin', d.minDeta*_eta_conversion)
528  alg.addvariable('DeltaEtaMax', d.maxDeta*_eta_conversion)
529  alg.addvariable('DeltaPhiMin', d.minDphi*_phi_conversion)
530  alg.addvariable('DeltaPhiMax', d.maxDphi*_phi_conversion)
531  tm.registerTopoAlgo(alg)
532 
533 
534  # (ATR-8194) L1Topo HT Trigger
535  algoList = [
536  {"itemNameMinHT": 150, "minHT": 240, "otype" : "jJ", "ocut" : 50, "olist" : "s", "nleading" : 5, "inputwidth": HW.jJetOutputWidthSort, "oeta" : 32}, #HT150-jJ50s5pETA32
537  {"itemNameMinHT": 190, "minHT": 300, "otype" : "jJ", "ocut" : 40, "olist" : "s", "nleading" : 5, "inputwidth": HW.jJetOutputWidthSort, "oeta" : 21}, #HT190-jJ40s5pETA21
538  ]
539  for x in algoList:
540  class d:
541  pass
542  for k in x:
543  setattr (d, k, x[k])
544  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))
545  log.debug("Define %s", toponame)
546  inputList = d.otype + d.olist
547  alg = AlgConf.JetHT( name = toponame, inputs = inputList, outputs = [toponame] )
548  alg.addgeneric('InputWidth', d.inputwidth)
549  alg.addgeneric('MaxTob', d.nleading)
550  alg.addgeneric('NumRegisters', 2 if d.olist=="all" else 0)
551  alg.addgeneric('NumResultBits', 1)
552  alg.addvariable('MinET', get_threshold_cut(d.otype, d.ocut)*_et_conversion)
553  alg.addvariable('MinEta', 0*_eta_conversion)
554  alg.addvariable('MaxEta', d.oeta*_eta_conversion)
555  alg.addvariable('MinHt', d.minHT*_et_conversion)
556  tm.registerTopoAlgo(alg)
557 
558  #DR for 2MU5
559  # Covers chains: 0DR15-2MU5VFab
560  # 10DR99-2MU5VFab
561  DR_2MU5FMap = [
562  {
563  "algoname" : "DR_2MU5VFab",
564  "minDR" : [0 ,10],
565  "maxDR" : [15,99],
566  "otype1" : "MU5VFab",
567  "mult1" : [2]*2
568  }
569  ]
570 
571 
572  for x in DR_2MU5FMap:
573  class d:
574  pass
575  for k in x:
576  setattr (d, k, x[k])
577  inputList = [ d.otype1 ]
578  toponames = []
579  for bitId in range(len(d.minDR)):
580  toponames.append("%iDR%i-%s%s" % (d.minDR[bitId], d.maxDR[bitId], str(d.mult1[bitId]),
581  d.otype1 )
582  )
583  alg = AlgConf.DeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
584  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
585  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
586  alg.addgeneric('NumResultBits', len(toponames) )
587 
588  for bitId in range(len(toponames)):
589  alg.addvariable('MinET1', 0 * _et_conversion, bitId )
590  alg.addvariable('MinET2', 0 * _et_conversion, bitId )
591  alg.addvariable("DeltaRMin", d.minDR[bitId] * d.minDR[bitId] * _dr_conversion * _dr_conversion, bitId)
592  alg.addvariable("DeltaRMax", d.maxDR[bitId] * d.maxDR[bitId] * _dr_conversion * _dr_conversion, bitId)
593 
594  tm.registerTopoAlgo(alg)
595 
596 
597  # DM/DPHI for eEM
598  # output lines = 0INVM70-27DPHI32-eEM12sm1-eEM12sm6, 0INVM70-27DPHI32-eEM15sm1-eEM15sm6
599  # Parameter ordering
600  # 1. MinEt1
601  # 2. MinEt2
602  # 3. MinMSqr
603  # 4. MaxMSqr
604  # 5. MinDeltaPhi
605  # 6. MaxDeltaPhi
606  eINVM_DPHIMap = [
607  {
608  "algoname" : "INVM_DPHI_eEMsm6",
609  "minInvm" : 0,
610  "maxInvm" : 70,
611  "minDphi" : 27,
612  "maxDphi" : 32,
613  "otype1" : "eEM",
614  "olist1" : "sm",
615  "ocut1List" : [ 12, 15 ],
616  "nleading1" : 1,
617  "otype2" : "eEM",
618  "ocut2List" : [ 12, 15 ],
619  "olist2" : "sm",
620  "nleading2" : 6
621 
622  }
623  ]
624 
625  for x in eINVM_DPHIMap:
626  class d:
627  pass
628  for k in x:
629  setattr (d, k, x[k])
630  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
631  toponames=[]
632  for bitId, ocut1Value in enumerate(d.ocut1List):
633  toponames.append ("%iINVM%i-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDphi, d.maxDphi,
634  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sm" else "",
635  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sm" else ""))
636  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = d.algoname, inputs = inputList, outputs = toponames )
637  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
638  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
639  alg.addgeneric('MaxTob1', d.nleading1)
640  alg.addgeneric('MaxTob2', d.nleading2)
641  alg.addgeneric('NumResultBits', len(toponames))
642  for bitId in range(len(toponames)):
643  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
644  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
645  alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
646  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
647  alg.addvariable('MinDeltaPhi', d.minDphi * _phi_conversion, bitId)
648  alg.addvariable('MaxDeltaPhi', d.maxDphi * _phi_conversion, bitId)
649 
650  tm.registerTopoAlgo(alg)
651 
652 
653  # Boosted DM/DPHI for eEM
654  # output lines = 0INVM70-0DPHI12-eEM9sl1-eEM9sl6,
655  # 0INVM70-0DPHI12-eEM12sl1-eEM12sl6,
656  # 0INVM70-0DPHI12-eEM15sl1-eEM15sl6
657  # Parameter ordering
658  # 1. MinEt1
659  # 2. MinEt2
660  # 3. MinMSqr
661  # 4. MaxMSqr
662  # 5. MinDeltaPhi
663  # 6. MaxDeltaPhi
664  eINVM_DPHIMap = [
665  {
666  "algoname" : "INVM_INVDPHI_eEMsl6",
667  "minInvm" : 0,
668  "maxInvm" : 70,
669  "minDphi" : 0,
670  "maxDphi" : 12,
671  "otype1" : "eEM",
672  "olist1" : "sl",
673  "ocut1List" : [ 9, 12],
674  "nleading1" : 1,
675  "otype2" : "eEM",
676  "ocut2List" : [ 9, 12 ],
677  "olist2" : "sl",
678  "nleading2" : 6
679  }
680  ]
681 
682  for x in eINVM_DPHIMap:
683  class d:
684  pass
685  for k in x:
686  setattr (d, k, x[k])
687  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
688  toponames=[]
689  for bitId, ocut1Value in enumerate(d.ocut1List):
690  toponames.append ("%iINVM%i-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDphi, d.maxDphi,
691  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
692  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
693  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = d.algoname, inputs = inputList, outputs = toponames )
694 
695  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
696  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
697  alg.addgeneric('MaxTob1', d.nleading1)
698  alg.addgeneric('MaxTob2', d.nleading2)
699  alg.addgeneric('NumResultBits', len(toponames))
700  for bitId in range(len(toponames)):
701  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
702  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
703  alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
704  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
705  alg.addvariable('MinDeltaPhi', d.minDphi * _phi_conversion, bitId)
706  alg.addvariable('MaxDeltaPhi', d.maxDphi * _phi_conversion, bitId)
707 
708  tm.registerTopoAlgo(alg)
709 
710 
711  # DM/DR for eEM
712  # output lines = 0INVM70-2DR15-eEM9sl1-eEM9sl6,
713  # 0INVM70-2DR15-eEM12sl1-eEM12sl6,
714  #
715  # Parameter ordering
716  # 1. MinEt1
717  # 2. MinEt2
718  # 3. MinMSqr
719  # 4. MaxMSqr
720  # 5. MinDeltaR
721  # 6. MaxDeltaR
722  eINVM_DRMap = [
723  {
724  "algoname" : "INVM_BOOSTDR_eEMsl6",
725  "minInvm" : 0,
726  "maxInvm" : 70,
727  "minDR" : 2,
728  "maxDR" : 15,
729  "otype1" : "eEM",
730  "olist1" : "sl",
731  "ocut1List" : [ 9, 12 ],
732  "nleading1" : 1,
733  "otype2" : "eEM",
734  "ocut2List" : [ 9, 12 ],
735  "olist2" : "sl",
736  "nleading2" : 6
737  }
738  ]
739 
740  for x in eINVM_DRMap:
741  class d:
742  pass
743  for k in x:
744  setattr (d, k, x[k])
745  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
746  toponames=[]
747  for bitId, ocut1Value in enumerate(d.ocut1List):
748  toponames.append ("%iINVM%i-%iDR%i-%s%s%s%s-%s%s%s%s" % (d.minInvm, d.maxInvm, d.minDR, d.maxDR,
749  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
750  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
751 
752  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
753  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
754  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
755  alg.addgeneric('MaxTob1', d.nleading1)
756  alg.addgeneric('MaxTob2', d.nleading2)
757  alg.addgeneric('NumResultBits', len(toponames))
758  for bitId in range(len(toponames)):
759  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
760  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
761  alg.addvariable('MinMSqr', d.minInvm * d.minInvm * _et_conversion * _et_conversion, bitId)
762  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm * _et_conversion * _et_conversion, bitId)
763  alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
764  alg.addvariable('DeltaRMax', d.maxDR*d.maxDR*_dr_conversion*_dr_conversion, bitId)
765 
766  tm.registerTopoAlgo(alg)
767 
768  # DM/DR Ranges for eEM12
769  # output lines = 0INVM30-2DR15-eEM12sl1-eEM12sl6,
770  # 25INVM70-13DR25-eEM12sl1-eEM12sl6,
771  #
772  # Parameter ordering
773  # 1. MinEt1
774  # 2. MinEt2
775  # 3. MinMSqr
776  # 4. MaxMSqr
777  # 5. MinDeltaR
778  # 6. MaxDeltaR
779  eINVM_Ranges_DRMap = [
780  {
781  "algoname" : "INVM_BOOSTDR_Ranges_eEM12sl6",
782  "minInvm" : [0, 25],
783  "maxInvm" : [30,70],
784  "minDR" : [2,13],
785  "maxDR" : [15,25],
786  "otype1" : "eEM",
787  "olist1" : "sl",
788  "ocut1List" : [12,12],
789  "nleading1" : 1,
790  "otype2" : "eEM",
791  "ocut2List" : [12,12],
792  "olist2" : "sl",
793  "nleading2" : 6
794  }
795  ]
796 
797  for x in eINVM_Ranges_DRMap:
798  class d:
799  pass
800  for k in x:
801  setattr (d, k, x[k])
802  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
803  toponames=[]
804  for bitId, ocut1Value in enumerate(d.ocut1List):
805  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],
806  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
807  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
808 
809  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
810  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
811  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
812  alg.addgeneric('MaxTob1', d.nleading1)
813  alg.addgeneric('MaxTob2', d.nleading2)
814  alg.addgeneric('NumResultBits', len(toponames))
815  for bitId in range(len(toponames)):
816  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
817  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
818  alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
819  alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
820  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
821  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
822 
823  tm.registerTopoAlgo(alg)
824 
825 
826  # DM/DR Ranges for asymmetric eEM12LeEM9L
827  # output lines = 0INVM30-2DR15-eEM12sl1-eEM9sl6,
828  # 25INVM70-13DR25-eEM12sl1-eEM9sl6,
829  #
830  # Parameter ordering
831  # 1. MinEt1
832  # 2. MinEt2
833  # 3. MinMSqr
834  # 4. MaxMSqr
835  # 5. MinDeltaR
836  # 6. MaxDeltaR
837  eINVM_Ranges_Asymm_DRMap = [
838  {
839  "algoname" : "INVM_BOOSTDR_Ranges_Asymm_eEMsl6",
840  "minInvm" : [0, 25],
841  "maxInvm" : [30,70],
842  "minDR" : [2,13],
843  "maxDR" : [15,25],
844  "otype1" : "eEM",
845  "olist1" : "sl",
846  "ocut1List" : [12,12],
847  "nleading1" : 1,
848  "otype2" : "eEM",
849  "ocut2List" : [9,9],
850  "olist2" : "sl",
851  "nleading2" : 6
852  }
853  ]
854 
855  for x in eINVM_Ranges_Asymm_DRMap:
856  class d:
857  pass
858  for k in x:
859  setattr (d, k, x[k])
860  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
861  toponames=[]
862  for bitId, ocut1Value in enumerate(d.ocut1List):
863  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],
864  d.otype1, str(ocut1Value) , d.olist1, str(d.nleading1) if d.olist1=="sl" else "",
865  d.otype2, str(d.ocut2List[bitId]) , d.olist2, str(d.nleading2) if d.olist2=="sl" else ""))
866 
867  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
868  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
869  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
870  alg.addgeneric('MaxTob1', d.nleading1)
871  alg.addgeneric('MaxTob2', d.nleading2)
872  alg.addgeneric('NumResultBits', len(toponames))
873  for bitId in range(len(toponames)):
874  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1List[bitId]) * _et_conversion, bitId)
875  alg.addvariable('MinET2', get_threshold_cut(d.otype1, d.ocut2List[bitId]) * _et_conversion, bitId)
876  alg.addvariable('MinMSqr', d.minInvm[bitId] * d.minInvm[bitId] * _et_conversion * _et_conversion, bitId)
877  alg.addvariable('MaxMSqr', d.maxInvm[bitId] * d.maxInvm[bitId] * _et_conversion * _et_conversion, bitId)
878  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
879  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
880 
881  tm.registerTopoAlgo(alg)
882 
883 
884  # INVM_DR for 2MU5VFab
885  # output lines = 2INVM9-2DR15-2MU5VFab and 8INVM15-0DR22-2MU5VFab
886  INVM_DR_2MU5VFabMap = [
887  {
888  "algoname": "INVM_DR_2MU5VFab",
889  "minInvm" : [2,8],
890  "maxInvm" : [9,15],
891  "minDR" : [2,0],
892  "maxDR" : [15,22],
893  "otype1" : "MU5VFab",
894  "mult1" : 2
895  }
896  ]
897  for x in INVM_DR_2MU5VFabMap:
898  class d:
899  pass
900  for k in x:
901  setattr(d,k,x[k])
902  inputList = d.otype1
903  toponames = []
904  for bitId in range(len(d.minDR)):
905  toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm[bitId], d.maxInvm[bitId],
906  d.minDR[bitId] , d.maxDR[bitId],
907  d.mult1, d.otype1
908  )
909  )
910  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
911  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
912  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
913  alg.addgeneric('NumResultBits', len(toponames))
914  for bitId in range(len(toponames)):
915  alg.addvariable('MinET1', 0*_et_conversion, bitId)
916  alg.addvariable('MinET2', 0*_et_conversion, bitId)
917  alg.addvariable('MinMSqr', d.minInvm[bitId]*d.minInvm[bitId]*_et_conversion*_et_conversion, bitId)
918  alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
919  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
920  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
921  tm.registerTopoAlgo(alg)
922 
923 
924  # INVM for 2MU3VFab
925  # output lines = '7INVM14-2MU3VFab', '7INVM22-2MU3VFab'
926  INVM_2MU3VFab_Map = [
927  {
928  "algoname": "INVM_2MU3VFab",
929  "minInvm" : 7,
930  "maxInvm" : [14,22],
931  "otype1" : "MU3VFab",
932  "mult1" : 2
933  }
934  ]
935  for x in INVM_2MU3VFab_Map:
936  class d:
937  pass
938  for k in x:
939  setattr(d,k,x[k])
940  inputList = d.otype1
941  toponames = []
942  for bitId in range(len(d.maxInvm)):
943  toponames.append("%iINVM%i-%i%s" % ( d.minInvm, d.maxInvm[bitId],
944  d.mult1, d.otype1
945  )
946  )
947  alg = AlgConf.InvariantMassInclusive1( name = d.algoname, inputs = inputList, outputs = toponames)
948  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
949  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
950  alg.addgeneric('NumResultBits', len(toponames))
951  for bitId in range(len(toponames)):
952  alg.addvariable('MinET1', 0*_et_conversion, bitId)
953  alg.addvariable('MinET2', 0*_et_conversion, bitId)
954  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
955  alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
956  tm.registerTopoAlgo(alg)
957 
958 
959 
960  # INVM_EM for Jpsi
961  invm_map = { "algoname": 'INVM_eEMs6' , "ocutlist": [ 9, 15 ], "minInvm": 1, "maxInvm": 5, "otype" : "eEM", "olist" : "s",
962  "nleading" : 1, "inputwidth": HW.eEmOutputWidthSort}
963  for x in [ invm_map ]:
964  class d:
965  pass
966  for k in x:
967  setattr (d, k, x[k])
968  inputList = d.otype + d.olist
969  toponames=[]
970  for ocut in d.ocutlist:
971  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 "")
972  toponames.append(toponame)
973  alg = AlgConf.InvariantMassInclusive2( name = d.algoname, inputs = [inputList, 'eEMs'], outputs = toponames)
974  alg.addgeneric('InputWidth1', d.inputwidth)
975  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
976  alg.addgeneric('MaxTob1', d.nleading)
977  alg.addgeneric('MaxTob2', HW.eEmOutputWidthSort)
978  alg.addgeneric('NumResultBits', len(toponames))
979  for bitid, ocut in enumerate(d.ocutlist):
980  alg.addvariable('MinET1', get_threshold_cut('eEM', ocut)*_et_conversion, bitid)
981  alg.addvariable('MinET2', 0*_et_conversion, bitid)
982  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
983  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitid)
984  tm.registerTopoAlgo(alg)
985 
986 
987  # added for muon-jet:
988  algoList = [
989  {"minDr": 0, "maxDr": 4, "otype1" : "MU3Vab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}, #0DR04-MU3Vab-CjJ40ab
990  {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 80, "olist2" : "ab"}, #0DR04-MU5VFab-CjJ80ab
991  {"minDr": 0, "maxDr": 4, "otype1" : "MU5VFab", "otype2" : "CjJ", "ocut2": 90, "olist2" : "ab"}, #0DR04-MU5VFab-CjJ90ab
992  ]
993  for x in algoList:
994  class d:
995  pass
996  for k in x:
997  setattr (d, k, x[k])
998  toponame = "%iDR%02d-%s-%s%s%s" % (d.minDr, d.maxDr, d.otype1, d.otype2, str(d.ocut2), d.olist2)
999  log.debug("Define %s", toponame)
1000  inputList = [d.otype1, d.otype2 + d.olist2]
1001  alg = AlgConf.DeltaRSqrIncl2( name = toponame, inputs = inputList, outputs = [ toponame ])
1002  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1003  alg.addgeneric('InputWidth2', HW.jJetOutputWidthSelect)
1004  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1005  alg.addgeneric('MaxTob2', HW.jJetOutputWidthSelect)
1006  alg.addgeneric('NumResultBits', 1)
1007  alg.addvariable('MinET1', 0*_et_conversion, 0)
1008  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1009  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1010  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1011  tm.registerTopoAlgo(alg)
1012 
1013  # dimu INVM items
1014  # Parameter ordering
1015  # 1. MinEt1
1016  # 2. MinEt2
1017  # 3. MinMSqr
1018  # 4. MaxMSqr
1019  listofalgos = [
1020  {"minInvm": 2, "maxInvm": 8, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #2INVM8-2MU3Vab
1021  {"minInvm": 2, "maxInvm": 9, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #2INVM9-2MU3Vab
1022  {"minInvm": 8, "maxInvm": 15, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #8INVM15-MU5VFab-MU3Vab
1023  {"minInvm": 2, "maxInvm": 8, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #2INVM8-MU5VFab-MU3Vab
1024  {"minInvm": 2, "maxInvm": 9, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3Vab",}, #2INVM9-MU5VFab-MU3Vab
1025  {"minInvm": 8, "maxInvm": 15, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #8INVM15-2MU5VFab
1026  {"minInvm": 2, "maxInvm": 9, "mult": 2, "otype1" : "MU5VFab", "otype2" : "", }, #2INVM9-2MU5VFab
1027  {"minInvm": 7, "maxInvm": 15, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM15-2MU3Vab
1028  {"minInvm": 7, "maxInvm": 22, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3VFab",}, #7INVM22-MU5VFab-MU3VFab, ATR-21566
1029  {"minInvm": 7, "maxInvm": 14, "mult": 1, "otype1" : "MU5VFab", "otype2" : "MU3VFab",}, #7INVM14-MU5VFab-MU3VFab, ATR-22782
1030  {"minInvm": 7, "maxInvm": 14, "mult": 2, "otype1" : "MU3Vab", "otype2" : "", }, #7INVM14-2MU3Vab, ATR-22782
1031  ]
1032  for x in listofalgos:
1033  class d:
1034  pass
1035  for k in x:
1036  setattr (d, k, x[k])
1037  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1038  obj2 = "-%s" % (d.otype2)
1039  toponame = "%iINVM%i-%s%s" % (d.minInvm, d.maxInvm, obj1, "" if d.mult>1 else obj2)
1040  log.debug("Define %s", toponame)
1041  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1042  algoname = AlgConf.InvariantMassInclusive1 if (d.mult>1) else AlgConf.InvariantMassInclusive2
1043  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1044  if (d.mult>1):
1045  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1046  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1047  else:
1048  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1049  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1050  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1051  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1052  alg.addgeneric('NumResultBits', 1)
1053  alg.addvariable('MinET1', 0*_et_conversion)
1054  alg.addvariable('MinET2', 0*_et_conversion)
1055  alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
1056  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
1057  tm.registerTopoAlgo(alg)
1058 
1059  toponame = "8INVM15-2CMU3Vab"
1060  log.debug("Define %s", toponame)
1061  inputList = ['CMU3Vab']
1062  alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame )
1063  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1064  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1065  alg.addgeneric('NumResultBits', 1)
1066  alg.addvariable('MinET1', 0*_et_conversion)
1067  alg.addvariable('MinET2', 0*_et_conversion)
1068  alg.addvariable('MinMSqr', 8*8*_et_conversion*_et_conversion)
1069  alg.addvariable('MaxMSqr', 15*15*_et_conversion*_et_conversion)
1070  tm.registerTopoAlgo(alg)
1071 
1072  algolist=[
1073  {"minInvm": 2, "maxInvm": 8, "mult": 1, "otype1" : "CMU3Vab", "otype2" :"MU3Vab"}, # 2INVM8-CMU3Vab-MU3Vab
1074  ]
1075  for x in algolist:
1076  class d:
1077  pass
1078  for k in x:
1079  setattr (d, k, x[k])
1080  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1081  obj2 = "-%s" % (d.otype2)
1082  toponame = "%iINVM%i-%s%s" % (d.minInvm, d.maxInvm, obj1, "" if d.mult>1 else obj2)
1083  log.debug("Define %s", toponame)
1084  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1085  algoname = AlgConf.InvariantMassInclusive1 if (d.mult>1) else AlgConf.InvariantMassInclusive2
1086  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1087  if (d.mult>1):
1088  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1089  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1090  alg.addgeneric('RequireOneBarrel', d.onebarrel)
1091  else:
1092  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1093  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1094  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1095  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1096  alg.addgeneric('NumResultBits', 1)
1097  alg.addvariable('MinET1', 0*_et_conversion)
1098  alg.addvariable('MinET2', 0*_et_conversion)
1099  alg.addvariable('MinMSqr', d.minInvm * d.minInvm *_et_conversion*_et_conversion)
1100  alg.addvariable('MaxMSqr', d.maxInvm * d.maxInvm *_et_conversion*_et_conversion)
1101  tm.registerTopoAlgo(alg)
1102 
1103  # dimu DR items
1104  algolist = [
1105  {"minDr": 0, "maxDr": 24, "mult": 2, "otype1" : "CMU3Vab", "otype2" : "", }, #0DR24-2CMU3Vab
1106  {"minDr": 1, "maxDr": 24, "mult": 1, "otype1" : "CMU3Vab", "otype2" : "MU3Vab", }, #1DR24-CMU3Vab-MU3Vab
1107  ]
1108  for x in algolist:
1109  class d:
1110  pass
1111  for k in x:
1112  setattr (d, k, x[k])
1113  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
1114  obj2 = "-%s" % (d.otype2)
1115  toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
1116  log.debug("Define %s", toponame)
1117  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
1118  algoname = AlgConf.DeltaRSqrIncl1 if (d.mult>1) else AlgConf.DeltaRSqrIncl2
1119  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1120  if (d.mult>1):
1121  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1122  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1123  else:
1124  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
1125  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1126  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
1127  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1128  alg.addgeneric('NumResultBits', 1)
1129  alg.addvariable('MinET1', 0*_et_conversion)
1130  alg.addvariable('MinET2', 0*_et_conversion)
1131  alg.addvariable('DeltaRMin', d.minDr*d.minDr *_dr_conversion*_dr_conversion)
1132  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr *_dr_conversion*_dr_conversion)
1133  tm.registerTopoAlgo(alg)
1134 
1135 
1136  # RATIO MATCH dedicated to Exotic #TODO: are eTAU correct to use here (and below)?
1137  toponame = '100RATIO-0MATCH-eTAU40si2-eEMall'
1138  alg = AlgConf.RatioMatch( name = toponame, inputs = [ 'eTAUs', 'eEMall'], outputs = [ toponame ] )
1139  alg.addgeneric('InputWidth1', HW.eTauOutputWidthSort)
1140  alg.addgeneric('InputWidth2', HW.eEmInputWidth)
1141  alg.addgeneric('MaxTob1', 2)
1142  alg.addgeneric('MaxTob2', HW.eEmInputWidth)
1143  alg.addgeneric('NumResultBits', 1)
1144  alg.addvariable('MinET1', get_threshold_cut('eTAU', 40)*_et_conversion)
1145  alg.addvariable('MinET2', 0*_et_conversion)
1146  alg.addvariable('Ratio', 100, 0)
1147  tm.registerTopoAlgo(alg)
1148 
1149  # NOT MATCH dedicated to Exotic
1150  toponame = 'NOT-0MATCH-eTAU40si1-eEMall'
1151  alg = AlgConf.NotMatch( name = toponame, inputs = [ 'eTAUs', 'eEMall'], outputs = [ toponame ] )
1152  alg.addgeneric('InputWidth1', HW.eTauOutputWidthSort)
1153  alg.addgeneric('InputWidth2', HW.eEmInputWidth)
1154  alg.addgeneric('MaxTob1', 1)
1155  alg.addgeneric('MaxTob2', HW.eEmInputWidth)
1156  alg.addgeneric('NumResultBits', 1)
1157  alg.addvariable('MinET1', get_threshold_cut('eTAU', 40)*_et_conversion)
1158  alg.addvariable('MinET2', 0*_et_conversion)
1159  alg.addvariable('EtaMin1', 0*_eta_conversion)
1160  alg.addvariable('EtaMax1', 49*_eta_conversion)
1161  alg.addvariable('EtaMin2', 0*_eta_conversion)
1162  alg.addvariable('EtaMax2', 49*_eta_conversion)
1163  alg.addvariable('DRCut', 0) #TODO: conversion needed here?
1164  tm.registerTopoAlgo(alg)
1165 
1166  # TODO: to be updated with phase1 met, jets
1167  xemap = [{"etcut": 0, "Threlist": [ 40, 50, 55, 60, 65, 75 ]}]
1168  for x in xemap:
1169  class d:
1170  pass
1171  for k in x:
1172  setattr (d, k, x[k])
1173  log.debug("Define %s", toponame)
1174  inputList = ['jXENoSort_1BC', 'AjJall_1BC']
1175  toponames=[]
1176  for minxe in d.Threlist:
1177  toponames.append("KF-jXE%s-AjJall" % (minxe))
1178  alg = AlgConf.KalmanMETCorrection( name = "KF-jXE-AjJall", inputs = inputList, outputs = toponames )
1179  alg.addgeneric('InputWidth', HW.jJetInputWidth)
1180  alg.addgeneric('NumResultBits', len(toponames))
1181  for key, value in KFMETweightParameters.items():
1182  # add weight (scale factor) parameters
1183  # these weights are compacted into 32bit words in order to limit the number
1184  # of registers needed to load them in firmware
1185  alg.addvariable(key, value)
1186  alg.addvariable('MinET', 0)
1187  for bitid,minxe in enumerate(d.Threlist):
1188  alg.addvariable('KFXE', str(minxe*_et_conversion), bitid)
1189  tm.registerTopoAlgo(alg)
1190 
1191 
1192  # LATE MUON : LATE-MU10s1
1193  for x in [
1194  #{"otype" : "LATE-MU", "ocut" : 10, "inputwidth": HW.muonOutputWidthSort},
1195  {"otype" : "LATE-MU", "ocut" : 10, "inputwidth": HW.NumberOfDelayedMuons},
1196  ]:
1197 
1198  class d:
1199  pass
1200  for k in x:
1201  setattr (d, k, x[k])
1202 
1203  toponame = "%s%ss1" % ( d.otype, str(d.ocut) )
1204 
1205  log.debug("Define %s", toponame)
1206 
1207  inputList = 'LMUs'
1208 
1209  alg = AlgConf.EtCut( name = toponame, inputs = inputList, outputs = toponame )
1210  alg.addgeneric('InputWidth', d.inputwidth)
1211  alg.addgeneric('MaxTob', 1)
1212  alg.addgeneric('NumResultBits', 1)
1213  alg.addvariable('MinET', str(d.ocut*_et_conversion))
1214  tm.registerTopoAlgo(alg)
1215 
1216 
1217  # (ATR-12748) fat jet trigger with Simple Cone algo
1218  algoList = [
1219  {"itemNameMinHT": 111, "minHT": 166, "otype" : "CjJ", "ocut" : 40, "olist" : "ab", "nleading" : HW.jJetOutputWidthSelect, "inputwidth": HW.jJetOutputWidthSelect, "oeta" : 26}, #SC111-CjJ40abpETA26
1220  ]
1221  for x in algoList:
1222  class d:
1223  pass
1224  for k in x:
1225  setattr (d, k, x[k])
1226  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))
1227  log.debug("Define %s", toponame)
1228  inputList = d.otype + d.olist
1229  alg = AlgConf.SimpleCone( name = toponame, inputs = inputList, outputs = [toponame] )
1230  alg.addgeneric('InputWidth', d.inputwidth)
1231  alg.addgeneric('NumResultBits', 1)
1232  alg.addvariable('MinET', d.ocut*_et_conversion)
1233  alg.addvariable('MinSumET', d.minHT*_et_conversion)
1234  alg.addvariable('MaxRSqr', 10*10*_dr_conversion*_dr_conversion)
1235  tm.registerTopoAlgo(alg)
1236 
1237  # 0INVM9-eEM9ab-eEMab
1238  algoList = [
1239  {"minInvm" : 0, "maxInvm": 9, "otype" : "eEM", "ocut1" : 9, "olist" : "ab", "inputwidth": HW.eEmOutputWidthSelect, "ocut2" : 0},
1240  ]
1241  for x in algoList:
1242  class d:
1243  pass
1244  for k in x:
1245  setattr (d, k, x[k])
1246  inputList = d.otype + d.olist
1247  toponame = "%iINVM%i-%s%s%s-%s%s" % (d.minInvm, d.maxInvm,
1248  d.otype, str(d.ocut1) , d.olist,
1249  d.otype, d.olist)
1250  alg = AlgConf.InvariantMassInclusive1( name = toponame, inputs = inputList, outputs = toponame)
1251  alg.addgeneric('InputWidth', d.inputwidth)
1252  alg.addgeneric('MaxTob', HW.eEmOutputWidthSelect)
1253  alg.addgeneric('NumResultBits', 1)
1254  alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion)
1255  alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion)
1256  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
1257  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
1258  tm.registerTopoAlgo(alg)
1259 
1260 
1261  # added for b-phys, 0DR03-eEM9ab-CjJ40ab
1262  algoList = [
1263  {"minDr": 0, "maxDr": 3, "otype1" : "eEM" ,"ocut1": 9, "olist1" : "ab", "otype2" : "CjJ", "ocut2": 40, "olist2" : "ab"}
1264  ]
1265  for x in algoList:
1266  class d:
1267  pass
1268  for k in x:
1269  setattr (d, k, x[k])
1270  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)
1271  log.debug("Define %s", toponame)
1272  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
1273  alg = AlgConf.DeltaRSqrIncl2( name = toponame, inputs = inputList, outputs = [ toponame ])
1274  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSelect)
1275  alg.addgeneric('InputWidth2', HW.jJetOutputWidthSelect)
1276  alg.addgeneric('MaxTob1', HW.eEmOutputWidthSelect)
1277  alg.addgeneric('MaxTob2', HW.jJetOutputWidthSelect)
1278  alg.addgeneric('NumResultBits', 1)
1279  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1280  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1281  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1282  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1283  tm.registerTopoAlgo(alg)
1284 
1285 
1286  # Axion 2EM DPHI
1287  #27DPHI32-eEMs1-eEMs6
1288  algoList = [
1289  {"minDphi": 27, "maxDphi": 32, "otype" : "eEM", "ocut1" : 0, "olist" : "s", "nleading1" : 1, "inputwidth1": HW.eEmOutputWidthSort, "ocut2" : 0, "nleading2": 6},
1290  ]
1291  for x in algoList:
1292  class d:
1293  pass
1294  for k in x:
1295  setattr (d, k, x[k])
1296  toponame = "%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.minDphi, d.maxDphi,
1297  d.otype, str(d.ocut1) if d.ocut1 > 0 else "", d.olist, str(d.nleading1) if d.olist=="s" else "",
1298  d.otype, str(d.ocut2) if d.ocut2 > 0 else "", d.olist, str(d.nleading2) if d.olist=="s" else "")
1299  log.debug("Define %s", toponame)
1300  inputList = d.otype + d.olist
1301  alg = AlgConf.DeltaPhiIncl1( name = toponame, inputs = inputList, outputs = toponame )
1302  alg.addgeneric('InputWidth', d.inputwidth1)
1303  alg.addgeneric('MaxTob', d.nleading2)
1304  alg.addgeneric('NumResultBits', 1)
1305  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)
1306  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)
1307  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion, 0)
1308  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, 0)
1309  tm.registerTopoAlgo(alg)
1310 
1311  # Tau dR chains
1312  algolist=[
1313  { "minDr": 0, "maxDr": 28, "otype1" : "eTAU" ,"ocut1": 30, "olist1" : "abm",
1314  "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,"otype2" : "eTAU", "ocut2": 20, "olist2" : "abm",
1315  "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect}, # 0DR28-eTAU30abm-eTAU20abm
1316  ]
1317  for x in algolist:
1318  class d:
1319  pass
1320  for k in x:
1321  setattr (d, k, x[k])
1322  obj1 = "%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1323  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1324  toponame = "%iDR%i-%s%s" % (d.minDr, d.maxDr, obj1, obj2)
1325  log.debug("Define %s", toponame)
1326  inputList = [d.otype1 + d.olist1] if d.otype1==d.otype2 else [d.otype1 + d.olist1, d.otype2 + d.olist2]
1327  algoname = AlgConf.DeltaRSqrIncl1 if d.otype1==d.otype2 else AlgConf.DeltaRSqrIncl2
1328  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
1329  if d.otype1==d.otype2:
1330  alg.addgeneric('InputWidth', d.inputwidth1)
1331  alg.addgeneric('MaxTob', d.nleading1)
1332  else:
1333  alg.addgeneric('InputWidth1', d.inputwidth1)
1334  alg.addgeneric('InputWidth2', d.inputwidth2)
1335  alg.addgeneric('MaxTob1', d.nleading1)
1336  alg.addgeneric('MaxTob2', d.nleading2)
1337  alg.addgeneric('NumResultBits', 1)
1338  if d.otype1==d.otype2:
1339  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion )
1340  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion )
1341  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
1342  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
1343  else:
1344  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , 0)
1345  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , 0)
1346  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion, 0)
1347  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion, 0)
1348  tm.registerTopoAlgo(alg)
1349 
1350 
1351 
1352  # DISAMB Lines with DR Cut
1353  # output lines = '2DISAMB-jJ55ab-0DR25-eTAU30ab-eTAU20ab'
1354  # '2DISAMB-jJ55ab-0DR28-eTAU30ab-eTAU20ab'
1355  # '2DISAMB-jJ50ab-0DR25-eTAU30ab-eTAU20ab',
1356  # '2DISAMB-jJ50ab-0DR28-eTAU30ab-eTAU20ab',
1357  # '2DISAMB-jJ40ab-0DR25-eTAU30ab-eTAU20ab',
1358  # '2DISAMB-jJ40ab-0DR28-eTAU30ab-eTAU20ab',
1359  # '2DISAMB-jJ30ab-0DR25-eTAU30ab-eTAU20ab',
1360  # '2DISAMB-jJ30ab-0DR28-eTAU30ab-eTAU20ab']
1361  DISAMB_DR_jJ_eTau_eTau_Map = [
1362  {
1363  "algoname": "2DISAMB_jJ55ab_DR_eTAU_eTAU",
1364  "disamb" : 2,
1365  "minDR" : 0,
1366  "maxDR" : [25,28],
1367  "otype1" : "eTAU",
1368  "ocut1" : 30,
1369  "olist1": "ab",
1370  "nleading1": HW.eTauOutputWidthSelect,
1371  "inputwidth1": HW.eTauOutputWidthSelect,
1372  "otype2" : "eTAU",
1373  "ocut2" : 20,
1374  "nleading2": HW.eTauOutputWidthSelect,
1375  "inputwidth2": HW.eTauOutputWidthSelect,
1376  "olist2": "ab",
1377  "otype3" : "jJ",
1378  "ocut3" : 55,
1379  "nleading3": HW.jJetOutputWidthSelect,
1380  "inputwidth3": HW.jJetOutputWidthSelect,
1381  "olist3": "ab",
1382  },
1383  {
1384  "algoname": "2DISAMB_jJ50ab_DR_eTAU_eTAU",
1385  "disamb" : 2,
1386  "minDR" : 0,
1387  "maxDR" : [25,28],
1388  "otype1" : "eTAU",
1389  "ocut1" : 30,
1390  "olist1": "ab",
1391  "nleading1": HW.eTauOutputWidthSelect,
1392  "inputwidth1": HW.eTauOutputWidthSelect,
1393  "otype2" : "eTAU",
1394  "ocut2" : 20,
1395  "nleading2": HW.eTauOutputWidthSelect,
1396  "inputwidth2": HW.eTauOutputWidthSelect,
1397  "olist2": "ab",
1398  "otype3" : "jJ",
1399  "ocut3" : 50,
1400  "nleading3": HW.jJetOutputWidthSelect,
1401  "inputwidth3": HW.jJetOutputWidthSelect,
1402  "olist3": "ab",
1403  },
1404  {
1405  "algoname": "2DISAMB_jJ40ab_DR_eTAU_eTAU",
1406  "disamb" : 2,
1407  "minDR" : 0,
1408  "maxDR" : [25, 28],
1409  "otype1" : "eTAU",
1410  "ocut1" : 30,
1411  "olist1": "ab",
1412  "nleading1": HW.eTauOutputWidthSelect,
1413  "inputwidth1": HW.eTauOutputWidthSelect,
1414  "otype2" : "eTAU",
1415  "ocut2" : 20,
1416  "nleading2": HW.eTauOutputWidthSelect,
1417  "inputwidth2": HW.eTauOutputWidthSelect,
1418  "olist2": "ab",
1419  "otype3" : "jJ",
1420  "ocut3" : 40,
1421  "nleading3": HW.jJetOutputWidthSelect,
1422  "inputwidth3": HW.jJetOutputWidthSelect,
1423  "olist3": "ab",
1424  },
1425  {
1426  "algoname": "2DISAMB_jJ30ab_DR_eTAU_eTAU",
1427  "disamb" : 2,
1428  "minDR" : 0,
1429  "maxDR" : [25, 28],
1430  "otype1" : "eTAU",
1431  "ocut1" : 30,
1432  "olist1": "ab",
1433  "nleading1": HW.eTauOutputWidthSelect,
1434  "inputwidth1": HW.eTauOutputWidthSelect,
1435  "otype2" : "eTAU",
1436  "ocut2" : 20,
1437  "nleading2": HW.eTauOutputWidthSelect,
1438  "inputwidth2": HW.eTauOutputWidthSelect,
1439  "olist2": "ab",
1440  "otype3" : "jJ",
1441  "ocut3" : 30,
1442  "nleading3": HW.jJetOutputWidthSelect,
1443  "inputwidth3": HW.jJetOutputWidthSelect,
1444  "olist3": "ab",
1445  }
1446  ]
1447  for x in DISAMB_DR_jJ_eTau_eTau_Map:
1448  class d:
1449  pass
1450  for k in x:
1451  setattr(d,k,x[k])
1452  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1453  toponames = []
1454  for bitId in range(len(d.maxDR)):
1455  obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1456  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1457  obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1458  toponames.append("%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "",
1459  obj3, d.minDR, d.maxDR[bitId], obj1, obj2))
1460 
1461  alg = AlgConf.DisambiguationDRIncl3( name = d.algoname, inputs = inputList, outputs = toponames )
1462  alg.addgeneric('InputWidth1', d.inputwidth1)
1463  alg.addgeneric('InputWidth2', d.inputwidth2)
1464  alg.addgeneric('InputWidth3', d.inputwidth3)
1465  alg.addgeneric('MaxTob1', d.nleading1)
1466  alg.addgeneric('MaxTob2', d.nleading2)
1467  alg.addgeneric('MaxTob3', d.nleading3)
1468  alg.addgeneric('NumResultBits', len(toponames))
1469 
1470  for bitId in range(len(toponames)):
1471  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitId)
1472  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, bitId)
1473  alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, bitId)
1474  alg.addvariable('DisambDRSqrMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
1475  alg.addvariable('DisambDRSqrMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1476  alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, bitId)
1477 
1478  tm.registerTopoAlgo(alg)
1479 
1480 
1481  # DR for eTAU30ab_eTAU20ab
1482  # output lines : '0DR25-eTAU30ab-eTAU20ab'
1483  # '0DR28-eTAU30ab-eTAU20ab'
1484  DR_eTau30_eTau20_Map = [
1485  {
1486  "algoname": "DR_eTAU30ab_eTAU20ab",
1487  "minDR" : 0,
1488  "maxDR" : [25,28],
1489  "otype1" : "eTAU",
1490  "ocut1" : 30,
1491  "olist1": "ab",
1492  "otype2" : "eTAU",
1493  "ocut2" : 20,
1494  "inputwidth": HW.eTauOutputWidthSelect,
1495  "olist2": "ab",
1496  }
1497  ]
1498  for x in DR_eTau30_eTau20_Map:
1499  class d:
1500  pass
1501  for k in x:
1502  setattr(d,k,x[k])
1503  inputList = [d.otype1 + d.olist1]
1504  toponames = []
1505  for bitId in range(len(d.maxDR)):
1506  obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1507  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1508  toponames.append("%dDR%d%s%s" % ( d.minDR, d.maxDR[bitId], obj1, obj2))
1509 
1510  alg = AlgConf.DeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames )
1511 
1512  alg.addgeneric('InputWidth', d.inputwidth)
1513  alg.addgeneric('MaxTob', HW.eTauOutputWidthSelect)
1514  alg.addgeneric('NumResultBits', len(toponames) )
1515 
1516  for bitId in range(len(toponames)):
1517  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitId)
1518  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, bitId)
1519  alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
1520  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
1521 
1522 
1523  tm.registerTopoAlgo(alg)
1524 
1525  # DISAMB 3 lists with DR cut to 2nd and 3rd lists
1526  algolist=[
1527  { "disamb": 2,
1528  "otype1" : "eTAU", "ocut1": 30, "olist1": "abm", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1529  "otype2" : "eTAU", "ocut2": 20, "olist2": "abm", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1530  "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1531  "drcutmin": 0, "drcutmax": 28}, # 2DISAMB-jJ55ab-0DR28-eTAU30abm-eTAU20abm
1532  { "disamb" : 2,
1533  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1534  "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1535  "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1536  "drcutmin": 4 , "drcutmax": 28}, # 2DISAMB-jJ55ab-4DR28-eTAU30ab-eTAU20ab
1537  { "disamb" : 2,
1538  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1539  "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1540  "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1541  "drcutmin": 4 , "drcutmax": 32}, # 2DISAMB-jJ55ab-4DR32-eTAU30ab-eTAU20ab
1542  { "disamb" : 2,
1543  "otype1" : "eTAU", "ocut1": 30, "olist1": "ab", "nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1544  "otype2" : "eTAU", "ocut2": 20, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1545  "otype3" : "jJ" , "ocut3": 55, "olist3": "ab" , "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1546  "drcutmin": 10 , "drcutmax": 32}, # 2DISAMB-jJ55ab-10DR32-eTAU30ab-eTAU20ab
1547  ]
1548  for x in algolist:
1549  class d:
1550  pass
1551  for k in x:
1552  setattr (d, k, x[k])
1553  obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1554  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1555  obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1556  toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
1557  log.debug("Define %s", toponame)
1558  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1559  alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
1560  alg.addgeneric('InputWidth1', d.inputwidth1)
1561  alg.addgeneric('InputWidth2', d.inputwidth2)
1562  alg.addgeneric('InputWidth3', d.inputwidth3)
1563  alg.addgeneric('MaxTob1', d.nleading1)
1564  alg.addgeneric('MaxTob2', d.nleading2)
1565  alg.addgeneric('MaxTob3', d.nleading3)
1566  alg.addgeneric('NumResultBits', 1)
1567  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1568  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1569  alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
1570  alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
1571  alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
1572  alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
1573  tm.registerTopoAlgo(alg)
1574 
1575 
1576  #TLA deta
1577  algoList = [
1578  { "minDeta": 0, "maxDeta": 20, "otype" : "jJ", "ocut1" : 90, "olist" : "s",
1579  "nleading1" : 1, "inputwidth1": HW.jJetOutputWidthSort, "ocut2" : 0, "nleading2": 2}, #0DETA20-jJ90s1-jJs2
1580  { "minDeta": 0, "maxDeta" : 24, "otype" : "eTAU" , "olist" : "s", "inputwidth1": HW.eTauOutputWidthSort,
1581  "ocut1" : 30, "nleading1": 2,
1582  "ocut2" : 12, "nleading2": 2}, #0DETA24_eTAU30s2_eTAU12s2
1583  ]
1584  for x in algoList:
1585  class d:
1586  pass
1587  for k in x:
1588  setattr (d, k, x[k])
1589  toponame = "%iDETA%i-%s%s%s%s-%s%s%s%s" % (d.minDeta, d.maxDeta,
1590  d.otype, d.ocut1 if d.ocut1 > 0 else "", d.olist, d.nleading1,
1591  d.otype, d.ocut2 if d.ocut2 > 0 else "", d.olist, d.nleading2)
1592  log.debug("Define %s", toponame)
1593  inputList = d.otype + d.olist
1594  alg = AlgConf.DeltaEtaIncl1( name = toponame, inputs = inputList, outputs = toponame )
1595  alg.addgeneric('InputWidth', d.inputwidth1)
1596  alg.addgeneric('MaxTob', d.nleading2)
1597  alg.addgeneric('NumResultBits', 1)
1598  alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion, 0)
1599  alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion, 0)
1600  alg.addvariable('MinDeltaEta', d.minDeta*_eta_conversion, 0)
1601  alg.addvariable('MaxDeltaEta', d.maxDeta*_eta_conversion, 0)
1602  tm.registerTopoAlgo(alg)
1603 
1604  #LLPDPHI - ATR-28563
1605  toponame = "0DPHI10-jXE40delay-jJ40s"
1606  alg = AlgConf.DeltaPhiIncl2( name = toponame, inputs = ['jXEs', 'jJs'], outputs = [ toponame ])
1607  alg.addgeneric('NumResultBits', 1)
1608  alg.addgeneric('Delay1', 1)
1609  alg.addgeneric('Delay2', 0)
1610  alg.addgeneric('InputWidth1', HW.metOutputWidth)
1611  alg.addgeneric('InputWidth2', HW.jJetOutputWidthSort)
1612  alg.addgeneric('MaxTob1', 1)
1613  alg.addgeneric('MaxTob2', 6)
1614  alg.addvariable('MinET1', 40*_et_conversion)
1615  alg.addvariable('MinET2', 40*_et_conversion)
1616  alg.addvariable('MinDeltaPhi', 0*_phi_conversion)
1617  alg.addvariable('MaxDeltaPhi', 10*_phi_conversion)
1618  tm.registerTopoAlgo(alg)
1619 
1620  # DISAMB 3 lists with DR cut to 2nd and 3rd lists
1621  algolist=[
1622  { "disamb": 2,
1623  "otype1" : "eTAU", "ocut1": 20, "olist1": "ab","nleading1": HW.eTauOutputWidthSelect, "inputwidth1": HW.eTauOutputWidthSelect,
1624  "otype2" : "eTAU", "ocut2": 12, "olist2": "ab", "nleading2": HW.eTauOutputWidthSelect, "inputwidth2": HW.eTauOutputWidthSelect,
1625  "otype3" : "jJ", "ocut3": 40, "olist3": "ab", "nleading3": HW.jJetOutputWidthSelect, "inputwidth3": HW.jJetOutputWidthSelect,
1626  "drcutmin": 0, "drcutmax": 10}, # 2DISAMB-jJ40ab-0DR10-eTAU20ab-eTAU12ab
1627  ]
1628  for x in algolist:
1629  class d:
1630  pass
1631  for k in x:
1632  setattr (d, k, x[k])
1633  obj1 = "-%s%s%s" % (d.otype1, str(d.ocut1), d.olist1)
1634  obj2 = "-%s%s%s" % (d.otype2, str(d.ocut2), d.olist2)
1635  obj3 = "%s%s%s" % (d.otype3, str(d.ocut3), d.olist3)
1636  toponame = "%sDISAMB-%s-%dDR%d%s%s" % ( str(d.disamb) if d.disamb>0 else "", obj3, d.drcutmin, d.drcutmax, obj1, obj2)
1637  log.debug("Define %s", toponame)
1638  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2, d.otype3 + d.olist3]
1639  alg = AlgConf.DisambiguationDRIncl3( name = toponame, inputs = inputList, outputs = [ toponame ])
1640  alg.addgeneric('InputWidth1', d.inputwidth1)
1641  alg.addgeneric('InputWidth2', d.inputwidth2)
1642  alg.addgeneric('InputWidth3', d.inputwidth3)
1643  alg.addgeneric('MaxTob1', d.nleading1)
1644  alg.addgeneric('MaxTob2', d.nleading2)
1645  alg.addgeneric('MaxTob3', d.nleading3)
1646  alg.addgeneric('NumResultBits', 1)
1647  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, 0)
1648  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion, 0)
1649  alg.addvariable('MinET3', get_threshold_cut(d.otype3, d.ocut3)*_et_conversion, 0)
1650  alg.addvariable('DisambDRSqrMin', d.drcutmin*d.drcutmin*_dr_conversion*_dr_conversion, 0)
1651  alg.addvariable('DisambDRSqrMax', d.drcutmax*d.drcutmax*_dr_conversion*_dr_conversion, 0)
1652  alg.addvariable('DisambDRSqr', d.disamb*d.disamb*_dr_conversion*_dr_conversion, 0)
1653  tm.registerTopoAlgo(alg)
1654 
1655  # jINVM + DPHI
1656  NFFDphimap = [
1657  { "itemNameMinInvm": 400, "minInvm": 640 , "minDphi": 0, "maxDphiList": [26, 24, 22, 20],
1658  "otype1" : "AjJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
1659  "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
1660  ]
1661  for x in NFFDphimap:
1662  class d:
1663  pass
1664  for k in x:
1665  setattr (d, k, x[k])
1666  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
1667  toponames=[]
1668  for maxDphi in d.maxDphiList:
1669  toponames.append ("%iINVM-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.itemNameMinInvm, d.minDphi, maxDphi,
1670  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
1671  d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
1672  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'jINVM_DPHI', inputs = inputList, outputs = toponames)
1673  alg.addgeneric('InputWidth1', d.inputwidth)
1674  alg.addgeneric('InputWidth2', d.inputwidth)
1675  alg.addgeneric('MaxTob1', d.nleading1)
1676  alg.addgeneric('MaxTob2', d.nleading2)
1677  alg.addgeneric('NumResultBits', len(toponames))
1678  for bitid,maxDphi in enumerate(d.maxDphiList):
1679  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
1680  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
1681  alg.addvariable('MinMSqr', d.minInvm*d.minInvm *_et_conversion*_et_conversion , bitid)
1682  alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
1683  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion , bitid)
1684  alg.addvariable('MaxDeltaPhi', maxDphi*_phi_conversion, bitid)
1685  tm.registerTopoAlgo(alg)
1686 
1687 
1688  # jINVM_NFF + DPHI
1689  NFFDphimap = [
1690  { "itemNameMinInvm": 400, "minInvm": 640 , "minDphi": 0, "maxDphiList": [26, 24, 22, 20],
1691  "otype1" : "jJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
1692  "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
1693  ]
1694  for x in NFFDphimap:
1695  class d:
1696  pass
1697  for k in x:
1698  setattr (d, k, x[k])
1699  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
1700  toponames=[]
1701  for maxDphi in d.maxDphiList:
1702  toponames.append ("%iINVM-%iDPHI%i-%s%s%s%s-%s%s%s%s" % (d.itemNameMinInvm, d.minDphi, maxDphi,
1703  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
1704  d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
1705  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'jINVM_DPHI_NFF', inputs = inputList, outputs = toponames)
1706  alg.addgeneric('InputWidth1', d.inputwidth)
1707  alg.addgeneric('InputWidth2', d.inputwidth)
1708  alg.addgeneric('MaxTob1', d.nleading1)
1709  alg.addgeneric('MaxTob2', d.nleading2)
1710  alg.addgeneric('NumResultBits', len(toponames))
1711  for bitid,maxDphi in enumerate(d.maxDphiList):
1712  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
1713  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
1714  alg.addvariable('MinMSqr', d.minInvm*d.minInvm *_et_conversion*_et_conversion , bitid)
1715  alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
1716  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion , bitid)
1717  alg.addvariable('MaxDeltaPhi', maxDphi*_phi_conversion, bitid)
1718  tm.registerTopoAlgo(alg)
1719 
1720 
1721  # CF
1722  algoList = [
1723  { "itemNameMinInvm": 400, "minInvm": 640, "otype1" : "AjJ", "ocut1": 60, "olist1" : "s", "nleading1" : 6, "inputwidth1": HW.jJetOutputWidthSort,
1724  "otype2" : "AjJ", "ocut2": 50, "olist2" : "s", "nleading2" : 6, "inputwidth2": HW.jJetOutputWidthSort, "applyEtaCut":1,
1725  "minEta1": 0 ,"maxEta1": 32 , "minEta2": 30 ,"maxEta2": 49 , }, #400INVM-AjJ60s6pETA32-AjJ50s6p30ETA49
1726  ]
1727  for x in algoList:
1728  class d:
1729  pass
1730  for k in x:
1731  setattr (d, k, x[k])
1732  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)
1733  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)
1734  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist2]
1735  toponame = "%iINVM-%s%s" % (d.itemNameMinInvm, obj1, obj2)
1736  alg = AlgConf.InvariantMassInclusive2( name = toponame, inputs = inputList, outputs = toponame)
1737  alg.addgeneric('InputWidth1', d.inputwidth1)
1738  alg.addgeneric('InputWidth2', d.inputwidth2)
1739  alg.addgeneric('MaxTob1', d.nleading1)
1740  alg.addgeneric('MaxTob2', d.nleading2)
1741  alg.addgeneric('NumResultBits', 1)
1742  if (d.applyEtaCut>0):
1743  alg.addgeneric('ApplyEtaCut', d.applyEtaCut)
1744  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion )
1745  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion )
1746  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion )
1747  alg.addvariable('MaxMSqr', _no_m_upper_threshold )
1748  if (d.applyEtaCut>0):
1749  alg.addvariable('MinEta1', d.minEta1*_eta_conversion )
1750  alg.addvariable('MaxEta1', d.maxEta1*_eta_conversion )
1751  alg.addvariable('MinEta2', d.minEta2*_eta_conversion )
1752  alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion )
1753  tm.registerTopoAlgo(alg)
1754 
1755  # jINVM
1756  NFFmap = [
1757  { "itemNameMinInvmList": [300, 400, 500, 700], "minInvmList": [480, 640, 800, 1100] ,
1758  "otype1" : "AjJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
1759  "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
1760  ]
1761  for x in NFFmap:
1762  class d:
1763  pass
1764  for k in x:
1765  setattr (d, k, x[k])
1766  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
1767  toponames=[]
1768  for minInvm in d.itemNameMinInvmList:
1769  toponames.append ("%iINVM-%s%s%s%s-%s%s%s%s" % (minInvm,
1770  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
1771  d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
1772  alg = AlgConf.InvariantMassInclusive2( name = 'jINVM', inputs = inputList, outputs = toponames)
1773  alg.addgeneric('InputWidth1', d.inputwidth)
1774  alg.addgeneric('InputWidth2', d.inputwidth)
1775  alg.addgeneric('MaxTob1', d.nleading1)
1776  alg.addgeneric('MaxTob2', d.nleading2)
1777  alg.addgeneric('NumResultBits', len(toponames))
1778  for bitid,minInvm in enumerate(d.minInvmList):
1779  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
1780  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
1781  alg.addvariable('MinMSqr', minInvm*minInvm*_et_conversion*_et_conversion , bitid)
1782  alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
1783  tm.registerTopoAlgo(alg)
1784 
1785  # jINVM_NFF
1786  NFFmap = [
1787  { "itemNameMinInvmList": [300, 400, 500, 700], "minInvmList": [480, 640, 800, 1100] ,
1788  "otype1" : "jJ", "ocut1" : 60, "olist1" : "s", "nleading1" : 6, "inputwidth": HW.jJetOutputWidthSort,
1789  "otype2" : "AjJ", "ocut2" : 50, "olist2" : "s", "nleading2" : 6 }
1790  ]
1791  for x in NFFmap:
1792  class d:
1793  pass
1794  for k in x:
1795  setattr (d, k, x[k])
1796  inputList = [d.otype1 + d.olist1, d.otype2 + d.olist1]
1797  toponames=[]
1798  for minInvm in d.itemNameMinInvmList:
1799  toponames.append ("%iINVM-%s%s%s%s-%s%s%s%s" % (minInvm,
1800  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
1801  d.otype2, str(d.ocut2) , d.olist2, str(d.nleading2) if d.olist2=="s" else ""))
1802  alg = AlgConf.InvariantMassInclusive2( name = 'jINVM_NFF', inputs = inputList, outputs = toponames)
1803  alg.addgeneric('InputWidth1', d.inputwidth)
1804  alg.addgeneric('InputWidth2', d.inputwidth)
1805  alg.addgeneric('MaxTob1', d.nleading1)
1806  alg.addgeneric('MaxTob2', d.nleading2)
1807  alg.addgeneric('NumResultBits', len(toponames))
1808  for bitid,minInvm in enumerate(d.minInvmList):
1809  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion , bitid)
1810  alg.addvariable('MinET2', get_threshold_cut(d.otype2, d.ocut2)*_et_conversion , bitid)
1811  alg.addvariable('MinMSqr', minInvm*minInvm*_et_conversion*_et_conversion , bitid)
1812  alg.addvariable('MaxMSqr', _no_m_upper_threshold , bitid) # no upper threshold
1813  tm.registerTopoAlgo(alg)
1814 
1815  #ATR-19355
1816  # Parameter ordering
1817  # 1. MinEt
1818  # 2. MinMSqr
1819  # 3. MaxMSqr
1820  toponame = "0INVM10-3MU3Vab"
1821  log.debug("Define %s", toponame)
1822  inputList = 'MU3Vab'
1823  alg = AlgConf.InvariantMassThreeTOBsIncl1( name = toponame, inputs = inputList, outputs = toponame )
1824  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1825  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1826  alg.addgeneric('NumResultBits', 1)
1827  alg.addvariable('MinET1', 0*_et_conversion)
1828  alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
1829  alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
1830  tm.registerTopoAlgo(alg)
1831 
1832  toponame = "0INVM10-3MU3VFab"
1833  log.debug("Define %s", toponame)
1834  inputList = 'MU3VFab'
1835  alg = AlgConf.InvariantMassThreeTOBsIncl1( name = toponame, inputs = inputList, outputs = toponame )
1836  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1837  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1838  alg.addgeneric('NumResultBits', 1)
1839  alg.addvariable('MinET1', 0*_et_conversion)
1840  alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
1841  alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
1842  tm.registerTopoAlgo(alg)
1843 
1844  #ATR-19638, 3muon, not all with the same charge
1845  toponame = "0INVM10C-3MU3Vab"
1846  log.debug("Define %s", toponame)
1847  inputList = 'MU3Vab'
1848  alg = AlgConf.InvariantMassThreeTOBsIncl1Charge( name = toponame, inputs = inputList, outputs = toponame )
1849  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
1850  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
1851  alg.addgeneric('NumResultBits', 1)
1852  alg.addvariable('MinET1', 0*_et_conversion)
1853  alg.addvariable('MinMSqr', 0*_et_conversion*_et_conversion)
1854  alg.addvariable('MaxMSqr', 10*10*_et_conversion*_et_conversion)
1855  tm.registerTopoAlgo(alg)
1856 
1857 
1858  # LFV
1859  # output lines: 0INVM10-0DR15-eEM10abl-MU8Fab, 0INVM10-0DR15-eEM15abl-MU5VFab
1860  # Parameter ordering
1861  # 1. MinEt1
1862  # 2. MinEt2
1863  # 3. MinMSqr
1864  # 4. MaxMSqr
1865  # 5. MinEta1
1866  # 6. MaxEta1
1867  # 7. MinEta2
1868  # 8. MaxEta2
1869  # 9. DeltaRMin
1870  # 10. DeltaRMax
1871  INVM_DR_eEM_MU_Map = [{
1872  "algoname": "INVM_DR_eEM_MU",
1873  "minInvm" : 0,
1874  "maxInvm" : 10,
1875  "minDR" : 0,
1876  "maxDR" : 15,
1877  "otype1" : "eEM",
1878  "ocut1" : [10,15],
1879  "olist1": "abl",
1880  "otype2" : "MU",
1881  "olist2": ["Fab","VFab"],
1882  "ocut2" : 5,
1883  "ocut2Offset" : [3,0]
1884 
1885  }]
1886 
1887  for x in INVM_DR_eEM_MU_Map:
1888  class d:
1889  pass
1890  for k in x:
1891  setattr(d,k,x[k])
1892  inputList = [d.otype1 + d.olist1, d.otype2 + str(d.ocut2) + d.olist2[1] ]
1893  toponames = []
1894  for bitId in range(len(d.ocut1)):
1895  obj1 = "-%s%s%s" % (d.otype1, str( d.ocut1[bitId] ) , d.olist1)
1896  obj2 = "-%s%s%s" % (d.otype2, str( d.ocut2 + d.ocut2Offset[bitId] ) , d.olist2[bitId])
1897  toponames.append("%dINVM%d-%dDR%d%s%s" % ( d.minInvm, d.maxInvm, d.minDR, d.maxDR, obj1, obj2))
1898 
1899  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl2( name = d.algoname, inputs = inputList, outputs = toponames )
1900 
1901  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSelect)
1902  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
1903  alg.addgeneric('MaxTob1', HW.eEmOutputWidthSort)
1904  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
1905  alg.addgeneric('ApplyEtaCut', 1)
1906 
1907  alg.addgeneric('NumResultBits', len(toponames) )
1908 
1909  for bitId in range(len(toponames)):
1910  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1[bitId])*_et_conversion, bitId)
1911  alg.addvariable('MinET2', (d.ocut2 + d.ocut2Offset[bitId])*_et_conversion, bitId)
1912  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
1913  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitId)
1914  alg.addvariable('MinEta1', 0*_eta_conversion, bitId)
1915  alg.addvariable('MaxEta1', 49*_eta_conversion, bitId)
1916  alg.addvariable('MinEta2', 0*_eta_conversion, bitId)
1917  alg.addvariable('MaxEta2', 49*_eta_conversion, bitId)
1918  alg.addvariable('DeltaRMin', d.minDR*d.minDR*_dr_conversion*_dr_conversion, bitId)
1919  alg.addvariable('DeltaRMax', d.maxDR*d.maxDR*_dr_conversion*_dr_conversion, bitId)
1920 
1921 
1922  tm.registerTopoAlgo(alg)
1923 
1924 
1925 
1926 
1927 
1928  #ATR-18824 ZAFB-DPHI
1929  # TODO: update with fwd electrons
1930  # Parameter ordering
1931  # 1. MinEt1
1932  # 2. MinEt2
1933  # 3. MinMSqr
1934  # 4. MaxMSqr
1935  # 5. MinEta1
1936  # 6. MaxEta1
1937  # 7. MinEta2
1938  # 8. MaxEta2
1939  # 9. MinDeltaPhi
1940  # 10. MaxDeltaPhi
1941  ZAFBDphimap = [
1942  { "minInvm": 60 , "minDphiList": [4, 25], "maxDphi": 32, "minEta2": 25, "maxEta2": 49,
1943  "inputwidth1": HW.eEmOutputWidthSelect, "otype1" : "eEM", "ocut1" : 18, "olist1" : "abm",
1944  "nleading1" : HW.eEmOutputWidthSelect, "inputwidth2": HW.jEmOutputWidthSort, "ocut2" : 20, "nleading2" : 6 }
1945  ]
1946  for x in ZAFBDphimap:
1947  class d:
1948  pass
1949  for k in x:
1950  setattr (d, k, x[k])
1951  inputList = [d.otype1 + d.olist1, 'jEMs25ETA49']
1952  toponames=[]
1953  for minDphi in d.minDphiList:
1954  toponames.append ("%iINVM-%02dDPHI%i-%s%s%s%s-jEM%ss%s%iETA%i" % (d.minInvm, minDphi, d.maxDphi,
1955  d.otype1, str(d.ocut1) , d.olist1, str(d.nleading1) if d.olist1=="s" else "",
1956  str(d.ocut2) , str(d.nleading2) , d.minEta2, d.maxEta2))
1957  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = 'ZAFB_DPHI', inputs = inputList, outputs = toponames)
1958  alg.addgeneric('InputWidth1', d.inputwidth1)
1959  alg.addgeneric('InputWidth2', d.inputwidth2)
1960  alg.addgeneric('MaxTob1', d.nleading1)
1961  alg.addgeneric('MaxTob2', d.nleading2)
1962  alg.addgeneric('NumResultBits', len(toponames))
1963  alg.addgeneric('ApplyEtaCut', 1)
1964  for bitid,minDphi in enumerate(d.minDphiList):
1965  alg.addvariable('MinET1', get_threshold_cut(d.otype1, d.ocut1)*_et_conversion, bitid)
1966  alg.addvariable('MinET2', get_threshold_cut('jEM', d.ocut2)*_et_conversion, bitid)
1967  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitid)
1968  alg.addvariable('MaxMSqr', _no_m_upper_threshold, bitid)
1969  alg.addvariable('MinEta1', 0*_eta_conversion, bitid)
1970  alg.addvariable('MaxEta1', 49*_eta_conversion, bitid)
1971  alg.addvariable('MinEta2', d.minEta2*_eta_conversion, bitid)
1972  alg.addvariable('MaxEta2', d.maxEta2*_eta_conversion, bitid)
1973  alg.addvariable('MinDeltaPhi', minDphi*_phi_conversion, bitid)
1974  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion, bitid)
1975  tm.registerTopoAlgo(alg)
1976 
1977  # ATR-19302, ATR-21637
1978  listofalgos=[
1979  {"minInvm": 0,"maxInvm": 70,"minDphi": 27,"maxDphi": 32,"otype":"eEM","olist":"s","ocut1":9,"nleading1":1,"ocut2":9,"nleading2":6,}, #0INVM70-27DPHI32-eEM9s1-eEM9s6
1980  {"minInvm": 0,"maxInvm": 70,"minDphi": 27,"maxDphi": 32,"otype":"eEM","olist":"sl","ocut1":9,"nleading1":1,"ocut2":9,"nleading2":6,}, #0INVM70-27DPHI32-eEM9sl1-eEM9sl6
1981  ]
1982  for x in listofalgos:
1983  class d:
1984  pass
1985  for k in x:
1986  setattr (d, k, x[k])
1987  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))
1988  log.debug("Define %s", toponame)
1989  inputList = [d.otype + d.olist, d.otype + d.olist]
1990  alg = AlgConf.InvariantMassDeltaPhiInclusive2( name = toponame, inputs = inputList, outputs = toponame )
1991  alg.addgeneric('InputWidth1', HW.eEmOutputWidthSort)
1992  alg.addgeneric('InputWidth2', HW.eEmOutputWidthSort)
1993  alg.addgeneric('MaxTob1', d.nleading1)
1994  alg.addgeneric('MaxTob2', d.nleading2)
1995  alg.addgeneric('NumResultBits', 1)
1996  alg.addvariable('MinET1', get_threshold_cut(d.otype, d.ocut1)*_et_conversion)
1997  alg.addvariable('MinET2', get_threshold_cut(d.otype, d.ocut2)*_et_conversion)
1998  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
1999  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2000  alg.addgeneric('ApplyEtaCut', 1)
2001  alg.addvariable('MinEta1', 0*_eta_conversion)
2002  alg.addvariable('MaxEta1',49*_eta_conversion)
2003  alg.addvariable('MinEta2', 0*_eta_conversion)
2004  alg.addvariable('MaxEta2',49*_eta_conversion)
2005  alg.addvariable('MinDeltaPhi', d.minDphi*_phi_conversion)
2006  alg.addvariable('MaxDeltaPhi', d.maxDphi*_phi_conversion)
2007  tm.registerTopoAlgo(alg)
2008 
2009 
2010  # DR Map for INVM_DR_2MU3 Trigger. Output lines:
2011  #'7INVM22-0DR20-2MU3Vab'
2012  #'7INVM22-0DR12-2MU3Vab'
2013  INVM_DR_2MU3Vab_Map = [
2014  {
2015  "algoname": "7INVM22_DR_2MU3Vab",
2016  "minInvm" : 7,
2017  "maxInvm" : 22,
2018  "minDR" : [0,0],
2019  "maxDR" : [12,20],
2020  "otype1" : "MU3Vab",
2021  "mult1" : 2
2022  }
2023  ]
2024  for x in INVM_DR_2MU3Vab_Map:
2025  class d:
2026  pass
2027  for k in x:
2028  setattr(d,k,x[k])
2029  inputList = d.otype1
2030  toponames = []
2031  for bitId in range(len(d.minDR)):
2032  toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm, d.maxInvm,
2033  d.minDR[bitId] , d.maxDR[bitId],
2034  d.mult1, d.otype1
2035  )
2036  )
2037  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
2038  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2039  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2040  alg.addgeneric('NumResultBits', len(toponames))
2041  for bitId in range(len(toponames)):
2042  alg.addvariable('MinET1', 0*_et_conversion, bitId)
2043  alg.addvariable('MinET2', 0*_et_conversion, bitId)
2044  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion, bitId)
2045  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion, bitId)
2046  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2047  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2048  tm.registerTopoAlgo(alg)
2049 
2050 
2051  # INVM_DR_2MU3VFab
2052  # Output lines: '2INVM9-0DR15-2MU3VFab'
2053  # '7INVM11-25DR99-2MU3VFab',
2054 
2055 
2056  INVM_DR_2MU3VFab_Map = [
2057  {
2058  "algoname": "INVM_DR_2MU3VFab",
2059  "minInvm" : [2,7],
2060  "maxInvm" : [9,11,22],
2061  "minDR" : [0,25],
2062  "maxDR" : [15,99],
2063  "otype1" : "MU3VFab",
2064  "mult1" : 2
2065  }
2066  ]
2067  for x in INVM_DR_2MU3VFab_Map:
2068  class d:
2069  pass
2070  for k in x:
2071  setattr(d,k,x[k])
2072  inputList = d.otype1
2073  toponames = []
2074  for bitId in range(len(d.minDR)):
2075  toponames.append("%iINVM%i-%iDR%i-%i%s" % ( d.minInvm[bitId], d.maxInvm[bitId],
2076  d.minDR[bitId] , d.maxDR[bitId],
2077  d.mult1, d.otype1
2078  )
2079  )
2080  alg = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1( name = d.algoname, inputs = inputList, outputs = toponames)
2081  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2082  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2083  alg.addgeneric('NumResultBits', len(toponames))
2084  for bitId in range(len(toponames)):
2085  alg.addvariable('MinET1', 0*_et_conversion, bitId)
2086  alg.addvariable('MinET2', 0*_et_conversion, bitId)
2087  alg.addvariable('MinMSqr', d.minInvm[bitId]*d.minInvm[bitId]*_et_conversion*_et_conversion, bitId)
2088  alg.addvariable('MaxMSqr', d.maxInvm[bitId]*d.maxInvm[bitId]*_et_conversion*_et_conversion, bitId)
2089  alg.addvariable('DeltaRMin', d.minDR[bitId]*d.minDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2090  alg.addvariable('DeltaRMax', d.maxDR[bitId]*d.maxDR[bitId]*_dr_conversion*_dr_conversion, bitId)
2091  tm.registerTopoAlgo(alg)
2092 
2093 
2094 
2095  #ATR-19720 and ATR-22782, BPH DR+M dimuon
2096  listofalgos=[
2097  {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #2INVM9-0DR15-MU5VFab-MU3Vab
2098  {"minInvm": 8, "maxInvm": 15, "minDr": 0, "maxDr": 22, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #8INVM15-0DR22-MU5VFab-MU3Vab
2099  {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 2, "otype1" : "MU3Vab", "otype2": "", }, #2INVM9-0DR15-2MU3Vab
2100 
2101 
2102  {"minInvm": 0, "maxInvm": 16, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #0INVM16-20DR99-2MU3Vab
2103  {"minInvm": 0, "maxInvm": 16, "minDr": 15, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #0INVM16-15DR99-2MU3Vab
2104  {"minInvm": 8, "maxInvm": 15, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-20DR99-2MU3Vab
2105  {"minInvm": 8, "maxInvm": 15, "minDr": 15, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-15DR99-2MU3Vab
2106 
2107  {"minInvm": 7, "maxInvm": 22, "minDr": 0, "maxDr": 20, "mult": 2, "otype1" : "MU3VFab", "otype2": "",}, #7INVM22-0DR20-2MU3VFab, ATR-21566
2108 
2109  {"minInvm": 8, "maxInvm": 15, "minDr": 0, "maxDr": 22, "mult": 1, "otype1" : "CMU5VFab","otype2": "CMU3Vab",}, #8INVM15-0DR22-CMU5VFab-CMU3Vab
2110 
2111  {"minInvm": 7, "maxInvm": 14, "minDr": 0, "maxDr": 25, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab", }, #7INVM14-0DR25-MU5VFab-MU3Vab
2112  {"minInvm": 7, "maxInvm": 11, "minDr": 25, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #7INVM11-25DR99-2MU3Vab
2113  {"minInvm": 7, "maxInvm": 14, "minDr": 0, "maxDr": 25, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3VFab", }, #7INVM14-0DR25-MU5VFab-MU3VFab
2114 
2115 
2116  ]
2117  for x in listofalgos:
2118  class d:
2119  pass
2120  for k in x:
2121  setattr (d, k, x[k])
2122  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
2123  obj2 = "-%s" % (d.otype2)
2124  toponame = "%iINVM%i-%iDR%i-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
2125  log.debug("Define %s", toponame)
2126  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
2127  algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1 if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2
2128  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2129  if (d.mult>1):
2130  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2131  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2132  else:
2133  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
2134  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2135  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
2136  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2137  alg.addgeneric('NumResultBits', 1)
2138  alg.addvariable('MinET1', 0*_et_conversion)
2139  alg.addvariable('MinET2', 0*_et_conversion)
2140  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2141  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2142  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
2143  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
2144  tm.registerTopoAlgo(alg)
2145 
2146  #ATR-19639, BPH DR+M+OS dimuon
2147  listofalgos=[
2148  {"minInvm": 2, "maxInvm": 9, "minDr": 0, "maxDr": 15, "mult": 1, "otype1" : "MU5VFab", "otype2": "MU3Vab",}, #2INVM9-0DR15-C-MU5VFab-MU3Vab
2149  {"minInvm": 8, "maxInvm": 15, "minDr": 20, "maxDr": 99, "mult": 2, "otype1" : "MU3Vab", "otype2": "",}, #8INVM15-20DR99-C-2MU3Vab
2150  ]
2151  for x in listofalgos:
2152  class d:
2153  pass
2154  for k in x:
2155  setattr (d, k, x[k])
2156  obj1 = "%s%s" % ((str(d.mult) if d.mult>1 else ""), d.otype1)
2157  obj2 = "-%s" % (d.otype2)
2158  toponame = "%iINVM%i-%iDR%i-C-%s%s" % (d.minInvm, d.maxInvm, d.minDr, d.maxDr, obj1, "" if d.mult>1 else obj2)
2159  log.debug("Define %s", toponame)
2160  inputList = [d.otype1] if (d.mult>1) else [d.otype1, d.otype2]
2161  algoname = AlgConf.InvariantMassInclusiveDeltaRSqrIncl1Charge if (d.mult>1) else AlgConf.InvariantMassInclusiveDeltaRSqrIncl2Charge
2162  alg = algoname( name = toponame, inputs = inputList, outputs = [ toponame ])
2163  if (d.mult>1):
2164  alg.addgeneric('InputWidth', HW.muonOutputWidthSelect)
2165  alg.addgeneric('MaxTob', HW.muonOutputWidthSelect)
2166  else:
2167  alg.addgeneric('InputWidth1', HW.muonOutputWidthSelect)
2168  alg.addgeneric('InputWidth2', HW.muonOutputWidthSelect)
2169  alg.addgeneric('MaxTob1', HW.muonOutputWidthSelect)
2170  alg.addgeneric('MaxTob2', HW.muonOutputWidthSelect)
2171  alg.addgeneric('NumResultBits', 1)
2172  alg.addvariable('MinET1', 0*_et_conversion)
2173  alg.addvariable('MinET2', 0*_et_conversion)
2174  alg.addvariable('MinMSqr', d.minInvm*d.minInvm*_et_conversion*_et_conversion)
2175  alg.addvariable('MaxMSqr', d.maxInvm*d.maxInvm*_et_conversion*_et_conversion)
2176  alg.addvariable('DeltaRMin', d.minDr*d.minDr*_dr_conversion*_dr_conversion)
2177  alg.addvariable('DeltaRMax', d.maxDr*d.maxDr*_dr_conversion*_dr_conversion)
2178  tm.registerTopoAlgo(alg)
2179 
2180 
2181  # CEP_CjJ
2182  CEPmap = [
2183  {"algoname": 'CEP_CjJ', "minETlist": [90, 100]}
2184  ]
2185  for x in CEPmap:
2186  class d:
2187  pass
2188  for k in x:
2189  setattr (d, k, x[k])
2190  inputList = ['CjJs']
2191  toponames=[]
2192  for minET in d.minETlist: # noqa: F821
2193  toponames.append ("CEP-CjJ%is6" % (minET)) # noqa: F821
2194  alg = AlgConf.ExclusiveJets( name = d.algoname, inputs = inputList, outputs = toponames) # noqa: F821
2195  alg.addgeneric('InputWidth', HW.jJetOutputWidthSort) # noqa: F821
2196  alg.addgeneric('MaxTob', HW.jJetOutputWidthSort) # noqa: F821
2197  alg.addgeneric('NumResultBits', len(toponames)) # noqa: F821
2198  alg.addvariable('PtScale', 1.4*10) # noqa: F821
2199  alg.addvariable('PtShift', 20*_et_conversion) # noqa: F821
2200  for bitid,minET in enumerate(d.minETlist): # noqa: F821
2201  alg.addvariable('MinET1', get_threshold_cut('CjJ', minET)*_et_conversion, bitid)# noqa: F821
2202  alg.addvariable('MinXi', 13600.0*_et_conversion*0.02, bitid) # noqa: F821
2203  alg.addvariable('MaxXi', 13600.0*_et_conversion*0.05, bitid) # noqa: F821
2204  tm.registerTopoAlgo(alg)
hist_file_dump.d
d
Definition: hist_file_dump.py:137
python.L1.Config.TopoAlgoDef.TopoAlgoDef.registerTopoAlgos
def registerTopoAlgos(tm)
Definition: TopoAlgoDef.py:21
python.L1.Config.L1CaloThresholdMapping.get_threshold_cut
def get_threshold_cut(threshold_type, threshold_val)
Definition: L1CaloThresholdMapping.py:155
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
str
Definition: BTagTrackIpAccessor.cxx:11
python.L1.Config.TopoAlgoDef.TopoAlgoDef
Definition: TopoAlgoDef.py:18