59 def makeAlgs (self, config) :
60
61 log = logging.getLogger('MuonCalibrationConfig')
62
63
64
65 if self.calibMode == 'correctData_CB':
66 calibMode = 0
67 elif self.calibMode == 'correctData_IDMS':
68 calibMode = 1
69 elif self.calibMode == 'notCorrectData_IDMS':
70 calibMode = 2
71 elif self.calibMode == 'notCorrectData_CB':
72 calibMode = 3
73 elif self.calibMode == 'correctData_IDonly':
74 calibMode = 4
75 elif self.calibMode == 'correctData_MSonly':
76 calibMode = 5
77 else :
78 raise ValueError ("invalid calibMode: \"" + self.calibMode + "\". Allowed values are correctData_CB, correctData_IDMS, notCorrectData_IDMS, notCorrectData_CB, correctData_IDonly, correctData_MSonly")
79
80 inputContainer = "AnalysisMuons" if config.isPhyslite() else "Muons"
81 if self.inputContainer:
82 inputContainer = self.inputContainer
83 config.setSourceName (self.containerName, inputContainer)
84 config.setContainerMeta (self.containerName, 'calibMode', calibMode)
85
86
87 if config.wantCopy (self.containerName) :
88 alg = config.createAlgorithm( 'CP::AsgShallowCopyAlg', 'MuonShallowCopyAlg' )
89 alg.input = config.readName (self.containerName)
90 alg.output = config.copyName (self.containerName)
91 alg.outputType = 'xAOD::MuonContainer'
92 decorationList = ['DFCommonJetDr',
93 'DFCommonMuonPassIDCuts',
94 'DFCommonMuonPassPreselection',
95 'neflowisol20_CloseByCorr',
96 'ptvarcone30_Nonprompt_All_MaxWeightTTVA_pt1000_CloseByCorr',
97 'ptvarcone30_Nonprompt_All_MaxWeightTTVA_pt500_CloseByCorr',
98 'topoetcone20_CloseByCorr']
99 if self.addGlobalFELinksDep:
100 decorationList += ['neutralGlobalFELinks', 'chargedGlobalFELinks']
101 if config.dataType() is not DataType.Data:
102 decorationList += ['TruthLink']
103 if self.addGlobalFELinksDep or config.dataType() is not DataType.Data:
104 alg.declareDecorations = decorationList
105
106
107 alg = config.createAlgorithm( 'CP::AsgSelectionAlg',
108 'MuonEtaCutAlg' )
109 config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
110 alg.selectionTool.maxEta = self.maxEta
111 alg.selectionDecoration = 'selectEta' + self.postfix + ',as_bits'
112 alg.particles = config.readName (self.containerName)
113 alg.preselection = config.getPreselection (self.containerName, '')
114 config.addSelection (self.containerName, '', alg.selectionDecoration)
115
116
117 alg = config.createAlgorithm( 'CP::MuonCalibrationAndSmearingAlg',
118 'MuonCalibrationAndSmearingAlg' )
119 config.addPrivateTool( 'calibrationAndSmearingTool',
120 'CP::MuonCalibTool' )
121
122 alg.calibrationAndSmearingTool.IsRun3Geo = config.geometry() >= LHCPeriod.Run3
123 alg.calibrationAndSmearingTool.calibMode = calibMode
124 if config.geometry() is LHCPeriod.Run4:
125 log.warning("Disabling NSW hits for Run4 geometry")
126 alg.calibrationAndSmearingTool.ExcludeNSWFromPrecisionLayers = True
127 else:
128 alg.calibrationAndSmearingTool.ExcludeNSWFromPrecisionLayers = self.excludeNSWFromPrecisionLayers and (config.geometry() >= LHCPeriod.Run3)
129
130
131
132 if self.useZeroPixMuons:
133 config.addPrivateTool( 'calibrationAndSmearingTool_ZeroPix',
134 'CP::MuonCalibTool' )
135 alg.calibrationAndSmearingTool_ZeroPix.IsRun3Geo = config.geometry() >= LHCPeriod.Run3
136 alg.calibrationAndSmearingTool_ZeroPix.calibMode = 5
137 alg.calibrationAndSmearingTool_ZeroPix.ExcludeNSWFromPrecisionLayers = alg.calibrationAndSmearingTool.ExcludeNSWFromPrecisionLayers
138 if self.zeroPixMuonType is not None:
139 alg.zeroPixMuonType = self.zeroPixMuonType
140
141 alg.muons = config.readName (self.containerName)
142 alg.muonsOut = config.copyName (self.containerName)
143 alg.preselection = config.getPreselection (self.containerName, '')
144 if config.isPhyslite() and not self.recalibratePhyslite :
145 alg.skipNominal = True
146
147
148 if self.minPt > 0:
149 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'MuonPtCutAlg' )
150 alg.selectionDecoration = 'selectPt' + self.postfix + ',as_bits'
151 config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
152 alg.particles = config.readName (self.containerName)
153 alg.selectionTool.minPt = self.minPt
154 alg.preselection = config.getPreselection (self.containerName, '')
155 config.addSelection (self.containerName, '', alg.selectionDecoration,
156 preselection = True)
157
158 alg = config.createAlgorithm( 'CP::AsgEnergyDecoratorAlg', 'EnergyDecorator' )
159 alg.particles = config.readName (self.containerName)
160
161 config.addOutputVar (self.containerName, 'pt', 'pt')
162 config.addOutputVar (self.containerName, 'eta', 'eta', noSys=True)
163 config.addOutputVar (self.containerName, 'phi', 'phi', noSys=True)
164 config.addOutputVar (self.containerName, 'e_%SYS%', 'e')
165 config.addOutputVar (self.containerName, 'charge', 'charge', noSys=True)
166
167
168 if self.decorateTruth and config.dataType() is not DataType.Data:
169 config.addOutputVar (self.containerName, "truthType", "truth_type", noSys=True)
170 config.addOutputVar (self.containerName, "truthOrigin", "truth_origin", noSys=True)
171
172 config.addOutputVar (self.containerName, 'muonType', 'muonType', noSys=True, enabled=self.writeColumnarToolVariables)
173
174