ATLAS Offline Software
Loading...
Searching...
No Matches
InDetVKalVxInJetTool.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
8
37
38
39
40#ifndef _VKalVrt_InDetVKalVxInJetTool_H
41#define _VKalVrt_InDetVKalVxInJetTool_H
42#include <vector>
43// Gaudi includes
45#include "GaudiKernel/ToolHandle.h"
47
48//Remove in boost > 1.76 when the boost iterator issue
49//is solved see ATLASRECTS-6358
50#define BOOST_ALLOW_DEPRECATED_HEADERS
51#include "boost/graph/adjacency_list.hpp"
52//
56//
57//
61
62class TH1D;
63class TH2D;
64class TH1F;
65class TProfile;
66class TTree;
67class ITHistSvc;
68
69namespace Trk{
70 class TrkVKalVrtFitter;
71 class IVertexFitter;
72 class IVKalState;
73}
74
76
77namespace InDetDD {
79}
80
81typedef std::vector<double> dvect;
82
83
84//------------------------------------------------------------------------
85namespace InDet {
86
87
89 std::vector<const xAOD::TrackParticle*> listJetTracks;
90 std::vector<const xAOD::TrackParticle*> tmpListTracks;
91 std::vector<const xAOD::TrackParticle*> listSecondTracks;
92 std::vector<const xAOD::TrackParticle*> TracksForFit;
93 std::vector<const xAOD::TrackParticle*> InpTrk;
94 std::vector< std::vector<const xAOD::TrackParticle*> > FoundSecondTracks;
95 std::vector<const xAOD::TrackParticle*> TrkFromV0;
96 };
97
99 public AthAlgTool, virtual public ISecVertexInJetFinder{
100
101
102 public:
103 /* Constructor */
104 InDetVKalVxInJetTool(const std::string& type, const std::string& name, const IInterface* parent);
105 /* Destructor */
106 virtual ~InDetVKalVxInJetTool();
107
108
109 virtual StatusCode initialize() override;
110 virtual StatusCode finalize() override;
111
112 virtual Trk::VxSecVertexInfo* findSecVertex(const EventContext& ctx,
113 const xAOD::Vertex & primaryVertex,
114 const TLorentzVector & jetMomentum,
115 const std::vector<const xAOD::IParticle*> & inputTracks) const override;
116
117//------------------------------------------------------------------------------------------------------------------
118// Private data and functions
119//
120
121 private:
122
123 struct DevTuple;
124 struct Hists {
125 StatusCode book (ITHistSvc& histSvc, const std::string& histDir);
126 TTree* m_tuple{};
127 DevTuple* m_curTup = nullptr;
131 TH1D* m_hb_massEE{};
136 TH1D* m_hb_nvrt2{};
137 TH1D* m_hb_ratio{};
139 TH1D* m_hb_impact{};
142 TH1D* m_hb_trkD0{};
145 TH1D* m_hb_r2d{};
146 TH1D* m_hb_r1dc{};
147 TH1D* m_hb_r2dc{};
148 TH1D* m_hb_r3dc{};
149 TH1D* m_hb_rNdc{};
151 TH1D* m_hb_jmom{};
152 TH1D* m_hb_mom{};
154 TH1D* m_hb_impV0{};
157 TH1D* m_hb_distVV{};
158 TH1D* m_hb_diffPS{};
167//--
168 TProfile * m_pr_NSelTrkMean{};
169 TProfile * m_pr_effVrt2tr{};
170 TProfile * m_pr_effVrt2trEta{};
171 TProfile * m_pr_effVrt{};
172 TProfile * m_pr_effVrtEta{};
173 };
174 std::unique_ptr<Hists> m_h;
175
176 IntegerProperty m_cutSctHits{this, "CutSctHits", 4,
177 "Remove track is it has less SCT hits"};
178 IntegerProperty m_cutPixelHits{this, "CutPixelHits", 1,
179 "Remove track is it has less Pixel hits"};
180 IntegerProperty m_cutSiHits{this, "CutSiHits", 7,
181 "Remove track is it has less Pixel+SCT hits"};
182 IntegerProperty m_cutBLayHits{this, "CutBLayHits", 0,
183 "Remove track is it has less B-layer hits"};
184 IntegerProperty m_cutSharedHits{this, "CutSharedHits", 1000,
185 "Reject final 2tr vertices if tracks have shared hits"};
186 DoubleProperty m_cutPt{this, "CutPt", 700., "Track Pt selection cut"};
187 DoubleProperty m_cutZVrt{this, "CutZVrt", 15., "Track Z impact selection cut"};
188 DoubleProperty m_cutA0{this, "CutA0", 5., "Track A0 selection cut"};
189 DoubleProperty m_cutChi2{this, "CutChi2", 5., "Track Chi2 selection cut"};
190 DoubleProperty m_secTrkChi2Cut{this, "SecTrkChi2Cut", 10.,
191 "Track - common secondary vertex association cut. Single Vertex Finder only"};
192 DoubleProperty m_coneForTag{this, "ConeForTag", 0.4,
193 "Cone around jet direction for track selection"};
194 DoubleProperty m_sel2VrtChi2Cut{this, "Sel2VrtChi2Cut", 10.,
195 "Cut on Chi2 of 2-track vertex for initial selection"};
196 DoubleProperty m_sel2VrtSigCut{this, "Sel2VrtSigCut", 4.,
197 "Cut on significance of 3D distance between initial 2-track vertex and PV"};
198 DoubleProperty m_trkSigCut{this, "TrkSigCut", 2.,
199 "Track 3D impact significance w/r primary vertex"};
200 DoubleProperty m_a0TrkErrorCut{this, "A0TrkErrorCut", 1.,
201 "Track A0 error cut"};
202 DoubleProperty m_zTrkErrorCut{this, "ZTrkErrorCut", 5.,
203 "Track Z impact error cut"};
204 DoubleProperty m_cutBVrtScore{this, "CutBVrtScore", 0.015,
205 "B vertex selection cut on 2track vertex score (probability-like) based on track classification"};
206 DoubleProperty m_vrt2TrMassLimit{this, "Vrt2TrMassLimit", 4000.,
207 "Maximal allowed mass for 2-track vertices"};
208
209 BooleanProperty m_useFrozenVersion{this, "UseFrozenVersion", false,
210 "Switch from default frozen version to the development/improved one"};
211 BooleanProperty m_fillHist{this, "FillHist", false,
212 "Fill technical histograms"};
213 BooleanProperty m_existIBL{this, "ExistIBL", true,
214 "Inform whether 3-layer or 4-layer detector is used"};
215
216 IntegerProperty m_RobustFit{this, "RobustFit", 1,
217 "Use vertex fit with RobustFit functional(VKalVrt) for common secondary vertex fit"};
218
219 double m_beampipeR = 0.;
220 double m_rLayerB = 0.;
221 double m_rLayer1 = 0.;
222 double m_rLayer2 = 0.;
223 double m_rLayer3 = 0.;
224
225 BooleanProperty m_useVertexCleaningPix{this, "useVertexCleaningPix", false,
226 "Clean vertices requiring track pixel hit patterns according to vertex position"};
227 BooleanProperty m_useVertexCleaningFMP{this, "useVertexCleaningFMP", false,
228 "Clean vertices requiring track F(irst) M(easured) P(oints) matching to vertex position"};
229 BooleanProperty m_rejectBadVertices{this, "rejectBadVertices", false,
230 "Reject V0s after checking 3D PV impact"};
231 BooleanProperty m_multiVertex{this, "MultiVertex", false,
232 "Run Multiple Secondary Vertices in jet finder"};
233 BooleanProperty m_multiWithPrimary{this, "MultiWithPrimary", false,
234 "Find Multiple Secondary Vertices + primary vertex in jet. MultiVertex Finder only!"};
235 BooleanProperty m_getNegativeTail{this, "getNegativeTail", false,
236 "Allow secondary vertex behind the primary one (negative) w/r jet direction (not for multivertex!)"};
237 BooleanProperty m_getNegativeTag{this, "getNegativeTag", false,
238 "Return ONLY negative secondary vertices (not for multivertex!)"};
239 BooleanProperty m_multiWithOneTrkVrt{this, "MultiWithOneTrkVrt", true,
240 "Allow one-track-vertex addition to already found secondary vertices. MultiVertex Finder only!"};
241
242 DoubleProperty m_vertexMergeCut{this, "VertexMergeCut", 3.,
243 "To allow vertex merging for MultiVertex Finder"};
244 DoubleProperty m_trackDetachCut{this, "TrackDetachCut", 6.,
245 "To allow track from vertex detachment for MultiVertex Finder"};
246
247 ToolHandle < Trk::IVertexFitter > m_fitter
248 {this, "VertexFitterTool", "Trk::TrkVKalVrtFitter/VertexFitterTool"};
250
252 ToolHandle < IInDetTrkInJetType > m_trackClassificator
253 {this, "TrackClassTool", "InDet::InDetTrkInJetType"};
255 {this, "EventInfoName", "EventInfo"};
256
261
263 {this, "useITkMaterialRejection", false,
264 "Reject vertices from hadronic interactions in detector material using ITk layout"};
267 std::unique_ptr<TH2D> m_ITkPixMaterialMap;
268
274 const double m_massB =5279.400 ;
275
276//-------------------------------------------
277//For ntuples (only for development/tuning!)
278
279 static int notFromBC(int PDGID) ;
280 static const xAOD::TruthParticle * getPreviousParent(const xAOD::TruthParticle * child, int & ParentPDG) ;
281 static int getIdHF(const xAOD::TrackParticle* TP ) ;
282 static int getG4Inter( const xAOD::TrackParticle* TP ) ;
283 static int getMCPileup(const xAOD::TrackParticle* TP ) ;
284
285 struct DevTuple
286 {
287 static const int maxNTrk=100;
288 static const int maxNVrt=100;
289 int nTrkInJet = 0;
290 float ewgt = 0;
291 float ptjet = 0;
292 float etajet = 0;
293 float phijet = 0;
294 float etatrk[maxNTrk] = {0};
295 float p_prob[maxNTrk] = {0};
296 float s_prob[maxNTrk] = {0};
297 int idMC[maxNTrk] = {0};
298 float SigR[maxNTrk] = {0};
299 float SigZ[maxNTrk] = {0};
300 float d0[maxNTrk] = {0};
301 float Z0[maxNTrk] = {0};
302 float pTvsJet[maxNTrk] = {0};
303 float prodTJ[maxNTrk] = {0};
304 float wgtB[maxNTrk] = {0};
305 float wgtL[maxNTrk] = {0};
306 float wgtG[maxNTrk] = {0};
307 float sig3D[maxNTrk] = {0};
308 int chg[maxNTrk] = {0};
309 int nVrtT[maxNTrk] = {0};
310 float TotM = 0;
311 int nVrt = 0;
312 float VrtDist2D[maxNVrt] = {0};
313 float VrtSig3D[maxNVrt] = {0};
314 float VrtSig2D[maxNVrt] = {0};
315 float VrtDR[maxNVrt] = {0};
316 float VrtdRtt[maxNVrt] = {0};
317 float VrtErrR[maxNVrt] = {0};
318 float mass[maxNVrt] = {0};
319 float Chi2[maxNVrt] = {0};
320 int itrk[maxNVrt] = {0};
321 int jtrk[maxNVrt] = {0};
322 int badVrt[maxNVrt] = {0};
323 int ibl[maxNVrt] = {0};
324 int bl[maxNVrt] = {0};
325 float fhitR[maxNVrt] = {0};
326 int NTHF = 0;
327 int itHF[maxNVrt] = {0};
328 //---
329 int nNVrt = 0;
330 float NVrtDist2D[maxNVrt] = {0};
331 float NVrtSig3D[maxNVrt] = {0};
332 int NVrtNT[maxNVrt] = {0};
333 int NVrtTrkI[maxNVrt] = {0};
334 float NVrtM[maxNVrt] = {0};
335 float NVrtChi2[maxNVrt] = {0};
336 float NVrtMaxW[maxNVrt] = {0};
337 float NVrtAveW[maxNVrt] = {0};
338 float NVrtDR[maxNVrt] = {0};
339 };
340
341 struct Vrt2Tr
342 { int i=0, j=0;
343 int badVrt=0;
345 TLorentzVector momentum;
346 long int vertexCharge = 0;
347 std::vector<double> errorMatrix;
348 std::vector<double> chi2PerTrk;
349 std::vector< std::vector<double> > trkAtVrt;
350 double signif3D=0.;
351 double signif3DProj=0.;
352 double signif2D=0.;
353 double chi2=0.;
354 double dRSVPV=-1.;
355 };
356
357
358// For multivertex version only
359
360 using compatibilityGraph_t = boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS>;
361 float m_chiScale[11]{};
362 struct WrkVrt
363 { bool Good=true;
364 std::deque<long int> selTrk;
366 TLorentzVector vertexMom{};
367 long int vertexCharge{};
368 std::vector<double> vertexCov;
369 std::vector<double> chi2PerTrk;
370 std::vector< std::vector<double> > trkAtVrt;
371 double chi2{};
373 double dCloseVrt=1000000.;
374 double projectedVrt=0.;
376 };
377
378
379// Private technical functions
380//
381//
382 xAOD::Vertex* getVrtSec(const std::vector<const xAOD::TrackParticle*> & inpTrk,
383 const xAOD::Vertex & primVrt,
384 const TLorentzVector & jetDir,
385 std::vector<double> & results,
386 std::vector<const xAOD::TrackParticle*> & selSecTrk,
387 std::vector<const xAOD::TrackParticle*> & trkFromV0,
388 int & nRefPVTrk,
389 compatibilityGraph_t & compatibilityGraph) const;
390
391 std::vector<xAOD::Vertex*> getVrtSecMulti(
393 const xAOD::Vertex& primVrt,
394 const TLorentzVector& jetDir,
395 std::vector<double>& results,
396 compatibilityGraph_t& compatibilityGraph) const;
397
398 static void trackClassification(std::vector<WrkVrt> *wrkVrtSet,
399 std::vector< std::deque<long int> > *trkInVrt) ;
400
401 static double MaxOfShared(std::vector<WrkVrt> *WrkVrtSet,
402 std::vector< std::deque<long int> > *trkInVrt,
403 long int & selectedTrack,
404 long int & selectedVertex) ;
405 void removeTrackFromVertex(std::vector<WrkVrt> *wrkVrtSet,
406 std::vector< std::deque<long int> > *trkInVrt,
407 long int & selectedTrack,
408 long int & selectedVertex) const;
409//
410//
411
412 void printWrkSet(const std::vector<WrkVrt> * WrkSet, const std::string& name ) const;
413
414
415 StatusCode cutTrk(const std::unordered_map<std::string,double>& TrkVarDouble,
416 const std::unordered_map<std::string,int>& TrkVarInt,
417 float evtWgt=1.) const;
418 static double coneDist(const AmgVector(5) & , const TLorentzVector & ) ;
419//
420// Gives correct mass assignment in case of nonequal masses
421 static double massV0( std::vector< std::vector<double> >& trkAtVrt, double massP, double massPi ) ;
422 static int findMax( std::vector<double>& chi2PerTrk, std::vector<float>& rank) ;
423
424
425 TLorentzVector totalMom(const std::vector<const Trk::Perigee*>& inpTrk) const;
426 static TLorentzVector totalMom(const std::vector<const xAOD::TrackParticle*>& inpTrk) ;
427 TLorentzVector momAtVrt(const std::vector<double>& inpTrk) const;
428 static double pTvsDir(const Amg::Vector3D &Dir, const std::vector<double>& inpTrk) ;
429 static double vrtRadiusError(const Amg::Vector3D & secVrt, const std::vector<double> & vrtErr) ;
430
431 bool insideMatLayer(float ,float ) const;
432 void fillVrtNTup( std::vector<Vrt2Tr> & all2TrVrt) const;
433 void fillNVrtNTup(std::vector<WrkVrt> & vrtSet, std::vector< std::vector<float> > & trkScore,
434 const xAOD::Vertex & primVrt, const TLorentzVector & jetDir)const;
435
436 TLorentzVector getBDir( const xAOD::TrackParticle* trk1,
437 const xAOD::TrackParticle* trk2,
438 const xAOD::Vertex & primVrt,
439 Amg::Vector3D &V1, Amg::Vector3D &V2) const;
440
441 static int nTrkCommon( std::vector<WrkVrt> *WrkVrtSet, int V1, int V2) ;
442 double minVrtVrtDist( std::vector<WrkVrt> *WrkVrtSet, int & V1, int & V2) const;
443 static double minVrtVrtDistNext( std::vector<WrkVrt> *WrkVrtSet, int & V1, int & V2) ;
444 static bool isPart( std::deque<long int> test, std::deque<long int> base) ;
445 static void clean1TrVertexSet(std::vector<WrkVrt> *WrkVrtSet) ;
446 static double jetProjDist(Amg::Vector3D &SecVrt, const xAOD::Vertex &primVrt, const TLorentzVector &JetDir) ;
447
448 double vrtVrtDist(const xAOD::Vertex & primVrt, const Amg::Vector3D & SecVrt,
449 const std::vector<double>& VrtErr,double& Signif ) const;
450 double vrtVrtDist2D(const xAOD::Vertex & primVrt, const Amg::Vector3D & SecVrt,
451 const std::vector<double>& VrtErr,double& Signif ) const;
452 double vrtVrtDist(const xAOD::Vertex & primVrt, const Amg::Vector3D & SecVrt,
453 const std::vector<double>& SecVrtErr, const TLorentzVector & JetDir) const;
454 double vrtVrtDist(const Amg::Vector3D & Vrt1, const std::vector<double>& VrtErr1,
455 const Amg::Vector3D & Vrt2, const std::vector<double>& VrtErr2) const;
456
457 template <class Particle>
458 void disassembleVertex(std::vector<WrkVrt> *WrkVrtSet, int iv,
459 std::vector<const Particle*> AllTracks,
460 Trk::IVKalState& istate) const;
461
462 static double projSV_PV(const Amg::Vector3D & SV, const xAOD::Vertex & PV, const TLorentzVector & Jet) ;
463
464 double rankBTrk(double TrkPt, double JetPt, double Signif) const;
465
466
467 static const Trk::Perigee* getPerigee( const xAOD::TrackParticle* ) ;
468 std::vector<const Trk::Perigee*> GetPerigeeVector( const std::vector<const Trk::TrackParticleBase*>& ) const;
469
470
471 template <class Trk>
472 double fitCommonVrt(const EventContext& ctx,
473 std::vector<const Trk*>& listSecondTracks,
474 std::vector<float> & trkRank,
475 const xAOD::Vertex & primVrt,
476 const TLorentzVector & jetDir,
477 std::vector<double> & inpMass,
478 Amg::Vector3D & fitVertex,
479 std::vector<double> & errorMatrix,
480 TLorentzVector & momentum,
481 std::vector< std::vector<double> > & trkAtVrt) const;
482
483 template <class Trk>
484 void removeEntryInList(std::vector<const Trk*>& , std::vector<float>&, int) const;
485 template <class Trk>
486 void removeDoubleEntries(std::vector<const Trk*>& ) const;
487
488 template <class Particle>
489 StatusCode refitVertex( std::vector<WrkVrt> *WrkVrtSet, int selectedVertex,
490 std::vector<const Particle*> & selectedTracks,
491 Trk::IVKalState& istate,
492 bool ifCovV0) const;
493
494 template <class Particle>
495 double refitVertex( WrkVrt &Vrt,std::vector<const Particle*> & SelectedTracks,
496 Trk::IVKalState& istate,
497 bool ifCovV0) const;
498
499 template <class Particle>
500 double mergeAndRefitVertices( std::vector<WrkVrt> *WrkVrtSet, int V1, int V2, WrkVrt & newvrt,
501 std::vector<const Particle*> & AllTrackList,
502 Trk::IVKalState& istate) const;
503 template <class Particle>
504 void mergeAndRefitOverlapVertices( std::vector<WrkVrt> *WrkVrtSet, int V1, int V2,
505 std::vector<const Particle*> & AllTrackLis,
506 Trk::IVKalState& istate) const;
507
508 template <class Particle>
509 double improveVertexChi2( std::vector<WrkVrt> *WrkVrtSet, int V, std::vector<const Particle*> & AllTracks,
510 Trk::IVKalState& istate,
511 bool ifCovV0) const;
512
513 int selGoodTrkParticle( const std::vector<const xAOD::TrackParticle*>& inpPart,
514 const xAOD::Vertex & primVrt,
515 const TLorentzVector & jetDir,
516 std::vector<const xAOD::TrackParticle*>& selPart,
517 float evtWgt=1.) const;
518
519
520 template <class Trk>
521 int select2TrVrt(const EventContext& ctx,
522 std::vector<const Trk*> & SelectedTracks,
523 std::vector<const Trk*> & TracksForFit,
524 const xAOD::Vertex & primVrt,
525 const TLorentzVector & JetDir,
526 std::vector<double> & InpMass,
527 int & nRefPVTrk,
528 std::vector<const Trk*> & TrkFromV0,
529 std::vector<const Trk*> & ListSecondTracks,
530 compatibilityGraph_t & compatibilityGraph,
531 float evtWgt = 1) const;
532
533 static Amg::MatrixX makeVrtCovMatrix( std::vector<double> & ErrorMatrix ) ;
534
535
537// Needed for TrackParticle<->TrackParticleBase story!!!!
538//
539// template <class Track>
540// StatusCode VKalVrtFitFastBase(const std::vector<const Track*>& listPart,Amg::Vector3D& Vertex) const;
541 StatusCode VKalVrtFitFastBase(const std::vector<const xAOD::TrackParticle*>& listPart,Amg::Vector3D& Vertex, Trk::IVKalState& istate) const;
542
543 template <class Track>
544 bool check2TrVertexInPixel( const Track* p1, const Track* p2, Amg::Vector3D &, std::vector<double> &) const;
545 template <class Track>
546 bool check1TrVertexInPixel( const Track* p1, Amg::Vector3D &, std::vector<double> & ) const;
547
548 void getPixelLayers(const xAOD::TrackParticle* Part, int &blHit, int &l1Hit, int &l2Hit, int &nLay) const;
549 static void getPixelDiscs(const xAOD::TrackParticle* Part, int &d0Hit, int &d1Hit, int &d2Hit) ;
550 void getPixelProblems(const xAOD::TrackParticle* Part, int &splshIBL, int &splshBL ) const;
551
552
553 StatusCode VKalVrtFitBase(const std::vector<const xAOD::TrackParticle*> & listPart,
555 TLorentzVector& Momentum,
556 long int& Charge,
557 std::vector<double>& ErrorMatrix,
558 std::vector<double>& Chi2PerTrk,
559 std::vector< std::vector<double> >& TrkAtVrt,
560 double& Chi2,
561 Trk::IVKalState& istate,
562 bool ifCovV0) const;
563
564 StatusCode GetTrkFitWeights(std::vector<double> & wgt,
565 const Trk::IVKalState& istate) const;
566
567 Hists& getHists() const;
568 };
569
570
571 template <class Trk>
572 void InDetVKalVxInJetTool::removeEntryInList(std::vector<const Trk*>& ListTracks, std::vector<float> & rank, int Outlier) const
573 {
574 if(Outlier < 0 ) return;
575 if(Outlier >= (int)ListTracks.size() ) return;
576 ListTracks.erase( ListTracks.begin()+Outlier);
577 rank.erase( rank.begin()+Outlier);
578 }
579
580 template <class Trk>
581 void InDetVKalVxInJetTool::removeDoubleEntries(std::vector<const Trk*>& ListTracks) const
582 {
583 typename std::vector<const Trk*>::iterator TransfEnd;
584 sort(ListTracks.begin(),ListTracks.end());
585 TransfEnd = unique(ListTracks.begin(),ListTracks.end());
586 ListTracks.erase( TransfEnd, ListTracks.end());
587 }
588
590 {
591 clique_visitor(std::vector< std::vector<int> > & input): m_allCliques(input){ input.clear();}
592
593 template <typename Clique, typename Graph>
594 void clique(const Clique& clq, Graph& )
595 {
596 std::vector<int> new_clique(0);
597 for(auto i = clq.begin(); i != clq.end(); ++i) new_clique.push_back(*i);
598 m_allCliques.push_back(std::move(new_clique));
599 }
600
601 std::vector< std::vector<int> > & m_allCliques;
602
603 };
604
605 template <class Track>
606 bool InDetVKalVxInJetTool::check1TrVertexInPixel( const Track* p1, Amg::Vector3D &FitVertex, std::vector<double> &VrtCov)
607 const
608 {
609 int blTrk=0, blP=0, l1Trk=0, l1P=0, l2Trk=0, nLays=0;
610 getPixelLayers( p1, blTrk , l1Trk, l2Trk, nLays );
611 getPixelProblems(p1, blP, l1P );
612 double radiusError=vrtRadiusError(FitVertex, VrtCov);
613 double xvt=FitVertex.x();
614 double yvt=FitVertex.y();
615 double R=std::hypot(xvt, yvt);
616 if(R < m_rLayerB-radiusError){ // Inside B-layer
617 if( blTrk<1 && l1Trk<1 ) return false;
618 if( nLays <2 ) return false; // Less than 2 layers on track 0
619 return true;
620 }else if(R > m_rLayerB+radiusError){ // Outside b-layer
621 if( blTrk>0 && blP==0 ) return false; // Good hit in b-layer is present
622 }
623//
624// L1 and L2 are considered only if vertex is in acceptance
625//
626 if(std::abs(FitVertex.z())<400.){
627 if(R < m_rLayer1-radiusError) { // Inside 1st-layer
628 if( l1Trk<1 && l2Trk<1 ) return false; // Less than 1 hits on track 0
629 return true;
630 }else if(R > m_rLayer1+radiusError) { // Outside 1st-layer
631 if( l1Trk>0 && l1P==0 ) return false; // Good L1 hit is present
632 }
633
634 if(R < m_rLayer2-radiusError) { // Inside 2nd-layer
635 if( l2Trk==0 ) return false; // At least one L2 hit must be present
636 }
637 } else {
638 int d0Trk=0, d1Trk=0, d2Trk=0;
639 getPixelDiscs( p1, d0Trk , d1Trk, d2Trk );
640 if( d0Trk+d1Trk+d2Trk ==0 )return false;
641 }
642 return true;
643 }
644
645} //end namespace
646
647#endif
#define AmgVector(rows)
boost::graph_traits< boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS > >::vertex_descriptor Vertex
std::vector< double > dvect
Jet_v1 Jet
Definition of the current "jet version".
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Handle class for reading from StoreGate.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated pixel ...
static void clean1TrVertexSet(std::vector< WrkVrt > *WrkVrtSet)
static void getPixelDiscs(const xAOD::TrackParticle *Part, int &d0Hit, int &d1Hit, int &d2Hit)
void fillNVrtNTup(std::vector< WrkVrt > &vrtSet, std::vector< std::vector< float > > &trkScore, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir) const
std::unique_ptr< TH2D > m_ITkPixMaterialMap
TLorentzVector getBDir(const xAOD::TrackParticle *trk1, const xAOD::TrackParticle *trk2, const xAOD::Vertex &primVrt, Amg::Vector3D &V1, Amg::Vector3D &V2) const
ToolHandle< IInDetTrkInJetType > m_trackClassificator
void getPixelLayers(const xAOD::TrackParticle *Part, int &blHit, int &l1Hit, int &l2Hit, int &nLay) const
static bool isPart(std::deque< long int > test, std::deque< long int > base)
ServiceHandle< InDet::IInDetEtaDependentCutsSvc > m_etaDependentCutsSvc
service to get cut values depending on different variable
double vrtVrtDist(const xAOD::Vertex &primVrt, const Amg::Vector3D &SecVrt, const std::vector< double > &VrtErr, double &Signif) const
std::vector< xAOD::Vertex * > getVrtSecMulti(workVectorArrxAOD *, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir, std::vector< double > &results, compatibilityGraph_t &compatibilityGraph) const
StatusCode refitVertex(std::vector< WrkVrt > *WrkVrtSet, int selectedVertex, std::vector< const Particle * > &selectedTracks, Trk::IVKalState &istate, bool ifCovV0) const
void disassembleVertex(std::vector< WrkVrt > *WrkVrtSet, int iv, std::vector< const Particle * > AllTracks, Trk::IVKalState &istate) const
int selGoodTrkParticle(const std::vector< const xAOD::TrackParticle * > &inpPart, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir, std::vector< const xAOD::TrackParticle * > &selPart, float evtWgt=1.) const
boost::adjacency_list< boost::listS, boost::vecS, boost::undirectedS > compatibilityGraph_t
virtual StatusCode finalize() override
virtual Trk::VxSecVertexInfo * findSecVertex(const EventContext &ctx, const xAOD::Vertex &primaryVertex, const TLorentzVector &jetMomentum, const std::vector< const xAOD::IParticle * > &inputTracks) const override
void removeTrackFromVertex(std::vector< WrkVrt > *wrkVrtSet, std::vector< std::deque< long int > > *trkInVrt, long int &selectedTrack, long int &selectedVertex) const
TLorentzVector momAtVrt(const std::vector< double > &inpTrk) const
const BeamPipeDetectorManager * m_beamPipeMgr
StatusCode GetTrkFitWeights(std::vector< double > &wgt, const Trk::IVKalState &istate) const
static double jetProjDist(Amg::Vector3D &SecVrt, const xAOD::Vertex &primVrt, const TLorentzVector &JetDir)
static double projSV_PV(const Amg::Vector3D &SV, const xAOD::Vertex &PV, const TLorentzVector &Jet)
static double massV0(std::vector< std::vector< double > > &trkAtVrt, double massP, double massPi)
static void trackClassification(std::vector< WrkVrt > *wrkVrtSet, std::vector< std::deque< long int > > *trkInVrt)
static double vrtRadiusError(const Amg::Vector3D &secVrt, const std::vector< double > &vrtErr)
static Amg::MatrixX makeVrtCovMatrix(std::vector< double > &ErrorMatrix)
Trk::TrkVKalVrtFitter * m_fitSvc
StatusCode VKalVrtFitFastBase(const std::vector< const xAOD::TrackParticle * > &listPart, Amg::Vector3D &Vertex, Trk::IVKalState &istate) const
virtual StatusCode initialize() override
ToolHandle< Trk::IVertexFitter > m_fitter
InDetVKalVxInJetTool(const std::string &type, const std::string &name, const IInterface *parent)
void getPixelProblems(const xAOD::TrackParticle *Part, int &splshIBL, int &splshBL) const
void removeDoubleEntries(std::vector< const Trk * > &) const
int select2TrVrt(const EventContext &ctx, std::vector< const Trk * > &SelectedTracks, std::vector< const Trk * > &TracksForFit, const xAOD::Vertex &primVrt, const TLorentzVector &JetDir, std::vector< double > &InpMass, int &nRefPVTrk, std::vector< const Trk * > &TrkFromV0, std::vector< const Trk * > &ListSecondTracks, compatibilityGraph_t &compatibilityGraph, float evtWgt=1) const
double rankBTrk(double TrkPt, double JetPt, double Signif) const
void removeEntryInList(std::vector< const Trk * > &, std::vector< float > &, int) const
static double MaxOfShared(std::vector< WrkVrt > *WrkVrtSet, std::vector< std::deque< long int > > *trkInVrt, long int &selectedTrack, long int &selectedVertex)
double minVrtVrtDist(std::vector< WrkVrt > *WrkVrtSet, int &V1, int &V2) const
const InDetDD::PixelDetectorManager * m_pixelManager
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
double mergeAndRefitVertices(std::vector< WrkVrt > *WrkVrtSet, int V1, int V2, WrkVrt &newvrt, std::vector< const Particle * > &AllTrackList, Trk::IVKalState &istate) const
TLorentzVector totalMom(const std::vector< const Trk::Perigee * > &inpTrk) const
double improveVertexChi2(std::vector< WrkVrt > *WrkVrtSet, int V, std::vector< const Particle * > &AllTracks, Trk::IVKalState &istate, bool ifCovV0) const
static double minVrtVrtDistNext(std::vector< WrkVrt > *WrkVrtSet, int &V1, int &V2)
StatusCode VKalVrtFitBase(const std::vector< const xAOD::TrackParticle * > &listPart, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, std::vector< double > &ErrorMatrix, std::vector< double > &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, Trk::IVKalState &istate, bool ifCovV0) const
static double coneDist(const AmgVector(5) &, const TLorentzVector &)
xAOD::Vertex * getVrtSec(const std::vector< const xAOD::TrackParticle * > &inpTrk, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir, std::vector< double > &results, std::vector< const xAOD::TrackParticle * > &selSecTrk, std::vector< const xAOD::TrackParticle * > &trkFromV0, int &nRefPVTrk, compatibilityGraph_t &compatibilityGraph) const
bool check1TrVertexInPixel(const Track *p1, Amg::Vector3D &, std::vector< double > &) const
static double pTvsDir(const Amg::Vector3D &Dir, const std::vector< double > &inpTrk)
std::vector< const Trk::Perigee * > GetPerigeeVector(const std::vector< const Trk::TrackParticleBase * > &) const
double fitCommonVrt(const EventContext &ctx, std::vector< const Trk * > &listSecondTracks, std::vector< float > &trkRank, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir, std::vector< double > &inpMass, Amg::Vector3D &fitVertex, std::vector< double > &errorMatrix, TLorentzVector &momentum, std::vector< std::vector< double > > &trkAtVrt) const
double vrtVrtDist2D(const xAOD::Vertex &primVrt, const Amg::Vector3D &SecVrt, const std::vector< double > &VrtErr, double &Signif) const
static int findMax(std::vector< double > &chi2PerTrk, std::vector< float > &rank)
static int nTrkCommon(std::vector< WrkVrt > *WrkVrtSet, int V1, int V2)
void printWrkSet(const std::vector< WrkVrt > *WrkSet, const std::string &name) const
StatusCode cutTrk(const std::unordered_map< std::string, double > &TrkVarDouble, const std::unordered_map< std::string, int > &TrkVarInt, float evtWgt=1.) const
void mergeAndRefitOverlapVertices(std::vector< WrkVrt > *WrkVrtSet, int V1, int V2, std::vector< const Particle * > &AllTrackLis, Trk::IVKalState &istate) const
static const xAOD::TruthParticle * getPreviousParent(const xAOD::TruthParticle *child, int &ParentPDG)
static const Trk::Perigee * getPerigee(const xAOD::TrackParticle *)
bool check2TrVertexInPixel(const Track *p1, const Track *p2, Amg::Vector3D &, std::vector< double > &) const
std::unique_ptr< Hists > m_h
Property holding a SG store/key/clid from which a ReadHandle is made.
std::string base
Definition hcg.cxx:83
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
Message Stream Member.
Primary Vertex Finder.
constexpr double protonMassInMeV
the mass of the proton (in MeV)
constexpr double KZeroMassInMeV
the mass of the neutral kaon (K0) (in MeV)
constexpr double chargedPionMassInMeV
the mass of the charged pion (in MeV)
constexpr double electronMassInMeV
the mass of the electron (in MeV)
constexpr double lambdaMassInMeV
the mass of the lambda baryon (in MeV)
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
TruthParticle_v1 TruthParticle
Typedef to implementation.
StatusCode book(ITHistSvc &histSvc, const std::string &histDir)
std::vector< std::vector< double > > trkAtVrt
std::vector< std::vector< double > > trkAtVrt
void clique(const Clique &clq, Graph &)
clique_visitor(std::vector< std::vector< int > > &input)
std::vector< std::vector< int > > & m_allCliques
std::vector< const xAOD::TrackParticle * > TracksForFit
std::vector< const xAOD::TrackParticle * > TrkFromV0
std::vector< const xAOD::TrackParticle * > listSecondTracks
std::vector< std::vector< const xAOD::TrackParticle * > > FoundSecondTracks
std::vector< const xAOD::TrackParticle * > InpTrk
std::vector< const xAOD::TrackParticle * > listJetTracks
std::vector< const xAOD::TrackParticle * > tmpListTracks