ATLAS Offline Software
Loading...
Searching...
No Matches
IDPerfMonEoverP.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5/********************************************************************
6
7NAME: IDPerfMonEoverP.cxx
8PACKAGE: InDetPerformanceMonitoring
9
10AUTHORS: A. Morley
11CREATED: Jul 2011
12
13PURPOSE: Create a simple ntuple to perform EoverP studies with
14********************************************************************/
15
16// INCLUDE HEADER FILES:
18
19// INCLUDE GAUDI HEADER FILES:
20#include "GaudiKernel/MsgStream.h"
21#include "Gaudi/Property.h"
22
23#include <algorithm>
24#include <cmath>
25#include <vector>
26// Validation mode - TTree includes
27#include "GaudiKernel/ITHistSvc.h"
28
31
33
34
35//#include "JetUtils/JetCaloQualityUtils.h"
37
38#include "TTree.h"
39#include "TMath.h"
40#include "TH1F.h"
41#include "TH2F.h"
42#include "TLorentzVector.h"
43
44using namespace std;
45using namespace Trk;
46// END OF HEADER FILES INCLUDE
47
49
50// CONSTRUCTOR:
51
52IDPerfMonEoverP::IDPerfMonEoverP(const std::string& name,
53 ISvcLocator* pSvcLocator):
54 AthAlgorithm(name, pSvcLocator),
59 m_trigDec("Trig::TrigDecisionTool/TrigDecisionTool"),
61 m_isDATA(true),
62 m_validationMode(true),
63 m_fillDetailedTree(false),
64 m_validationTreeName( "EGrefitter" ),
65 m_validationTreeDescription( "egamma track refitter caches" ),
66 m_validationTreeFolder( "/ZmumuValidationUserSel/EGrefitter"), // use same root file name as Zmumu
73 m_nbpv{},
75 m_sumet{},
84 m_WenuLooseElectronET(nullptr),
85 m_WenuTight_Met(nullptr),
86 m_WenuTight_MT(nullptr),
87 m_WenuTightMet_MT(nullptr),
88 m_WenuTightElectronET(nullptr),
89 m_WenuTightW_PT(nullptr),
92 m_smallValidationTreeName("EGrefitterSmall"),
93 m_smallValidationTreeDescription("Small Tree for E/p fits"),
94 m_smallValidationTreeFolder("/eoverpValidation2/efitterValidation2"),
95 m_smallValidationTree(nullptr),
104 m_smalld0{},
105 m_smallz0{},
109{
110
111// The following properties are specified at run-time
112// (declared in jobOptions file)
113 declareProperty("RefitTracks", m_refitEverything);
114 declareProperty("isDATA", m_isDATA);
115 declareProperty("FillVertexInfo", m_fillVertexInfo = false, "job option to activate the filling of the vertex info");
116 declareProperty("ReFitterTool", m_TrackRefitter, "ToolHandle for track fitter implementation");
117 declareProperty("ReFitterTool2", m_TrackRefitter_no2, "ToolHandle for track fitter implementation");
118 declareProperty("TrigDecisionTool", m_trigDec, "The TrigDecisionTool instance.");
119 declareProperty("InputElectronContainerName", m_InputElectronContainerName = "Electrons");
120 declareProperty("InputJetContainerName", m_jetContainerName = "AntiKt4LCTopoJets");
121 // declareProperty("MissingEtObjectName", m_missingEtObjectName = "MET_RefFinal");
122 declareProperty("METFinalName", m_metRefFinalName= "FinalClus");
123 declareProperty("MissingEtObjectName", m_missingEtObjectName = "MET_Reference_AntiKt4LCTopo");
124 declareProperty("primaryVertexCollection", m_primaryVertexCollection = "PrimaryVertices");
125 declareProperty("RefittedElectronTrackContainer1", m_OutputTrackCollectionName_no1="GSFTracks");
126 declareProperty("RefittedElectronTrackContainer2", m_OutputTrackCollectionName_no2="DNATracks");
127 declareProperty("ValidationMode", m_validationMode);
128 declareProperty("FillDetailedTree", m_fillDetailedTree);
129 declareProperty("ElectronLikelihoodTune", m_lhTune="mc15_20150712");
130 declareProperty("ValidationTreeFolder", m_validationTreeFolder, "/ZmumuValidationUserSel/EGrefitter"); // use same root file name as Zmumu
131}
132
133// DESTRUCTOR:
134
139
141
142// INITIALIZE METHOD:
143
145{
146 ATH_MSG_INFO("Initializing IDPerfMonEoverP");
147
148 ATH_CHECK( m_evt.initialize() );
149
150 // Retrieve Jet selector tool
151 CHECK( m_jetCleaningTool.retrieve() );
152
153 // Retrieve fitter
154 if (m_TrackRefitter.retrieve().isFailure()) {
155 ATH_MSG_FATAL("Unable to retrieve " << m_TrackRefitter );
156 return StatusCode::FAILURE;
157 } else
158 ATH_MSG_INFO("Retrieved tool" << m_TrackRefitter );
159
160 // Retrieve the second fitter
161 if (m_TrackRefitter_no2.retrieve().isFailure()) {
162 ATH_MSG_FATAL("Unable to retrieve " << m_TrackRefitter_no2 );
163 return StatusCode::FAILURE;
164 } else {
165 ATH_MSG_INFO("Retrieved tool" << m_TrackRefitter_no2 );
166 }
167
168 if(m_trigDec.retrieve().isFailure()) {
169 ATH_MSG_FATAL("Unable to retrieve " << m_trigDec << " turn it off");
170 return StatusCode::FAILURE;
171 }
172 else {
173 ATH_MSG_INFO("Retrieved tool " << m_trigDec );
174 }
175
176
177 //
178 // Electron PID Variables
179 //
180 // Following are of ShowerShapeType
181 namespace xEgamma = xAOD::EgammaParameters;
182 namespace xIso = xAOD::Iso;
184 {xEgamma::f1, "f1"},
185 {xEgamma::emins1, "f1core"},
186 {xEgamma::fracs1, "fside"},
187 {xEgamma::e2tsts1, "Emax2"},
188 {xEgamma::weta1, "ws3"},
189 {xEgamma::wtots1, "wstot"},
190 {xEgamma::emaxs1,"emaxs1"},
191 {xEgamma::e233,"E233"},
192 {xEgamma::e237,"E237"},
193 {xEgamma::e277,"E277"},
194 {xEgamma::weta2,"weta2"},
195 {xEgamma::f3,"f3"},
196 {xEgamma::f3core,"f3core"}
197 };
198 // Following are of isolation type
200 {xIso::etcone20,"Etcone20"},
201 {xIso::etcone30,"Etcone30"},
202 {xIso::etcone40,"Etcone40"},
203 {xIso::ptcone30,"ptcone30"}
204 };
205 // Following are of trackcalomatch type
207 {xEgamma::deltaEta1,"deltaeta1"},
208 {xEgamma::deltaEta2,"deltaeta2"},
209 {xEgamma::deltaPhi2,"deltaphi2"}
210 };
211
212
213
214 //
215 // Trigger
216 //
218 "L1_MBTS_1",
219 "L1_EM2",
220 "L1_2EM2",
221 "L1_2EM4",
222 "L1_EM5",
223 "L1_EM10",
224 "L1_EM10I",
225 "L1_EM14",
226 "L1_EM18",
227 "L1_EM18I",
228 "L1_EM23I",
229 "L1_EM100",
230 "EF_2e5_medium",
231 "EF_e10_medium",
232 "EF_e20_loose",
233 "EF_em105_passHLT",
234 "EF_g20_loose",
235 "EF_e20_medium",
236 "EF_e22_medium",
237 //run 2 test
238 "HLT_e24_lhmedium_idperf_L1EM20VH",
239 "HLT_e24_medium_L1EM18VH",
240 "e5_vloose",
241 "ALL",
242 "HLT_ALL"
243 };
244
245 // If the validation nuptle has been requested Setup the ntuple
246 if (m_validationMode){
247 if (m_validationTree == nullptr ){ // validation tree does not exist yet
248 // create the new Tree
249 ATH_MSG_DEBUG ( "Booking validationTree with name: " << m_validationTreeName );
251 std::string FitterNames[3] = {"GX2","Refitted1","Refitted2"};
252 m_validationTree->Branch("runNumber" , &m_runNumber, "runNumber/I");
253 m_validationTree->Branch("eventNumber" , &m_evtNumber, "eventNumber/I");
254 m_validationTree->Branch("lumi_block" , &m_lumi_block, "lumi_block/I");
255 // counter for number of electrons
256 m_validationTree->Branch("nElectrons" , &m_nelectrons, "nElectrons/I");
257 // Track fitter information
258 for(int fitter(0); fitter < 3; ++fitter){
259 m_validationTree->Branch( (FitterNames[fitter]+"_Theta").c_str() , m_electronTheta[fitter], (FitterNames[fitter]+"_Theta0[nElectrons]/F").c_str() );
260 m_validationTree->Branch( (FitterNames[fitter]+"_Eta").c_str() , m_electronEta[fitter], (FitterNames[fitter]+"_Eta[nElectrons]/F").c_str() );
261 m_validationTree->Branch( (FitterNames[fitter]+"_Eta").c_str() , m_electronEta[fitter], (FitterNames[fitter]+"_Eta[nElectrons]/F").c_str() );
262 m_validationTree->Branch( (FitterNames[fitter]+"_Phi0").c_str() , m_electronPhi[fitter], (FitterNames[fitter]+"_Phi0[nElectrons]/F").c_str() );
263 m_validationTree->Branch( (FitterNames[fitter]+"_QoverP").c_str() , m_electronQoverP[fitter], (FitterNames[fitter]+"_QoverP[nElectrons]/F").c_str());
264 m_validationTree->Branch( (FitterNames[fitter]+"_d0").c_str() , m_electrond0[fitter], (FitterNames[fitter]+"_d0[nElectrons]/F").c_str());
265 m_validationTree->Branch( (FitterNames[fitter]+"_z0").c_str() , m_electronz0[fitter], (FitterNames[fitter]+"_z0[nElectrons]/F").c_str());
266 m_validationTree->Branch( (FitterNames[fitter]+"_LMQoverP").c_str() , m_electronLMQoverP[fitter], (FitterNames[fitter]+"_LMQoverP[nElectrons]/F").c_str());
267 m_validationTree->Branch( (FitterNames[fitter]+"_ThetaErr").c_str() , m_electronErrTheta[fitter], (FitterNames[fitter]+"_Theta0Err[nElectrons]/F").c_str());
268 m_validationTree->Branch( (FitterNames[fitter]+"_Phi0Err").c_str() , m_electronErrPhi[fitter], (FitterNames[fitter]+"_Phi0Err[nElectrons]/F").c_str());
269 m_validationTree->Branch( (FitterNames[fitter]+"_QoverPErr").c_str(), m_electronErrQoverP[fitter],(FitterNames[fitter]+"_QoverPErr[nElectrons]/F").c_str());
270 m_validationTree->Branch( (FitterNames[fitter]+"_d0Err").c_str() , m_electronErrd0[fitter], (FitterNames[fitter]+"_d0Err[nElectrons]/F").c_str());
271 m_validationTree->Branch( (FitterNames[fitter]+"_z0Err").c_str() , m_electronErrz0[fitter], (FitterNames[fitter]+"_z0Err[nElectrons]/F").c_str());
272 }
273
274 m_validationTree->Branch("associatedToVtx" , m_associatedToVtx, "associatedToVtx[nElectrons]/I");
275 m_validationTree->Branch("nbpv", &m_nbpv, "nbpv/I");
276 m_validationTree->Branch("pvtype", m_pvtype, "pvtype[nbpv]/I");
277 m_validationTree->Branch("pvnbtk", m_pvnbtk, "pvnbtk[nbpv]/I");
278 m_validationTree->Branch("pvsumpt", m_pvsumpt, "pvsumpt[nbpv]/F");
279 m_validationTree->Branch("pvx", m_pvx, "pvx[nbpv]/F");
280 m_validationTree->Branch("pvy", m_pvy, "pvy[nbpv]/F");
281 m_validationTree->Branch("pvz", m_pvz, "pvz[nbpv]/F");
282 m_validationTree->Branch("errpvx", m_errpvx, "errpvx[nbpv]/F");
283 m_validationTree->Branch("errpvy", m_errpvy, "errpvy[nbpv]/F");
284 m_validationTree->Branch("errpvz", m_errpvz, "errpvz[nbpv]/F");
285 m_validationTree->Branch("covpvxpvy", m_covpvxpvy, "covpvxpvy[nbpv]/F");
286 m_validationTree->Branch("covpvzpvx", m_covpvzpvx, "covpvzpvx[nbpv]/F");
287 m_validationTree->Branch("covpvypvz", m_covpvypvz, "covpvypvz[nbpv]/F");
288
289
290 m_validationTree->Branch("METgoodness", &m_METgoodness, "METgoodness/B");
291 m_validationTree->Branch("sumet", &m_sumet, "sumet/F");
292 m_validationTree->Branch("missingEt", &m_missingEt, "missingEt/F");
293 m_validationTree->Branch("missingEtx", &m_missingEtx, "missingEtx/F");
294 m_validationTree->Branch("missingEty", &m_missingEty, "missingEty/F");
295
296
297 m_validationTree->Branch("ElectronAuthor" , m_author, "ElectronAuthor[nElectrons]/I");
298 m_validationTree->Branch("ClusterEnergy" , m_ClusterEnergy, "ClusterEnergy[nElectrons]/F");
299 m_validationTree->Branch("ClusterEta" , m_ClusterEta, "ClusterEta[nElectrons]/F");
300 m_validationTree->Branch("ClusterPhi" , m_ClusterPhi, "ClusterPhi[nElectrons]/F");
301
302 m_validationTree->Branch("IsEMLoose" , m_IsEMLoose, "m_IsEMLoose[nElectrons]/O");
303 m_validationTree->Branch("IsEMMedium" , m_IsEMMedium, "m_IsEMMedium[nElectrons]/O");
304 m_validationTree->Branch("IsEMTight" , m_IsEMTight, "m_IsEMTight[nElectrons]/O");
305 m_validationTree->Branch("isGoodOQ" , m_isGoodOQ, "isGoodOQ[nElectrons]/O");
306
307 m_validationTree->Branch("nTRT" , m_nTRT , "nTRT[nElectrons]/I");
308 m_validationTree->Branch("nSCT" , m_nSCT, "nSCT[nElectrons]/I");
309 m_validationTree->Branch("nBLayer" , m_nBLayer, "nBLayer[nElectrons]/I");
310 m_validationTree->Branch("nPIX" , m_nPIX, "nPIX[nElectrons]/I");
311 m_validationTree->Branch("nTRTout" , m_nTRTout, "nTRTout[nElectrons]/I");
312 m_validationTree->Branch("nSCTout" , m_nSCTout, "nSCTout[nElectrons]/I");
313 m_validationTree->Branch("nPIXout" , m_nPIXout, "nPIXout[nElectrons]/I");
314 m_validationTree->Branch("nTRTHT" , m_nTRTHT, "nTRTHT[nElectrons]/I");
315 m_validationTree->Branch("nTRTHout" , m_nTRTHTout, "nTRTHTout[nElectrons]/I");
316
317
318 for(unsigned int item(0); item < m_PID_ShowerType_Names.size(); ++item){
319 m_validationTree->Branch( m_PID_ShowerType_Names[item].second.c_str() , m_ePID_ShowerType[item], std::string( m_PID_ShowerType_Names[item].second + "[nElectrons]/F").c_str() );
320 }
321
322 for(unsigned int item(0); item < m_PID_IsolationType_Names.size(); ++item){
323 m_validationTree->Branch( m_PID_IsolationType_Names[item].second.c_str() , m_ePID_IsolationType[item], std::string( m_PID_IsolationType_Names[item].second + "[nElectrons]/F").c_str() );
324 }
325
326 for(unsigned int item(0); item < m_PID_TrackCaloMatchType_Names.size(); ++item){
327 m_validationTree->Branch( m_PID_TrackCaloMatchType_Names[item].second.c_str() , m_ePID_TrackCaloMatchType[item], std::string( m_PID_TrackCaloMatchType_Names[item].second + "[nElectrons]/F").c_str() );
328 }
329
330 for(unsigned int item(0); item < m_PID_SummaryType_Names.size(); ++item){
331 m_validationTree->Branch( m_PID_SummaryType_Names[item].second.c_str() , m_ePID_SummaryType[item], std::string( m_PID_SummaryType_Names[item].second + "[nElectrons]/F").c_str() );
332 }
333
334 for(unsigned int item(0); item < m_triggerNames.size(); ++item){
335 m_validationTree->Branch( m_triggerNames[item].c_str() , &m_trigger[item], std::string( m_triggerNames[item]+ "/B" ).c_str() );
336 }
337
338 }
339
340
341 if(m_smallValidationTree == nullptr){
342
344
345 m_smallValidationTree->Branch("charge",&m_smallCharge,"charge/D");
346 m_smallValidationTree->Branch("runNumber" , &m_runNumber, "runNumber/I");
347 m_smallValidationTree->Branch("Default_QoverP",&m_small_QoverP,"Default_QoverP/D");
348 m_smallValidationTree->Branch("Refitted1_QoverP",&m_small1_QoverP,"Refitted1_QoverP/D");
349 m_smallValidationTree->Branch("Refitted2_QoverP",&m_small2_QoverP,"Refitted2_QoverP/D");
350 m_smallValidationTree->Branch("ClusterEnergy",&m_smallClusterEnergy,"ClusterEnergy/D");
351 m_smallValidationTree->Branch("ClusterEta" ,&m_smallClusterEta,"ClusterEta/D");
352 m_smallValidationTree->Branch("ClusterPhi" ,&m_smallClusterPhi,"ClusterPhi/D");
353 m_smallValidationTree->Branch("TrackTheta" ,&m_smallTrackTheta,"TrackTheta/D");
354 }
355
356 // Access THistSvc
357 ServiceHandle<ITHistSvc> tHistSvc("THistSvc", name());
358 if ( tHistSvc.retrieve().isSuccess()) {
359 ATH_MSG_DEBUG(" initialize() THistSvc successfully retrieved ");
360 }
361 else {
362 ATH_MSG_ERROR("initialize() Could not find Hist Service -> Switching ValidationMode Off !");
365 m_validationMode = false;
366 }
367
368 // now register the Tree
369 if (m_validationTree != nullptr ) {
370 if ( (tHistSvc->regTree(m_validationTreeFolder, m_validationTree)).isSuccess() ) {
371 ATH_MSG_DEBUG( "initialize() validation tree (" << m_validationTree->GetName() <<") successfully registered in folder " << m_validationTreeFolder );
372 }
373 else {
374 ATH_MSG_ERROR( "initialize() Could not register the validation Tree -> Switching ValidationMode Off !");
376 m_validationMode = false;
377 }
378 }
379 else {
380 ATH_MSG_DEBUG( "initialize() no validation tree to register :( ");
381 }
382
383 if ((tHistSvc->regTree(m_smallValidationTreeFolder, m_smallValidationTree)).isFailure() ) {
384 ATH_MSG_ERROR("initialize() Could not register the validation Tree -> Switching ValidationMode Off !");
386 m_validationMode = false;
387 }
388 else {
389 m_ZeeLooseMassOS_Cluster = new TH1F("ZeeMassLooseOS","ZeeMassLooseOS", 120, 60000 ,120000);
390 m_ZeeLooseMassSS_Cluster = new TH1F("ZeeMassLooseSS","ZeeMassLooseSS", 120, 60000 ,120000);
391 m_ZeeMediumMassOS_Cluster = new TH1F("ZeeMassMediumOS","ZeeMassMediumOS", 120, 60000 ,120000);
392 m_ZeeMediumMassSS_Cluster = new TH1F("ZeeMassMediumSS","ZeeMassMediumSS", 120, 60000 ,120000);
393 m_WenuLooseElectronET= new TH1F("WenuLooseElectronET","WenuLooseElectronET", 80, 20000 ,100000);
394 m_WenuTight_Met = new TH1F("WenuTight_Met","WenuTight_Met", 120, 00000 ,120000);
395 m_WenuTight_MT = new TH1F("WenuTight_MT","WenuTight_MT", 120, 00000 ,120000);
396 m_WenuTightMet_MT = new TH1F("WenuTightMet_MT","WenuTightMet_MT", 120, 00000 ,120000);
397 m_WenuTightElectronET = new TH1F("WenuTightElectronET","WenuTightElectronET", 100, 00000 ,100000);
398 m_WenuTightW_PT = new TH1F("WenuTightW_PT","WenuTightW_PT", 100, 00000 ,100000);
399
400 m_ZeeMediumOS_ClusterPtEta = new TH2F("ZeeMediumOS_ClusterPtEta", "ZeeMediumOS_ClusterPtEta",100,20000,120000,50,-2.5,2.5);
401 m_WenuTightElectron_PTEtaPos = new TH2F("WenuTightElectron_PTEtaPos", "WenuTightElectron_PTEtaPos",100,20000,120000,50,-2.5,2.5);
402 m_WenuTightElectron_PTEtaNeg = new TH2F("WenuTightElectron_PTEtaNeg", "WenuTightElectron_PTEtaNeg",100,20000,120000,50,-2.5,2.5);
403
404 bool somethingFailed{};
405 somethingFailed |= ( (tHistSvc->regHist(m_smallValidationTreeFolder + "/ZeeMassLooseOS",m_ZeeLooseMassOS_Cluster )).isFailure() );
406 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/ZeeMassLooseSS",m_ZeeLooseMassSS_Cluster )).isFailure() );
407 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/ZeeMassMediumOS",m_ZeeMediumMassOS_Cluster )).isFailure() );
408 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/ZeeMassMediumSS",m_ZeeMediumMassSS_Cluster )).isFailure() );
409 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/WenuLooseElectronET",m_WenuLooseElectronET )).isFailure() );
410 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/WenuTight_Met",m_WenuTight_Met )).isFailure() );
411 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/WenuTight_MT",m_WenuTight_MT )).isFailure() );
412 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/WenuTightMet_MT",m_WenuTightMet_MT )).isFailure() );
413 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/WenuTightElectronET",m_WenuTightElectronET )).isFailure() );
414 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/WenuTightW_PT",m_WenuTightW_PT )).isFailure() );
415 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/ZeeMediumOS_ClusterPtEta",m_ZeeMediumOS_ClusterPtEta )).isFailure() );
416 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/WenuTightElectron_PTEtaPos",m_WenuTightElectron_PTEtaPos )).isFailure() );
417 somethingFailed |=( (tHistSvc->regHist(m_smallValidationTreeFolder + "/WenuTightElectron_PTEtaNeg",m_WenuTightElectron_PTEtaNeg )).isFailure() );
418 if (somethingFailed) ATH_MSG_ERROR("initialize() Could not register histogram ");
419
420 ATH_MSG_INFO("Booked Small Tree add histograms");
421 }
422
423 ATH_MSG_INFO("Loaded THistSvc");
424 }
425
426 //---Electron Likelihood tool---
427 ATH_MSG_INFO("IDPerfMonEoverP::Initialize() -- Setting up electron LH tool.");
428 m_LHToolLoose2015 = new AsgElectronLikelihoodTool ("m_LHToolLoose2015");
429 m_LHToolMedium2015 = new AsgElectronLikelihoodTool ("m_LHToolMedium2015");
430 m_LHToolTight2015 = new AsgElectronLikelihoodTool ("m_LHToolTight2015");
431
432 if((m_LHToolLoose2015->setProperty("primaryVertexContainer",m_primaryVertexCollection)).isFailure())
433 ATH_MSG_WARNING("Failure setting primary vertex container " << m_primaryVertexCollection << "in loose electron likelihood tool");
434 if((m_LHToolMedium2015->setProperty("primaryVertexContainer",m_primaryVertexCollection)).isFailure())
435 ATH_MSG_WARNING("Failure setting primary vertex container " << m_primaryVertexCollection << "in medium electron likelihood tool");
436 if((m_LHToolTight2015->setProperty("primaryVertexContainer",m_primaryVertexCollection)).isFailure())
437 ATH_MSG_WARNING("Failure setting primary vertex container " << m_primaryVertexCollection << "in tight electron likelihood tool");
438
439 //Set up electron LH level
440 std::string confDir = "ElectronPhotonSelectorTools/offline/"+m_lhTune+"/";
441 std::string configFileL = confDir+"ElectronLikelihoodLooseOfflineConfig2015.conf";
442 std::string configFileM = confDir+"ElectronLikelihoodMediumOfflineConfig2015.conf";
443 std::string configFileT = confDir+"ElectronLikelihoodTightOfflineConfig2015.conf";
444
445 if((m_LHToolLoose2015->setProperty("ConfigFile",configFileL)).isFailure())
446 ATH_MSG_WARNING("Failure loading ConfigFile in loose electron likelihood tool.");
447 if((m_LHToolMedium2015->setProperty("ConfigFile",configFileM)).isFailure())
448 ATH_MSG_WARNING("Failure loading ConfigFile in medium electron likelihood tool.");
449 if((m_LHToolTight2015->setProperty("ConfigFile",configFileT)).isFailure())
450 ATH_MSG_WARNING("Failure loading ConfigFile in tight electron likelihood tool.");
451
452 StatusCode lhl = m_LHToolLoose2015->initialize();
453 if(lhl.isFailure())
454 ATH_MSG_WARNING("Loose electron likelihood tool initialize() failed!");
455 StatusCode lhm = m_LHToolMedium2015->initialize();
456 if(lhm.isFailure())
457 ATH_MSG_WARNING("Medium electron likelihood tool initialize() failed!");
458 StatusCode lht = m_LHToolTight2015->initialize();
459 if(lht.isFailure())
460 ATH_MSG_WARNING("Tight electron likelihood tool initialize() failed!");
461 ATH_MSG_INFO( "Initialization completed successfully");
462 return StatusCode::SUCCESS;
463}
464
465// FINALIZE METHOD:
466
468{
469 return StatusCode::SUCCESS;
470}
471
473// ATHENA EXECUTE METHOD:
474StatusCode IDPerfMonEoverP::execute(const EventContext& ctx)
475{
476 ATH_MSG_DEBUG( "Executing IDPerfMonEoverP" );
477 StatusCode sc(StatusCode::SUCCESS);
478 std::map<const xAOD::TrackParticle*, VxPos > trackParticleVertexMap;
479 const xAOD::Vertex* primaryVertexFirstCandidate = nullptr;
480 if (m_validationMode){
482 }else{
483 ATH_MSG_WARNING( " Validation Mode has been turned off ALG will do not fill Ntuples" );
484 return sc;
485 }
486
487 ATH_MSG_DEBUG("Retrieving event info.");
489 if(evt.isValid()) {
490 m_runNumber = evt->runNumber();
491 m_evtNumber = evt->eventNumber();
492 m_lumi_block = evt->lumiBlock();
493 ATH_MSG_DEBUG(" --> run: " << m_runNumber << " event: " << m_evtNumber << " lumiblock: " << m_lumi_block );
494 }
495 else {
496 ATH_MSG_ERROR("Could not retrieve event info."); // Keeping ERROR only to preserve old functionality
497 }
498
499 ATH_MSG_DEBUG("Retrieved Trigger info.");
501
502 if (m_fillVertexInfo) {
503 if ( not fillVertexInformation(trackParticleVertexMap, primaryVertexFirstCandidate) ){
504 ATH_MSG_DEBUG("No Primary Vertex info found");
505 }
506 } // doVertexInfo
507
508 ATH_MSG_DEBUG("MET info.being stored");
509 if( storeMETinformation() ) {
510 ATH_MSG_DEBUG("MET info. stored");
511 }
512 else {
513 ATH_MSG_DEBUG("NO MET info. stored :(");
514 }
515
516 // Get the electron AOD container
517 const xAOD::ElectronContainer* ElectronInput_container;
518 ATH_MSG_DEBUG("Retrieving ElectronInput_container: " << m_InputElectronContainerName);
519 sc = evtStore()->retrieve(ElectronInput_container, m_InputElectronContainerName);
520 if (sc != StatusCode::SUCCESS){
521 ATH_MSG_WARNING("No electron container --> return");
522 deleteAction();
523 return StatusCode::SUCCESS;
524 }
525
526 if (ElectronInput_container->empty() ){
527 ATH_MSG_DEBUG("-- ElectronInput_container is empty -> return");
528 deleteAction();
529 return StatusCode::SUCCESS;
530 }
531
534
535
536 typedef xAOD::ElectronContainer::const_iterator electron_iterator;
537 electron_iterator iter = ElectronInput_container->begin();
538 electron_iterator iterEnd = ElectronInput_container->end();
539
540 // Loop over the Electrons
541 ATH_MSG_DEBUG("Electron info. being stored");
542 for(; iter != iterEnd ; ++iter) {
543 ATH_MSG_DEBUG("Dealing with electron: "<< m_electronCounter+1);
544 if (m_electronCounter >= NOS_ELECTRONS) break;
545 const xAOD::Electron *pThisElectron = (*iter);
546
547 if (pThisElectron->passSelection("LHTight") ) { // keep only tight electrons
549
550 // Cluster Info
551 fillElectronInfo ( pThisElectron );
552 // Fill General info
553 fillGeneral( pThisElectron );
554 // Fill IsEm info
555 fillIsEM( pThisElectron );
556
557 //Get the track particle
558 const xAOD::TrackParticle* mytp = (*iter)->trackParticle();
559 if ( mytp != nullptr ) ATH_MSG_DEBUG("-- electron: "<< m_electronCounter+1 << " pt: " << mytp->p4().Perp() );
560
561 if( mytp != nullptr ){
562 uint8_t dummy(0);
563 auto summaryByDetector=[&mytp,&dummy]( const xAOD::SummaryType & t){
564 return mytp->summaryValue(dummy, t) ? (dummy) : (-1);
565 };
566 m_nTRT[m_electronCounter] = summaryByDetector( xAOD::numberOfTRTHits );
567 m_nSCT[m_electronCounter] = summaryByDetector( xAOD::numberOfSCTHits );
568 m_nPIX[m_electronCounter] = summaryByDetector( xAOD::numberOfPixelHits );
574 }
575 else{
576 ATH_MSG_DEBUG("Electron with no track particle?? Possibly Forward");
577 continue;
578 }
579
580 //Find which if any vertex the electron track is associated to
581 VxPos myVxPos = findAssociatedVertex( trackParticleVertexMap,
582 primaryVertexFirstCandidate,
583 pThisElectron );
584 m_associatedToVtx[m_electronCounter] = myVxPos.second;
585 if( mytp->track() ){
586 const Trk::Track* oTrkTrack = mytp->track();
587 if (oTrkTrack){
588 const Trk::Perigee* oMeasPer = oTrkTrack->perigeeParameters() ;
589 if (oMeasPer) addToValidationNtuple( oMeasPer, pThisElectron->caloCluster(), 0 );
590 fillLastMeasurement( oTrkTrack , 0 );
591 }
592 }
593 else {
594 ATH_MSG_DEBUG("mytp->track() == 0");
595 const Trk::Perigee* oMeasPer = &(mytp->perigeeParameters()) ;
596 addToValidationNtuple( oMeasPer, pThisElectron->caloCluster(), 0 );
597 }
598
599
601 // First Refitter................
602 ATH_MSG_DEBUG( "Refitting the track" );
603
605 StatusCode sc = m_TrackRefitter->refitTrack(ctx,
606 pThisElectron->trackParticle()->track(),
607 cache1 );
608
609 if (sc == StatusCode::SUCCESS){
610 Trk::Track* trkTrack= cache1.refittedTrack.release();
611 m_refittedTracks_no1->push_back(trkTrack);
612 addToValidationNtuple( cache1.refittedTrackPerigee ,pThisElectron->caloCluster(), 1 );
613 fillLastMeasurement(trkTrack, 1 );
614 } else {
615 ATH_MSG_DEBUG( "Track Refit Failed" );
616 }
617 //******************************************************//
618 // Refit tracks using the second refitter if it is present
619 //******************************************************//
620 ATH_MSG_DEBUG( "Refitting the track again" );
621
623 sc = m_TrackRefitter_no2->refitTrack(ctx,
624 pThisElectron->trackParticle()->track(),
625 cache2 );
626
627 if (sc == StatusCode::SUCCESS){
628 Trk::Track* trkTrack= cache2.refittedTrack.release();
629 //Add the refitted track to the TrackCollection
630 m_refittedTracks_no2->push_back( trkTrack );
631 //Add data to the trkRefitterNtuple
632
633 addToValidationNtuple( cache2.refittedTrackPerigee ,pThisElectron->caloCluster(), 2 );
634 fillLastMeasurement( trkTrack, 2 );
635 }
636 else {
637 ATH_MSG_DEBUG( "Track Refit Failed" );
638 }
639 }
640 else {
641 ATH_MSG_DEBUG( "Not Refitting the track -- DO NOTHING" );
642 }//End if >6 silicon hits;
643
644 //Increment the electron counter for the validation nutple
646 } // isTightElec
647 } // loop on electrons
648
649 // Commit Data to Ntuple;
651 // Fill much smaller tree
652 std::vector<int> goodElectrons = FillSimpleTree();
653 TrackCollection* selectedElectrons = new TrackCollection;
654
655 for( const auto & thisGoodElectron: goodElectrons){
657 StatusCode sc = m_TrackRefitter->refitTrack(ctx,
658 (*ElectronInput_container)[thisGoodElectron]->trackParticle()->track(),
659 cache );
660 if (sc == StatusCode::SUCCESS){
661 Trk::Track* trkTrack= cache.refittedTrack.release();
662 selectedElectrons->push_back(trkTrack);
663 }
664 }
665
666 //******************************************************//
667 //* Add the newly created TrackCollection to StoreGate *//
668 //******************************************************//
669
671 if (sc.isFailure())
672 {
673 ATH_MSG_ERROR("Could not record "<< m_OutputTrackCollectionName_no1 <<" object.");
674 delete selectedElectrons;
675 return (StatusCode::FAILURE);
676 }
677 //
679 if (sc.isFailure())
680 {
681 ATH_MSG_ERROR("Could not record "<< m_OutputTrackCollectionName_no2 <<" object.");
682 delete selectedElectrons;
683 return (StatusCode::FAILURE);
684 }
685 //
686 sc = evtStore()->record( selectedElectrons, m_OutputTrackCollectionName_no1 + "Selected", false );
687 if (sc.isFailure())
688 {
689 ATH_MSG_ERROR("Could not record "<< m_OutputTrackCollectionName_no1+"Selected" <<" object.");
690 delete selectedElectrons;
691 return (StatusCode::FAILURE);
692 }
693 ATH_MSG_DEBUG( "execute completed successfully");
694 return StatusCode::SUCCESS;
695}
696
697void IDPerfMonEoverP::addToValidationNtuple(const Trk::Perigee* perigee,const xAOD::CaloCluster* /*cluster*/, int isOriginal){
698 if (perigee){
699 ATH_MSG_DEBUG( "Adding data to ntuple" );
700 if (isOriginal >= 0 && isOriginal <3){
701 m_electrond0[isOriginal][m_electronCounter] = perigee->parameters()[Trk::d0];
702 m_electronz0[isOriginal][m_electronCounter] = perigee->parameters()[Trk::z0];
703 m_electronPhi[isOriginal][m_electronCounter] = perigee->parameters()[Trk::phi0];
704 m_electronTheta[isOriginal][m_electronCounter] = perigee->parameters()[Trk::theta];
705 m_electronEta[isOriginal][m_electronCounter] = perigee->eta();
706 m_electronQoverP[isOriginal][m_electronCounter]= perigee->parameters()[Trk::qOverP];
707 //
708 const AmgSymMatrix(5)* matrix = perigee->covariance();
709 if (matrix){
710 m_electronErrd0[isOriginal][m_electronCounter] =std::sqrt( (*matrix)(Trk::d0,Trk::d0) );
711 m_electronErrz0[isOriginal][m_electronCounter] = std::sqrt( (*matrix)(Trk::z0,Trk::z0) );
712 m_electronErrPhi[isOriginal][m_electronCounter] = std::sqrt( (*matrix)(Trk::phi0,Trk::phi0) );
713 m_electronErrTheta[isOriginal][m_electronCounter]= std::sqrt( (*matrix)(Trk::theta,Trk::theta) );
714 m_electronErrQoverP[isOriginal][m_electronCounter]= std::sqrt( (*matrix)(Trk::qOverP,Trk::qOverP) );
715 }
716 }
717 } else {
718 ATH_MSG_DEBUG( "No MeasuredPerigee - cannot add data to ntuple" );
719 }
720
721 ATH_MSG_DEBUG( "Finished adding data to ntuple" );
722}
723
726{
727 ATH_MSG_DEBUG( "fillIsEM" );
728 int el_goodOQ = (int)eg->isGoodOQ(xAOD::EgammaParameters::BADCLUSELECTRON);
729 m_isGoodOQ[m_electronCounter] = el_goodOQ;
730 // check loose LH
731 bool val_loose = (bool) m_LHToolLoose2015->accept(eg);
732 ATH_MSG_DEBUG( "Loose value : " << val_loose);
733 if(val_loose){
734 m_IsEMLoose[m_electronCounter] = val_loose;
735 }//else{ATH_MSG_DEBUG("Loose electron not defined !");}
736
737 // check medium LH
738 bool val_med = (bool) m_LHToolMedium2015->accept(eg);
739 ATH_MSG_DEBUG( "Medium value : " << val_med );
740 if(val_med){
742 }//else{ATH_MSG_DEBUG("Mediu, electron not defined !");}
743
744 // check tight LH
745 bool val_tight = (bool) m_LHToolTight2015->accept(eg);
746 ATH_MSG_DEBUG( "Tight value : " << val_tight);
747 if(val_tight){
748 m_IsEMTight[m_electronCounter] = val_tight;
749 }//else{ATH_MSG_DEBUG("Tight electron not defined !");}
750 return;
751
752}
753
754
756{
757 ATH_MSG_DEBUG( "fillGeneral" );
758 const xAOD::CaloCluster* cluster = eg->caloCluster();
759 if(!cluster) return;
760 m_ClusterEnergy[m_electronCounter] = cluster->e();
761 m_ClusterPhi[m_electronCounter] = cluster->phi();
762 m_ClusterEta[m_electronCounter] = cluster->eta();
763}
764
765
766
767
769{
770 ATH_MSG_DEBUG( "clear ValidationNtuple variables" );
771 for (int i = 0 ; i < NOS_ELECTRONS ; ++i){
772 for (int j = 0 ; j <3 ; ++j){
773 m_electrond0[j][i] = 0;
774 m_electronz0[j][i] = 0;
775 m_electronPhi[j][i] = 0;
776 m_electronTheta[j][i] = 0;
777 m_electronEta[j][i] = 0;
778 m_electronQoverP[j][i] = 0;
779 m_electronLMQoverP[j][i] = 0;
780
781 m_electronErrd0[j][i] = 0;
782 m_electronErrz0[j][i] = 0;
783 m_electronErrPhi[j][i] = 0;
784 m_electronErrTheta[j][i] = 0;
785 m_electronErrQoverP[j][i] = 0;
786
787 }
788 m_associatedToVtx[i] = 0;
789
790 m_author[i] = 0;
791
792 m_ClusterEnergy[i] = 0;
793
794 m_IsEMLoose[i] = false;
795 m_IsEMMedium[i] = false;
796 m_IsEMTight[i] = false;
797 m_IsEMTightTRT[i] = false;
798
799
800 for (int j = 0 ; j < 50 ; ++j){
801 m_ePID_ShowerType[j][i] =0;
802 m_ePID_IsolationType[j][i] =0;
804 m_ePID_SummaryType[j][i] =0;
805 m_trigger[j] = false;
806 }
807 }
808
809
810 //Vertex information
811 m_nbpv =0;
812 for (int i(0); i< NO_PV; ++i){
813 m_pvtype[i] =0;
814 m_pvnbtk[i]=0;
815 m_pvsumpt[i]=0;
816 m_pvx[i]=0;
817 m_pvy[i]=0;
818 m_pvz[i]=0;
819 m_errpvx[i]=0;
820 m_errpvy[i]=0;
821 m_errpvz[i]=0;
822 m_covpvxpvy[i]=0;
823 m_covpvypvz[i]=0;
824 m_covpvzpvx[i]=0;
825 }
826 //MET
827 m_METgoodness=false;
828 m_sumet=0;
829 m_missingEt=0;
830 m_missingEtx=0;
831 m_missingEty=0;
832
833 return;
834}
835
838{
839
840}
841
844{
845 ATH_MSG_DEBUG( "validationAction() -- START -- ");
846 // first record the values
847 if (m_validationTree){
850 m_validationTree->Fill();
851 ATH_MSG_DEBUG( "Writing data into ntuple " << m_validationTree->GetName() << ". Entry #" << m_validationTree->GetEntries() );
852 }
853 // then reset
855 ATH_MSG_DEBUG( "validationAction() -- completed -- current number of entries " << m_validationTree->GetEntries() );
856 }
857}
858
859
861{
862 ATH_MSG_VERBOSE("In storeMETinformation()");
863 const xAOD::MissingETContainer *pMissingCont(0);
864 const xAOD::MissingET *MET;
866 ATH_MSG_WARNING("No collection with name " << m_missingEtObjectName << " found in StoreGate");
867 return false;
868 }
869
870 StatusCode sc;
871 sc = evtStore()->retrieve(pMissingCont,m_missingEtObjectName);
872 if (sc.isFailure()) {
873 ATH_MSG_ERROR( "Could not retrieve MissingETContainer" );
874 return false;
875 }
876 MET = (*pMissingCont)[m_metRefFinalName];
878 m_sumet = MET->sumet();
879 m_missingEt = MET->met();
880 m_missingEtx = MET->mpx();
881 m_missingEty = MET->mpy();
882 return true;
883}
884
885
887{
888 const xAOD::JetContainer* jetTDS = nullptr;
889 StatusCode sc= evtStore()->retrieve( jetTDS, m_jetContainerName);
890 if( sc.isFailure() || !jetTDS ) {
891 ATH_MSG_WARNING("No " << m_jetContainerName << " jet container found in TDS");
892 return false;
893 }
894 if (jetTDS->empty()) return true;
895 bool cleanJet = true;
896 for(const auto* jet_elem : *jetTDS ) {
897 if(!m_jetCleaningTool->keep( *jet_elem )) cleanJet=false;
898 if(!cleanJet) break;
899 }
900 return cleanJet;
901}
902
904bool IDPerfMonEoverP::fillVertexInformation(std::map<const xAOD::TrackParticle*, VxPos >& trackParticleVertexMap,
905 xAOD::Vertex const* & primaryVertexFirstCandidate)
906{
907 ATH_MSG_DEBUG( "fillVertexInformation() -- START --" );
908 const xAOD::VertexContainer* vxContainer(0);
909 int npv = 0;
910 StatusCode sc = evtStore()->retrieve(vxContainer, m_primaryVertexCollection);
911 if (sc.isFailure()) {
912 ATH_MSG_WARNING( "Could not retrieve primary vertex info: " << m_primaryVertexCollection );
913 return false;
914 }
915 else {
916 ATH_MSG_DEBUG( "Found primary vertex info: " << m_primaryVertexCollection );
917 if(vxContainer) {
918 ATH_MSG_DEBUG("Nb of reco primary vertex for coll "
919 << " = " << vxContainer->size() );
920 primaryVertexFirstCandidate = std::begin(*vxContainer)[0];
921 ATH_MSG_DEBUG( "The primary vertex type: " << primaryVertexFirstCandidate->type() );
922 int vtxCount = 0;
923 for(const auto* vxI : *vxContainer ) {
924 int type = (int)(vxI)->vertexType();
925 const xAOD::Vertex* primaryVertex = vxI;
926 vtxCount++;
927 ATH_MSG_DEBUG( " -- dealing with vertex " << vtxCount << " type: " << type );
928 int nbtk = 0;
929 const std::vector< ElementLink< xAOD::TrackParticleContainer > > tpLinks = vxI->trackParticleLinks();
930 float sumpt = 0.;
931 if(not tpLinks.empty()) {
932 nbtk = tpLinks.size();
933 ATH_MSG_DEBUG( " -- vertex " << vtxCount << " has " << nbtk << " track particles" );
934 for(const auto& tp_elem : tpLinks ){
935 const xAOD::TrackParticle* trk = *tp_elem;
936 if (trk != NULL) {
937 VxPos myVxPos = std::make_pair(vxI,npv);
938 trackParticleVertexMap.insert( std::make_pair( trk, myVxPos ) );
939 if(trk) {
940 sumpt += trk->p4().Perp();
941 }
942 }
943 else {
944 ATH_MSG_DEBUG( " -- trk is NULL :(" );
945 } // trk not null
946 } // loop on tracks
947 ATH_MSG_DEBUG( "Reco PV " << npv << ": ("
948 << primaryVertex->position().x() << ","
949 << primaryVertex->position().y() << ","
950 << primaryVertex->position().z() << ")"
951 << " type=" << type
952 << " nbtk=" << nbtk
953 << " sumpt=" << sumpt);
954
955 if(npv >= NO_PV) {
956 ATH_MSG_WARNING( "More than " << NO_PV << " reconstructed primary vertices in event "
957 << "for run= " << m_runNumber << " evt= " << m_evtNumber
958 << ". Truncated event. " );
959 } else {
960 m_pvtype[npv] = type;
961 m_pvnbtk[npv] = nbtk;
962 m_pvsumpt[npv] = sumpt;
963 m_pvx[npv] = primaryVertex->position().x();
964 m_pvy[npv] = primaryVertex->position().y();
965 m_pvz[npv] = primaryVertex->position().z();
966
967 }
968 ++npv;
969 } else {
970 ATH_MSG_DEBUG( "Vertex " << npv << " has no tracks associated to it!" );
971 }
972 }
973 } else {
974 ATH_MSG_DEBUG( "No container in collection?? " << m_primaryVertexCollection );
975 }
976 }
977 m_nbpv = npv;
978
979 ATH_MSG_DEBUG("Done filling Vertex information -- completed -- ");
980
981 if (npv == 0) return false;
982 return true;
983}
984
985VxPos IDPerfMonEoverP::findAssociatedVertex(std::map<const xAOD::TrackParticle*, VxPos >& trackParticleVertexMap,
986 const xAOD::Vertex* primaryVertexFirstCandidate,
987 const xAOD::Electron* eg) const
988{
989 ATH_MSG_VERBOSE("In findAssociatedVertex()");
990 std::map<const xAOD::TrackParticle*, VxPos>::iterator tpVx =
991 trackParticleVertexMap.find(eg->trackParticle());
992 if (tpVx == trackParticleVertexMap.end() ){
993 return std::make_pair( primaryVertexFirstCandidate,-1 );
994 } else
995 return (*tpVx).second;
996
997}
998
999
1001{
1002 ATH_MSG_VERBOSE("In fillTriggerInformation()");
1003 ATH_MSG_DEBUG( "Pass state All = " << m_trigDec->isPassed( ".*" ) );
1004 ATH_MSG_DEBUG( "Pass state L1 = " << m_trigDec->isPassed( "L1_.*" ) );
1005 ATH_MSG_DEBUG( "Pass state L2 = " << m_trigDec->isPassed( "L2_.*" ) );
1006 ATH_MSG_DEBUG( "Pass state EF = " << m_trigDec->isPassed( "EF_.*" ) );
1007 ATH_MSG_DEBUG("HLT_.* is passed: " << m_trigDec->isPassed("HLT_.*"));
1008 for (unsigned int i=0; i < m_triggerNames.size(); ++i){
1009 if(m_triggerNames[i] == "ALL")
1010 m_trigger[i] = m_trigDec->isPassed(".*");
1011 else if(m_triggerNames[i] == "HLT_ALL")
1012 m_trigger[i] = m_trigDec->isPassed("HLT_.*");
1013 else
1014 m_trigger[i] = m_trigDec->isPassed(m_triggerNames[i]);
1015 }
1016 return;
1017}
1018
1020{
1021 ATH_MSG_VERBOSE( "In fillElectronInfo()" );
1022 for (size_t i = 0; i < m_PID_ShowerType_Names.size(); i++) {
1023 float dummy(-1);
1024 m_ePID_ShowerType[i][m_electronCounter] = static_cast<float> (p->showerShapeValue( dummy, m_PID_ShowerType_Names[i].first ))? dummy :-1;
1025 }
1026 for (size_t i = 0; i < m_PID_TrackCaloMatchType_Names.size(); i++) {
1027 float dummy(-1);
1028 m_ePID_TrackCaloMatchType[i][m_electronCounter] = static_cast<float> (p->trackCaloMatchValue( dummy, m_PID_TrackCaloMatchType_Names[i].first ))? dummy :-1;
1029 }
1030
1031for (size_t i = 0; i < m_PID_SummaryType_Names.size(); i++) {
1032 float dummy(-1);
1033 m_ePID_SummaryType[i][m_electronCounter] = static_cast<float> (p->trackParticleSummaryValue( dummy, m_PID_SummaryType_Names[i].first ))? dummy :-1;
1034 }
1035
1036 return;
1037
1038}
1039
1040bool IDPerfMonEoverP::fillLastMeasurement(const Trk::Track* track, const int fitter)
1041{
1042 ATH_MSG_VERBOSE("In fillLastMeasurement()");
1043 if(!track) return false;
1044 const Trk::TrackParameters* trkPara =0;
1045
1046 const Trk::TrackStates* oldTrackStates = track->trackStateOnSurfaces();
1047 if (oldTrackStates == 0)
1048 {
1049 return false;
1050 }
1051
1052 for ( Trk::TrackStates::const_reverse_iterator rItTSoS = oldTrackStates->rbegin(); rItTSoS != oldTrackStates->rend(); ++rItTSoS)
1053 {
1054 if (trkPara!=0){
1055 break;
1056 }
1057
1058 if ( (*rItTSoS)->type(Trk::TrackStateOnSurface::Measurement) && (*rItTSoS)->trackParameters()!=0 && (*rItTSoS)->measurementOnTrack()!=0)
1059 {
1060 trkPara = (*rItTSoS)->trackParameters();
1061 }
1062 }
1063
1064 if (trkPara !=0 ){
1065 m_electronLMQoverP[fitter][m_electronCounter] = trkPara->parameters()[Trk::qOverP] ;
1066 return true;
1067 }
1068
1069 return false;
1070
1071}
1072
1074bool IDPerfMonEoverP::passZeeSelection(std::vector<int>& electrons)
1075{
1076 ATH_MSG_VERBOSE("In passZeeSelection() -- START -- ");
1077 //ATH_MSG_WARNING("Zee seletion needs to be adjusted for run2");
1078 // Adjusted according to https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/WZCommonAnalysisTopics2015
1079 if(m_nbpv<1) {
1080 ATH_MSG_DEBUG (" -- passZeeSelection() -- failing on primary vertices: m_nbpv= " << m_nbpv);
1081 return false;
1082 }
1083
1084 bool primaryVertexOk(false);
1085 electrons.clear();
1086
1087 for (int i=0; i<m_nbpv; ++i){
1088 if (m_pvnbtk[i] > 2) primaryVertexOk = true;
1089 }
1090 if(!primaryVertexOk) {
1091 ATH_MSG_DEBUG (" -- passZeeSelection() -- failing on primary vertices");
1092 return false;
1093 }
1094 //Trigger
1095 //No need to pass the trigger for tracking performance studies
1096
1097 //Loose electron selection
1098 std::vector<int> goodLooseElectrons;
1099
1100 for(int ele=0; ele<m_nelectrons; ele++){
1101 //Loose electron selection
1102 if (!m_IsEMLoose[ele]) continue;
1103 //Pt
1104 double clusterEt = cosh( m_ClusterEta[ele] ) != 0 ? m_ClusterEnergy[ele] / std::cosh( m_ClusterEta[ele] ) : 0.;
1105 if (clusterEt <= 25000) continue;
1106
1107 //Range
1108 double absEta = std::abs(m_ClusterEta[ele]);
1109 if (absEta >= 2.47 || ( absEta >= 1.37 && absEta <= 1.52 )) continue;
1110
1111 //OTx ...
1112 if(!m_isGoodOQ[ele]) continue;
1113
1114 //Author
1115 if(m_author[ele]!=1 && m_author[ele]!=3) continue;
1116
1117 goodLooseElectrons.push_back(ele);
1118 }
1119
1120 int pairsLooseInMassWindow = 0;
1121
1122 ATH_MSG_DEBUG(" -- passZeeSelection() -- report -- N Loose electrons " << goodLooseElectrons.size());
1123
1124 //Fill Loose electron ET spectrum;
1125 for(int gele1 = 0; gele1 < (int)goodLooseElectrons.size()-1; ++gele1){
1126 for(int gele2 = gele1+1; gele2 < (int)goodLooseElectrons.size(); ++gele2){
1127 int ele1 = goodLooseElectrons[gele1];
1128 int ele2 = goodLooseElectrons[gele2];
1129 double mass = getMassCluster(ele1,ele2);
1130 if (mass > 60000 && mass < 120000){
1131 ++pairsLooseInMassWindow;
1132 if(m_electronQoverP[0][ele1]*m_electronQoverP[0][ele2]<0)
1133 m_ZeeLooseMassOS_Cluster->Fill(mass);
1134 else
1135 m_ZeeLooseMassSS_Cluster->Fill(mass);
1136 }
1137 }
1138 }
1139
1140 if (pairsLooseInMassWindow < 1) {
1141 ATH_MSG_DEBUG (" -- passZeeSelection() -- failing pairsLooseInMassWindow= " << pairsLooseInMassWindow );
1142 return false;
1143 }
1144 std::vector<int> goodMediumElectrons;
1145
1146 for(int gele = 0; gele < (int)goodLooseElectrons.size(); ++gele){
1147 int ele = goodLooseElectrons[gele];
1148 if(m_IsEMMedium[ele]){
1149 goodMediumElectrons.push_back(ele);
1150 }
1151 }
1152
1153 //Reject events with more than two good electrons
1154 if (goodMediumElectrons.size() != 2) {
1155 ATH_MSG_DEBUG (" -- passZeeSelection() -- failing goodMediumElectrons != 2 --> " << goodMediumElectrons.size());
1156 return false;
1157 }
1158
1159 // Make the mass out of the highest pt electrons ....
1160 double mass = getMassCluster(goodMediumElectrons[0],goodMediumElectrons[1]);
1161 if (mass > 66000 && mass < 116000){
1162 if(m_electronQoverP[0][goodMediumElectrons[0]]*m_electronQoverP[0][goodMediumElectrons[1]]<0){
1163 m_ZeeMediumMassOS_Cluster->Fill(mass);
1164 electrons.push_back(goodMediumElectrons[0]);
1165 electrons.push_back(goodMediumElectrons[1]);
1166
1167 double trackEt = m_ClusterEnergy[goodMediumElectrons[0]]*sin(m_electronTheta[0][goodMediumElectrons[0]]);
1168 m_ZeeMediumOS_ClusterPtEta->Fill(trackEt, m_ClusterEta[0] );
1169 trackEt = m_ClusterEnergy[goodMediumElectrons[1]]*sin(m_electronTheta[0][goodMediumElectrons[1]]);
1170 m_ZeeMediumOS_ClusterPtEta->Fill(trackEt, m_ClusterEta[1] );
1171
1172 return true;
1173 } else{
1174 m_ZeeMediumMassSS_Cluster->Fill(mass);
1175 return false;
1176 }
1177 }
1178 return false;
1179}
1180
1182bool IDPerfMonEoverP::passWenuSelection(std::vector<int>& electrons)
1183{
1184 ATH_MSG_VERBOSE("In passWenuSelection() -- START -- ");
1185 if(m_nbpv<1) return false;
1186 bool primaryVertexOk(false);
1187 electrons.clear();
1188
1189 for (int i(0); i<m_nbpv; ++i){
1190 if (m_pvnbtk[i] > 2) primaryVertexOk = true;
1191 }
1192 if(!primaryVertexOk) {
1193 ATH_MSG_DEBUG (" -- passWenuSelection() -- failing on primary vertices");
1194 return false;
1195 }
1196
1197 //MET Goodness
1198 if( m_isDATA && !m_METgoodness) {
1199 ATH_MSG_DEBUG (" -- passWenuSelection() -- failing on m_isDATA && !m_METgoodness");
1200 return false;
1201 }
1202
1203 //Trigger
1204 //no need to pass trigger for perfromance studies
1205
1206
1207 //Loose electron selection
1208 std::vector<int> goodLooseElectrons;
1209 for(int ele(0); ele<m_nelectrons; ++ele){
1210 //Loose electron selection
1211 if (!m_IsEMLoose[ele]) continue;
1212 //Pt
1213 double clusterEt = cosh( m_ClusterEta[ele] ) != 0 ? m_ClusterEnergy[ele] / std::cosh( m_ClusterEta[ele] ) : 0.;
1214 if (clusterEt <= 25000) continue;
1215 //Range
1216 double absEta = std::abs(m_ClusterEta[ele]);
1217 if (absEta >= 2.47 || ( absEta >= 1.37 && absEta <= 1.52 ) ) continue;
1218 //OTx ...
1219 if(!m_isGoodOQ[ele]) continue;
1220 //Author
1221 if(m_author[ele]!=1 && m_author[ele]!=3) continue;
1222 goodLooseElectrons.push_back(ele);
1223 }
1224
1225 //Fill Loose electron ET spectrum;
1226 for(int gele(0); gele < (int) goodLooseElectrons.size(); ++gele){
1227 int ele = goodLooseElectrons[gele];
1228 double trackEt = m_ClusterEnergy[gele]*sin(m_electronTheta[0][ele]);
1229 m_WenuLooseElectronET->Fill(trackEt);
1230 }
1231
1232 int nMediumElectrons(0);
1233 int nTightElectrons(0);
1234 int tightElectron(0);
1235
1236 for(int gele(0); gele < (int) goodLooseElectrons.size(); ++gele){
1237 //
1238 int ele = goodLooseElectrons[gele];
1239 if(m_IsEMMedium[ele]) ++nMediumElectrons;
1240 if (!m_IsEMTight[ele]) continue;
1241 ++nTightElectrons;
1242 tightElectron = ele;
1243 }
1244
1245 //Reject events with more than one good electron
1246 if (nMediumElectrons >2) {
1247 ATH_MSG_DEBUG (" -- passWenuSelection() -- failing number of medium electrons cut " << nMediumElectrons );
1248 return false;
1249 }
1250 //Reject events with no tight electrons;
1251 if (nTightElectrons <1) {
1252 ATH_MSG_DEBUG (" -- passWenuSelection() -- failing number of tight electrons cut " << nTightElectrons );
1253 return false;
1254 }
1255 double metphi = atan2(m_missingEty,m_missingEtx);
1256 double trackEt = m_ClusterEnergy[tightElectron]*std::sin(m_electronTheta[0][tightElectron]);
1257 double clusterEt = std::cosh( m_ClusterEta[tightElectron] ) !=0 ? m_ClusterEnergy[tightElectron] / std::cosh( m_ClusterEta[tightElectron] ) : 0.;
1258
1259 double massT = 2*m_missingEt*trackEt*(1-cos(m_electronPhi[0][tightElectron]-metphi));
1260 if(massT > 0) massT =std::sqrt(massT);
1261 else massT = 0;
1262
1263
1265 m_WenuTight_MT->Fill(massT);
1266
1267 if (m_missingEt <= 25000) {
1268 ATH_MSG_DEBUG (" -- passWenuSelection() -- failing missingEt cut " << m_missingEt );
1269 return false;
1270 }
1271 m_WenuTightMet_MT->Fill(massT);
1272
1273 if (massT <= 50000) {
1274 ATH_MSG_DEBUG (" -- passWenuSelection() -- failing transverse mass cut " << massT );
1275 return false;
1276 }
1277
1278 m_WenuTightElectronET->Fill(clusterEt);
1279
1280 double sumpx = m_ClusterEnergy[tightElectron]*std::sin( m_electronPhi[0][tightElectron] ) * std::sin(m_electronTheta[0][tightElectron]) + m_missingEtx;
1281 double sumpy = m_ClusterEnergy[tightElectron]*std::cos( m_electronPhi[0][tightElectron] ) * std::sin(m_electronTheta[0][tightElectron]) + m_missingEty;
1282
1283 double wpt = sumpx*sumpx +sumpy*sumpy - massT*massT;
1284 if(wpt > 0) wpt =std::sqrt(wpt);
1285 else wpt = 0;
1286
1287 m_WenuTightW_PT->Fill(wpt);
1288
1289
1290 if(m_electronQoverP[0][tightElectron] > 0){
1291 m_WenuTightElectron_PTEtaPos->Fill(trackEt,m_ClusterEta[tightElectron]);
1292 } else {
1293 m_WenuTightElectron_PTEtaNeg->Fill(trackEt,m_ClusterEta[tightElectron]);
1294 }
1295
1296 electrons.push_back(tightElectron);
1297
1298 ATH_MSG_VERBOSE("In passWenuSelection() -- completed -- ");
1299 return true;
1300}
1301
1302double IDPerfMonEoverP::getMassCluster(int el1, int el2)
1303{
1304 ATH_MSG_VERBOSE("In getMassCluster()");
1305 double ELECTRON_MASS = ParticleConstants::electronMassInMeV; //MeV
1306 TLorentzVector v0,v1;
1307 double pt1 = m_ClusterEnergy[el1]*std::sin(m_electronTheta[0][el1]);
1308 double pt2 = m_ClusterEnergy[el2]*std::sin(m_electronTheta[0][el2]);
1309 double eta1 = -std::log( std::tan(m_electronTheta[0][el1] * 0.5) );
1310 double eta2 = -std::log( std::tan(m_electronTheta[0][el2] * 0.5) );
1311 v0.SetPtEtaPhiM(pt1,eta1,m_electronPhi[0][el1], ELECTRON_MASS);
1312 v1.SetPtEtaPhiM(pt2,eta2,m_electronPhi[0][el2], ELECTRON_MASS);
1313 double mass = (v0+v1).M();
1314 return mass;
1315
1316}
1317
1319{
1320 ATH_MSG_VERBOSE("In fillSimpleTree()");
1321 std::vector<int> electronsZee;
1322 std::vector<int> electronsWenu;
1323
1324 // check if Zee or Wenu event
1325 passZeeSelection(electronsZee);
1326 passWenuSelection(electronsWenu);
1327
1328 std::vector<int> allInterestingElectrons;
1329 for(int i(0); i < (int)electronsZee.size(); ++i){
1330 int ele = electronsZee[i];
1331 if ( std::find(allInterestingElectrons.begin(), allInterestingElectrons.end(), ele)==allInterestingElectrons.end() ){
1332 allInterestingElectrons.push_back(ele);
1333 }
1334 }
1335 for(int i(0); i < (int)electronsWenu.size(); ++i){
1336 int ele = electronsWenu[i];
1337 if ( std::find(allInterestingElectrons.begin(), allInterestingElectrons.end(), ele)==allInterestingElectrons.end() ){
1338 allInterestingElectrons.push_back(ele);
1339 }
1340 }
1341 ATH_MSG_DEBUG(" SimpleTreeElectrons " << allInterestingElectrons.size() );
1342 for(int i(0); i < (int)allInterestingElectrons.size(); ++i){
1343 int ele = allInterestingElectrons[i];
1344 if (m_electronQoverP[0][ele] > 0 )
1345 m_smallCharge = 1.;
1346 else
1347 m_smallCharge =-1.;
1355 m_smallValidationTree->Fill();
1356 }
1357
1358 return allInterestingElectrons;
1359}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
#define CHECK(...)
Evaluate an expression and check for errors.
#define AmgSymMatrix(dim)
#define NO_PV
std::pair< const xAOD::Vertex *, int > VxPos
#define NOS_ELECTRONS
static Double_t sc
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
Electron selector tool to select objects in Athena using an underlying pure ROOT tool.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > & evtStore()
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:861
const_reverse_iterator rend() const noexcept
Return a const_reverse_iterator pointing at the beginning of the collection.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_reverse_iterator rbegin() const noexcept
Return a const_reverse_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition DataVector.h:870
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
float m_pvy[NO_PV]
float m_electronErrd0[3][NOS_ELECTRONS]
SG::ReadHandleKey< xAOD::EventInfo > m_evt
ReadHandle to the Event Info.
void fillGeneral(const xAOD::Electron *eg)
std::string m_missingEtObjectName
MET input name.
std::vector< std::pair< xAOD::EgammaParameters::ShowerShapeType, std::string > > m_PID_ShowerType_Names
TH1F * m_ZeeMediumMassOS_Cluster
int m_nTRT[NOS_ELECTRONS]
std::string m_OutputTrackCollectionName_no2
int m_nTRTout[NOS_ELECTRONS]
TH2F * m_WenuTightElectron_PTEtaNeg
validation tree name - to be acessed by this from root
AsgElectronLikelihoodTool * m_LHToolLoose2015
int m_nBLayer[NOS_ELECTRONS]
float m_ePID_ShowerType[50][NOS_ELECTRONS]
float m_ClusterPhi[NOS_ELECTRONS]
double getMassCluster(int el1, int el2)
TTree * m_smallValidationTree
std::string m_smallValidationTreeName
validation tree description - second argument in TTree
float m_ePID_SummaryType[50][NOS_ELECTRONS]
std::vector< std::pair< xAOD::SummaryType, std::string > > m_PID_SummaryType_Names
float m_covpvxpvy[NO_PV]
void addToValidationNtuple(const Trk::Perigee *, const xAOD::CaloCluster *, int isOrginal)
addToValidationNutple
TH1F * m_ZeeMediumMassSS_Cluster
void fillIsEM(const xAOD::Electron *eg)
ToolHandle< IegammaTrkRefitterTool > m_TrackRefitter
The track refitter.
std::string m_validationTreeName
validation tree description - second argument in TTree
float m_electronEta[3][NOS_ELECTRONS]
Track Eta at perigee.
bool passMETCleaningCuts() const
float m_electrond0[3][NOS_ELECTRONS]
Track Phi on electron.
VxPos findAssociatedVertex(std::map< const xAOD::TrackParticle *, VxPos > &trackParticleVertexMap, const xAOD::Vertex *primaryVertexFirstCandidate, const xAOD::Electron *) const
ToolHandle< IJetSelector > m_jetCleaningTool
jet selector tool
TH2F * m_WenuTightElectron_PTEtaPos
TH1F * m_ZeeLooseMassSS_Cluster
float m_ePID_TrackCaloMatchType[50][NOS_ELECTRONS]
StatusCode initialize()
Gaudi algorithm hooks.
TrackCollection * m_refittedTracks_no2
float m_electronz0[3][NOS_ELECTRONS]
Track q over p on electron.
float m_covpvzpvx[NO_PV]
int m_nSCT[NOS_ELECTRONS]
~IDPerfMonEoverP()
Destructor.
std::string m_primaryVertexCollection
Primary vertex input name.
unsigned int m_evtNumber
std::string m_smallValidationTreeDescription
stream/folder to for the TTree to be written out
int m_nPIX[NOS_ELECTRONS]
float m_ePID_IsolationType[50][NOS_ELECTRONS]
unsigned int m_lumi_block
bool m_IsEMMedium[NOS_ELECTRONS]
StatusCode execute(const EventContext &ctx)
Execute method.
TrackCollection * m_refittedTracks_no1
Refitted track collection.
std::string m_InputElectronContainerName
Electron collection input name.
float m_electronErrz0[3][NOS_ELECTRONS]
float m_electronPhi[3][NOS_ELECTRONS]
Track Phi on electron.
float m_pvsumpt[NO_PV]
std::string m_validationTreeFolder
Root Validation Tree.
float m_errpvy[NO_PV]
std::vector< std::pair< xAOD::Iso::IsolationType, std::string > > m_PID_IsolationType_Names
bool m_validationMode
< boolean to switch to validation mode
int m_author[NOS_ELECTRONS]
int m_associatedToVtx[NOS_ELECTRONS]
int m_nTRTHT[NOS_ELECTRONS]
bool m_IsEMTight[NOS_ELECTRONS]
float m_electronErrPhi[3][NOS_ELECTRONS]
Track phi error on electron.
bool m_isGoodOQ[NOS_ELECTRONS]
bool m_IsEMTightTRT[NOS_ELECTRONS]
StatusCode finalize()
float m_ClusterEnergy[NOS_ELECTRONS]
float m_electronErrTheta[3][NOS_ELECTRONS]
Track theta error on electron.
std::string m_OutputTrackCollectionName_no1
Name of output of Refitted Inner Detector Tracks.
int m_electronCounter
counter for electrons
TH2F * m_ZeeMediumOS_ClusterPtEta
float m_pvx[NO_PV]
std::string m_metRefFinalName
void fillElectronInfo(const xAOD::Electron *p)
int m_nSCTout[NOS_ELECTRONS]
std::string m_lhTune
float m_electronLMQoverP[3][NOS_ELECTRONS]
Track q over p on electron.
bool fillLastMeasurement(const Trk::Track *track, const int fitter)
AsgElectronLikelihoodTool * m_LHToolTight2015
IDPerfMonEoverP(const std::string &name, ISvcLocator *pSvcLocator)
Default constructor.
unsigned int m_runNumber
float m_pvz[NO_PV]
std::vector< int > FillSimpleTree()
float m_covpvypvz[NO_PV]
TH1F * m_ZeeLooseMassOS_Cluster
ToolHandle< Trig::TrigDecisionTool > m_trigDec
The trigger decision tool.
float m_ClusterEta[NOS_ELECTRONS]
int m_nTRTHTout[NOS_ELECTRONS]
int m_nPIXout[NOS_ELECTRONS]
bool fillVertexInformation(std::map< const xAOD::TrackParticle *, VxPos > &trackParticleVertexMap, xAOD::Vertex const *&primaryVertexFirstCandidate)
float m_electronQoverP[3][NOS_ELECTRONS]
Track q over p on electron.
bool passWenuSelection(std::vector< int > &electrons)
float m_errpvz[NO_PV]
bool passZeeSelection(std::vector< int > &electrons)
bool m_fillDetailedTree
validation tree name - to be acessed by this from root
AsgElectronLikelihoodTool * m_LHToolMedium2015
float m_electronTheta[3][NOS_ELECTRONS]
Track theta at perigee.
float m_electronErrQoverP[3][NOS_ELECTRONS]
std::string m_jetContainerName
JEt collection input name.
float m_errpvx[NO_PV]
bool m_IsEMLoose[NOS_ELECTRONS]
std::vector< std::string > m_triggerNames
std::string m_validationTreeDescription
stream/folder to for the TTree to be written out
std::string m_smallValidationTreeFolder
Root Validation Tree.
std::vector< std::pair< xAOD::EgammaParameters::TrackCaloMatchType, std::string > > m_PID_TrackCaloMatchType_Names
void deleteAction() const
ToolHandle< IegammaTrkRefitterTool > m_TrackRefitter_no2
The track refitter.
double eta() const
Access method for pseudorapidity - from momentum.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
const Perigee * perigeeParameters() const
return Perigee.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double e() const
The total energy of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
bool isGoodOQ(uint32_t mask) const
Check object quality. Return True is it is Good Object Quality.
bool passSelection(bool &value, const std::string &menu) const
Check if the egamma object pass a selection menu (using the name) If the menu decision is stored in t...
uint16_t author(uint16_t bitmask=EgammaParameters::AuthorALL) const
Get author.
const xAOD::CaloCluster * caloCluster(size_t index=0) const
Pointer to the xAOD::CaloCluster/s that define the electron candidate.
const xAOD::TrackParticle * trackParticle(size_t index=0) const
Pointer to the xAOD::TrackParticle/s that match the electron candidate.
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
const Trk::Track * track() const
Returns a pointer (which can be NULL) to the Trk::Track which was used to make this TrackParticle.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
Type::ObjectType type() const
A little helper function for identifying the type in template code.
Definition Vertex_v1.cxx:58
const Amg::Vector3D & position() const
Returns the 3-pos.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:116
Definition MET.py:1
constexpr double electronMassInMeV
the mass of the electron (in MeV)
Ensure that the ATLAS eigen extensions are properly loaded.
DataVector< const Trk::TrackStateOnSurface > TrackStates
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi0
Definition ParamDefs.h:65
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
ParametersBase< TrackParametersDim, Charged > TrackParameters
const IIntersectionCache * cache() const
Retrieve the associated cache block, if it exists.
STL namespace.
const uint32_t BADCLUSELECTRON
Definition EgammaDefs.h:116
const uint16_t AuthorElectron
Object Reconstructed by standard cluster-based algorithm.
Definition EgammaDefs.h:24
Namespace holding the IsolationType enumeration.
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".
MissingET_v1 MissingET
Version control by type defintion.
Definition MissingET.h:15
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
MissingETContainer_v1 MissingETContainer
JetContainer_v1 JetContainer
Definition of the current "jet container version".
SummaryType
Enumerates the different types of information stored in Summary.
@ numberOfTRTHighThresholdOutliers
number of TRT high threshold outliers (only xenon counted) [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfSCTOutliers
number of SCT outliers [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfTRTHighThresholdHits
number of TRT hits which pass the high threshold (only xenon counted) [unit8_t].
@ numberOfTRTOutliers
number of TRT outliers [unit8_t].
Electron_v1 Electron
Definition of the current "egamma version".
Definition Electron.h:17
Struct Holding the result to return and intermediate objects Things are owned by the EDM or the uniqu...
std::unique_ptr< Trk::Track > refittedTrack
Pointer to the refitted track.
const Trk::Perigee * refittedTrackPerigee
Pointer to the refitted MeasuredPerigee.