40#ifndef _VKalVrt_InDetVKalVxInJetTool_H
41#define _VKalVrt_InDetVKalVxInJetTool_H
45#include "GaudiKernel/ToolHandle.h"
46#include "GaudiKernel/IChronoStatSvc.h"
51#define BOOST_ALLOW_DEPRECATED_HEADERS
52#include "boost/graph/adjacency_list.hpp"
72 class TrkVKalVrtFitter;
83typedef std::vector<double>
dvect;
95 std::vector<const xAOD::TrackParticle*>
InpTrk;
112 virtual StatusCode
finalize()
override;
116 const TLorentzVector & jetMomentum,
117 const std::vector<const xAOD::IParticle*> & inputTracks)
const override;
127 StatusCode
book (ITHistSvc& histSvc,
const std::string& histDir);
176 std::unique_ptr<Hists>
m_h;
179 "Remove track is it has less SCT hits"};
181 "Remove track is it has less Pixel hits"};
183 "Remove track is it has less Pixel+SCT hits"};
185 "Remove track is it has less B-layer hits"};
187 "Reject final 2tr vertices if tracks have shared hits"};
188 DoubleProperty
m_cutPt{
this,
"CutPt", 700.,
"Track Pt selection cut"};
189 DoubleProperty
m_cutZVrt{
this,
"CutZVrt", 15.,
"Track Z impact selection cut"};
190 DoubleProperty
m_cutA0{
this,
"CutA0", 5.,
"Track A0 selection cut"};
191 DoubleProperty
m_cutChi2{
this,
"CutChi2", 5.,
"Track Chi2 selection cut"};
193 "Track - common secondary vertex association cut. Single Vertex Finder only"};
195 "Cone around jet direction for track selection"};
197 "Cut on Chi2 of 2-track vertex for initial selection"};
199 "Cut on significance of 3D distance between initial 2-track vertex and PV"};
201 "Track 3D impact significance w/r primary vertex"};
203 "Track A0 error cut"};
205 "Track Z impact error cut"};
207 "B vertex selection cut on 2track vertex score (probability-like) based on track classification"};
209 "Maximal allowed mass for 2-track vertices"};
212 "Switch from default frozen version to the development/improved one"};
214 "Fill technical histograms"};
216 "Inform whether 3-layer or 4-layer detector is used"};
219 "Use vertex fit with RobustFit functional(VKalVrt) for common secondary vertex fit"};
228 "Clean vertices requiring track pixel hit patterns according to vertex position"};
230 "Clean vertices requiring track F(irst) M(easured) P(oints) matching to vertex position"};
232 "Reject V0s after checking 3D PV impact"};
234 "Run Multiple Secondary Vertices in jet finder"};
236 "Find Multiple Secondary Vertices + primary vertex in jet. MultiVertex Finder only!"};
238 "Allow secondary vertex behind the primary one (negative) w/r jet direction (not for multivertex!)"};
240 "Return ONLY negative secondary vertices (not for multivertex!)"};
242 "Allow one-track-vertex addition to already found secondary vertices. MultiVertex Finder only!"};
245 "To allow vertex merging for MultiVertex Finder"};
247 "To allow track from vertex detachment for MultiVertex Finder"};
250 {
this,
"VertexFitterTool",
"Trk::TrkVKalVrtFitter/VertexFitterTool"};
256 {
this,
"TrackClassTool",
"InDet::InDetTrkInJetType"};
258 {
this,
"EventInfoName",
"EventInfo"};
263 {
this,
"InDetEtaDependentCutsSvc",
""};
266 {
this,
"useITkMaterialRejection",
false,
267 "Reject vertices from hadronic interactions in detector material using ITk layout"};
387 const TLorentzVector & jetDir,
388 std::vector<double> & results,
389 std::vector<const xAOD::TrackParticle*> & selSecTrk,
390 std::vector<const xAOD::TrackParticle*> & trkFromV0,
397 const TLorentzVector& jetDir,
398 std::vector<double>& results,
402 std::vector< std::deque<long int> > *trkInVrt) ;
404 static double MaxOfShared(std::vector<WrkVrt> *WrkVrtSet,
405 std::vector< std::deque<long int> > *trkInVrt,
406 long int & selectedTrack,
407 long int & selectedVertex) ;
409 std::vector< std::deque<long int> > *trkInVrt,
410 long int & selectedTrack,
411 long int & selectedVertex)
const;
415 void printWrkSet(
const std::vector<WrkVrt> * WrkSet,
const std::string& name )
const;
418 StatusCode
cutTrk(
const std::unordered_map<std::string,double>& TrkVarDouble,
419 const std::unordered_map<std::string,int>& TrkVarInt,
420 float evtWgt=1.)
const;
424 static double massV0( std::vector< std::vector<double> >& trkAtVrt,
double massP,
double massPi ) ;
425 static int findMax( std::vector<double>& chi2PerTrk, std::vector<float>& rank) ;
428 TLorentzVector
totalMom(
const std::vector<const Trk::Perigee*>& inpTrk)
const;
429 static TLorentzVector
totalMom(
const std::vector<const xAOD::TrackParticle*>& inpTrk) ;
430 TLorentzVector
momAtVrt(
const std::vector<double>& inpTrk)
const;
435 void fillVrtNTup( std::vector<Vrt2Tr> & all2TrVrt)
const;
436 void fillNVrtNTup(std::vector<WrkVrt> & vrtSet, std::vector< std::vector<float> > & trkScore,
437 const xAOD::Vertex & primVrt,
const TLorentzVector & jetDir)
const;
444 static int nTrkCommon( std::vector<WrkVrt> *WrkVrtSet,
int V1,
int V2) ;
445 double minVrtVrtDist( std::vector<WrkVrt> *WrkVrtSet,
int & V1,
int & V2)
const;
446 static double minVrtVrtDistNext( std::vector<WrkVrt> *WrkVrtSet,
int & V1,
int & V2) ;
447 static bool isPart( std::deque<long int> test, std::deque<long int>
base) ;
452 const std::vector<double>& VrtErr,
double& Signif )
const;
454 const std::vector<double>& VrtErr,
double& Signif )
const;
456 const std::vector<double>& SecVrtErr,
const TLorentzVector & JetDir)
const;
458 const Amg::Vector3D & Vrt2,
const std::vector<double>& VrtErr2)
const;
460 template <
class Particle>
462 std::vector<const Particle*> AllTracks,
467 double rankBTrk(
double TrkPt,
double JetPt,
double Signif)
const;
471 std::vector<const Trk::Perigee*>
GetPerigeeVector(
const std::vector<const Trk::TrackParticleBase*>& )
const;
476 std::vector<const Trk*>& listSecondTracks,
477 std::vector<float> & trkRank,
479 const TLorentzVector & jetDir,
480 std::vector<double> & inpMass,
482 std::vector<double> & errorMatrix,
483 TLorentzVector & momentum,
484 std::vector< std::vector<double> > & trkAtVrt)
const;
487 void removeEntryInList(std::vector<const Trk*>& , std::vector<float>&,
int)
const;
491 template <
class Particle>
492 StatusCode
refitVertex( std::vector<WrkVrt> *WrkVrtSet,
int selectedVertex,
493 std::vector<const Particle*> & selectedTracks,
497 template <
class Particle>
502 template <
class Particle>
504 std::vector<const Particle*> & AllTrackList,
506 template <
class Particle>
508 std::vector<const Particle*> & AllTrackLis,
511 template <
class Particle>
512 double improveVertexChi2( std::vector<WrkVrt> *WrkVrtSet,
int V, std::vector<const Particle*> & AllTracks,
518 const TLorentzVector & jetDir,
519 std::vector<const xAOD::TrackParticle*>& selPart,
520 float evtWgt=1.)
const;
525 std::vector<const Trk*> & SelectedTracks,
526 std::vector<const Trk*> & TracksForFit,
528 const TLorentzVector & JetDir,
529 std::vector<double> & InpMass,
531 std::vector<const Trk*> & TrkFromV0,
532 std::vector<const Trk*> & ListSecondTracks,
534 float evtWgt = 1)
const;
546 template <
class Track>
548 template <
class Track>
556 StatusCode
VKalVrtFitBase(
const std::vector<const xAOD::TrackParticle*> & listPart,
558 TLorentzVector& Momentum,
560 std::vector<double>& ErrorMatrix,
561 std::vector<double>& Chi2PerTrk,
562 std::vector< std::vector<double> >& TrkAtVrt,
578 if(
Outlier >= (
int)ListTracks.size() )
return;
579 ListTracks.erase( ListTracks.begin()+
Outlier);
580 rank.erase( rank.begin()+
Outlier);
586 typename std::vector<const Trk*>::iterator TransfEnd;
587 sort(ListTracks.begin(),ListTracks.end());
588 TransfEnd = unique(ListTracks.begin(),ListTracks.end());
589 ListTracks.erase( TransfEnd, ListTracks.end());
596 template <
typename Clique,
typename Graph>
599 std::vector<int> new_clique(0);
600 for(
auto i = clq.begin(); i != clq.end(); ++i) new_clique.push_back(*i);
608 template <
class Track>
612 int blTrk=0, blP=0, l1Trk=0, l1P=0, l2Trk=0, nLays=0;
616 double xvt=FitVertex.x();
617 double yvt=FitVertex.y();
618 double R=std::hypot(xvt, yvt);
620 if( blTrk<1 && l1Trk<1 )
return false;
621 if( nLays <2 )
return false;
624 if( blTrk>0 && blP==0 )
return false;
629 if(std::abs(FitVertex.z())<400.){
631 if( l1Trk<1 && l2Trk<1 )
return false;
634 if( l1Trk>0 && l1P==0 )
return false;
638 if( l2Trk==0 )
return false;
641 int d0Trk=0, d1Trk=0, d2Trk=0;
643 if( d0Trk+d1Trk+d2Trk ==0 )
return false;
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.
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated pixel ...
Property holding a SG store/key/clid from which a ReadHandle is made.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
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.
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