40#ifndef _VKalVrt_InDetVKalVxInJetTool_H
41#define _VKalVrt_InDetVKalVxInJetTool_H
45#include "GaudiKernel/ToolHandle.h"
50#define BOOST_ALLOW_DEPRECATED_HEADERS
51#include "boost/graph/adjacency_list.hpp"
70 class TrkVKalVrtFitter;
81typedef std::vector<double>
dvect;
93 std::vector<const xAOD::TrackParticle*>
InpTrk;
110 virtual StatusCode
finalize()
override;
114 const TLorentzVector & jetMomentum,
115 const std::vector<const xAOD::IParticle*> & inputTracks)
const override;
125 StatusCode
book (ITHistSvc& histSvc,
const std::string& histDir);
174 std::unique_ptr<Hists>
m_h;
177 "Remove track is it has less SCT hits"};
179 "Remove track is it has less Pixel hits"};
181 "Remove track is it has less Pixel+SCT hits"};
183 "Remove track is it has less B-layer hits"};
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"};
191 "Track - common secondary vertex association cut. Single Vertex Finder only"};
193 "Cone around jet direction for track selection"};
195 "Cut on Chi2 of 2-track vertex for initial selection"};
197 "Cut on significance of 3D distance between initial 2-track vertex and PV"};
199 "Track 3D impact significance w/r primary vertex"};
201 "Track A0 error cut"};
203 "Track Z impact error cut"};
205 "B vertex selection cut on 2track vertex score (probability-like) based on track classification"};
207 "Maximal allowed mass for 2-track vertices"};
210 "Switch from default frozen version to the development/improved one"};
212 "Fill technical histograms"};
214 "Inform whether 3-layer or 4-layer detector is used"};
217 "Use vertex fit with RobustFit functional(VKalVrt) for common secondary vertex fit"};
226 "Clean vertices requiring track pixel hit patterns according to vertex position"};
228 "Clean vertices requiring track F(irst) M(easured) P(oints) matching to vertex position"};
230 "Reject V0s after checking 3D PV impact"};
232 "Run Multiple Secondary Vertices in jet finder"};
234 "Find Multiple Secondary Vertices + primary vertex in jet. MultiVertex Finder only!"};
236 "Allow secondary vertex behind the primary one (negative) w/r jet direction (not for multivertex!)"};
238 "Return ONLY negative secondary vertices (not for multivertex!)"};
240 "Allow one-track-vertex addition to already found secondary vertices. MultiVertex Finder only!"};
243 "To allow vertex merging for MultiVertex Finder"};
245 "To allow track from vertex detachment for MultiVertex Finder"};
248 {
this,
"VertexFitterTool",
"Trk::TrkVKalVrtFitter/VertexFitterTool"};
253 {
this,
"TrackClassTool",
"InDet::InDetTrkInJetType"};
255 {
this,
"EventInfoName",
"EventInfo"};
260 {
this,
"InDetEtaDependentCutsSvc",
""};
263 {
this,
"useITkMaterialRejection",
false,
264 "Reject vertices from hadronic interactions in detector material using ITk layout"};
384 const TLorentzVector & jetDir,
385 std::vector<double> & results,
386 std::vector<const xAOD::TrackParticle*> & selSecTrk,
387 std::vector<const xAOD::TrackParticle*> & trkFromV0,
394 const TLorentzVector& jetDir,
395 std::vector<double>& results,
399 std::vector< std::deque<long int> > *trkInVrt) ;
401 static double MaxOfShared(std::vector<WrkVrt> *WrkVrtSet,
402 std::vector< std::deque<long int> > *trkInVrt,
403 long int & selectedTrack,
404 long int & selectedVertex) ;
406 std::vector< std::deque<long int> > *trkInVrt,
407 long int & selectedTrack,
408 long int & selectedVertex)
const;
412 void printWrkSet(
const std::vector<WrkVrt> * WrkSet,
const std::string& name )
const;
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;
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) ;
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;
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;
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) ;
449 const std::vector<double>& VrtErr,
double& Signif )
const;
451 const std::vector<double>& VrtErr,
double& Signif )
const;
453 const std::vector<double>& SecVrtErr,
const TLorentzVector & JetDir)
const;
455 const Amg::Vector3D & Vrt2,
const std::vector<double>& VrtErr2)
const;
457 template <
class Particle>
459 std::vector<const Particle*> AllTracks,
464 double rankBTrk(
double TrkPt,
double JetPt,
double Signif)
const;
468 std::vector<const Trk::Perigee*>
GetPerigeeVector(
const std::vector<const Trk::TrackParticleBase*>& )
const;
473 std::vector<const Trk*>& listSecondTracks,
474 std::vector<float> & trkRank,
476 const TLorentzVector & jetDir,
477 std::vector<double> & inpMass,
479 std::vector<double> & errorMatrix,
480 TLorentzVector & momentum,
481 std::vector< std::vector<double> > & trkAtVrt)
const;
484 void removeEntryInList(std::vector<const Trk*>& , std::vector<float>&,
int)
const;
488 template <
class Particle>
489 StatusCode
refitVertex( std::vector<WrkVrt> *WrkVrtSet,
int selectedVertex,
490 std::vector<const Particle*> & selectedTracks,
494 template <
class Particle>
499 template <
class Particle>
501 std::vector<const Particle*> & AllTrackList,
503 template <
class Particle>
505 std::vector<const Particle*> & AllTrackLis,
508 template <
class Particle>
509 double improveVertexChi2( std::vector<WrkVrt> *WrkVrtSet,
int V, std::vector<const Particle*> & AllTracks,
515 const TLorentzVector & jetDir,
516 std::vector<const xAOD::TrackParticle*>& selPart,
517 float evtWgt=1.)
const;
522 std::vector<const Trk*> & SelectedTracks,
523 std::vector<const Trk*> & TracksForFit,
525 const TLorentzVector & JetDir,
526 std::vector<double> & InpMass,
528 std::vector<const Trk*> & TrkFromV0,
529 std::vector<const Trk*> & ListSecondTracks,
531 float evtWgt = 1)
const;
543 template <
class Track>
545 template <
class Track>
553 StatusCode
VKalVrtFitBase(
const std::vector<const xAOD::TrackParticle*> & listPart,
555 TLorentzVector& Momentum,
557 std::vector<double>& ErrorMatrix,
558 std::vector<double>& Chi2PerTrk,
559 std::vector< std::vector<double> >& TrkAtVrt,
575 if(
Outlier >= (
int)ListTracks.size() )
return;
576 ListTracks.erase( ListTracks.begin()+
Outlier);
577 rank.erase( rank.begin()+
Outlier);
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());
593 template <
typename Clique,
typename Graph>
596 std::vector<int> new_clique(0);
597 for(
auto i = clq.begin(); i != clq.end(); ++i) new_clique.push_back(*i);
605 template <
class Track>
609 int blTrk=0, blP=0, l1Trk=0, l1P=0, l2Trk=0, nLays=0;
613 double xvt=FitVertex.x();
614 double yvt=FitVertex.y();
615 double R=std::hypot(xvt, yvt);
617 if( blTrk<1 && l1Trk<1 )
return false;
618 if( nLays <2 )
return false;
621 if( blTrk>0 && blP==0 )
return false;
626 if(std::abs(FitVertex.z())<400.){
628 if( l1Trk<1 && l2Trk<1 )
return false;
631 if( l1Trk>0 && l1P==0 )
return false;
635 if( l2Trk==0 )
return false;
638 int d0Trk=0, d1Trk=0, d2Trk=0;
640 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