2 from collections
import namedtuple
3 from AthenaCommon.Logging
import logging
4 log = logging.getLogger(__name__)
6 from ..Base.TopoAlgos
import EMMultiplicityAlgo, TauMultiplicityAlgo, JetMultiplicityAlgo, XEMultiplicityAlgo, LArSaturationAlgo, ZeroBiasAlgo
7 from ..Base.TopoAlgorithms
import AlgType, AlgCategory
11 Defines the TopoAlgorithms that calculate multiplicities for L1Calo thresholds
12 The thresholds have to be explicitly defined here.
17 emThresholds_3bits = [
18 'eEM5',
'eEM7',
'eEM9',
'eEM10L',
20 emThresholds_2bits = [
21 'eEM12L',
'eEM15',
'eEM18',
'eEM18L',
'eEM18M',
'eEM22M',
26 emVarThresholds_2bits = [
27 'eEM24VM',
'eEM26',
'eEM26L',
'eEM26M',
'eEM26T',
'eEM28M',
28 'eEM1',
'eEM2',
'eEM20M',
'eEM24M',
35 for em
in emThresholds_3bits:
38 nbits = 3, classtype=
'eEmMultiplicity')
39 tm.registerTopoAlgo(alg)
41 for em
in emThresholds_2bits:
44 nbits = 2, classtype=
'eEmMultiplicity')
45 tm.registerTopoAlgo(alg)
47 for em
in emVarThresholds_2bits:
50 nbits = 2, classtype=
'eEmVarMultiplicity')
51 tm.registerTopoAlgo(alg)
53 emThresholds_2bits = [
58 for em
in emThresholds_2bits:
61 nbits = 2, classtype=
'jEmMultiplicity')
62 tm.registerTopoAlgo(alg)
64 etauThresholds_3bits = [
65 'eTAU1',
'eTAU12',
'eTAU20',
'eTAU70',
67 jtauThresholds_3bits = [
70 ctauThresholds_3bits = [
71 'cTAU12M',
'cTAU20M',
'cTAUSPARE1',
73 etauThresholds_2bits = [
74 'eTAU20L',
'eTAU20M',
'eTAU30',
'eTAU30M',
'eTAU35',
'eTAU35M',
'eTAU40HM',
'eTAU60',
'eTAU80',
'eTAU140',
75 'eTAU40HT',
'eTAU60HM',
'eTAU60HL',
'eTAU80HL',
77 jtauThresholds_2bits = [
80 ctauThresholds_2bits = [
81 'cTAU30M',
'cTAU35M',
'cTAU50M',
87 for tau
in etauThresholds_3bits:
90 nbits = 3, classtype=
'eTauMultiplicity')
91 tm.registerTopoAlgo(alg)
93 for tau
in jtauThresholds_3bits:
96 nbits = 3, classtype=
'jTauMultiplicity')
97 tm.registerTopoAlgo(alg)
99 for tau
in ctauThresholds_3bits:
102 nbits = 3, classtype=
'cTauMultiplicity')
103 tm.registerTopoAlgo(alg)
105 for tau
in etauThresholds_2bits:
108 nbits = 2, classtype=
'eTauMultiplicity')
109 tm.registerTopoAlgo(alg)
111 for tau
in jtauThresholds_2bits:
114 nbits = 2, classtype=
'jTauMultiplicity')
115 tm.registerTopoAlgo(alg)
117 for tau
in ctauThresholds_2bits:
120 nbits = 2, classtype=
'cTauMultiplicity')
121 tm.registerTopoAlgo(alg)
124 jJThresholds_3bits = [
125 'jJ5',
'jJ10',
'jJ20',
'jJ30',
'jJ30p0ETA25',
'jJ40',
'jJ40p0ETA25',
'jJ50',
'jJ55',
'jJ55p0ETA23',
'jJ60',
127 jJThresholds_2bits = [
128 'jJ70p0ETA23',
'jJ80',
'jJ80p0ETA25',
'jJ85p0ETA21',
130 'jJ140',
'jJ160',
'jJ180',
'jJ500',
132 'jJ40p30ETA49',
'jJ50p30ETA49',
'jJ60p30ETA49',
'jJ90p30ETA49',
'jJ125p30ETA49',
136 'jJ5p30ETA49',
'jJ10p30ETA49',
142 for jJet
in jJThresholds_3bits:
145 nbits = 3, classtype=
'jJetMultiplicity')
146 tm.registerTopoAlgo(alg)
148 for jJet
in jJThresholds_2bits:
151 nbits = 2, classtype=
'jJetMultiplicity')
152 tm.registerTopoAlgo(alg)
155 gJThresholds_3bits = [
'gJ20p0ETA25',
'gJ20p25ETA49',
'gJSPARE1', ]
156 gJThresholds_2bits = [
'gJ50p0ETA25',
'gJ100p0ETA25',
'gJ400p0ETA25' ]
158 for gJet
in gJThresholds_3bits:
161 nbits = 3, classtype=
'gJetMultiplicity')
162 tm.registerTopoAlgo(alg)
164 for gJet
in gJThresholds_2bits:
167 nbits = 2, classtype=
'gJetMultiplicity')
168 tm.registerTopoAlgo(alg)
170 gLJThresholds_2bits = [
171 'gLJ80p0ETA25',
'gLJ100p0ETA25',
'gLJ140p0ETA25',
'gLJ160p0ETA25',
176 'gLJSPARE1',
'gLJSPARE2',
'gLJSPARE3',
179 for gLJet
in gLJThresholds_2bits:
182 nbits = 2, classtype=
'gLJetMultiplicity')
183 tm.registerTopoAlgo(alg)
186 'gXEJWOJ60',
'gXEJWOJ70',
'gXEJWOJ80',
'gXEJWOJ100',
'gXEJWOJ110',
'gXEJWOJ120',
'gXEJWOJ500',
188 'gXENC70',
'gXENC100',
190 'jXE60',
'jXE70',
'jXE80',
'jXE90',
'jXE100',
'jXE110',
'jXE120',
'jXE500',
192 'jXEC100',
'jTE200',
'jTEC200',
'jTEFWD100',
'jTEFWDA100',
'jTEFWDC100',
193 'gTE3',
'gTE5',
'gTE10',
'gTE200',
196 'jTE3',
'jTE4',
'jTE5',
'jTE10',
'jTE20',
'jTE50',
197 'jTE100',
'jTE600',
'jTE1500',
'jTE4000',
'jTE6500',
'jTE8300',
'jTE9000',
'jTE10000',
'jTE12000',
198 'jTEFWDA1',
'jTEFWDC1',
'jTEFWDA5',
'jTEFWDC5',
'jTEFWD8300',
207 for XE
in XEThresholds:
211 tm.registerTopoAlgo(alg)
222 List of the constraints in terms of multiplicity algorithms, to make sure the menu fits
225 The Phase-I L1Topo boards contain 2 FPGAs, with 2 output fibers each (connected to the CTP).
226 Up to 96 bits per fiber.
238 multLimits = namedtuple(
'ML', [
'thrtype',
'conn',
'nbit',
'startbit',
'endbit'])
241 multLimits(thrtype=
'eEM', conn=
'Topo1Opt0', nbit=3, startbit=0, endbit=11),
242 multLimits(thrtype=
'eEM', conn=
'Topo1Opt0', nbit=2, startbit=24, endbit=43),
243 multLimits(thrtype=
'eEMV', conn=
'Topo1Opt0', nbit=2, startbit=44, endbit=63),
244 multLimits(thrtype=
'ZeroBiasA', conn=
'Topo1Opt0', nbit=1, startbit=64, endbit=64),
247 multLimits(thrtype=
'eTAU', conn=
'Topo1Opt1', nbit=3, startbit=0, endbit=8 ),
248 multLimits(thrtype=
'eTAU', conn=
'Topo1Opt1', nbit=2, startbit=12, endbit=35),
249 multLimits(thrtype=
'gLJ', conn=
'Topo1Opt1', nbit=2, startbit=40, endbit=55),
250 multLimits(thrtype=
'gJ', conn=
'Topo1Opt1', nbit=3, startbit=58, endbit=66),
251 multLimits(thrtype=
'gJ', conn=
'Topo1Opt1', nbit=2, startbit=70, endbit=75),
252 multLimits(thrtype=
'eTAU', conn=
'Topo1Opt1', nbit=2, startbit=78, endbit=81),
255 multLimits(thrtype=
'jJ', conn=
'Topo1Opt2', nbit=3, startbit=0, endbit=32),
256 multLimits(thrtype=
'jJ', conn=
'Topo1Opt2', nbit=2, startbit=36, endbit=73),
259 multLimits(thrtype=
'jTAU', conn=
'Topo1Opt3', nbit=3, startbit=0, endbit=2 ),
260 multLimits(thrtype=
'jTAU', conn=
'Topo1Opt3', nbit=2, startbit=6, endbit=7 ),
261 multLimits(thrtype=
'cTAU', conn=
'Topo1Opt3', nbit=3, startbit=14, endbit=22),
262 multLimits(thrtype=
'cTAU', conn=
'Topo1Opt3', nbit=2, startbit=23, endbit=30),
263 multLimits(thrtype=
'jEM', conn=
'Topo1Opt3', nbit=2, startbit=31, endbit=36),
264 multLimits(thrtype=
'LArSaturation', conn=
'Topo1Opt3', nbit=1, startbit=37, endbit=37),
265 multLimits(thrtype=
'ZeroBiasB', conn=
'Topo1Opt3', nbit=1, startbit=38, endbit=38),
266 multLimits(thrtype=
'EN', conn=
'Topo1Opt3', nbit=1, startbit=39, endbit=86),
269 for conn
in l1menu.connectors:
270 if 'Topo1' not in conn.name
or conn.legacy:
continue
272 for tl
in conn.triggerLines:
273 if 'Perf' in tl.name:
continue
275 algo = l1menu.topoAlgos.topoAlgos[AlgCategory.MULTI][AlgType.MULT][f
'Mult_{tl.name}']
278 if 'LArSaturation' in algo.name:
279 thrtype =
'LArSaturation'
280 elif 'XE' in algo.input
or 'TE' in algo.input
or 'MHT' in algo.input:
282 elif 'eEmVar' in algo.classtype:
285 for ml
in multiplicities:
286 if conn.name == ml.conn
and thrtype == ml.thrtype
and algo.nbits == ml.nbit
and tl.startbit >= ml.startbit
and tl.endbit <= ml.endbit:
289 raise RuntimeError(f
'The multiplicity algorithm {algo.name} with startbit {tl.startbit} does not fit in the current Topo1 and CTP FWs. If this is intended, please correct the multiplicity constraints and communicate the new menu to the L1Topo and CTP groups.')
292 for etl
in conn.emptyTriggerLines:
293 log.debug(
'Empty Multiplicity placeholder in bits %i-%i of %s', etl.startbit, etl.endbit, conn.name)
294 for ml
in multiplicities:
296 if conn.name == ml.conn
and etl.startbit >= ml.startbit
and etl.endbit <= ml.endbit:
297 raise RuntimeError(f
'One of the Empty or (Empty, nbits) Multiplicity algorithm placeholders in the L1 Menu is overlapping with the declared multiplicity algorithm bit ranges ({conn.name}, bits {etl.startbit}-{etl.endbit}). Check the bit mapping and algorithm alignments!')