160 qualitySelectionOutput = True, isRun3Geo = False):
161 """Create muon analysis algorithms for a single working point
164 dataType -- The data type to run on ("data", "mc" or "afii")
165 workingPoint -- The working point to use
166 postfix -- a postfix to apply to decorations and algorithm
167 names. this is mostly used/needed when using this
168 sequence with multiple working points to ensure all
170 qualitySelectionOutput -- Whether or not to apply muon quality selection
171 when creating output containers.
172 isRun3Geo -- switches the muon selection tool to run 3 geometry
175 if dataType
not in [
"data",
"mc",
"afii"] :
176 raise ValueError (
"invalid data type: " + dataType)
178 splitWP = workingPoint.split (
'.')
179 if len (splitWP) != 2 :
180 raise ValueError (
'working point should be of format "quality.isolation", not ' + workingPoint)
182 sfWorkingPoint = splitWP[0]
183 from xAODMuon.xAODMuonEnums
import xAODMuonEnums
184 if splitWP[0] ==
'Tight' :
185 quality = xAODMuonEnums.Quality.Tight
187 elif splitWP[0] ==
'Medium' :
188 quality = xAODMuonEnums.Quality.Medium
190 elif splitWP[0] ==
'Loose' :
191 quality = xAODMuonEnums.Quality.Loose
193 elif splitWP[0] ==
'VeryLoose' :
194 quality = xAODMuonEnums.Quality.VeryLoose
196 elif splitWP[0] ==
'HighPt' :
199 elif splitWP[0] ==
'LowPtEfficiency' :
203 raise ValueError (
"invalid muon quality: \"" + splitWP[0] +
204 "\", allowed values are Tight, Medium, Loose, " +
205 "VeryLoose, HighPt, LowPtEfficiency")
209 'MuonSelectionAlg' + postfix )
211 alg.selectionTool.MuQuality = quality
212 alg.selectionTool.IsRun3Geo = isRun3Geo
213 alg.selectionDecoration =
'good_muon' + postfix +
',as_bits'
214 alg.badMuonVetoDecoration =
'is_bad' + postfix +
',as_char'
215 seq.append( alg, inputPropName =
'muons',
216 stageName =
'selection',
217 metaConfig = {
'selectionDecorNames' : [alg.selectionDecoration],
218 'selectionDecorNamesOutput' : [alg.selectionDecoration]
if qualitySelectionOutput
else [],
219 'selectionDecorCount' : [4]},
220 dynConfig = {
'preselection' :
lambda meta :
"&&".join (meta[
"selectionDecorNamesOutput"])})
223 if splitWP[1] !=
'NonIso' :
225 'MuonIsolationAlg' + postfix )
226 addPrivateTool( alg,
'isolationTool',
'CP::IsolationSelectionTool' )
227 alg.isolationTool.MuonWP = splitWP[1]
228 alg.isolationDecoration =
'isolated_muon' + postfix +
',as_bits'
229 seq.append( alg, inputPropName =
'muons',
230 stageName =
'selection',
231 metaConfig = {
'selectionDecorNames' : [alg.isolationDecoration],
232 'selectionDecorNamesOutput' : [alg.isolationDecoration],
233 'selectionDecorCount' : [1]},
234 dynConfig = {
'preselection' :
lambda meta :
"&&".join (meta[
"selectionDecorNamesOutput"])})
239 'MuonEfficiencyScaleFactorAlg' + postfix )
241 'CP::MuonEfficiencyScaleFactors' )
242 alg.scaleFactorDecoration =
'muon_effSF' + postfix +
"_%SYS%"
243 alg.outOfValidity = 2
244 alg.outOfValidityDeco =
'bad_eff' + postfix
245 alg.efficiencyScaleFactorTool.WorkingPoint = sfWorkingPoint
247 alg.efficiencyScaleFactorTool.CalibrationRelease =
'230309_Preliminary_r22run3'
248 if dataType !=
'data':
249 seq.append( alg, inputPropName =
'muons',
250 stageName =
'efficiency',
251 dynConfig = {
'preselection' :
lambda meta :
"&&".join (meta[
"selectionDecorNamesOutput"])})
255 'MuonSelectionSummary' + postfix )
256 alg.selectionDecoration =
'baselineSelection' + postfix +
',as_char'
257 seq.append( alg, inputPropName =
'particles',
258 stageName =
'selection',
259 dynConfig = {
'preselection' :
lambda meta :
"&&".join (meta[
"selectionDecorNames"])})