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