96def MUON5KernelCfg(flags, name='MUON5Kernel', **kwargs):
97 """Configure the derivation framework driving algorithm (kernel) for MUON5"""
98 acc = ComponentAccumulator()
99
100 stream_name= 'StreamDAOD_MUON5'
101
102 kwargs.setdefault("MuonContainer", "Muons")
103 kwargs.setdefault("IdTrkContainer", "InDetTrackParticles")
104 kwargs.setdefault("MsTrkContainer", "ExtrapolatedMuonTrackParticles")
105 kwargs.setdefault("scheduleThinning", True)
106
107
108
109
110 from DerivationFrameworkPhys.PhysCommonConfig import PhysCommonAugmentationsCfg
111 acc.merge(PhysCommonAugmentationsCfg(flags, TriggerListsHelper = kwargs['TriggerListsHelper']))
112
113
114 diMuonSelAcc = Muon5MumuSelectionCfg(flags,
115 MuonContainer= kwargs["MuonContainer"],
116 IdTrackContainer=kwargs["IdTrkContainer"])
117
118
119
120
121 dimuon_flags = ["pass{flag}".format(flag = algo.BranchPrefix) for algo in diMuonSelAcc.getEventAlgos()]
122 skimmingORs = [f"DIMU_{flag} > 0" for flag in dimuon_flags ]
123 acc.merge(diMuonSelAcc)
124
125
126
127
128
129
130 MUON5AugmentTools = []
131 muonThinFlags = []
132 trkThinFlags = []
133
134 Muon5ElElSelectionTool = acc.popToolsAndMerge(Muon5ElElSelectionCfg(flags))
135 acc.addPublicTool(Muon5ElElSelectionTool)
136 MUON5AugmentTools.append(Muon5ElElSelectionTool)
137 skimmingORs.append("(count( EGAM1_DiElectronMass3 > 60.0*GeV ) >= 1)")
138
139
140
141 from DerivationFrameworkMuons.TrackIsolationDecoratorConfig import TrackIsolationCfg
142 acc.merge(TrackIsolationCfg(flags, TrackCollection="InDetTrackParticles"))
143 acc.merge(TrackIsolationCfg(flags, TrackCollection="ExtrapolatedMuonTrackParticles"))
144
145 from IsolationSelection.IsolationSelectionConfig import IsoCloseByAlgsCfg
146 contNames = [ "Muons", "Electrons", "Photons" ]
147 acc.merge(IsoCloseByAlgsCfg(flags, isPhysLite = False, containerNames = contNames, useSelTools = True, stream_name = stream_name))
148
149
150 from DerivationFrameworkMuons.MuonsToolsConfig import MuonCaloDepositAlgCfg
151 acc.merge(MuonCaloDepositAlgCfg(flags,
152 name = "MuonCaloDepositAlg",
153 ContainerKey="Muons"))
154 acc.merge(MuonCaloDepositAlgCfg(flags,
155 name = "IdTrkCaloDepositDecorator",
156 ContainerKey="InDetTrackParticles"))
158 from BTagging.BTagTrackAugmenterAlgConfig import BTagTrackAugmenterAlgCfg
159 acc.merge(BTagTrackAugmenterAlgCfg(
160 flags,
161 prefix="btagIp_",
162 TrackCollection="InDetTrackParticles",
163 PrimaryVertexCollectionName="PrimaryVertices"
164 ))
165
166 if flags.Input.isMC:
167
168 from DerivationFrameworkFlavourTag.FtagDerivationConfig import TrackTruthDecoratorCfg
169 acc.merge(TrackTruthDecoratorCfg(flags))
170
171 from ParticleJetTools.TruthVertexDecoratorConfig import TruthVertexDecoratorsCfg
172 acc.merge(TruthVertexDecoratorsCfg(flags))
173
174
175
176
177
178
179
180 elReq1 = '(Electrons.pt > 25*GeV && abs(Electrons.eta) < 2.5 && Electrons.DFCommonElectronsLHMedium)'
181 elReq2 = '(Electrons.pt > 3*GeV && abs(Electrons.eta) < 2.8 && Electrons.DFCommonElectronsLHLoose)'
182 muReq1 = '(Muons.DFCommonMuonPassPreselection && Muons.DFCommonMuonPassIDCuts && Muons.pt>25*GeV && abs(Muons.eta) <2.5)'
183 muReq2 = '(Muons.DFCommonMuonPassPreselection && Muons.DFCommonMuonPassIDCuts && Muons.pt>3*GeV && abs(Muons.eta) <2.8)'
184
185 el1 = '(count('+elReq1+') >= 1)'
186 el2 = '(count('+elReq2+') >= 1)'
187 mu1 = '(count('+muReq1+') >= 1)'
188 mu2 = '(count('+muReq2+') >= 1)'
189
190 emuSel='(('+el1+"&&"+mu2+')'+'||'+'('+el2+"&&"+mu1+'))'
191 skimmingORs.append(emuSel)
192
193 lepSelection = '||'.join(skimmingORs)
194
195 MUON5SkimmingTools = []
196 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import xAODStringSkimmingToolCfg
197
198
199 SkimArgs={}
200 if not (flags.Reco.EnableTrigger or flags.Trigger.triggerConfig == 'INFILE'):
201 SkimArgs["TrigDecisionTool"] = ""
202 MUON5SkimmingTool1 = acc.getPrimaryAndMerge(xAODStringSkimmingToolCfg(flags,
203 name = "MUON5SkimmingTool1",
204 expression = lepSelection,
205 **SkimArgs))
206 MUON5SkimmingTools.append(MUON5SkimmingTool1)
207
208
209
210
211
212 MUON5ThinningTools = []
213
214
215 from DerivationFrameworkInDet.InDetToolsConfig import TrackParticleThinningCfg
216 MUON5TrackThinningTool = acc.getPrimaryAndMerge(TrackParticleThinningCfg(flags,
217 name = "MUON5TrackThinningTool",
218 StreamName = stream_name,
219 SelectionString = "abs(InDetTrackParticles.DFCommonInDetTrackZ0AtPV) < 35.0 && abs(InDetTrackParticles.eta) < 3.2",
220 InDetTrackParticlesKey = "InDetTrackParticles")
221 )
222
223 MUON5ThinningTools.append(MUON5TrackThinningTool)
224
225
226 from DerivationFrameworkCalo.DerivationFrameworkCaloConfig import CaloClusterThinningCfg
227 from DerivationFrameworkMuons.MuonsToolsConfig import AnalysisMuonThinningAlgCfg
228
229
230 fwdTracks = "InDetForwardTrackParticles"
231 if fwdTracks not in flags.Input.Collections:
232 fwdTracks = ""
233 acc.merge(AnalysisMuonThinningAlgCfg(flags,
234 name = "AnalysisMuonThinningAlgMUON5",
235 MuonPassFlags = muonThinFlags,
236 TrkPassFlags = trkThinFlags,
237 StreamName = stream_name,
238 IdTrkFwdThinning=fwdTracks))
239
240
241
242 MUON5ThinningTool1 = acc.getPrimaryAndMerge(CaloClusterThinningCfg(flags,
243 name = "MUON5ThinningTool1",
244 StreamName = stream_name,
245 SGKey = "Muons",
246 SelectionString = "Muons.pt>4*GeV",
247 TopoClCollectionSGKey = "CaloCalTopoClusters",
248 ConeSize = 0.5))
249 MUON5ThinningTools.append(MUON5ThinningTool1)
250
251
252 MUON5ThinningTool2 = acc.getPrimaryAndMerge(CaloClusterThinningCfg(flags,
253 name = "MUON5ThinningTool2",
254 StreamName = stream_name,
255 SGKey = "Electrons",
256 SelectionString = "Electrons.pt>4*GeV",
257 CaloClCollectionSGKey = "egammaClusters",
258 ConeSize = 0.4))
259 MUON5ThinningTools.append(MUON5ThinningTool2)
260
261
262 MUON5ThinningTool3 = acc.getPrimaryAndMerge(CaloClusterThinningCfg(flags,
263 name = "MUON5ThinningTool3",
264 StreamName = stream_name,
265 SGKey = "Photons",
266 SelectionString = "Photons.pt>4*GeV",
267 CaloClCollectionSGKey = "egammaClusters",
268 ConeSize = 0.4))
269 MUON5ThinningTools.append(MUON5ThinningTool3)
270
271
272 muon5CellThinAlg = CompFactory.CaloThinCellsByClusterAlg(
273 'MUON5_CaloThinCellsByClusterAlg_MuonClusterCollection',
274 StreamName = stream_name,
275 Clusters = 'MuonClusterCollection',
276 Cells = 'AllCalo')
277 acc.addEventAlgo(muon5CellThinAlg)
278
279
280 if flags.Input.isMC:
281 from DerivationFrameworkMCTruth.TruthDerivationToolsConfig import MenuTruthThinningCfg
282 MUON5TruthThinningTool = acc.getPrimaryAndMerge(MenuTruthThinningCfg(flags,
283 name = "MUON5TruthThinningTool",
284 StreamName = stream_name,
285 WritePartons = False,
286 WriteHadrons = False,
287 WriteCHadrons = True,
288 WriteBHadrons = True,
289 WriteGeant = False,
290 WriteTauHad = True,
291 PartonPtThresh = -1.0,
292 WriteBSM = True,
293 WriteBosons = True,
294 WriteBosonProducts = True,
295 WriteBSMProducts = True,
296 WriteTopAndDecays = True,
297 WriteEverything = False,
298 WriteAllLeptons = True,
299 WriteLeptonsNotFromHadrons = False,
300 WriteNotPhysical = False,
301 WriteFirstN = -1,
302 PreserveAncestors = False,
303 PreserveParentsSiblingsChildren = True,
304 PreserveGeneratorDescendants = False))
305
306
307 MUON5ThinningTools.append(MUON5TruthThinningTool)
308
309
310
311
312 DerivationKernel = CompFactory.DerivationFramework.DerivationKernel
313 acc.addEventAlgo(DerivationKernel(name,
314 AugmentationTools = MUON5AugmentTools,
315 SkimmingTools = MUON5SkimmingTools,
316 ThinningTools = MUON5ThinningTools))
317 return acc
318
319