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
167
168
169
170
171
172 elReq1 = '(Electrons.pt > 25*GeV && abs(Electrons.eta) < 2.5 && Electrons.DFCommonElectronsLHMedium)'
173 elReq2 = '(Electrons.pt > 3*GeV && abs(Electrons.eta) < 2.8 && Electrons.DFCommonElectronsLHLoose)'
174 muReq1 = '(Muons.DFCommonMuonPassPreselection && Muons.DFCommonMuonPassIDCuts && Muons.pt>25*GeV && abs(Muons.eta) <2.5)'
175 muReq2 = '(Muons.DFCommonMuonPassPreselection && Muons.DFCommonMuonPassIDCuts && Muons.pt>3*GeV && abs(Muons.eta) <2.8)'
176
177 el1 = '(count('+elReq1+') >= 1)'
178 el2 = '(count('+elReq2+') >= 1)'
179 mu1 = '(count('+muReq1+') >= 1)'
180 mu2 = '(count('+muReq2+') >= 1)'
181
182 emuSel='(('+el1+"&&"+mu2+')'+'||'+'('+el2+"&&"+mu1+'))'
183 skimmingORs.append(emuSel)
184
185 lepSelection = '||'.join(skimmingORs)
186
187 MUON5SkimmingTools = []
188 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import xAODStringSkimmingToolCfg
189
190
191 SkimArgs={}
192 if not (flags.Reco.EnableTrigger or flags.Trigger.triggerConfig == 'INFILE'):
193 SkimArgs["TrigDecisionTool"] = ""
194 MUON5SkimmingTool1 = acc.getPrimaryAndMerge(xAODStringSkimmingToolCfg(flags,
195 name = "MUON5SkimmingTool1",
196 expression = lepSelection,
197 **SkimArgs))
198 MUON5SkimmingTools.append(MUON5SkimmingTool1)
199
200
201
202
203
204 MUON5ThinningTools = []
205
206
207 from DerivationFrameworkInDet.InDetToolsConfig import TrackParticleThinningCfg
208 MUON5TrackThinningTool = acc.getPrimaryAndMerge(TrackParticleThinningCfg(flags,
209 name = "MUON5TrackThinningTool",
210 StreamName = stream_name,
211 SelectionString = "abs(DFCommonInDetTrackZ0AtPV) < 35.0 && abs(InDetTrackParticles.eta) < 3.2",
212 InDetTrackParticlesKey = "InDetTrackParticles")
213 )
214
215 MUON5ThinningTools.append(MUON5TrackThinningTool)
216
217
218 from DerivationFrameworkCalo.DerivationFrameworkCaloConfig import CaloClusterThinningCfg
219 from DerivationFrameworkMuons.MuonsToolsConfig import AnalysisMuonThinningAlgCfg
220
221
222 fwdTracks = "InDetForwardTrackParticles"
223 if fwdTracks not in flags.Input.Collections:
224 fwdTracks = ""
225 acc.merge(AnalysisMuonThinningAlgCfg(flags,
226 name = "AnalysisMuonThinningAlgMUON5",
227 MuonPassFlags = muonThinFlags,
228 TrkPassFlags = trkThinFlags,
229 StreamName = stream_name,
230 IdTrkFwdThinning=fwdTracks))
231
232
233
234 MUON5ThinningTool1 = acc.getPrimaryAndMerge(CaloClusterThinningCfg(flags,
235 name = "MUON5ThinningTool1",
236 StreamName = stream_name,
237 SGKey = "Muons",
238 SelectionString = "Muons.pt>4*GeV",
239 TopoClCollectionSGKey = "CaloCalTopoClusters",
240 ConeSize = 0.5))
241 MUON5ThinningTools.append(MUON5ThinningTool1)
242
243
244 MUON5ThinningTool2 = acc.getPrimaryAndMerge(CaloClusterThinningCfg(flags,
245 name = "MUON5ThinningTool2",
246 StreamName = stream_name,
247 SGKey = "Electrons",
248 SelectionString = "Electrons.pt>4*GeV",
249 CaloClCollectionSGKey = "egammaClusters",
250 ConeSize = 0.4))
251 MUON5ThinningTools.append(MUON5ThinningTool2)
252
253
254 MUON5ThinningTool3 = acc.getPrimaryAndMerge(CaloClusterThinningCfg(flags,
255 name = "MUON5ThinningTool3",
256 StreamName = stream_name,
257 SGKey = "Photons",
258 SelectionString = "Photons.pt>4*GeV",
259 CaloClCollectionSGKey = "egammaClusters",
260 ConeSize = 0.4))
261 MUON5ThinningTools.append(MUON5ThinningTool3)
262
263
264 muon5CellThinAlg = CompFactory.CaloThinCellsByClusterAlg(
265 'MUON5_CaloThinCellsByClusterAlg_MuonClusterCollection',
266 StreamName = stream_name,
267 Clusters = 'MuonClusterCollection',
268 Cells = 'AllCalo')
269 acc.addEventAlgo(muon5CellThinAlg)
270
271
272 if flags.Input.isMC:
273 from DerivationFrameworkMCTruth.TruthDerivationToolsConfig import MenuTruthThinningCfg
274 MUON5TruthThinningTool = acc.getPrimaryAndMerge(MenuTruthThinningCfg(flags,
275 name = "MUON5TruthThinningTool",
276 StreamName = stream_name,
277 WritePartons = False,
278 WriteHadrons = False,
279 WriteCHadrons = True,
280 WriteBHadrons = True,
281 WriteGeant = False,
282 WriteTauHad = True,
283 PartonPtThresh = -1.0,
284 WriteBSM = True,
285 WriteBosons = True,
286 WriteBosonProducts = True,
287 WriteBSMProducts = True,
288 WriteTopAndDecays = True,
289 WriteEverything = False,
290 WriteAllLeptons = True,
291 WriteLeptonsNotFromHadrons = False,
292 WriteNotPhysical = False,
293 WriteFirstN = -1,
294 PreserveAncestors = False,
295 PreserveParentsSiblingsChildren = True,
296 PreserveGeneratorDescendants = False))
297
298
299 MUON5ThinningTools.append(MUON5TruthThinningTool)
300
301
302
303
304 DerivationKernel = CompFactory.DerivationFramework.DerivationKernel
305 acc.addEventAlgo(DerivationKernel(name,
306 AugmentationTools = MUON5AugmentTools,
307 SkimmingTools = MUON5SkimmingTools,
308 ThinningTools = MUON5ThinningTools))
309 return acc
310
311