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