ATLAS Offline Software
Loading...
Searching...
No Matches
MUON1.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2#====================================================================
3# DAOD_MUON1.py
4# This defines the component accumulator version of DAOD_MUON1
5# It requires the flag MUON1 in Derivation_tf.py
6#====================================================================
7
8from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
9from AthenaConfiguration.ComponentFactory import CompFactory
10from AthenaConfiguration.Enums import MetadataCategory
11import AthenaCommon.SystemOfUnits as Units
12
13
15 MuonContainer="Muons",
16 IdTrackContainer="InDetTrackParticles",
17 applyTrigger = False):
18 acc = ComponentAccumulator()
19 from DerivationFrameworkMuons.MuonsToolsConfig import DiMuonTaggingAlgCfg
20
21 acc.merge(DiMuonTaggingAlgCfg(flags,
22 name = "DiMuonTaggingZmumuOC",
23 Mu1PtMin = 4.*Units.GeV,
24 Mu1AbsEtaMax = 2.75,
25 Mu1RequireQual = True,
26 Mu2PtMin = 2.*Units.GeV,
27 UseTrackProbe = True,
28 MuonContainerKey = MuonContainer,
29 TrackContainerKey = IdTrackContainer,
30 InvariantMassLow = 60*Units.GeV,
31 IDTrackThinningConeSize = 0.4,
32 applyTrigger = applyTrigger,
33 BranchPrefix = "Muon1ZmumuOC"))
34
35
36 acc.merge(DiMuonTaggingAlgCfg(flags,
37 name = "DiMuonTaggingZmumuSC",
38 Mu1PtMin = 4.*Units.GeV,
39 Mu1AbsEtaMax = 2.75,
40 Mu1RequireQual = True,
41 Mu2PtMin = 2.*Units.GeV,
42 UseTrackProbe = True,
43 MuonContainerKey = MuonContainer,
44 TrackContainerKey = IdTrackContainer,
45 OppositeCharge = False,
46 applyTrigger = applyTrigger,
47 InvariantMassLow = 60*Units.GeV,
48 BranchPrefix = "Muon1ZmumuSC"))
49 # Jpsi
50 acc.merge(DiMuonTaggingAlgCfg(flags,
51 name = "DiMuonTaggingJpsi",
52 Mu1PtMin = 4.*Units.GeV,
53 Mu1AbsEtaMax = 2.75,
54 Mu1RequireQual = True,
55 Mu2PtMin = 2.*Units.GeV,
56 UseTrackProbe = True,
57 MuonContainerKey = MuonContainer,
58 TrackContainerKey = IdTrackContainer,
59 applyTrigger = applyTrigger,
60 InvariantMassLow = 2.0*Units.GeV,
61 InvariantMassHigh = 4.8*Units.GeV,
62 BranchPrefix = "Muon1JPsi"))
63
64 acc.merge(DiMuonTaggingAlgCfg(flags,
65 name = "DiMuonTaggingUpsilon",
66 Mu1PtMin = 4.*Units.GeV,
67 Mu1AbsEtaMax = 2.75,
68 Mu1RequireQual = True,
69 Mu2PtMin = 2.*Units.GeV,
70 MuonContainerKey = MuonContainer,
71 TrackContainerKey = IdTrackContainer,
72 InvariantMassLow = 7.0*Units.GeV,
73 InvariantMassHigh = 13.*Units.GeV,
74 applyTrigger = applyTrigger,
75 BranchPrefix = "Muon1Upsilon"))
76 if flags.Input.isMC:
77
78 acc.merge(DiMuonTaggingAlgCfg(flags,
79 name = "MuonTruthTagging",
80 TruthKey = "TruthMuons",
81 Mu1PtMin = 2.*Units.GeV,
82 Mu1RequireQual = True,
83 Mu2PtMin = 60.*Units.TeV, # Dummy value
84 UseTrackProbe = True,
85 MuonContainerKey = MuonContainer,
86 TrackContainerKey = IdTrackContainer,
87 OppositeCharge = False,
88 InvariantMassLow = 60*Units.TeV, # Dummy value
89 applyTrigger = applyTrigger,
90 IDTrackThinningConeSize = 0.1,
91 BranchPrefix = "TruthMuon"))
92
93 return acc
94
95
96# Main algorithm config
97def MUON1KernelCfg(flags, name='MUON1Kernel', **kwargs):
98 """Configure the derivation framework driving algorithm (kernel) for MUON1"""
99 acc = ComponentAccumulator()
100 stream_name= 'StreamDAOD_MUON1'
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 # Common augmentations
110 # --------------------
111 from DerivationFrameworkPhys.PhysCommonConfig import PhysCommonAugmentationsCfg
112 acc.merge(PhysCommonAugmentationsCfg(flags, TriggerListsHelper = kwargs['TriggerListsHelper']))
113
114
115 diMuonSelAcc = Muon1SelectionCfg(flags,
116 MuonContainer= kwargs["MuonContainer"],
117 IdTrackContainer=kwargs["IdTrkContainer"])
118 # ------------
119 # Augmentation
120 # ------------
121 # Strings for applying cuts based on augmentations
122 muonThinFlags = ["pass{flag}".format(flag = algo.BranchPrefix) for algo in diMuonSelAcc.getEventAlgos()]
123 skimmingORs = [f"DIMU_{flag} > 0" for flag in muonThinFlags]
124 trkThinFlags = [muonThinFlags[i] for i, algo in enumerate(diMuonSelAcc.getEventAlgos()) if algo.UseTrackProbe ]
125 acc.merge(diMuonSelAcc)
126
127
128
129 if flags.Input.isMC:
130 from DerivationFrameworkMCTruth.TruthDerivationToolsConfig import MuonTruthClassifierFallbackCfg
131 MUON1MuonTruthClassifierFallback = acc.getPrimaryAndMerge(MuonTruthClassifierFallbackCfg(flags,
132 name = "MUON1MuonTruthClassifierFallback",
133 ContainerKey = kwargs["MuonContainer"]))
134 acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel("MuonTruthClassifierFallBack",
135 AugmentationTools=[MUON1MuonTruthClassifierFallback]))
136 from DerivationFrameworkMCTruth.TruthDerivationToolsConfig import MuonTruthIsolationDecorAlgCfg
137 acc.merge(MuonTruthIsolationDecorAlgCfg(flags,
138 name = "MUON1MuonTruthIsolationAlg",
139 ContainerKey = kwargs["MuonContainer"]))
140
141
142
143 from DerivationFrameworkMuons.JPsiVertexFitSetupCfg import AddMCPJPsiVertexFitCfg
144 acc.merge(AddMCPJPsiVertexFitCfg(flags,
145 prefix='Muon1',
146 IdTrkContainer = kwargs["IdTrkContainer"],
147 MuonContainer = kwargs["MuonContainer"]))
148
149 from DerivationFrameworkMuons.TrackIsolationDecoratorConfig import TrackIsolationCfg
150 acc.merge(TrackIsolationCfg(flags,
151 TrackCollection=kwargs["IdTrkContainer"]))
152 acc.merge(TrackIsolationCfg(flags,
153 TrackCollection=kwargs["MsTrkContainer"]))
154
155
156 from DerivationFrameworkMuons.MuonsToolsConfig import MuonCaloDepositAlgCfg
157 acc.merge(MuonCaloDepositAlgCfg(flags,
158 name = "MuonCaloDepositAlg",
159 ContainerKey= kwargs["MuonContainer"]))
160 acc.merge(MuonCaloDepositAlgCfg(flags,
161 name = "IdTrkCaloDepositDecorator",
162 ContainerKey= kwargs["IdTrkContainer"]))
163
164
165 from DerivationFrameworkMuons.MuonsToolsConfig import MuonTPExtrapolationAlgCfg
166 acc.merge(MuonTPExtrapolationAlgCfg(flags,
167 name = "MuonTPExtrapolationAlgMUON1",
168 ContainerKey= kwargs["MuonContainer"],
169 TrackSelections = ["passMuon1JPsi"]))
170
171 acc.merge(MuonTPExtrapolationAlgCfg(flags,
172 name = "MuonTPTrigExtrapolationMUON1",
173 ContainerKey= kwargs["IdTrkContainer"],
174 TrackSelections = ["passMuon1JPsi"]))
175
176
177 # --------
178 # Skimming
179 # --------
180 MUON1SkimmingTools = []
181 skimming_expression = '||'.join(skimmingORs)
182 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import xAODStringSkimmingToolCfg
183 MUON1SkimmingTool1 = acc.getPrimaryAndMerge(xAODStringSkimmingToolCfg(flags,
184 name = "MUON1SkimmingTool1",
185 expression = skimming_expression))
186 MUON1SkimmingTools.append(MUON1SkimmingTool1)
187
188 # --------
189 # Thinning
190 # --------
191
192 # Thinning tools
193 from DerivationFrameworkCalo.DerivationFrameworkCaloConfig import CaloClusterThinningCfg
194 from DerivationFrameworkMuons.MuonsToolsConfig import AnalysisMuonThinningAlgCfg
195 MUON1ThinningTools = []
196 if kwargs["scheduleThinning"]:
197 fwdTracks = "InDetForwardTrackParticles"
198 if fwdTracks not in flags.Input.Collections:
199 fwdTracks = ""
200 acc.merge(AnalysisMuonThinningAlgCfg(flags,
201 name = "AnalysisMuonThinningAlgMUON1",
202 MuonPassFlags = ["{cont}.{passDecor}".format(cont = kwargs["MuonContainer"],
203 passDecor = passDecor) for passDecor in muonThinFlags],
204 TrkPassFlags =["{cont}.{passDecor}".format(cont = kwargs["IdTrkContainer"],
205 passDecor = passDecor) for passDecor in trkThinFlags],
206 IdTrkFwdThinning=fwdTracks,
207 StreamName = stream_name))
208
209
210 # keep topoclusters around muons
211 MUON1ThinningTool1 = acc.getPrimaryAndMerge(CaloClusterThinningCfg(flags,
212 name = "MUON1ThinningTool4",
213 StreamName = stream_name,
214 SGKey = "Muons",
215 SelectionString = "Muons.pt>4*GeV",
216 TopoClCollectionSGKey = "CaloCalTopoClusters",
217 ConeSize = 0.5))
218 MUON1ThinningTools.append(MUON1ThinningTool1)
219
220
221 muon1CellThinAlg = CompFactory.CaloThinCellsByClusterAlg(
222 'MUON1_CaloThinCellsByClusterAlg_MuonClusterCollection',
223 StreamName = stream_name,
224 Clusters = 'MuonClusterCollection',
225 Cells = 'AllCalo')
226 acc.addEventAlgo(muon1CellThinAlg)
227
228
229
230 from DerivationFrameworkBPhys.commonBPHYMethodsCfg import Thin_vtxTrkCfg
231 MUON1Thin_vtxTrk = acc.getPrimaryAndMerge(Thin_vtxTrkCfg(flags,
232 name = "MUON1Thin_vtxTrk",
233 StreamName = stream_name,
234 TrackParticleContainerName = "InDetTrackParticles",
235 VertexContainerNames = ["Muon1JpsiCandidates"],
236 PassFlags = ["passed_Jpsi"] ))
237 MUON1ThinningTools.append(MUON1Thin_vtxTrk)
238
239
240 if flags.Input.isMC:
241 from DerivationFrameworkMCTruth.TruthDerivationToolsConfig import MenuTruthThinningCfg
242 MUON1TruthThinningTool = acc.getPrimaryAndMerge(MenuTruthThinningCfg(flags,
243 name = "MUON1TruthThinningTool",
244 StreamName = stream_name,
245 WritePartons = False,
246 WriteHadrons = False,
247 WriteCHadrons = False,
248 WriteBHadrons = True,
249 WriteGeant = False,
250 WriteTauHad = False,
251 PartonPtThresh = -1.0,
252 WriteBSM = True,
253 WriteBosons = True,
254 WriteBosonProducts = False,
255 WriteBSMProducts = True,
256 WriteTopAndDecays = False,
257 WriteEverything = False,
258 WriteAllLeptons = True,
259 WriteLeptonsNotFromHadrons = False,
260 WriteNotPhysical = False,
261 WriteFirstN = -1,
262 PreserveAncestors = False,
263 PreserveParentsSiblingsChildren = True,
264 PreserveGeneratorDescendants = False))
265 # Not sure what this should be set to nowadays
266 #SimBarcodeOffset = DerivationFrameworkSimBarcodeOffset)
267 MUON1ThinningTools.append(MUON1TruthThinningTool)
268
269 # --------------------
270 # The kernel algorithm
271 # --------------------
272
273
274 from IsolationSelection.IsolationSelectionConfig import IsoCloseByAlgsCfg
275 acc.merge(IsoCloseByAlgsCfg(flags, isPhysLite = True))
276
277
278 acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(name,
279 SkimmingTools = MUON1SkimmingTools,
280 ThinningTools = MUON1ThinningTools))
281 return acc
282
283
284def MUON1Cfg(flags):
285 stream_name = 'StreamDAOD_MUON1'
286 acc = ComponentAccumulator()
287
288 # Get the lists of triggers needed for trigger matching.
289 # This is needed at this scope (for the slimming) and further down in the config chain
290 # for actually configuring the matching, so we create it here and pass it down
291 from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
292 MUON1TriggerListsHelper = TriggerListsHelper(flags)
293
294
295
296 # Common augmentations
297 acc.merge(MUON1KernelCfg(flags, name="MUON1Kernel", StreamName = stream_name, TriggerListsHelper = MUON1TriggerListsHelper))
298
299 # LeptonTaggers isolation to schedule PLIT
300 from LeptonTaggers.LeptonTaggersConfig import DecoratePLITAlgsCfg
301 acc.merge(DecoratePLITAlgsCfg(flags))
302
303 # ============================
304 # Define contents of the format
305 # =============================
306 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
307 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
308 from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
309
310 isoCones = [f"pt{cone}cone{size}_Nonprompt_All_MaxWeightTTVA_pt{pt}" for cone in ["", "var"] for size in range(20,50,10) for pt in [500, 1000] ]
311 isoCones += [f"{cone}{size}" for cone in ["topoetcone", "neflowisol"] for size in range(20,50,10)]
312
313 decorationsID = ["TTVA_AMVFVertices" , "TTVA_AMVFWeights", "vx", "vy", "vz"]
314 decorationsME = []
315 decoartionsMuon = ["EnergyLossSigma"]
316
317 decorationsID += isoCones
318 decorationsME += isoCones
319 CaloDeposDecors = ["CaloDeposits", "CaloElosses", "CaloDepType"]
320 decorationsID += CaloDeposDecors
321 decoartionsMuon += CaloDeposDecors
322 tpExtrapolations = ["EtaTriggerPivot", "PhiTriggerPivot", "DecoratedPivotEtaPhi"]
323 decorationsID += tpExtrapolations
324 decoartionsMuon += tpExtrapolations
325
326
327 MUON1SlimmingHelper = SlimmingHelper("MUON1SlimmingHelper", NamesAndTypes = flags.Input.TypedCollections, flags = flags)
328 MUON1SlimmingHelper.SmartCollections = ["EventInfo",
329 "Electrons",
330 "Photons",
331 "Muons",
332 "PrimaryVertices",
333 "InDetTrackParticles",
334 "AntiKt4EMTopoJets",
335 "AntiKt4EMPFlowJets",
336 "MET_Baseline_AntiKt4EMTopo",
337 "MET_Baseline_AntiKt4EMPFlow",
338 "TauJets",
339 "TauJets_MuonRM",
340 "DiTauJets",
341 "DiTauJetsLowPt",
342 "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets",
343 ]
344
345 excludedVertexAuxData = "-vxTrackAtVertex.-MvfFitInfo.-isInitialized.-VTAV"
346 StaticContent = []
347 StaticContent += ["xAOD::VertexContainer#SoftBVrtClusterTool_Tight_Vertices"]
348 StaticContent += ["xAOD::VertexAuxContainer#SoftBVrtClusterTool_Tight_VerticesAux." + excludedVertexAuxData]
349 StaticContent += ["xAOD::VertexContainer#SoftBVrtClusterTool_Medium_Vertices"]
350 StaticContent += ["xAOD::VertexAuxContainer#SoftBVrtClusterTool_Medium_VerticesAux." + excludedVertexAuxData]
351 StaticContent += ["xAOD::VertexContainer#SoftBVrtClusterTool_Loose_Vertices"]
352 StaticContent += ["xAOD::VertexAuxContainer#SoftBVrtClusterTool_Loose_VerticesAux." + excludedVertexAuxData]
353 StaticContent += ["xAOD::VertexContainer#Muon1JpsiCandidates"]
354 StaticContent += ["xAOD::VertexAuxContainer#Muon1JpsiCandidatesAux."+excludedVertexAuxData]
355 StaticContent += ["CaloCellContainer#DFMUONCellContainer"]
356 StaticContent += ["CaloClusterCellLinkContainer#MuonClusterCollection_links"]
357
358 MUON1SlimmingHelper.StaticContent = StaticContent
359
360 from IsolationSelection.IsolationSelectionConfig import setupIsoCloseBySlimmingVariables
361 setupIsoCloseBySlimmingVariables(MUON1SlimmingHelper)
362 # Extra content
363 MUON1SlimmingHelper.ExtraVariables += ["AntiKt4EMTopoJets.ConeExclBHadronsFinal.ConeExclCHadronsFinal.GhostBHadronsFinal.GhostCHadronsFinal.GhostBHadronsFinalCount.GhostBHadronsFinalPt.GhostCHadronsFinalCount.GhostCHadronsFinalPt",
364 "AntiKt4EMPFlowJets.ConeExclBHadronsFinal.ConeExclCHadronsFinal.GhostBHadronsFinal.GhostCHadronsFinal.GhostBHadronsFinalCount.GhostBHadronsFinalPt.GhostCHadronsFinalCount.GhostCHadronsFinalPt",
365 "TruthPrimaryVertices.t.x.y.z",
366 "PrimaryVertices.trackWeights",
367 "MuonSegments.chiSquared.numberDoF.nPrecisionHits.x.y.z",
368 "Muons." +".".join(decoartionsMuon),
369 "InDetTrackParticles."+ ".".join(decorationsID),
370 "ExtrapolatedMuonTrackParticles." +".".join(decorationsME),
371 "CaloCalTopoClusters.calE.calEta.calM.calPhi.e_sampl.rawM.rawPhi.rawEta.rawE",
372 "EventInfo.GenFiltHT.GenFiltMET.GenFiltHTinclNu.GenFiltPTZ.GenFiltFatJ",
373 "TauJets.dRmax.etOverPtLeadTrk",
374 "TauJets_MuonRM.dRmax.etOverPtLeadTrk",
375 "CombinedMuonTrackParticles.vx.vy.vz",
376 "MuonSpectrometerTrackParticles.vx.vy.vz",
377 "HLT_xAOD__TrigMissingETContainer_TrigEFMissingET.ex.ey",
378 "HLT_xAOD__TrigMissingETContainer_TrigEFMissingET_mht.ex.ey"]
379
380 # LeptonTaggers PLIT content
381 from LeptonTaggers.LeptonTaggersConfig import GetExtraPLITVariablesForDxAOD
382 MUON1SlimmingHelper.ExtraVariables += GetExtraPLITVariablesForDxAOD()
383
384 # Truth content
385 if flags.Input.isMC:
386 MUON1SlimmingHelper.AllVariables += ["TruthEvents", "TruthParticles", "TruthVertices", "MuonTruthParticles"]
387
388 MUON1SlimmingHelper.AllVariables += ["MuonClusterCollection"]
389
390 # Trigger content
391 MUON1SlimmingHelper.IncludeTriggerNavigation = False
392 MUON1SlimmingHelper.IncludeJetTriggerContent = False
393 MUON1SlimmingHelper.IncludeMuonTriggerContent = True
394 MUON1SlimmingHelper.IncludeEGammaTriggerContent = False
395 MUON1SlimmingHelper.IncludeTauTriggerContent = False
396 MUON1SlimmingHelper.IncludeEtMissTriggerContent = False
397 MUON1SlimmingHelper.IncludeBJetTriggerContent = False
398 MUON1SlimmingHelper.IncludeBPhysTriggerContent = True
399 MUON1SlimmingHelper.IncludeMinBiasTriggerContent = False
400
401 # Trigger matching
402 # Run 2
403 if flags.Trigger.EDMVersion == 2:
404 from DerivationFrameworkPhys.TriggerMatchingCommonConfig import AddRun2TriggerMatchingToSlimmingHelper
405 AddRun2TriggerMatchingToSlimmingHelper(SlimmingHelper = MUON1SlimmingHelper,
406 OutputContainerPrefix = "TrigMatch_",
407 TriggerList = MUON1TriggerListsHelper.Run2TriggerNamesTau)
408 AddRun2TriggerMatchingToSlimmingHelper(SlimmingHelper = MUON1SlimmingHelper,
409 OutputContainerPrefix = "TrigMatch_",
410 TriggerList = MUON1TriggerListsHelper.Run2TriggerNamesNoTau)
411
412 # Custom (B-physics) muon chains not in PHYS
413 from DerivationFrameworkMuons.MuonsExtraTriggerConfig import MuonExtraTriggerHelper
414 ExtraHelper = MuonExtraTriggerHelper(flags,MUON1TriggerListsHelper)
415 acc.merge(ExtraHelper.Run2MatchAugmentationCfg(flags))
416 ExtraHelper.AddRun2MatchingToSlimmingHelper(SlimmingHelper = MUON1SlimmingHelper,
417 OutputContainerPrefix = "TrigMatch_")
418
419 # Run 3, or Run 2 with navigation conversion
420 if flags.Trigger.EDMVersion == 3 or (flags.Trigger.EDMVersion == 2 and flags.Trigger.doEDMVersionConversion):
421 from TrigNavSlimmingMT.TrigNavSlimmingMTConfig import AddRun3TrigNavSlimmingCollectionsToSlimmingHelper
422 AddRun3TrigNavSlimmingCollectionsToSlimmingHelper(MUON1SlimmingHelper)
423
424 # Output stream
425 MUON1ItemList = MUON1SlimmingHelper.GetItemList()
426 acc.merge(OutputStreamCfg(flags, "DAOD_MUON1", ItemList=MUON1ItemList, AcceptAlgs=["MUON1Kernel"]))
427 acc.merge(SetupMetaDataForStreamCfg(flags, "DAOD_MUON1", AcceptAlgs=["MUON1Kernel"], createMetadata=[MetadataCategory.CutFlowMetaData, MetadataCategory.TruthMetaData]))
428
429 return acc
430
MUON1Cfg(flags)
Definition MUON1.py:284
Muon1SelectionCfg(flags, MuonContainer="Muons", IdTrackContainer="InDetTrackParticles", applyTrigger=False)
Definition MUON1.py:17
MUON1KernelCfg(flags, name='MUON1Kernel', **kwargs)
Definition MUON1.py:97