ATLAS Offline Software
Loading...
Searching...
No Matches
NonPromptLeptonVertexingAlg.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// Local
8
9// Athena
14
15// C/C++
16#include <cmath>
17#include <iostream>
18#include <sstream>
19
20using namespace std;
21
22//======================================================================================================
23Prompt::NonPromptLeptonVertexingAlg::NonPromptLeptonVertexingAlg(const std::string& name, ISvcLocator *pSvcLocator):
24 AthAlgorithm (name, pSvcLocator),
26{}
27
28//=============================================================================
30{
31 if(m_printTime) {
32 //
33 // Reset timers
34 //
35 m_timerAll .Reset();
36 m_timerExec.Reset();
37
38 //
39 // Start full timer
40 //
41 m_timerAll.Start();
42 }
43
44 if(m_svContainerName.empty()) {
45 ATH_MSG_ERROR("NonPromptLeptonVertexingAlg::initialize - empty SV container name: \"" << m_svContainerName << "\"");
46 return StatusCode::FAILURE;
47 }
48
49 ATH_CHECK(m_vertexMerger.retrieve());
50 ATH_CHECK(m_vertexFitterTool.retrieve());
51
52 ATH_CHECK(m_inDetTracksKey.initialize());
53 ATH_CHECK(m_leptonContainerKey.initialize());
56
57 ATH_CHECK(m_svContainerName.initialize());
58
64
65 ATH_MSG_DEBUG("LeptonContainerName = " << m_leptonContainerKey);
66 ATH_MSG_DEBUG("ReFitPriVtxContainerName = " << m_refittedPriVtxContainerName);
67 ATH_MSG_DEBUG("SVContainerName = " << m_svContainerName);
68 ATH_MSG_DEBUG("IndexVectorName = " << m_decoratorNameIndexVector.key());
69
70 ATH_MSG_DEBUG("mergeMinVtxDist = " << m_mergeMinVtxDist);
71 ATH_MSG_DEBUG("mergeChi2OverDoF = " << m_mergeChi2OverDoF);
72
73 ATH_MSG_DEBUG("minTrackLeptonDR = " << m_minTrackLeptonDR);
74 ATH_MSG_DEBUG("maxTrackLeptonDR = " << m_maxTrackLeptonDR);
75
76 ATH_MSG_DEBUG("selectTracks = " << m_selectTracks);
77 ATH_MSG_DEBUG("minTrackpT = " << m_minTrackpT);
78 ATH_MSG_DEBUG("maxTrackEta = " << m_maxTrackEta);
79 ATH_MSG_DEBUG("maxTrackZ0Sin = " << m_maxTrackZ0Sin);
80
81 ATH_MSG_DEBUG("minTrackSiHits = " << m_minTrackSiHits);
82 ATH_MSG_DEBUG("maxTrackSharedSiHits = " << m_maxTrackSharedSiHits);
83 ATH_MSG_DEBUG("maxTrackSiHoles = " << m_maxTrackSiHoles);
84 ATH_MSG_DEBUG("maxTrackPixHoles = " << m_maxTrackPixHoles);
85
86 return StatusCode::SUCCESS;
87}
88
89//=============================================================================
91{
92 if(m_printTime) {
93 //
94 // Print full time stopwatch
95 //
96 m_timerAll.Stop();
97
98 ATH_MSG_INFO("NonPromptLeptonVertexingAlg - total time: " << PrintResetStopWatch(m_timerAll));
99 ATH_MSG_INFO("NonPromptLeptonVertexingAlg - execute time: " << PrintResetStopWatch(m_timerExec));
100 }
101
102 return StatusCode::SUCCESS;
103}
104
105//=============================================================================
106StatusCode Prompt::NonPromptLeptonVertexingAlg::execute(const EventContext& ctx)
107{
108 //
109 // Start execute timer for new event
110 //
112
113
115
116 //
117 // Find Inner Detector tracks save them class member variable for convenience.
118 //
120 if (!h_inDetTracks.isValid()){
121 ATH_MSG_FATAL("execute - failed to find the InDetTrackParticles");
122 return StatusCode::FAILURE;
123 }
124
125 const xAOD::TrackParticleContainer inDetTracks = *h_inDetTracks;
126
127 //
128 // Create vertex containers and record them in StoreGate
129 //
130 std::set< xAOD::Vertex* > svSet;
131
133 ATH_CHECK(h_SVContainer.record(
134 std::make_unique< xAOD::VertexContainer>(), std::make_unique< xAOD::VertexAuxContainer>()
135 ));
136 xAOD::VertexContainer &SVContainerRef = *(h_SVContainer.ptr());
137
138 //
139 // Retrieve containers from evtStore
140 //
144
145 ATH_MSG_DEBUG ("NonPromptLeptonVertexingAlg::execute - Read " << vertices->size() << " primary vertices");
146 ATH_MSG_DEBUG ("NonPromptLeptonVertexingAlg::execute - Read " << refittedVertices->size() << " refitted primary vertices");
147
148 //
149 // Find default Primary Vertex
150 //
151 Prompt::FittingInput fittingInput(&inDetTracks, 0, 0);
152
153 for(const xAOD::Vertex *vertex: *vertices) {
154 if(vertex->vertexType() == xAOD::VxType::PriVtx) {
155 fittingInput.priVtx = vertex;
156 break;
157 }
158 }
159
160 if(!fittingInput.priVtx) {
161 ATH_MSG_INFO("Failed to find primary vertex - skip this event");
162
163 return StatusCode::SUCCESS;
164 }
165
166 //
167 // Find the refitted Primary Vertex
168 //
169 for(const xAOD::Vertex *vertex: *refittedVertices) {
170 short refittedVertexType = 0;
171
172 if(getVar(vertex, refittedVertexType, m_refittedVertexTypeName) && refittedVertexType == xAOD::VxType::PriVtx) {
173 fittingInput.refittedPriVtx = vertex;
174 }
175
176 if(fittingInput.refittedPriVtx) {
177 break;
178 }
179 }
180
181 //
182 // Dynamic cast IParticle container to electron or muon container
183 //
184 ATH_MSG_DEBUG("\n\t\t\t Size of lepton container: " << leptonContainer ->size());
185
186 SG::AuxElement::ConstAccessor<ElementLink<xAOD::VertexContainer> > priVtxWithoutLepAcc(m_linkNameRefittedPriVtxWithoutLepton);
187
188 using VecElemVtx_t = std::vector<ElementLink<xAOD::VertexContainer> >;
190 indexVectorDec (m_decoratorNameIndexVector, ctx);
192 indexVectorDecDeepMerge (m_decoratorNameIndexVectorDeepMerge, ctx);
194 lepSVElementLinksDec (m_decoratorNameSecVtxLinks, ctx);
196 lepDeepMergedSVElementLinksDec (m_decoratorNameDeepMergedSecVtxLinks, ctx);
197
198 for(const xAOD::IParticle *lepton: *leptonContainer) {
199 const xAOD::TrackParticle *tracklep = 0;
200 const xAOD::Electron *elec = dynamic_cast<const xAOD::Electron*>(lepton);
201 const xAOD::Muon *muon = dynamic_cast<const xAOD::Muon *>(lepton);
202
203 if(elec) {
204 //
205 // Get GSF track
206 //
207 const xAOD::TrackParticle *bestmatchedGSFElTrack = elec->trackParticle(0);
208
209 //
210 // Get original ID track for vertex fitting
211 //
212 if(passElecCand(*elec) && bestmatchedGSFElTrack) {
213 tracklep = xAOD::EgammaHelpers::getOriginalTrackParticleFromGSF(bestmatchedGSFElTrack);
214 }
215 }
216 else if(muon) {
217 if(passMuonCand(*muon)) {
218 tracklep = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
219 }
220 }
221 else {
222 ATH_MSG_WARNING("NonPromptLeptonVertexingAlg::execute - failed to find electron or muon: should never happen!");
223 }
224
225 if(!tracklep) {
226 lepSVElementLinksDec (*lepton).clear();
227 lepDeepMergedSVElementLinksDec(*lepton).clear();
228 indexVectorDec (*lepton).clear();
229 indexVectorDecDeepMerge (*lepton).clear();
230
231 ATH_MSG_DEBUG("NonPromptLeptonVertexingAlg::execute - cannot find muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle) nor electron->trackParticle()");
232 continue;
233 }
234
235 ATH_MSG_DEBUG("NonPromptLeptonVertexingAlg::execute - process new lepton track " << tracklep);
236
237 //
238 // Find refitted primary vertex with lepton track excluded
239 //
240 fittingInput.refittedPriVtxWithoutLep = 0;
241
242 if(priVtxWithoutLepAcc.isAvailable(*lepton)) {
243 ElementLink<xAOD::VertexContainer> vtxLink = priVtxWithoutLepAcc(*lepton);
244
245 if(vtxLink.isValid()) {
246 fittingInput.refittedPriVtxWithoutLep = *vtxLink;
247
248 ATH_MSG_DEBUG("DecorateSecondaryVertex - found refitted primary vertex without lepton: "
249 << m_linkNameRefittedPriVtxWithoutLepton << " with Ntrack =" << fittingInput.refittedPriVtxWithoutLep->nTrackParticles());
250 }
251 }
252
253 //
254 // Collect tracks around the lepton track
255 //
256 std::vector<const xAOD::TrackParticle* > ifitTracks = findNearbyTracks(*tracklep, inDetTracks, *fittingInput.priVtx);
257
258 //
259 // Fit 2-track vertices
260 //
261 std::vector<std::unique_ptr<xAOD::Vertex>> twoTrkVertices = prepLepWithTwoTrkSVVec(
262 ctx, fittingInput, tracklep, ifitTracks
263 );
264
265 // We make a copy so we can store the list of original
266 // two-track vertices
267 std::vector<std::unique_ptr<xAOD::Vertex>> twoTrkVerticesCopy;
268 for (std::unique_ptr<xAOD::Vertex> &vtx : twoTrkVertices) {
269 std::unique_ptr<xAOD::Vertex> newVtx = std::make_unique<xAOD::Vertex>(*vtx);
270 twoTrkVerticesCopy.push_back(std::move(newVtx));
271 }
272
273 // Deep merge 2-track vertices.
274 ATH_MSG_DEBUG("Getting deep merged vertices");
275 ATH_MSG_DEBUG("Starting with " << twoTrkVertices.size() << " 2-track vertices");
276 Prompt::MergeResultNotOwner deep_merged_result = m_vertexMerger->mergeInitVertices(
277 ctx, fittingInput, tracklep, twoTrkVertices, ifitTracks);
278
279 //
280 // Save secondary vertices
281 //
282 std::vector<ElementLink<xAOD::VertexContainer> > svLinks;
283 std::vector<ElementLink<xAOD::VertexContainer> > deepmergeSVLinks;
284
285 std::vector<int> indexVectorTwoTrk;
286 std::vector<int> indexVectorDeepMerged;
287
288 //
289 // Record 2-track vertexes and simple merged vertexes
290 //
291 ATH_MSG_DEBUG("NonPromptLeptonVertexingAlg::execute --- recording " << twoTrkVerticesCopy.size() << " 2-track and simple merged vertices");
292 saveSecondaryVertices(twoTrkVerticesCopy, indexVectorTwoTrk, svLinks, SVContainerRef, svSet);
293
294 //
295 // Record both merged multi-track vertices and also unmerged 2-track vertices
296 //
297 ATH_MSG_DEBUG("NonPromptLeptonVertexingAlg::execute --- recording " << deep_merged_result.vtxsNewMerged.size() << " merged multi-track vertices");
298 saveSecondaryVertices(deep_merged_result.vtxsNewMerged, indexVectorDeepMerged, deepmergeSVLinks, SVContainerRef, svSet);
299
300 ATH_MSG_DEBUG("NonPromptLeptonVertexingAlg::execute --- recording " << deep_merged_result.vtxsInitPassedNotMerged.size() << " unmerged 2-track vertices");
301 saveSecondaryVertices(deep_merged_result.vtxsInitPassedNotMerged, indexVectorDeepMerged, deepmergeSVLinks, SVContainerRef, svSet);
302
303 ATH_MSG_DEBUG ("NonPromptLeptonVertexingAlg::execute -- number of two-track SV = " << twoTrkVertices.size());
304 ATH_MSG_DEBUG ("NonPromptLeptonVertexingAlg::execute -- number of deep merged SV = " << deep_merged_result.vtxsNewMerged.size());
305
306 lepSVElementLinksDec (*lepton) = std::move(svLinks);
307 lepDeepMergedSVElementLinksDec(*lepton) = std::move(deepmergeSVLinks);
308 indexVectorDec (*lepton) = std::move(indexVectorTwoTrk);
309 indexVectorDecDeepMerge (*lepton) = std::move(indexVectorDeepMerged);
310
311 ATH_MSG_DEBUG("NonPromptLeptonVertexingAlg - done with lepton pT=" << tracklep->pt() << ", " << truthAsStr(*lepton) << endl
312 << "___________________________________________________________________________");
313 }
314
315 ATH_MSG_DEBUG("SV Vertex container " << m_svContainerName << " recorded in store");
316
317 ATH_MSG_DEBUG(" NonPromptLeptonVertexingAlg::execute - done with this event" << endl
318 << "___________________________________________________________________________");
319
320 return StatusCode::SUCCESS;
321}
322
323//=============================================================================
325{
326 //
327 // Check whether electron candidate passes loose selection
328 //
329 char lh_loose = -1;
330
331 Prompt::GetAuxVar(elec, lh_loose, "DFCommonElectronsLHLoose");
332
333 ATH_MSG_DEBUG("NonPromptLeptonVertexingAlg::passElecCand - "
334 << "pT=" << elec.pt() << ", eta=" << elec.eta() << ", phi=" << elec.phi() << std::endl
335 << " DFCommonElectronsLHLoose = " << int(lh_loose) << std::endl
336 << " " << truthAsStr(elec));
337
338 if(!lh_loose) {
339 return false;
340 }
341
342 return true;
343}
344
345//=============================================================================
347{
348 //
349 // Check whether muon candidate is a combined muon
350 //
351 ATH_MSG_DEBUG("NonPromptLeptonVertexingAlg::passMuonCand - "
352 << "pT=" << muon.pt() << ", eta=" << muon.eta() << ", phi=" << muon.phi() << std::endl
353 << " Type = " << muon.muonType() << std::endl
354 << " " << truthAsStr(muon));
355
356 return muon.muonType() == xAOD::Muon::MuonType::Combined;
357}
358
359//=============================================================================
360std::vector<const xAOD::TrackParticle*> Prompt::NonPromptLeptonVertexingAlg::findNearbyTracks(
361 const xAOD::TrackParticle &tracklep,
362 const xAOD::TrackParticleContainer &inDetTracks,
363 const xAOD::Vertex &priVtx
364) const {
365 //
366 // Select tracks -- avoid using track selection tool since z0 definition is different
367 //
368 std::vector<const xAOD::TrackParticle *> mytracks;
369
370 for(const xAOD::TrackParticle *track: inDetTracks) {
371 if(!track) {
372 ATH_MSG_WARNING("skip null track pointer - should never happen");
373 continue;
374 }
375
376 //
377 // Check minimum track and lepton DR: skip the track that is probably the lepton track
378 //
379 if(tracklep.p4().DeltaR(track->p4()) < m_minTrackLeptonDR) {
380 ATH_MSG_DEBUG("skip the track very close to the lepton ");
381 continue;
382 }
383
384 //
385 // Check track and lepton maximum DR
386 //
387 if(tracklep.p4().DeltaR(track->p4()) > m_maxTrackLeptonDR) {
388 continue;
389 }
390
391 const double delta_z0 = track->z0() + track->vz() - priVtx.z();
392 const double Z0Sin = std::abs(delta_z0*std::sin(track->theta()));
393 const double abs_eta = std::abs(track->eta());
394
395 uint8_t numberOfPixelHits = 0;
396 uint8_t numberOfSCTHits = 0;
397 uint8_t numberOfPixelHoles = 0;
398 uint8_t numberOfSCTHoles = 0;
399 uint8_t numberOfPixelSharedHits = 0;
400 uint8_t numberOfSCTSharedHits = 0;
401
402 if(!(track->summaryValue(numberOfPixelHits, xAOD::numberOfPixelHits))) continue;
403 if(!(track->summaryValue(numberOfSCTHits, xAOD::numberOfSCTHits))) continue;
404 if(!(track->summaryValue(numberOfPixelHoles, xAOD::numberOfPixelHoles))) continue;
405 if(!(track->summaryValue(numberOfSCTHoles, xAOD::numberOfSCTHoles))) continue;
406 if(!(track->summaryValue(numberOfPixelSharedHits, xAOD::numberOfPixelSharedHits))) continue;
407 if(!(track->summaryValue(numberOfSCTSharedHits, xAOD::numberOfSCTSharedHits))) continue;
408
409 const uint8_t NSiHits = numberOfPixelHits + numberOfSCTHits;
410 const uint8_t NSiHoles = numberOfPixelHoles + numberOfSCTHoles;
411 const float NSiShHits = float(numberOfPixelSharedHits) + float(numberOfSCTSharedHits)/2.0;
412
413 if(m_selectTracks) {
414 //
415 // Kinematic track selection
416 //
417 if(track->pt() < m_minTrackpT) continue;
418 if(abs_eta > m_maxTrackEta) continue;
419 if(Z0Sin > m_maxTrackZ0Sin) continue;
420
421 //
422 // Hit quality track selection
423 //
424 if(NSiHits < m_minTrackSiHits) continue;
425 if(NSiShHits > m_maxTrackSharedSiHits) continue;
426 if(NSiHoles > m_maxTrackSiHoles ) continue;
427 if(numberOfPixelHoles > m_maxTrackPixHoles ) continue;
428 }
429
430 mytracks.push_back(track);
431 }
432
433 return mytracks;
434}
435
436//=============================================================================
437std::vector<std::unique_ptr<xAOD::Vertex>> Prompt::NonPromptLeptonVertexingAlg::prepLepWithTwoTrkSVVec(
438 const EventContext& ctx,
439 const FittingInput &input,
440 const xAOD::TrackParticle* tracklep,
441 const std::vector<const xAOD::TrackParticle*> &tracks
442)
443{
444 //
445 // Decorate lepton with vector of two-track vertices.
446 // Return vector of finding vertices
447 //
448 std::vector<std::unique_ptr<xAOD::Vertex>> twoTrkVertices;
449 std::vector<const xAOD::TrackParticle*> tracksForFit;
450
451 if(!input.priVtx) {
452 ATH_MSG_WARNING("prepLepWithTwoTrkSVVec -- invalid primary vertex: nothing to do");
453 return twoTrkVertices;
454 }
455
456 for(const xAOD::TrackParticle *selectedtrack: tracks) {
457 tracksForFit.clear();
458 tracksForFit.push_back(tracklep);
459 tracksForFit.push_back(selectedtrack);
460
461 std::unique_ptr<xAOD::Vertex> newSecondaryVertex = m_vertexFitterTool->fitVertexWithPrimarySeed(
462 ctx, input, tracksForFit, kTwoTrackVtx
463 );
464
465 if(!newSecondaryVertex) {
466 ATH_MSG_DEBUG("prepLepWithTwoTrkSVVec -- failed to fit 2-track vertex");
467 continue;
468 }
469
470 twoTrkVertices.push_back(std::move(newSecondaryVertex));
471 }
472
473 return twoTrkVertices;
474}
475
476//=============================================================================
478 std::vector<std::unique_ptr<xAOD::Vertex>> &clusterVtxs,
479 std::vector<std::unique_ptr<xAOD::Vertex>> &inputVtxs
480)
481{
482 ATH_MSG_DEBUG("makeVertexCluster - before: clusterVtxs.size()=" << clusterVtxs.size() << ", inputVtxs.size()=" << inputVtxs.size());
483
484 std::vector<std::unique_ptr<xAOD::Vertex>>::iterator vit = inputVtxs.begin();
485
486 while(vit != inputVtxs.end()) {
487 bool pass = false;
488
489 for(std::vector<std::unique_ptr<xAOD::Vertex>>::const_iterator cit = clusterVtxs.begin(); cit != clusterVtxs.end(); ++cit) {
490 if(vit->get() == cit->get()) {
491 ATH_MSG_DEBUG("makeVertexCluster - logic error - found the same vertex twice: " << ((*vit).get()));
492 continue;
493 }
494
495 const double vdist = getDistance((*vit)->position(), (*cit)->position());
496
497 ATH_MSG_DEBUG("makeVertexCluster - vdist=" << vdist );
498
499 if(vdist < m_mergeMinVtxDist) {
500 pass = true;
501 break;
502 }
503 }
504
505 if(pass) {
506 clusterVtxs.push_back(std::move(*vit));
507 inputVtxs.erase(vit);
508
509 vit = inputVtxs.begin();
510 }
511 else {
512 ++vit;
513 }
514 }
515
516 ATH_MSG_DEBUG("makeVertexCluster - after: clusterVtxs.size()=" << clusterVtxs.size() << ", inputVtxs.size()=" << inputVtxs.size());
517}
518
519//=============================================================================
521 std::vector<std::unique_ptr<xAOD::Vertex>> &vtxs,
522 std::vector<int> &indexVector,
523 std::vector<ElementLink<xAOD::VertexContainer> > &svLinks,
524 xAOD::VertexContainer &SVContainer,
525 std::set< xAOD::Vertex* >& svSet
526)
527{
528 //
529 // Record created xAOD::Vertex in output vertex container
530 //
531 ATH_MSG_DEBUG("saveSecondaryVertices - will save " << vtxs.size() << " vertexes");
532
533 for(std::unique_ptr<xAOD::Vertex> &vtx: vtxs) {
534 int index = -99;
535 if(getVar(vtx, index, "SecondaryVertexIndex")) {
536 indexVector.push_back(index);
537 }
538 else {
539 ATH_MSG_WARNING("saveSecondaryVertices - missing \"SecondaryVertexIndex\" variable");
540 }
541
542 if(svSet.insert(vtx.get()).second) {
543 //
544 // First time seeing this this vertex - record it in output container
545 //
546 SVContainer.push_back(std::move(vtx));
547 ElementLink<xAOD::VertexContainer> svLink(SVContainer,SVContainer.size()-1);
548 svLinks.push_back(svLink);
549 } else {
550 ATH_MSG_ERROR("saveSecondaryVertices --- the same vertex has been encountered more than once! Is this a logic error?");
551 }
552 }
553
554 ATH_MSG_DEBUG("saveSecondaryVertices - all done");
555}
556
557
#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_WARNING(x)
#define ATH_MSG_DEBUG(x)
Some common helper functions used by decoration handles.
Handle class for adding a decoration to an object.
size_t size() const
Number of registered mappings.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
Gaudi::Property< std::string > m_linkNameRefittedPriVtxWithoutLepton
SG::WriteDecorHandleKey< xAOD::IParticleContainer > m_decoratorNameIndexVector
SG::WriteHandleKey< xAOD::VertexContainer > m_svContainerName
SG::WriteDecorHandleKey< xAOD::IParticleContainer > m_decoratorNameIndexVectorDeepMerge
void saveSecondaryVertices(std::vector< std::unique_ptr< xAOD::Vertex > > &vtxs, std::vector< int > &indexVector, std::vector< ElementLink< xAOD::VertexContainer > > &svLinks, xAOD::VertexContainer &SVContainer, std::set< xAOD::Vertex * > &svSet)
ToolHandle< Prompt::IVertexMergingTool > m_vertexMerger
ToolHandle< Prompt::VertexFittingTool > m_vertexFitterTool
SG::WriteDecorHandleKey< xAOD::IParticleContainer > m_decoratorNameSecVtxLinks
SG::ReadHandleKey< xAOD::VertexContainer > m_primaryVertexContainerName
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_inDetTracksKey
virtual StatusCode execute(const EventContext &ctx) override
Execute method.
bool passMuonCand(const xAOD::Muon &muon) const
SG::ReadHandleKey< xAOD::IParticleContainer > m_leptonContainerKey
SG::WriteDecorHandleKey< xAOD::IParticleContainer > m_decoratorNameDeepMergedSecVtxLinks
void makeVertexCluster(std::vector< std::unique_ptr< xAOD::Vertex > > &clusterVtxs, std::vector< std::unique_ptr< xAOD::Vertex > > &inputVtxs)
bool passElecCand(const xAOD::Electron &elec) const
std::vector< const xAOD::TrackParticle * > findNearbyTracks(const xAOD::TrackParticle &tracklep, const xAOD::TrackParticleContainer &inDetTracks, const xAOD::Vertex &priVtx) const
Gaudi::Property< std::string > m_refittedVertexTypeName
NonPromptLeptonVertexingAlg(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< std::unique_ptr< xAOD::Vertex > > prepLepWithTwoTrkSVVec(const EventContext &ctx, const FittingInput &input, const xAOD::TrackParticle *tracklep, const std::vector< const xAOD::TrackParticle * > &tracks)
SG::ReadHandleKey< xAOD::VertexContainer > m_refittedPriVtxContainerName
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Handle class for adding a decoration to an object.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition Egamma_v1.cxx:66
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition Egamma_v1.cxx:71
virtual double phi() const override final
The azimuthal angle ( ) of the particle.
Definition Egamma_v1.cxx:76
const xAOD::TrackParticle * trackParticle(size_t index=0) const
Pointer to the xAOD::TrackParticle/s that match the electron candidate.
Class providing the definition of the 4-vector interface.
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
float z() const
Returns the z position.
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
bool GetAuxVar(const T1 &obj, T2 &value, const std::string &var_name)
Definition PromptUtils.h:83
std::string PrintResetStopWatch(TStopwatch &watch)
std::string truthAsStr(const xAOD::IParticle &particle)
bool getVar(T1 &obj, T2 &value, const std::string &var_name)
Definition PromptUtils.h:62
double getDistance(const xAOD::Vertex *vtx1, const xAOD::Vertex *vtx2)
std::string decorKeyFromKey(const std::string &key, const std::string &deflt)
Extract the decoration part of key.
Definition index.py:1
STL namespace.
const xAOD::TrackParticle * getOriginalTrackParticleFromGSF(const xAOD::TrackParticle *trkPar)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the GSF Track Particle...
@ PriVtx
Primary vertex.
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.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
Muon_v1 Muon
Reference the current persistent version:
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].
Electron_v1 Electron
Definition of the current "egamma version".
const xAOD::Vertex * refittedPriVtxWithoutLep
const xAOD::Vertex * refittedPriVtx
const xAOD::Vertex * priVtx