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