49 def makeAlgs (self, config) :
50
51
52 if 'EleRM' in self.inputContainer:
53 if config.dataType() is DataType.Data and config.dataYear() <= 2023:
54 raise RuntimeError("EleRM taus are only available from 2024 dataset onward")
55 elif config.dataType() is not DataType.Data and config.campaign() <= Campaign.MC23d:
56 raise RuntimeError("EleRM taus are only available from 2024 dataset onward")
57
58 postfix = self.postfix
59 if postfix != '' and postfix[0] != '_' :
60 postfix = '_' + postfix
61
62 inputContainer = "AnalysisTauJets" if config.isPhyslite() else "TauJets"
63 if self.inputContainer:
64 inputContainer = self.inputContainer
65 config.setSourceName (self.containerName, inputContainer)
66
67
68 if config.wantCopy (self.containerName) :
69 alg = config.createAlgorithm( 'CP::AsgShallowCopyAlg', 'TauShallowCopyAlg' )
70 alg.input = config.readName (self.containerName)
71 alg.output = config.copyName (self.containerName)
72 alg.outputType = 'xAOD::TauJetContainer'
73 decorations = []
74 if self.addGlobalFELinksDep:
75 decorations += ['neutralGlobalFELinks', 'chargedGlobalFELinks']
76 if config.dataType() is not DataType.Data:
77 decorations += ['IsTruthMatched', 'truthJetLink', 'truthParticleLink']
78 if decorations:
79 alg.declareDecorations = decorations
80
81
82 if self.rerunTruthMatching and config.dataType() is not DataType.Data:
83 alg = config.createAlgorithm( 'CP::TauTruthMatchingAlg',
84 'TauTruthMatchingAlg' )
85 config.addPrivateTool( 'matchingTool',
86 'TauAnalysisTools::TauTruthMatchingTool' )
87 alg.matchingTool.TruthJetContainerName = 'AntiKt4TruthDressedWZJets'
88 alg.taus = config.readName (self.containerName)
89 alg.preselection = config.getPreselection (self.containerName, '')
90
91
92 if self.decorateTruth and config.dataType() is not DataType.Data:
93 alg = config.createAlgorithm( 'CP::TauTruthDecorationsAlg',
94 'TauTruthDecorationsAlg',
95 reentrant=True )
96 alg.taus = config.readName (self.containerName, nominal=True)
97 alg.doubleDecorations = ['pt_vis', 'pt_invis', 'eta_vis', 'eta_invis', 'phi_vis', 'phi_invis', 'm_vis', 'm_invis']
98 alg.floatDecorations = []
99 alg.intDecorations = ['pdgId']
100 alg.unsignedIntDecorations = ['classifierParticleOrigin', 'classifierParticleType']
101 alg.charDecorations = ['IsHadronicTau']
102 alg.prefix = 'truth_'
103
104
105 for var in ['DecayMode', 'ParticleType', 'PartonTruthLabelID'] + alg.doubleDecorations[:] + alg.floatDecorations[:] + alg.intDecorations[:] + alg.unsignedIntDecorations[:] + alg.charDecorations[:]:
106 branchName = alg.prefix + var
107 if 'classifierParticle' in var:
108 branchOutput = alg.prefix + var.replace('classifierParticle', '').lower()
109 else:
110 branchOutput = branchName
111 config.addOutputVar (self.containerName, branchName, branchOutput, noSys=True)
112
113
114 if self.decorateExtraVariables:
115 alg = config.createAlgorithm( 'CP::TauExtraVariablesAlg',
116 'TauExtraVariablesAlg',
117 reentrant=True )
118 alg.taus = config.readName (self.containerName, nominal=True)
119
120
121 alg = config.createAlgorithm( 'CP::TauSmearingAlg', 'TauSmearingAlg' )
122 config.addPrivateTool( 'smearingTool', 'TauAnalysisTools::TauSmearingTool' )
123 alg.smearingTool.useFastSim = config.dataType() is DataType.FastSim
124 alg.smearingTool.Campaign = "mc23" if config.geometry() is LHCPeriod.Run3 else "mc20"
125 if config.geometry() is LHCPeriod.Run2 and self.useGNTau:
126 raise RuntimeError("Tau Smearing recommendations with GNTau are not yet available for Run2")
127 alg.smearingTool.useGNTau = self.useGNTau
128 alg.taus = config.readName (self.containerName)
129 alg.tausOut = config.copyName (self.containerName)
130 config.setExtraOutputs ({('xAOD::IParticleContainer' , 'StoreGateSvc+' + config.readName(self.containerName, nominal=True) + '.RNNEleScoreSigTrans_v1')})
131 alg.preselection = config.getPreselection (self.containerName, '')
132
133
134 alg = config.createAlgorithm( 'CP::AsgEnergyDecoratorAlg', 'EnergyDecorator' )
135 alg.particles = config.readName (self.containerName)
136
137 config.addOutputVar (self.containerName, 'pt', 'pt')
138 config.addOutputVar (self.containerName, 'eta', 'eta', noSys=True)
139 config.addOutputVar (self.containerName, 'phi', 'phi', noSys=True)
140 config.addOutputVar (self.containerName, 'e_%SYS%', 'e')
141 config.addOutputVar (self.containerName, 'charge', 'charge', noSys=True)
142 config.addOutputVar (self.containerName, 'NNDecayMode', 'NNDecayMode', noSys=True, auxType='int')
143 config.addOutputVar (self.containerName, 'passTATTauMuonOLR', 'passTATTauMuonOLR', noSys=True, auxType='char')
144 config.addOutputVar (self.containerName, 'TESCompatibility', 'TESCompatibility')
145 if self.decorateExtraVariables:
146 config.addOutputVar (self.containerName, 'nTracksCharged', 'nTracksCharged', noSys=True)
147
148