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