69 **kwargs) -> ComponentAccumulator:
70 assert isinstance(toBeEmulatedTriggers, list)
71 assert isinstance(InputChain_EMTopo, str)
72 assert isinstance(InputJetContainer_EMTopo, str)
73 assert isinstance(InputJetContainer_EMTopoPresel, str)
74 assert isinstance(InputJetContainer_PFlow, str)
75 assert isinstance(InputJetContainer_PFlowPresel, str)
76 assert isinstance(InputJetContainer_a4tcemsubjesJet, str)
77 assert isinstance(InputJetContainer_SplitJet, str)
78 assert isinstance(InputJetContainer_GSCJet, str)
79
80 from AthenaCommon.Logging import logging
81 log = logging.getLogger('TrigBtagEmulationToolCfg')
82
83 period = -1
84 if flags.GeoModel.Run is LHCPeriod.Run2:
85 period = 2
86 from Campaigns.Utils import Campaign, getMCCampaign
87 campaign = getMCCampaign(flags.Input.Files)
88 if len(InputJetContainer_a4tcemsubjesJet) == 0:
89 InputJetContainer_a4tcemsubjesJet = 'HLT_xAOD__JetContainer_a4tcemsubjesFS' if campaign == Campaign.MC20a or flags.Input.DataYear == 2016 else 'HLT_xAOD__JetContainer_a4tcemsubjesISFS'
90 if len(InputJetContainer_SplitJet) == 0:
91 InputJetContainer_SplitJet = 'HLT_xAOD__JetContainer_SplitJet'
92 if len(InputJetContainer_GSCJet) == 0:
93 if campaign != Campaign.MC20a and flags.Input.DataYear != 2016:
94 InputJetContainer_GSCJet = 'HLT_xAOD__JetContainer_GSCJet'
95
96 if "StreamAOD" not in flags.Input.ProcessingTags:
97 import PyUtils.PoolFile as PF
98 PF.PoolOpts.FAST_MODE = True
99 for fname in flags.Input.Files:
100 pool_file = PF.PoolFile(fname, verbose=False)
101 btag_link_exists = any("BTagBtagToJetAssociator" in d.name for d in pool_file.data)
102 if not btag_link_exists:
103 log.error(f"BTagBtagToJetAssociator not found in input file {fname}. Emulation of b-jet chains will be incorrect.")
104 elif flags.GeoModel.Run is LHCPeriod.Run3:
105 period = 3
106 if len(InputChain_EMTopo) == 0:
107 InputChain_EMTopo = 'HLT_j45_subjesgsc_ftf_L1J15'
108 if len(InputJetContainer_EMTopo) == 0:
109 InputJetContainer_EMTopo = 'HLT_AntiKt4EMTopoJets_subjesIS'
110 if len(InputJetContainer_EMTopoPresel) == 0:
111 InputJetContainer_EMTopoPresel = 'HLT_AntiKt4EMTopoJets_subjesIS'
112 if len(InputJetContainer_PFlow) == 0:
113 InputJetContainer_PFlow = 'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf'
114 if len(InputJetContainer_PFlowPresel) == 0:
115 InputJetContainer_PFlowPresel = 'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf'
116 else:
117 raise ValueError(f"Unsupported LHC Period {flags.GeoModel.Run}.")
118
119
120 chainDefinitions = {}
121 for chain in toBeEmulatedTriggers:
122 if period == 3:
123 from TriggerMenuMT.HLT.Config.Utility.DictFromChainName import dictFromChainName
124 from TriggerMenuMT.HLT.Config.Utility.ChainDefInMenu import ChainProp
125 chainDict = dictFromChainName(flags, chain)
126 chainParts = ['L1item:' + chainDict['L1item']]
127 for chainPart in chainDict['chainParts']:
128
129
130 partDefinition = ''
131 partDefinition += 'L1threshold:' + chainPart['L1threshold']
132 partDefinition += '|name:' + chainPart['chainPartName']
133 partDefinition += '|multiplicity:' + chainPart['multiplicity']
134 partDefinition += '|threshold:' + chainPart['threshold']
135 partDefinition += '|etaRange:' + chainPart['etaRange']
136 partDefinition += '|jvt:' + (chainPart['jvt'] if chainPart['jvt'] else '-99999')
137 partDefinition += '|tagger:' + chainPart['bTag']
138 partDefinition += '|jetpresel:' + chainPart['trkpresel']
139 partDefinition += '|dijetmass:' + (chainPart['hypoScenario'][len('DJMASS'):] if ('DJMASS' in chainPart['hypoScenario']) else 'None')
140 partDefinition += '|isPFlow:' + ('True' if (chainPart['constitType'] == 'pf') else 'False')
141 partDefinition += '|isShared:' + ('True' if ('SHARED' in chainPart['chainPartName']) else 'False')
142 partDefinition += '|GSCthreshold:-99999'
143 chainParts.append(partDefinition)
144 chainName = chain.name if isinstance(chain, ChainProp) else chain
145 chainDefinitions[chainName] = chainParts
146 elif period == 2:
147 from ROOT.ChainNameParser import HLTChainInfo
148 chainInfo = HLTChainInfo(chain)
149 chainParts = ['L1item:' + chainInfo.l1Item()]
150 for legInfo in chainInfo:
151 eta = '0eta320'
152 tagger = ''
153 gscthreshold = '-99999'
154 for part in legInfo.legParts:
155 if part.startswith('b'):
156 tagger = part
157 elif 'eta' in part:
158 eta = part
159 elif part.startswith('gsc'):
160 gscthreshold = str(part)[3:]
161 partDefinition = ''
162 partDefinition += 'L1threshold:' + chainInfo.l1Item()
163 partDefinition += '|name:' + legInfo.legName()
164 partDefinition += '|multiplicity:' + str(legInfo.multiplicity)
165 partDefinition += '|threshold:' + str(legInfo.threshold)
166 partDefinition += '|etaRange:' + eta
167 partDefinition += '|jvt:-99999'
168 partDefinition += '|tagger:' + tagger
169 partDefinition += '|jetpresel:nopresel'
170 partDefinition += '|dijetmass:None'
171 partDefinition += '|isPFlow:False'
172 partDefinition += '|isShared:False'
173 partDefinition += '|GSCthreshold:' + gscthreshold
174 chainParts.append(partDefinition)
175 chainDefinitions[chain] = chainParts
176
177
178
179
180 acc = ComponentAccumulator()
181
182
183 tdt = acc.getPrimaryAndMerge(TrigDecisionToolCfg(flags))
184
185
186 kwargs.setdefault('EmulatedChainDefinitions', chainDefinitions)
187 kwargs.setdefault('TrigDecisionTool', tdt)
188 kwargs.setdefault('LHCPeriod', period)
189
190 if period == 3:
191 kwargs.setdefault('JM_PFlow_CNT' , acc.popToolsAndMerge(jetPFlowCNTManagerToolCfg(flags,
192 JetContainerName=InputJetContainer_PFlow)))
193
194 kwargs.setdefault('JM_EMTopo_PRESEL', acc.popToolsAndMerge(jetEMTopoPRESELManagerToolCfg(flags,
195 JetContainerName=InputJetContainer_EMTopoPresel)))
196 from TrigBjetHypo.TrigBjetBtagHypoTool import bTaggingWP
197 from TrigBjetHypo.TrigBjetBtagHypoTool import bbTaggingWP
198
199 working_points = { "newTagger" : 1.234 }
200 working_points.update(bTaggingWP)
201 working_points.update(bbTaggingWP)
202 kwargs.setdefault('FTD_Remapping',
203 {"DL1d20210519r22_pu" : "DL1dEMUL_pu",
204 "DL1d20210519r22_pc" : "DL1dEMUL_pc",
205 "DL1d20210519r22_pb" : "DL1dEMUL_pb"})
206
207 elif period == 2:
208 kwargs.setdefault('JM_a4tcemsubjes_CNT' , acc.popToolsAndMerge(jetHLTCNTManagerToolCfg(flags,
209 JetContainerName=InputJetContainer_a4tcemsubjesJet)))
210
211 kwargs.setdefault('JM_Split_CNT' , acc.popToolsAndMerge(jetSplitManagerToolCfg(flags,
212 JetContainerName=InputJetContainer_SplitJet)))
213
214 kwargs.setdefault('JM_GSC_CNT' , acc.popToolsAndMerge(jetGSCManagerToolCfg(flags,
215 JetContainerName=InputJetContainer_GSCJet)))
216
217 working_points = {
218 "mv2c2040": 0.75,
219 "mv2c2050": 0.50,
220 "mv2c2060": -0.0224729,
221 "mv2c2070": -0.509032,
222 "mv2c2077": -0.764668,
223 "mv2c2085": -0.938441,
224 }
225 working_points.update({
226 "mv2c1040": 0.978,
227 "mv2c1050": 0.948,
228 "mv2c1060": 0.846,
229 "mv2c1070": 0.580,
230 "mv2c1077": 0.162,
231 "mv2c1085": -0.494
232 })
233
234 kwargs.setdefault('WorkingPoints', working_points)
235 acc.setPrivateTools(CompFactory.Trig.TrigBtagEmulationTool('TrigBtagEmulationTool', **kwargs))
236 return acc
237