ATLAS Offline Software
Loading...
Searching...
No Matches
InDet::InDetVKalVxInJetTool Class Reference

#include <InDetVKalVxInJetTool.h>

Inheritance diagram for InDet::InDetVKalVxInJetTool:

Classes

struct  Hists
struct  DevTuple
struct  Vrt2Tr
struct  WrkVrt

Public Member Functions

 InDetVKalVxInJetTool (const std::string &type, const std::string &name, const IInterface *parent)
virtual ~InDetVKalVxInJetTool ()
virtual StatusCode initialize () override
virtual StatusCode finalize () override
virtual Trk::VxSecVertexInfofindSecVertex (const EventContext &ctx, const xAOD::Vertex &primaryVertex, const TLorentzVector &jetMomentum, const std::vector< const xAOD::IParticle * > &inputTracks) const override
template<class Track>
double fitCommonVrt (const EventContext &ctx, std::vector< const Track * > &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
template<class Track>
int select2TrVrt (const EventContext &ctx, std::vector< const Track * > &selectedTracks, std::vector< const Track * > &tracksForFit, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir, std::vector< double > &inpMass, int &nRefPVTrk, std::vector< const Track * > &trkFromV0, std::vector< const Track * > &listSecondTracks, compatibilityGraph_t &compatibilityGraph, float evtWgt) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
 DeclareInterfaceID (ISecVertexInJetFinder, 1, 0)
virtual std::vector< std::string > trackDecorationNames () const
 Return a list of the names of track decorations created by this tool, in order to allow them to be locked when the calling algorithm completes.

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

using compatibilityGraph_t = boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS>
typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

xAOD::VertexgetVrtSec (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
std::vector< xAOD::Vertex * > getVrtSecMulti (workVectorArrxAOD *, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir, std::vector< double > &results, compatibilityGraph_t &compatibilityGraph) const
void removeTrackFromVertex (std::vector< WrkVrt > *wrkVrtSet, std::vector< std::deque< long int > > *trkInVrt, long int &selectedTrack, long int &selectedVertex) const
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
TLorentzVector totalMom (const std::vector< const Trk::Perigee * > &inpTrk) const
TLorentzVector momAtVrt (const std::vector< double > &inpTrk) const
bool insideMatLayer (float, float) const
void fillVrtNTup (std::vector< Vrt2Tr > &all2TrVrt) const
void fillNVrtNTup (std::vector< WrkVrt > &vrtSet, std::vector< std::vector< float > > &trkScore, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir) const
TLorentzVector getBDir (const xAOD::TrackParticle *trk1, const xAOD::TrackParticle *trk2, const xAOD::Vertex &primVrt, Amg::Vector3D &V1, Amg::Vector3D &V2) const
double minVrtVrtDist (std::vector< WrkVrt > *WrkVrtSet, int &V1, int &V2) const
double vrtVrtDist (const xAOD::Vertex &primVrt, const Amg::Vector3D &SecVrt, const std::vector< double > &VrtErr, double &Signif) const
double vrtVrtDist2D (const xAOD::Vertex &primVrt, const Amg::Vector3D &SecVrt, const std::vector< double > &VrtErr, double &Signif) const
double vrtVrtDist (const xAOD::Vertex &primVrt, const Amg::Vector3D &SecVrt, const std::vector< double > &SecVrtErr, const TLorentzVector &JetDir) const
double vrtVrtDist (const Amg::Vector3D &Vrt1, const std::vector< double > &VrtErr1, const Amg::Vector3D &Vrt2, const std::vector< double > &VrtErr2) const
template<class Particle>
void disassembleVertex (std::vector< WrkVrt > *WrkVrtSet, int iv, std::vector< const Particle * > AllTracks, Trk::IVKalState &istate) const
double rankBTrk (double TrkPt, double JetPt, double Signif) const
std::vector< const Trk::Perigee * > GetPerigeeVector (const std::vector< const Trk::TrackParticleBase * > &) const
template<class Trk>
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
template<class Trk>
void removeEntryInList (std::vector< const Trk * > &, std::vector< float > &, int) const
template<class Trk>
void removeDoubleEntries (std::vector< const Trk * > &) const
template<class Particle>
StatusCode refitVertex (std::vector< WrkVrt > *WrkVrtSet, int selectedVertex, std::vector< const Particle * > &selectedTracks, Trk::IVKalState &istate, bool ifCovV0) const
template<class Particle>
double refitVertex (WrkVrt &Vrt, std::vector< const Particle * > &SelectedTracks, Trk::IVKalState &istate, bool ifCovV0) const
template<class Particle>
double mergeAndRefitVertices (std::vector< WrkVrt > *WrkVrtSet, int V1, int V2, WrkVrt &newvrt, std::vector< const Particle * > &AllTrackList, Trk::IVKalState &istate) const
template<class Particle>
void mergeAndRefitOverlapVertices (std::vector< WrkVrt > *WrkVrtSet, int V1, int V2, std::vector< const Particle * > &AllTrackLis, Trk::IVKalState &istate) const
template<class Particle>
double improveVertexChi2 (std::vector< WrkVrt > *WrkVrtSet, int V, std::vector< const Particle * > &AllTracks, Trk::IVKalState &istate, bool ifCovV0) 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
template<class Trk>
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
StatusCode VKalVrtFitFastBase (const std::vector< const xAOD::TrackParticle * > &listPart, Amg::Vector3D &Vertex, Trk::IVKalState &istate) const
template<class Track>
bool check2TrVertexInPixel (const Track *p1, const Track *p2, Amg::Vector3D &, std::vector< double > &) const
template<class Track>
bool check1TrVertexInPixel (const Track *p1, Amg::Vector3D &, std::vector< double > &) const
void getPixelLayers (const xAOD::TrackParticle *Part, int &blHit, int &l1Hit, int &l2Hit, int &nLay) const
void getPixelProblems (const xAOD::TrackParticle *Part, int &splshIBL, int &splshBL) const
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
StatusCode GetTrkFitWeights (std::vector< double > &wgt, const Trk::IVKalState &istate) const
HistsgetHists () const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Static Private Member Functions

static int notFromBC (int PDGID)
static const xAOD::TruthParticlegetPreviousParent (const xAOD::TruthParticle *child, int &ParentPDG)
static int getIdHF (const xAOD::TrackParticle *TP)
static int getG4Inter (const xAOD::TrackParticle *TP)
static int getMCPileup (const xAOD::TrackParticle *TP)
static void trackClassification (std::vector< WrkVrt > *wrkVrtSet, std::vector< std::deque< long int > > *trkInVrt)
static double MaxOfShared (std::vector< WrkVrt > *WrkVrtSet, std::vector< std::deque< long int > > *trkInVrt, long int &selectedTrack, long int &selectedVertex)
static double coneDist (const AmgVector(5) &, const TLorentzVector &)
static double massV0 (std::vector< std::vector< double > > &trkAtVrt, double massP, double massPi)
static int findMax (std::vector< double > &chi2PerTrk, std::vector< float > &rank)
static TLorentzVector totalMom (const std::vector< const xAOD::TrackParticle * > &inpTrk)
static double pTvsDir (const Amg::Vector3D &Dir, const std::vector< double > &inpTrk)
static double vrtRadiusError (const Amg::Vector3D &secVrt, const std::vector< double > &vrtErr)
static int nTrkCommon (std::vector< WrkVrt > *WrkVrtSet, int V1, int V2)
static double minVrtVrtDistNext (std::vector< WrkVrt > *WrkVrtSet, int &V1, int &V2)
static bool isPart (std::deque< long int > test, std::deque< long int > base)
static void clean1TrVertexSet (std::vector< WrkVrt > *WrkVrtSet)
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 const Trk::PerigeegetPerigee (const xAOD::TrackParticle *)
static Amg::MatrixX makeVrtCovMatrix (std::vector< double > &ErrorMatrix)
static void getPixelDiscs (const xAOD::TrackParticle *Part, int &d0Hit, int &d1Hit, int &d2Hit)

Private Attributes

std::unique_ptr< Histsm_h
IntegerProperty m_cutSctHits
IntegerProperty m_cutPixelHits
IntegerProperty m_cutSiHits
IntegerProperty m_cutBLayHits
IntegerProperty m_cutSharedHits
DoubleProperty m_cutPt {this, "CutPt", 700., "Track Pt selection cut"}
DoubleProperty m_cutZVrt {this, "CutZVrt", 15., "Track Z impact selection cut"}
DoubleProperty m_cutA0 {this, "CutA0", 5., "Track A0 selection cut"}
DoubleProperty m_cutChi2 {this, "CutChi2", 5., "Track Chi2 selection cut"}
DoubleProperty m_secTrkChi2Cut
DoubleProperty m_coneForTag
DoubleProperty m_sel2VrtChi2Cut
DoubleProperty m_sel2VrtSigCut
DoubleProperty m_trkSigCut
DoubleProperty m_a0TrkErrorCut
DoubleProperty m_zTrkErrorCut
DoubleProperty m_cutBVrtScore
DoubleProperty m_vrt2TrMassLimit
BooleanProperty m_useFrozenVersion
BooleanProperty m_fillHist
BooleanProperty m_existIBL
IntegerProperty m_RobustFit
double m_beampipeR = 0.
double m_rLayerB = 0.
double m_rLayer1 = 0.
double m_rLayer2 = 0.
double m_rLayer3 = 0.
BooleanProperty m_useVertexCleaningPix
BooleanProperty m_useVertexCleaningFMP
BooleanProperty m_rejectBadVertices
BooleanProperty m_multiVertex
BooleanProperty m_multiWithPrimary
BooleanProperty m_getNegativeTail
BooleanProperty m_getNegativeTag
BooleanProperty m_multiWithOneTrkVrt
DoubleProperty m_vertexMergeCut
DoubleProperty m_trackDetachCut
ToolHandle< Trk::IVertexFitterm_fitter {this, "VertexFitterTool", "Trk::TrkVKalVrtFitter/VertexFitterTool"}
Trk::TrkVKalVrtFitterm_fitSvc {}
ServiceHandle< IChronoStatSvc > m_timingProfile {this,"ChronoStatSvc","ChronoStatSvc"}
bool m_useTrackClassificator = true
ToolHandle< IInDetTrkInJetTypem_trackClassificator {this, "TrackClassTool", "InDet::InDetTrkInJetType"}
SG::ReadHandleKey< xAOD::EventInfom_eventInfoKey {this, "EventInfoName", "EventInfo"}
bool m_useEtaDependentCuts = false
ServiceHandle< InDet::IInDetEtaDependentCutsSvcm_etaDependentCutsSvc {this, "InDetEtaDependentCutsSvc", ""}
 service to get cut values depending on different variable
BooleanProperty m_useITkMaterialRejection
const BeamPipeDetectorManagerm_beamPipeMgr = nullptr
const InDetDD::PixelDetectorManagerm_pixelManager = nullptr
std::unique_ptr< TH2D > m_ITkPixMaterialMap
const double m_massPi = ParticleConstants::chargedPionMassInMeV
const double m_massP = ParticleConstants::protonMassInMeV
const double m_massE = ParticleConstants::electronMassInMeV
const double m_massK0 = ParticleConstants::KZeroMassInMeV
const double m_massLam = ParticleConstants::lambdaMassInMeV
const double m_massB =5279.400
float m_chiScale [11] {}
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 100 of file InDetVKalVxInJetTool.h.

Member Typedef Documentation

◆ compatibilityGraph_t

using InDet::InDetVKalVxInJetTool::compatibilityGraph_t = boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS>
private

Definition at line 363 of file InDetVKalVxInJetTool.h.

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ InDetVKalVxInJetTool()

InDet::InDetVKalVxInJetTool::InDetVKalVxInJetTool ( const std::string & type,
const std::string & name,
const IInterface * parent )

Definition at line 29 of file InDetVKalVxInJetTool.cxx.

31 :
32 AthAlgTool(type,name,parent)
33 {
34 declareInterface< ISecVertexInJetFinder >(this);
35 }
AthAlgTool()
Default constructor:

◆ ~InDetVKalVxInJetTool()

InDet::InDetVKalVxInJetTool::~InDetVKalVxInJetTool ( )
virtual

Definition at line 38 of file InDetVKalVxInJetTool.cxx.

38 {
39 ATH_MSG_DEBUG("InDetVKalVxInJetTool destructor called");
40 }
#define ATH_MSG_DEBUG(x)

Member Function Documentation

◆ check1TrVertexInPixel()

template<class Track>
bool InDet::InDetVKalVxInJetTool::check1TrVertexInPixel ( const Track * p1,
Amg::Vector3D & FitVertex,
std::vector< double > & VrtCov ) const
private

Definition at line 609 of file InDetVKalVxInJetTool.h.

611 {
612 int blTrk=0, blP=0, l1Trk=0, l1P=0, l2Trk=0, nLays=0;
613 getPixelLayers( p1, blTrk , l1Trk, l2Trk, nLays );
614 getPixelProblems(p1, blP, l1P );
615 double radiusError=vrtRadiusError(FitVertex, VrtCov);
616 double xvt=FitVertex.x();
617 double yvt=FitVertex.y();
618 double R=std::hypot(xvt, yvt);
619 if(R < m_rLayerB-radiusError){ // Inside B-layer
620 if( blTrk<1 && l1Trk<1 ) return false;
621 if( nLays <2 ) return false; // Less than 2 layers on track 0
622 return true;
623 }else if(R > m_rLayerB+radiusError){ // Outside b-layer
624 if( blTrk>0 && blP==0 ) return false; // Good hit in b-layer is present
625 }
626//
627// L1 and L2 are considered only if vertex is in acceptance
628//
629 if(std::abs(FitVertex.z())<400.){
630 if(R < m_rLayer1-radiusError) { // Inside 1st-layer
631 if( l1Trk<1 && l2Trk<1 ) return false; // Less than 1 hits on track 0
632 return true;
633 }else if(R > m_rLayer1+radiusError) { // Outside 1st-layer
634 if( l1Trk>0 && l1P==0 ) return false; // Good L1 hit is present
635 }
636
637 if(R < m_rLayer2-radiusError) { // Inside 2nd-layer
638 if( l2Trk==0 ) return false; // At least one L2 hit must be present
639 }
640 } else {
641 int d0Trk=0, d1Trk=0, d2Trk=0;
642 getPixelDiscs( p1, d0Trk , d1Trk, d2Trk );
643 if( d0Trk+d1Trk+d2Trk ==0 )return false;
644 }
645 return true;
646 }
static void getPixelDiscs(const xAOD::TrackParticle *Part, int &d0Hit, int &d1Hit, int &d2Hit)
void getPixelLayers(const xAOD::TrackParticle *Part, int &blHit, int &l1Hit, int &l2Hit, int &nLay) const
static double vrtRadiusError(const Amg::Vector3D &secVrt, const std::vector< double > &vrtErr)
void getPixelProblems(const xAOD::TrackParticle *Part, int &splshIBL, int &splshBL) const
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)

◆ check2TrVertexInPixel()

template<class Track>
bool InDet::InDetVKalVxInJetTool::check2TrVertexInPixel ( const Track * p1,
const Track * p2,
Amg::Vector3D & fitVertex,
std::vector< double > & vrtErr ) const
private

Definition at line 924 of file BTagVrtSec.cxx.

927 {
928 int blTrk[2] = {0,0};
929 int l1Trk[2] = {0,0};
930 int l2Trk[2] = {0,0};
931 int nLays[2] = {0,0};
932 getPixelLayers( p1, blTrk[0] , l1Trk[0], l2Trk[0], nLays[0] );
933 getPixelLayers( p2, blTrk[1] , l1Trk[1], l2Trk[1], nLays[1] ); // Very close to PV. Both b-layer hits are mandatory.
934
935 int blP[2] = {0,0};
936 int l1P[2] = {0,0};
937 getPixelProblems(p1, blP[0], l1P[0] );
938 getPixelProblems(p2, blP[1], l1P[1] );
939
940 double xvt = fitVertex.x();
941 double yvt = fitVertex.y();
942 double radiusError = vrtRadiusError(fitVertex, vrtErr);
943 double R = std::hypot(xvt, yvt);
944
945 if(R < m_rLayerB-radiusError) {
946 //----------------------------------------- Inside B-layer
947 if(blTrk[0]==0 && blTrk[1]==0) return false; // No b-layer hits at all, but all expected
948 if(blTrk[0]<1 && l1Trk[0]<1 ) return false;
949 if(blTrk[1]<1 && l1Trk[1]<1) return false;
950 if(nLays[0]<2) return false; // Less than 2 layers on track 0
951 if(nLays[1]<2) return false; // Less than 2 layers on track 1
952 return true;
953 } else if(R > m_rLayerB+radiusError){
954 //----------------------------------------- Outside b-layer
955 if(blTrk[0]>0 && blP[0]==0 && blTrk[1]>0 && blP[1]==0) return false; // Good hit in b-layer is present
956 }
957
958 //
959 // L1 and L2 are considered only if vertex is in acceptance
960 //
961 if(std::abs(fitVertex.z())<400.){
962
963 if(R < m_rLayer1-radiusError) {
964 //------------------------------------------ Inside 1st-layer
965 if( l1Trk[0]==0 && l1Trk[1]==0 ) return false; // No L1 hits at all
966 if( l1Trk[0]<1 && l2Trk[0]<1 ) return false; // Less than 1 hits on track 0
967 if( l1Trk[1]<1 && l2Trk[1]<1 ) return false; // Less than 1 hits on track 1
968 return true;
969 } else if(R > m_rLayer1+radiusError) {
970 //------------------------------------------- Outside 1st-layer
971 if( l1Trk[0]>0 && l1P[0]==0 && l1Trk[1]>0 && l1P[1]==0 ) return false; // Good L1 hit is present
972 }
973
974 if(R < m_rLayer2-radiusError) {
975 //------------------------------------------- Inside 2nd-layer
976 if( (l2Trk[0]+l2Trk[1])==0 ) return false; // At least one L2 hit must be present
977 }
978
979 } else {
980 int d0Trk[2] = {0,0};
981 int d1Trk[2] = {0,0};
982 int d2Trk[2] = {0,0};
983 getPixelDiscs( p1, d0Trk[0] , d1Trk[0], d2Trk[0] );
984 getPixelDiscs( p2, d0Trk[1] , d1Trk[1], d2Trk[1] );
985 if( d0Trk[0]+d1Trk[0]+d2Trk[0] ==0 ) return false;
986 if( d0Trk[1]+d1Trk[1]+d2Trk[1] ==0 ) return false;
987 }
988
989 return true;
990 }

◆ clean1TrVertexSet()

void InDet::InDetVKalVxInJetTool::clean1TrVertexSet ( std::vector< WrkVrt > * WrkVrtSet)
staticprivate

Definition at line 1027 of file BTagVrtSecMulti.cxx.

1028 {
1029 std::vector<int> countVT(wrkVrtSet->size(),0);
1030 std::vector<int> linkedVrt(wrkVrtSet->size(),0);
1031 //--- Mark as bad the 1track vertex if the detached track is NOT present in any remaining good vertex (>=2tr)
1032
1033 for(unsigned int i1tv = 0; i1tv<wrkVrtSet->size(); i1tv++) {
1034 WrkVrt vrt1 = (*wrkVrtSet)[i1tv];
1035 if( vrt1.selTrk.size()!=1) continue;
1036 if(!vrt1.Good) continue;
1037 int Trk1 = vrt1.detachedTrack;
1038
1039 int foundInGoodVrt = 0;
1040 for(unsigned int mtv=0; mtv<wrkVrtSet->size(); mtv++) { //cycle over good vertices with many tracks
1041 WrkVrt vrtm = (*wrkVrtSet)[mtv];
1042 if( vrtm.selTrk.size()<2) continue;
1043 if(!vrtm.Good) continue;
1044
1045 if( std::find(vrtm.selTrk.begin(), vrtm.selTrk.end(), Trk1) != vrtm.selTrk.end()){
1046 foundInGoodVrt++;
1047 countVT[mtv]++;
1048 linkedVrt[i1tv] = mtv; //Linked vertex found
1049 }
1050 }
1051
1052 if(!foundInGoodVrt) vrt1.Good=false; // Make the vertex bad
1053 }
1054
1055 //---Select SINGLE 1tr-vertex from many pointing to one multi-track vertex
1056 for(int mtv = 0; mtv<static_cast<int>(wrkVrtSet->size()); mtv++) {
1057 WrkVrt vrtm = (*wrkVrtSet)[mtv];
1058 if(vrtm.selTrk.size()<2) continue;
1059 if(!vrtm.Good) continue;
1060 if(countVT[mtv] < 1) continue;
1061
1062 double distM = 1.e9;
1063 int best1TVrt = -1;
1064 for(unsigned int i1tv = 0; i1tv<wrkVrtSet->size(); i1tv++) {
1065 WrkVrt vrt1 = (*wrkVrtSet)[i1tv];
1066 if(vrt1.selTrk.size()!=1) continue;
1067 if(!vrt1.Good) continue;
1068 if(linkedVrt[i1tv]!=mtv) continue;
1069
1070 double dist = (vrtm.vertexMom+vrt1.vertexMom).M();
1071 if(dist < distM){
1072 distM = dist;
1073 best1TVrt = i1tv;
1074 }
1075 vrt1.Good=false;
1076 }
1077
1078 if(best1TVrt>-1 && distM<c_vrtBCMassLimit) (*wrkVrtSet)[best1TVrt].Good=true;
1079 }
1080 }

◆ coneDist()

double InDet::InDetVKalVxInJetTool::coneDist ( const AmgVector(5) & vectPerig,
const TLorentzVector & jetDir )
staticprivate

Definition at line 276 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

278 {
279
280 double etaTr = -std::log(std::tan(vectPerig[3]/2.));
281 double etaJet = jetDir.PseudoRapidity();
282 double adphi = std::abs(jetDir.Phi()-vectPerig[2]);
283 while(adphi> M_PI)adphi-=2.*M_PI;
284 return std::sqrt(adphi*adphi + (etaJet-etaTr)*(etaJet-etaTr));
285 }
#define M_PI

◆ cutTrk()

StatusCode InDet::InDetVKalVxInJetTool::cutTrk ( const std::unordered_map< std::string, double > & TrkVarDouble,
const std::unordered_map< std::string, int > & TrkVarInt,
float evtWgt = 1. ) const
private

Definition at line 17 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/CutTrk.cxx.

21 {
22
23 double eta = TrkVarDouble.at("eta");
24 double PInvVert = TrkVarDouble.at("PInvVert");
25 double ThetaVert = TrkVarDouble.at("ThetaVert");
26 double A0Vert = TrkVarDouble.at("A0Vert");
27 double ZVert = TrkVarDouble.at("ZVert");
28 double Chi2 = TrkVarDouble.at("Chi2");
29 double ConeDist = TrkVarDouble.at("ConeDist");
30 double CovTrkMtx11 = TrkVarDouble.at("CovTrkMtx11");
31 double CovTrkMtx22 = TrkVarDouble.at("CovTrkMtx22");
32 double trkP = TrkVarDouble.at("trkP");
33 double trkPErr = TrkVarDouble.at("trkPErr");
34
35 int PixelHits = TrkVarInt.at("PixelHits");
36 int SctHits = TrkVarInt.at("SctHits");
37 int BLayHits = TrkVarInt.at("BLayHits");
38 int SharedHits = TrkVarInt.at("SharedHits");
39 int badHits = TrkVarInt.at("badHits");
40
41 if ( CovTrkMtx11 > m_a0TrkErrorCut*m_a0TrkErrorCut ) return StatusCode::FAILURE;
42 if ( CovTrkMtx22 > m_zTrkErrorCut*m_zTrkErrorCut ) return StatusCode::FAILURE;
43 if ( ConeDist > m_coneForTag ) return StatusCode::FAILURE;
44 if(trkP>10000.){
45 if(m_fillHist){
46 Hists& h = getHists();
47 h.m_hb_trkPErr->Fill( trkPErr , evtWgt);
48 }
49 if(trkPErr>0.5) return StatusCode::FAILURE;
50 }
51
52 double Pt = sin(ThetaVert)/std::abs(PInvVert);
53 //- Track quality
54
55 double pT_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinPtAtEta(eta) : m_cutPt.value();
56 if(Pt < pT_cut) return StatusCode::FAILURE;
57
58 if(!m_multiWithPrimary){ //Must not be used for primary vertex search
59 double z0_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMaxZImpactAtEta(eta) : m_cutZVrt.value();
60 // Eta-dependent cuts with z0*sin(theta)
61 if(m_useEtaDependentCuts && std::abs(ZVert*sin(ThetaVert)) > z0_cut) return StatusCode::FAILURE;
62 //Otherwise cuts with z0
63 else if(!m_useEtaDependentCuts && std::abs(ZVert) > z0_cut) return StatusCode::FAILURE;
64 }
65
66 double chi2_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMaxChi2AtEta(eta) : m_cutChi2.value();
67 if(Chi2 > chi2_cut) return StatusCode::FAILURE;
68
69 double d0_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMaxPrimaryImpactAtEta(eta) : m_cutA0.value();
70 if(std::abs(A0Vert) > d0_cut) return StatusCode::FAILURE;
71
72 int pix_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinPixelHitsAtEta(eta) : m_cutPixelHits.value();
73 if(!m_useEtaDependentCuts && std::abs(eta)>2.){
74 if(badHits && PixelHits<=3) return StatusCode::FAILURE;
75 PixelHits--;
76 }
77 if(PixelHits < pix_cut) return StatusCode::FAILURE;
78
79 int strip_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinStripHitsAtEta(eta) : m_cutSctHits.value();
81 if(SctHits<3) return StatusCode::FAILURE;
82 if(std::abs(eta)>2. && m_existIBL) SctHits--;
83 if(std::abs(eta)>1.65) SctHits--;
84 }
85 if(SctHits < strip_cut) return StatusCode::FAILURE;
86
87 int si_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinSiHitsAtEta(eta) : m_cutSiHits.value();
88 if((PixelHits+SctHits) < si_cut) return StatusCode::FAILURE;
89
90 int inpix_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinInnermostPixelHitsAtEta(eta) : m_cutBLayHits.value();
91 if(BLayHits < inpix_cut) return StatusCode::FAILURE;
92
93 int shared_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMaxSharedAtEta(eta) : m_cutSharedHits.value();
94 if(SharedHits > shared_cut) return StatusCode::FAILURE;
95
96 return StatusCode::SUCCESS;
97
98 }
Scalar eta() const
pseudorapidity method
ServiceHandle< InDet::IInDetEtaDependentCutsSvc > m_etaDependentCutsSvc
service to get cut values depending on different variable

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ DeclareInterfaceID()

InDet::ISecVertexInJetFinder::DeclareInterfaceID ( ISecVertexInJetFinder ,
1 ,
0  )
inherited

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ disassembleVertex()

template<class Particle>
void InDet::InDetVKalVxInJetTool::disassembleVertex ( std::vector< WrkVrt > * WrkVrtSet,
int iv,
std::vector< const Particle * > AllTracks,
Trk::IVKalState & istate ) const
private

Definition at line 948 of file BTagVrtSecMulti.cxx.

952 {
953 WrkVrt newvrt;
954 newvrt.Good = true;
955 std::vector<const Particle*> ListBaseTracks;
956 int NTrk = (*wrkVrtSet)[iv].selTrk.size();
957 int SelT = -1;
958 if(NTrk<3) return;
959
961 //=== To get robust definition of most bad outlier
962 m_fitSvc->setRobustness(5, istate);
963 sc = refitVertex(wrkVrtSet, iv, AllTracks, istate, false);
964 if(sc.isFailure()){
965 (*wrkVrtSet)[iv].Good = false;
966 return;
967 }
968
969 m_fitSvc->setRobustness(0, istate);
970 double Chi2Max=0.;
971 for(int i = 0; i<NTrk; i++){
972 if((*wrkVrtSet)[iv].chi2PerTrk[i]>Chi2Max) {
973 Chi2Max = (*wrkVrtSet)[iv].chi2PerTrk[i];
974 SelT = i;
975 }
976 }
977
978 unsigned int NVrtCur = wrkVrtSet->size();
979 for(int i = 0; i<NTrk; i++){
980 if(i==SelT) continue;
981 ListBaseTracks.clear();
982 ListBaseTracks.push_back( AllTracks[(*wrkVrtSet)[iv].selTrk[i]] );
983 ListBaseTracks.push_back( AllTracks[(*wrkVrtSet)[iv].selTrk[SelT]] );
984 newvrt.selTrk.resize(2);
985 newvrt.selTrk[0] = (*wrkVrtSet)[iv].selTrk[i];
986 newvrt.selTrk[1] = (*wrkVrtSet)[iv].selTrk[SelT];
987
988 sc = VKalVrtFitFastBase(ListBaseTracks,newvrt.vertex,istate);
989 if( sc.isFailure() ) continue;
990 if( newvrt.vertex.perp() > m_rLayer2*2. ) newvrt.vertex = Amg::Vector3D(0.,0.,0.);
991 m_fitSvc->setApproximateVertex(newvrt.vertex[0], newvrt.vertex[1], newvrt.vertex[2], istate);
992
993 sc=VKalVrtFitBase(ListBaseTracks,
994 newvrt.vertex,
995 newvrt.vertexMom,
996 newvrt.vertexCharge,
997 newvrt.vertexCov,
998 newvrt.chi2PerTrk,
999 newvrt.trkAtVrt,
1000 newvrt.chi2,
1001 istate, false);
1002 if(sc.isFailure() ) continue;
1003 if(newvrt.chi2>10.) continue; // Too bad 2-track vertex fit
1004
1005 newvrt.chi2PerTrk[0] = newvrt.chi2PerTrk[1] = newvrt.chi2/2.;
1006 newvrt.nCloseVrt = 0;
1007 newvrt.dCloseVrt = 1000000.;
1008 newvrt.projectedVrt = 0.9999;
1009
1010 if(wrkVrtSet->size()==NVrtCur){
1011 wrkVrtSet->push_back(newvrt);
1012 continue;
1013 } // just the first added vertex
1014
1015 if( (*wrkVrtSet).at(NVrtCur).chi2<newvrt.chi2 ) continue; // previously added 2tr vertex was better
1016
1017 wrkVrtSet->pop_back();
1018 wrkVrtSet->push_back(newvrt);
1019 } // end for(int i = 0; i<NTrk; i++)
1020
1021 (*wrkVrtSet)[iv].selTrk.erase( (*wrkVrtSet)[iv].selTrk.begin() + SelT ); //remove track
1022 sc = refitVertex(wrkVrtSet, iv, AllTracks, istate, false);
1023 if( sc.isFailure() ) (*wrkVrtSet)[iv].Good = false;
1024 }
static Double_t sc
StatusCode refitVertex(std::vector< WrkVrt > *WrkVrtSet, int selectedVertex, std::vector< const Particle * > &selectedTracks, Trk::IVKalState &istate, bool ifCovV0) const
Trk::TrkVKalVrtFitter * m_fitSvc
StatusCode VKalVrtFitFastBase(const std::vector< const xAOD::TrackParticle * > &listPart, Amg::Vector3D &Vertex, Trk::IVKalState &istate) const
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
Eigen::Matrix< double, 3, 1 > Vector3D
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ fillNVrtNTup()

void InDet::InDetVKalVxInJetTool::fillNVrtNTup ( std::vector< WrkVrt > & vrtSet,
std::vector< std::vector< float > > & trkScore,
const xAOD::Vertex & primVrt,
const TLorentzVector & jetDir ) const
private

Definition at line 550 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

553 {
554 if (!m_h) return;
555 Hists& h = getHists();
556 int ipnt=0;
557 TLorentzVector VertexMom;
558 for(auto & vrt : VrtSet) {
559 if(ipnt==DevTuple::maxNVrt)break;
560 h.m_curTup->NVrtDist2D[ipnt]=vrt.vertex.perp();
561 h.m_curTup->NVrtNT[ipnt]=vrt.selTrk.size();
562 h.m_curTup->NVrtTrkI[ipnt]=vrt.selTrk[0];
563 h.m_curTup->NVrtM[ipnt]=vrt.vertexMom.M();
564 h.m_curTup->NVrtChi2[ipnt]=vrt.chi2;
565 float maxW=0., sumW=0.;
566 for(auto trk : vrt.selTrk){ sumW+=trkScore[trk][0]; maxW=std::max(trkScore[trk][0], maxW);}
567 h.m_curTup->NVrtMaxW[ipnt]=maxW;
568 h.m_curTup->NVrtAveW[ipnt]=sumW/vrt.selTrk.size();
569 TLorentzVector SVPV(vrt.vertex.x()-PV.x(),vrt.vertex.y()-PV.y(),vrt.vertex.z()-PV.z(),1.);
570 h.m_curTup->NVrtDR[ipnt]=JetDir.DeltaR(SVPV);
571 VertexMom += vrt.vertexMom;
572 ipnt++; h.m_curTup->nNVrt=ipnt;
573 }
574 h.m_curTup->TotM=VertexMom.M();
575 }
std::unique_ptr< Hists > m_h

◆ fillVrtNTup()

void InDet::InDetVKalVxInJetTool::fillVrtNTup ( std::vector< Vrt2Tr > & all2TrVrt) const
private

Definition at line 524 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

526 {
527 if (!m_h) return;
528 Hists& h = getHists();
529 int ipnt=0;
530 Amg::Vector3D pf1,pf2;
531 for(auto & vrt : all2TrVrt) {
532 if(ipnt==DevTuple::maxNTrk)break;
533 h.m_curTup->VrtDist2D[ipnt]=vrt.fitVertex.perp();
534 h.m_curTup->VrtSig3D[ipnt]=vrt.signif3D;
535 h.m_curTup->VrtSig2D[ipnt]=vrt.signif2D;
536 h.m_curTup->itrk[ipnt]=vrt.i;
537 h.m_curTup->jtrk[ipnt]=vrt.j;
538 h.m_curTup->mass[ipnt]=vrt.momentum.M();
539 h.m_curTup->Chi2[ipnt]=vrt.chi2;
540 h.m_curTup->badVrt[ipnt]=vrt.badVrt;
541 h.m_curTup->VrtDR[ipnt]=vrt.dRSVPV;
542 h.m_curTup->VrtErrR[ipnt]= vrtRadiusError(vrt.fitVertex, vrt.errorMatrix);
543 Amg::setRThetaPhi(pf1, 1., vrt.trkAtVrt[0][1], vrt.trkAtVrt[0][0]);
544 Amg::setRThetaPhi(pf2, 1., vrt.trkAtVrt[1][1], vrt.trkAtVrt[1][0]);
545 h.m_curTup->VrtdRtt[ipnt]=Amg::deltaR(pf1,pf2);
546 ipnt++; h.m_curTup->nVrt=ipnt;
547 }
548 }
void setRThetaPhi(Amg::Vector3D &v, double r, double theta, double phi)
sets radius, the theta and phi angle of a vector.
double deltaR(const Amg::Vector3D &v1, const Amg::Vector3D &v2)

◆ finalize()

StatusCode InDet::InDetVKalVxInJetTool::finalize ( )
overridevirtual

Definition at line 293 of file InDetVKalVxInJetTool.cxx.

294 {
295 if(m_timingProfile)m_timingProfile->chronoPrint("InDetVKalVxInJetTool");
296 ATH_MSG_DEBUG("InDetVKalVxInJetTool finalize()");
297 return StatusCode::SUCCESS;
298 }
ServiceHandle< IChronoStatSvc > m_timingProfile

◆ findMax()

int InDet::InDetVKalVxInJetTool::findMax ( std::vector< double > & chi2PerTrk,
std::vector< float > & rank )
staticprivate

Definition at line 318 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

320 {
321 double chi2Ref=0.;
322 int position=-1;
323 if( chi2PerTrk.empty() ) return position ;
324 for (int i=0; i< (int)chi2PerTrk.size(); i++){
325 if(chi2PerTrk[i]/std::max(rank[i],(float)0.1) > chi2Ref) { chi2Ref=chi2PerTrk[i]/std::max(rank[i],(float)0.1); position=i;}
326 }
327 return position;
328 }
const Amg::Vector3D & position() const
Method to retrieve the position of the Intersection.

◆ findSecVertex()

Trk::VxSecVertexInfo * InDet::InDetVKalVxInJetTool::findSecVertex ( const EventContext & ctx,
const xAOD::Vertex & primaryVertex,
const TLorentzVector & jetMomentum,
const std::vector< const xAOD::IParticle * > & inputTracks ) const
overridevirtual

Implements InDet::ISecVertexInJetFinder.

Definition at line 303 of file InDetVKalVxInJetTool.cxx.

307 {
308 if(m_timingProfile)m_timingProfile->chronoStart("InDetVKalVxInJetTool");
309 std::vector<double> Results;
310 std::vector<const xAOD::TrackParticle*> InpTrk;
311 std::vector<const xAOD::TrackParticle*> SelSecTrk;
312 std::vector< std::vector<const xAOD::TrackParticle*> > SelSecTrkPerVrt;
313 std::vector<const xAOD::TrackParticle*> xaodTrkFromV0;
314 std::vector<xAOD::Vertex*> listVrtSec(0);
315 double SecVtxMass = 0.;
316 double RatioE = 0.;
317 double EnergyJet = 0.;
318 int N2trVertices = 0 ;
319 int NBigImpTrk = 0 ;
320
321 if(m_fillHist){
322 Hists& h = getHists();
323 if (h.m_curTup) {
324 h.m_curTup->nVrt=0;
325 h.m_curTup->nTrkInJet=0;
326 h.m_curTup->NTHF=0;
327 h.m_curTup->nNVrt=0;
328 h.m_curTup->TotM=0.; h.m_curTup->ewgt=1.;
329 }
330 }
331
332 int pseudoVrt = 0;
333
334 compatibilityGraph_t compatibilityGraph;
335
336 InpTrk.clear(); InpTrk.reserve(IInpTrk.size());
337 std::vector<const xAOD::IParticle*>::const_iterator i_itrk;
338 for (i_itrk = IInpTrk.begin(); i_itrk < IInpTrk.end(); ++i_itrk) {
339 const xAOD::TrackParticle * tmp=dynamic_cast<const xAOD::TrackParticle *> ((*i_itrk));
340 if(tmp)InpTrk.push_back(tmp);
341 }
342
343 if(m_multiVertex){
344 std::unique_ptr<workVectorArrxAOD> tmpVectxAOD= std::make_unique<workVectorArrxAOD>();
345 tmpVectxAOD->InpTrk.resize(InpTrk.size());
346 std::copy(InpTrk.begin(),InpTrk.end(), tmpVectxAOD->InpTrk.begin());
347 listVrtSec = getVrtSecMulti(tmpVectxAOD.get(),primVrt,jetDir,Results,compatibilityGraph);
348 SelSecTrkPerVrt.swap(tmpVectxAOD->FoundSecondTracks);
349 xaodTrkFromV0.swap(tmpVectxAOD->TrkFromV0);
350 }else{
351 int nRefPVTrk=0;
352 xAOD::Vertex* secVrt = getVrtSec( InpTrk,primVrt,jetDir,Results,SelSecTrk,xaodTrkFromV0, nRefPVTrk, compatibilityGraph);
353 if(secVrt != nullptr) listVrtSec.push_back(secVrt);
354 else if(m_fillHist) {
355 Hists& h = getHists();
356 h.m_pr_effVrt->Fill((float)nRefPVTrk,0.);
357 h.m_pr_effVrtEta->Fill( jetDir.Eta(),0.);
358 }
359 }
360 if(Results.size()<7) {
361 listVrtSec.clear();
362 }else{
363 SecVtxMass = Results[0];
364 RatioE = Results[1];
365 N2trVertices = (int)Results[2];
366 NBigImpTrk = (int)Results[3];
367 EnergyJet = Results[6];
368 if( Results[2]==0 && Results[4]==0 ) pseudoVrt=1;
369 }
370
371 std::vector<const xAOD::IParticle*> iparTrkFromV0(0);
372 for(auto & i : xaodTrkFromV0)iparTrkFromV0.push_back(i);
373
374 Trk::VxSecVKalVertexInfo* res=nullptr;
375 try{
376 if(pseudoVrt){
377 res = new Trk::VxSecVKalVertexInfo(listVrtSec[0], SecVtxMass, RatioE, NBigImpTrk, iparTrkFromV0 );
378 }else{
379 res = new Trk::VxSecVKalVertexInfo(listVrtSec, SecVtxMass, RatioE, N2trVertices, EnergyJet, iparTrkFromV0 );
380 if(Results.size()>8)res->setDstToMatLay(Results[7]);
381 } }
382 catch (std::bad_alloc& ba){
383 ATH_MSG_DEBUG("Trk::VxSecVKalVertexInfo allocation failure! "<< ba.what());
384 }
385
386 if(m_fillHist){
387 Hists& h = getHists();
388 h.m_tuple->Fill();
389 };
390 if(m_timingProfile)m_timingProfile->chronoStop("InDetVKalVxInJetTool");
391 return res;
392 }
std::vector< Result > Results
std::pair< std::vector< unsigned int >, bool > res
std::vector< xAOD::Vertex * > getVrtSecMulti(workVectorArrxAOD *, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir, std::vector< double > &results, compatibilityGraph_t &compatibilityGraph) const
boost::adjacency_list< boost::listS, boost::vecS, boost::undirectedS > compatibilityGraph_t
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
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.

◆ fitCommonVrt() [1/2]

template<class Track>
double InDet::InDetVKalVxInJetTool::fitCommonVrt ( const EventContext & ctx,
std::vector< const Track * > & 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

Definition at line 399 of file BTagVrtSec.cxx.

410 {
411 ATH_MSG_DEBUG("fitCommonVrt() called " <<listSecondTracks.size());
412 //preparation
414
415 //
416 // Start of fit
417 //
418 std::unique_ptr<Trk::IVKalState> state = m_fitSvc->makeState(ctx);
419 m_fitSvc->setMassInputParticles( inpMass, *state ); // Use pions masses
420 sc = VKalVrtFitFastBase(listSecondTracks, fitVertex, *state); // Fast crude estimation
421 if(sc.isFailure() || fitVertex.perp() > m_rLayer2*2. ) { // No initial estimation
422 m_fitSvc->setApproximateVertex(primVrt.x(), primVrt.y(), primVrt.z(), *state); // Use primary vertex as starting point
423 } else {
424 m_fitSvc->setApproximateVertex(fitVertex.x(), fitVertex.y(), fitVertex.z(), *state); // Use fitted vertex as starting point
425 }
426
427 //fit itself
428 int NTracksVrt = listSecondTracks.size();
429 double FitProb = 0.;
430 std::vector<double> trkFitWgt(0);
431 std::vector<double> Chi2PerTrk;
432 long int Charge;
433 double Chi2 = 0.;
434 int Outlier = 1;
435 Amg::Vector3D tmpVertex;
436
437 for (int i = 0; i < NTracksVrt-1; i++) {
438
439 if(m_RobustFit)m_fitSvc->setRobustness(m_RobustFit, *state);
440 else m_fitSvc->setRobustness(0, *state);
441 sc = VKalVrtFitBase(listSecondTracks, fitVertex, Momentum, Charge,
442 errorMatrix, Chi2PerTrk, TrkAtVrt, Chi2,
443 *state, true);
444 if(sc.isFailure() || Chi2 > 1000000.) return -10000.; // No fit
445 if (Chi2PerTrk.empty()) return -10000.; // No fit
446 if(m_RobustFit){
447 sc = GetTrkFitWeights(trkFitWgt, *state);
448 if(sc.isFailure()) return -10000.; // No weights
449 Outlier = std::min_element(trkFitWgt.begin(), trkFitWgt.end()) - trkFitWgt.begin();
450 } else {
451 Outlier = findMax(Chi2PerTrk, trkRank);
452 }
453
454 FitProb = TMath::Prob(Chi2, 2*listSecondTracks.size()-3);
455 if(listSecondTracks.size()==2) break; // Only 2 tracks left
456
457 double signif3Dproj = vrtVrtDist(primVrt, fitVertex, errorMatrix, jetDir);
458 if(signif3Dproj<0 && (!m_getNegativeTail) && (!m_getNegativeTag)){
459 double maxDst = -1.e12;
460 int maxT = -1;
461 double minChi2 = 1.e12;
462
463 for(unsigned int it=0; it<listSecondTracks.size(); it++){
464 std::vector<const Track*> tmpList(listSecondTracks);
465 tmpList.erase(tmpList.begin()+it);
466 sc = VKalVrtFitBase(tmpList, tmpVertex, Momentum, Charge,
467 errorMatrix, Chi2PerTrk, TrkAtVrt, Chi2,
468 *state,true);
469 if(sc.isFailure()) continue;
470
471 signif3Dproj=vrtVrtDist(primVrt, tmpVertex, errorMatrix, jetDir);
472 if(signif3Dproj>maxDst && maxDst<10.){
473 maxDst = signif3Dproj;
474 maxT = it;
475 minChi2 = Chi2;
476 }
477 else if(signif3Dproj>0. && maxDst>10. && Chi2<minChi2){
478 minChi2 = Chi2;
479 maxT = it;
480 }
481 }
482
483 if(maxT>=0){
484 Outlier = maxT;
485 removeEntryInList(listSecondTracks,trkRank,Outlier);
486 m_fitSvc->setApproximateVertex(fitVertex.x(),fitVertex.y(),fitVertex.z(),*state);
487 ATH_MSG_DEBUG("Remove negative outlier="<< maxT<<" from "<<listSecondTracks.size()+1<<" tracks");
488 continue;
489 }
490 }
491
492 if(FitProb > 0.001) {
493 if(Momentum.M() <c_vrtBCMassLimit) {
494 if( Chi2PerTrk[Outlier] < m_secTrkChi2Cut*m_chiScale[std::min(int(listSecondTracks.size()),10)] ) break; // Solution found
495 } else {
496 double minM = 1.e12;
497 int minT = -1;
498 double minChi2 = 1.e12;
499
500 for(unsigned int it=0; it<listSecondTracks.size(); it++){
501 std::vector<const Track*> tmpList(listSecondTracks);
502 tmpList.erase(tmpList.begin()+it);
503 sc = VKalVrtFitBase(tmpList, tmpVertex, Momentum, Charge,
504 errorMatrix, Chi2PerTrk, TrkAtVrt, Chi2,
505 *state, true);
506 if(sc.isFailure()) continue;
507 if((projSV_PV(tmpVertex,primVrt,jetDir)<0. &&(!m_getNegativeTag)) || (projSV_PV(tmpVertex,primVrt,jetDir)>0. &&(m_getNegativeTag))) continue; // Drop negative direction
508
509 if(m_useTrackClassificator) Chi2 += trkRank[it]; // Remove preferably non-HF-tracks
510
511 if(Momentum.M()<minM && minM>c_vrtBCMassLimit){
512 minM = Momentum.M();
513 minT = it;
514 minChi2 = Chi2;
515 }
516 else if(Momentum.M()<c_vrtBCMassLimit && minM<c_vrtBCMassLimit && Chi2<minChi2){
517 minChi2 = Chi2;
518 minT = it;
519 }
520 }
521
522 ATH_MSG_DEBUG("Big mass. Remove trk="<<minT<<" New mass="<<minM<<" New Chi2="<<minChi2);
523 if(minT>=0) Outlier = minT;
524 }
525 } // end if(FitProb > 0.001)
526
527 ATH_MSG_DEBUG("SecVrt remove trk="<<Outlier<<" from "<< listSecondTracks.size()<<" tracks");
528 removeEntryInList(listSecondTracks,trkRank,Outlier);
529 m_fitSvc->setApproximateVertex(fitVertex.x(), fitVertex.y(), fitVertex.z(), *state); // Use as starting point
530
531 } // end for (int i = 0; i < NTracksVrt-1; i++)
532
533 // cppcheck-suppress containerOutOfBounds; Chi2PerTrk is not empty if we get here
534 ATH_MSG_DEBUG("SecVrt fit converged. Ntr="<< listSecondTracks.size()<<" Chi2="<<Chi2
535 <<" Chi2_trk="<<Chi2PerTrk[Outlier]<<" Prob="<<FitProb<<" M="<<Momentum.M()<<" Dir="<<projSV_PV(fitVertex,primVrt,jetDir));
536
537 if( listSecondTracks.size()==2 ){
538 if( Momentum.M() > c_vrtBCMassLimit
539 || FitProb < 0.001
540 || Chi2PerTrk[Outlier] > m_secTrkChi2Cut) return -10000.;
541 }
542
543 //
544 //-- To kill remnants of conversion
545 double Dist2D = std::sqrt(fitVertex.x()*fitVertex.x()+fitVertex.y()*fitVertex.y());
546 if( listSecondTracks.size()==2 && Dist2D > 20. && Charge==0 ) {
547 double mass_EE = massV0( TrkAtVrt,m_massE,m_massE);
548 if(mass_EE < 40.) return -40.;
549 }
550
551 return Chi2;
552 }
double vrtVrtDist(const xAOD::Vertex &primVrt, const Amg::Vector3D &SecVrt, const std::vector< double > &VrtErr, double &Signif) const
StatusCode GetTrkFitWeights(std::vector< double > &wgt, const Trk::IVKalState &istate) const
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)
void removeEntryInList(std::vector< const Trk * > &, std::vector< float > &, int) const
static int findMax(std::vector< double > &chi2PerTrk, std::vector< float > &rank)
float z() const
Returns the z position.
float y() const
Returns the y position.
float x() const
Returns the x position.

◆ fitCommonVrt() [2/2]

template<class Trk>
double InDet::InDetVKalVxInJetTool::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
private

◆ getBDir()

TLorentzVector InDet::InDetVKalVxInJetTool::getBDir ( const xAOD::TrackParticle * trk1,
const xAOD::TrackParticle * trk2,
const xAOD::Vertex & primVrt,
Amg::Vector3D & V1,
Amg::Vector3D & V2 ) const
private

Definition at line 42 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

47 { // B hadron flight direction based on 2 separate tracks and PV. Calculated via plane-plane crossing
48 Amg::Vector3D PVRT(PrimVrt.x(),PrimVrt.y(),PrimVrt.z());
49//----------------------------------------------------------------------------
50 Amg::Vector3D pnt1=trk1->perigeeParameters().position()-PVRT;
51 Amg::Vector3D mom1((trk1->p4()).Px(),(trk1->p4()).Py(),(trk1->p4()).Pz());
52 Amg::Vector3D pnt2=trk2->perigeeParameters().position()-PVRT;
53 Amg::Vector3D mom2((trk2->p4()).Px(),(trk2->p4()).Py(),(trk2->p4()).Pz());
54 pnt1.normalize(); pnt2.normalize(); mom1.normalize(); mom2.normalize();
55//------------------------------------------------------------------------
56 const double dRLim=m_coneForTag;
57 Amg::Vector3D norm1=pnt1.cross(mom1);
58 Amg::Vector3D norm2=pnt2.cross(mom2);
59 Amg::Vector3D t=norm1.cross(norm2); t.normalize(); if(t.dot(mom1+mom2)<0.) t*=-1.;
60 double aveP=(trk1->p4()+trk2->p4()).P()/2.;
61 TLorentzVector tl; tl.SetXYZM(t.x()*aveP,t.y()*aveP,t.z()*aveP,ParticleConstants::chargedPionMassInMeV); //Crossing line of 2 planes
62 if( tl.DeltaR(trk1->p4()) >dRLim || tl.DeltaR(trk2->p4()) >dRLim ) {V1*=0.; V2*=0.; return tl;}//Too big dR between tracks and found "B line"
63//------------------------------------------------------------------------
64 double X;
65 pnt1=trk1->perigeeParameters().position()-PVRT;
66 pnt2=trk2->perigeeParameters().position()-PVRT;
67 std::abs(mom1[1]*t[2]-mom1[2]*t[1])>std::abs(mom1[0]*t[2]-mom1[2]*t[0]) ? X=(t[1]*pnt1[2]-t[2]*pnt1[1])/(mom1[1]*t[2]-mom1[2]*t[1])
68 : X=(t[0]*pnt1[2]-t[2]*pnt1[0])/(mom1[0]*t[2]-mom1[2]*t[0]);
69 V1=pnt1+mom1*X; // First particle vertex
70 std::abs(mom2[1]*t[2]-mom2[2]*t[1])>std::abs(mom2[0]*t[2]-mom2[2]*t[0]) ? X=(t[1]*pnt2[2]-t[2]*pnt2[1])/(mom2[1]*t[2]-mom2[2]*t[1])
71 : X=(t[0]*pnt2[2]-t[2]*pnt2[0])/(mom2[0]*t[2]-mom2[2]*t[0]);
72 V2=pnt2+mom2*X; // Second particle vertex
73//------------------------------------------------------------------------
74 if(V1.dot(t)<0. && V2.dot(t)<0.) {V1*=0.;V2*=0.;} // Check correctness of topology
75 else {V1+=PVRT; V2+=PVRT;} // Transform to detector frame
76//------------------------------------------------------------------------
77 return tl;
78 }
const Amg::Vector3D & position() const
Access method for the position.
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.
constexpr double chargedPionMassInMeV
the mass of the charged pion (in MeV)

◆ getG4Inter()

int InDet::InDetVKalVxInJetTool::getG4Inter ( const xAOD::TrackParticle * TP)
staticprivate

Definition at line 629 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

629 {
630 static const SG::ConstAccessor< ElementLink< xAOD::TruthParticleContainer> > truthParticleLinkAcc ("truthParticleLink");
631 if( truthParticleLinkAcc.isAvailable (*TP) ) {
632 const ElementLink<xAOD::TruthParticleContainer>& tplink =
633 truthParticleLinkAcc (*TP);
634 if( tplink.isValid() && HepMC::is_simulation_particle(*tplink)) return 1;
635 }
636 return 0;
637 }
bool is_simulation_particle(const T &p)
Method to establish if a particle (or barcode) was created during the simulation (TODO update to be s...
SG::ConstAccessor< T, ALLOC > ConstAccessor
Definition AuxElement.h:570

◆ getHists()

InDetVKalVxInJetTool::Hists & InDet::InDetVKalVxInJetTool::getHists ( ) const
private

Definition at line 396 of file InDetVKalVxInJetTool.cxx.

397 {
398 // We earlier checked that no more than one thread is being used.
399 Hists* h ATLAS_THREAD_SAFE = m_h.get();
400 return *h;
401 }
#define ATLAS_THREAD_SAFE

◆ getIdHF()

int InDet::InDetVKalVxInJetTool::getIdHF ( const xAOD::TrackParticle * TP)
staticprivate

Definition at line 578 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

578 {
579 static const SG::ConstAccessor< ElementLink< xAOD::TruthParticleContainer> > truthParticleLinkAcc ("truthParticleLink");
580 if( truthParticleLinkAcc.isAvailable (*TP) ) {
581 const ElementLink<xAOD::TruthParticleContainer>& tplink =
582 truthParticleLinkAcc (*TP);
583 if( !tplink.isValid() ) return 0;
584 static const SG::ConstAccessor<float> truthMatchProbabilityAcc ("truthMatchProbability");
585 if( truthMatchProbabilityAcc (*TP ) < 0.5 ) return 0;
586 if (HepMC::is_simulation_particle(*tplink)) return 0;
587 if( (*tplink)->hasProdVtx()){
588 if( (*tplink)->prodVtx()->nIncomingParticles()==1){
589 int PDGID1=0, PDGID2=0, PDGID3=0, PDGID4=0;
590 const xAOD::TruthParticle * parTP1=getPreviousParent(*tplink, PDGID1);
591 const xAOD::TruthParticle * parTP2=nullptr ;
592 const xAOD::TruthParticle * parTP3=nullptr ;
593 int noBC1=notFromBC(PDGID1);
594 if(noBC1) parTP2 = getPreviousParent(parTP1, PDGID2);
595 int noBC2=notFromBC(PDGID2);
596 if(noBC2 && parTP2) parTP3 = getPreviousParent(parTP2, PDGID3);
597 int noBC3=notFromBC(PDGID3);
598 if(noBC3 && parTP3) getPreviousParent(parTP3, PDGID4);
599 int noBC4=notFromBC(PDGID4);
600 if(noBC1 && noBC2 && noBC3 && noBC4)return 0;
601 return 1; //This is a reconstructed track from B/C decays
602 } } }
603 return 0;
604 }
static const xAOD::TruthParticle * getPreviousParent(const xAOD::TruthParticle *child, int &ParentPDG)
TruthParticle_v1 TruthParticle
Typedef to implementation.

◆ getMCPileup()

int InDet::InDetVKalVxInJetTool::getMCPileup ( const xAOD::TrackParticle * TP)
staticprivate

Definition at line 638 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

638 {
639 static const SG::ConstAccessor< ElementLink< xAOD::TruthParticleContainer> > truthParticleLinkAcc ("truthParticleLink");
640 if( truthParticleLinkAcc.isAvailable (*TP) ) {
641 const ElementLink<xAOD::TruthParticleContainer>& tplink =
642 truthParticleLinkAcc (*TP);
643 if( !tplink.isValid() ) return 1;
644 } else { return 1; }
645 return 0;
646 }

◆ getPerigee()

const Trk::Perigee * InDet::InDetVKalVxInJetTool::getPerigee ( const xAOD::TrackParticle * i_ntrk)
staticprivate

Definition at line 401 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

402 {
403 return &(i_ntrk->perigeeParameters());
404 }

◆ GetPerigeeVector()

std::vector< const Trk::Perigee * > InDet::InDetVKalVxInJetTool::GetPerigeeVector ( const std::vector< const Trk::TrackParticleBase * > & ) const
private

◆ getPixelDiscs()

void InDet::InDetVKalVxInJetTool::getPixelDiscs ( const xAOD::TrackParticle * Part,
int & d0Hit,
int & d1Hit,
int & d2Hit )
staticprivate

Definition at line 501 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

502 {
503 uint32_t HitPattern=Part->hitPattern();
504 d0Hit=0; if( HitPattern&((1<<Trk::pixelEndCap0)) ) d0Hit=1;
505 d1Hit=0; if( HitPattern&((1<<Trk::pixelEndCap1)) ) d1Hit=1;
506 d2Hit=0; if( HitPattern&((1<<Trk::pixelEndCap2)) ) d2Hit=1;
507 }
@ pixelEndCap0
three pixel discs (on each side)
setEventNumber uint32_t

◆ getPixelLayers()

void InDet::InDetVKalVxInJetTool::getPixelLayers ( const xAOD::TrackParticle * Part,
int & blHit,
int & l1Hit,
int & l2Hit,
int & nLay ) const
private

Definition at line 441 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

442 {
443 blHit=l1Hit=l2Hit=nLays=0;
444 if(m_existIBL){ // 4-layer pixel detector
445 uint8_t IBLhit,BLhit,NPlay,IBLexp,BLexp;
446 if(!Part->summaryValue( IBLhit, xAOD::numberOfInnermostPixelLayerHits) ) IBLhit = 0;
447 if(!Part->summaryValue( BLhit, xAOD::numberOfNextToInnermostPixelLayerHits) ) BLhit = 0;
448 if(!Part->summaryValue( NPlay, xAOD::numberOfContribPixelLayers) ) NPlay = 0;
449 if(!Part->summaryValue( IBLexp, xAOD::expectInnermostPixelLayerHit) ) IBLexp = 0;
450 if(!Part->summaryValue( BLexp, xAOD::expectNextToInnermostPixelLayerHit) ) BLexp = 0;
451 blHit=IBLhit; if( IBLexp==0 ) blHit=-1;
452 l1Hit= BLhit; if( BLexp==0 ) l1Hit=-1;
453 nLays=NPlay;
454 //if((IBLhit+BLhit) == 0){ //no hits in IBL and BL VK OLD VERSION WITHOUT PATTERN AVAILABLE
455 // if(NPlay>=1) { l2Hit=1; } // at least one of remaining layers is fired
456 // if(NPlay==0) { l2Hit=0; }
457 //}else if( IBLhit*BLhit == 0){ // one hit in IBL and BL. Others are presumably also fired
458 // if(NPlay>=2) { l2Hit=1; }
459 // if(NPlay<=1) { l2Hit=0; } // no fired layer except for IBL/BL
460 //}
461 uint32_t HitPattern=Part->hitPattern();
462 l2Hit=0; if( HitPattern&((1<<Trk::pixelBarrel2)) ) l2Hit=1;
463 // bitH=HitPattern&((int)std::pow(2,Trk::pixelBarrel1));
464 } else { // 3-layer pixel detector
465 uint8_t BLhit,NPlay,NHoles,IBLhit;
466 if(!Part->summaryValue( BLhit, xAOD::numberOfBLayerHits) ) BLhit = 0;
467 if(!Part->summaryValue(IBLhit, xAOD::numberOfInnermostPixelLayerHits) ) IBLhit = 0; // Some safety
468 BLhit=BLhit>IBLhit ? BLhit : IBLhit; // Some safety
469 if(!Part->summaryValue( NPlay, xAOD::numberOfContribPixelLayers) ) NPlay = 0;
470 if(!Part->summaryValue(NHoles, xAOD::numberOfPixelHoles) ) NHoles = 0;
471 blHit=BLhit; //B-layer hit is fired. Presumable all other layers are also fired.
472 nLays=NPlay;
473 //if (BLhit==0) { //B-layer hit is absent.
474 // if(NPlay>=2) { l1Hit=l2Hit=1;}
475 // if(NPlay==0) { l1Hit=l2Hit=0;}
476 // if(NPlay==1) {
477 // if( NHoles==0) {l1Hit=0; l2Hit=1;}
478 // if( NHoles>=1) {l1Hit=1; l2Hit=0;}
479 // }
480 //}
481 uint32_t HitPattern=Part->hitPattern();
482 l1Hit=0; if( HitPattern&((1<<Trk::pixelBarrel1)) ) l1Hit=1;
483 l2Hit=0; if( HitPattern&((1<<Trk::pixelBarrel2)) ) l2Hit=1;
484 }
485
486 }
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfContribPixelLayers
number of contributing layers of the pixel detector [unit8_t].
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
@ numberOfBLayerHits
these are the hits in the first pixel layer, i.e.
@ expectNextToInnermostPixelLayerHit
Do we expect a 1st-layer barrel hit for this track?
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer

◆ getPixelProblems()

void InDet::InDetVKalVxInJetTool::getPixelProblems ( const xAOD::TrackParticle * Part,
int & splshIBL,
int & splshBL ) const
private

Definition at line 487 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

488 {
489 splshIBL=splshBL=0;
490 if(m_existIBL){ // 4-layer pixel detector
491 uint8_t share,split;
492 //if(!Part->summaryValue( IBLout, xAOD::numberOfInnermostPixelLayerOutliers ) ) IBLout = 0;
493 if(!Part->summaryValue( share, xAOD::numberOfInnermostPixelLayerSharedHits ) ) share = 0;
495 splshIBL=share+split;
496 if(!Part->summaryValue( share, xAOD::numberOfNextToInnermostPixelLayerSharedHits ) ) share = 0;
498 splshBL=share+split;
499 }
500 }
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:179
@ numberOfNextToInnermostPixelLayerSharedHits
number of Pixel 1st layer barrel hits shared by several tracks.
@ numberOfNextToInnermostPixelLayerSplitHits
number of Pixel 1st layer barrel hits split by cluster splitting
@ numberOfInnermostPixelLayerSharedHits
number of Pixel 0th layer barrel hits shared by several tracks.
@ numberOfInnermostPixelLayerSplitHits
number of Pixel 0th layer barrel hits split by cluster splitting

◆ getPreviousParent()

const xAOD::TruthParticle * InDet::InDetVKalVxInJetTool::getPreviousParent ( const xAOD::TruthParticle * child,
int & ParentPDG )
staticprivate

Definition at line 617 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

617 {
618 ParentPDG=0;
619 if( child->hasProdVtx() ){
620 if( child->prodVtx()->nIncomingParticles()==1 ){
621 ParentPDG = abs((*(child->prodVtx()->incomingParticleLinks())[0])->pdgId());
622 return *(child->prodVtx()->incomingParticleLinks())[0];
623 }
624 }
625 return nullptr;
626 }
bool hasProdVtx() const
Check for a production vertex on this particle.
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
size_t nIncomingParticles() const
Get the number of incoming particles.
const TPLinks_t & incomingParticleLinks() const
Get all the incoming particles.

◆ GetTrkFitWeights()

StatusCode InDet::InDetVKalVxInJetTool::GetTrkFitWeights ( std::vector< double > & wgt,
const Trk::IVKalState & istate ) const
private

Definition at line 435 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

437 {
438 return m_fitSvc->VKalGetTrkWeights(wgt, istate);
439 }

◆ getVrtSec()

xAOD::Vertex * InDet::InDetVKalVxInJetTool::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
private

Definition at line 69 of file BTagVrtSec.cxx.

78 {
79
80 ATH_MSG_DEBUG("getVrtSec() called with xAOD::TrackParticle=" <<inpTrk.size());
81 if( inpTrk.size() < 2 ) { return nullptr;} // 0,1 track => nothing to do!
82
83 std::vector<const xAOD::TrackParticle*> selectedTracks(0);
84 results.clear();
85 listSecondTracks.clear();
86 nRefPVTrk = 0;
87
88 float evtWgt = 1.;
89 const EventContext & ctx = Gaudi::Hive::currentContext();
90 SG::ReadHandle<xAOD::EventInfo> eventInfo{m_eventInfoKey, ctx};
91 if (eventInfo.isValid()) {
92 if(eventInfo->hasBeamSpotWeight()) evtWgt *= eventInfo->beamSpotWeight();
93 } else ATH_MSG_DEBUG("No event info object found!");
94
95 nRefPVTrk = selGoodTrkParticle( inpTrk, primVrt, jetDir, selectedTracks);
96 if(m_fillHist){
97 Hists& h = getHists();
98 h.m_hb_ntrkjet->Fill( static_cast<double>( selectedTracks.size() ), evtWgt);
99 h.m_pr_NSelTrkMean->Fill(jetDir.Pt(), static_cast<double>( selectedTracks.size() ));
100 }
101 long int NTracks = static_cast<int>( selectedTracks.size() );
102 if( NTracks < 2 ) { return nullptr;} // 0,1 selected track => nothing to do!
103
104 ATH_MSG_DEBUG("Number of selected tracks inside jet= "<<NTracks);
105
106 TLorentzVector MomentumJet = totalMom(selectedTracks);
107 if(m_fillHist){
108 Hists& h = getHists();
109 h.m_hb_jmom->Fill( MomentumJet.E(), evtWgt);
110 }
111
112
113 //--------------------------------------------------------------------------------------------
114 // Initial xAOD::TrackParticle list ready
115
116 std::vector<const xAOD::TrackParticle*> tracksForFit;
117 std::vector<double> inpMass(NTracks,m_massPi);
118 int Vrt2TrackNumber = select2TrVrt(ctx, selectedTracks, tracksForFit, primVrt, jetDir, inpMass, nRefPVTrk,
119 trkFromV0, listSecondTracks,
120 compatibilityGraph, evtWgt);
121
122 //
123 //--- Cleaning
124 //
125 if( trkFromV0.size() > 1) {
126 removeDoubleEntries(trkFromV0);
127 AnalysisUtils::Sort::pT(&trkFromV0);
128 }
129
130 std::vector<const xAOD::TrackParticle*> saveSecondTracks(listSecondTracks);
131 removeDoubleEntries(listSecondTracks);
132 AnalysisUtils::Sort::pT (&listSecondTracks);
133 for(const auto *iv0 : trkFromV0){
134 auto itf = std::find(selectedTracks.begin(),selectedTracks.end(),iv0);
135 if(itf!=selectedTracks.end()) selectedTracks.erase(itf);
136 }
137
138 ATH_MSG_DEBUG(" Found different xAOD tracks in pairs="<< listSecondTracks.size());
139 if(listSecondTracks.size() < 2 ) return nullptr;
140
141 //--Ranking of selected tracks
142 std::vector<float> trkRank(0);
143 for(const auto *tk : listSecondTracks){
144 float rank = m_useTrackClassificator ?
145 m_trackClassificator->trkTypeWgts(ctx, tk, primVrt, jetDir)[0] :
146 std::count(saveSecondTracks.begin(), saveSecondTracks.end(), tk); // Number of 2tr vertices where each track is used
147 trkRank.push_back(rank);
148 }
149
151 while( median(trkRank)<0.3 && trkRank.size()>3 ) {
152 int Smallest = std::min_element(trkRank.begin(),trkRank.end()) - trkRank.begin();
153 removeEntryInList(listSecondTracks,trkRank,Smallest);
154 }
155 }
156
157 //
158 //-----------------------------------------------------------------------------------------------------
159 // Secondary track list is ready
160 // Now common vertex fit
161 //
162 std::vector<double> errorMatrix;
163 Amg::Vector3D fitVertex;
164 std::vector< std::vector<double> > TrkAtVrt;
165 TLorentzVector Momentum;
166
167 double Chi2 = fitCommonVrt(ctx, listSecondTracks, trkRank, primVrt, jetDir, inpMass, fitVertex, errorMatrix, Momentum, TrkAtVrt);
168
169 if( Chi2 < 0 && listSecondTracks.size()>2 ) { // Vertex not reconstructed. Try to remove one track with biggest pt.
170 double tpmax = 0.;
171 int ipmax = -1;
172 for(unsigned int it=0; it<listSecondTracks.size(); it++){
173 if(tpmax<listSecondTracks[it]->pt()){
174 tpmax = listSecondTracks[it]->pt();
175 ipmax = it;
176 }
177 }
178
179 if(ipmax>=0) removeEntryInList(listSecondTracks,trkRank,ipmax);
180 Chi2 = fitCommonVrt(ctx, listSecondTracks, trkRank, primVrt, jetDir, inpMass, fitVertex, errorMatrix, Momentum, TrkAtVrt);
181 ATH_MSG_DEBUG("Second fitCommonVrt try="<< Chi2<<" Ntrk="<<listSecondTracks.size());
182 }
183 ATH_MSG_DEBUG("fitCommonVrt result="<< Chi2<<" Ntrk="<<listSecondTracks.size());
184
185 if(Chi2 < 0) return nullptr;
186
187 //
188 // Check jet tracks not in secondary vertex
189 std::map<double,const xAOD::TrackParticle*> AdditionalTracks;
190 std::vector<double> Impact, ImpactError;
191 double Signif3D = 0.;
192 vrtVrtDist(primVrt, fitVertex, errorMatrix, Signif3D);
193
194 if(Signif3D>8.){
195
196 int hitL1=0, nLays=0, hitIBL=0, hitBL=0;
197 for (const auto *i_ntrk : selectedTracks) {
198 if( find( listSecondTracks.begin(), listSecondTracks.end(), i_ntrk) != listSecondTracks.end() ) continue; // Track is used already
199
201 std::vector<float> trkScore=m_trackClassificator->trkTypeWgts(ctx, i_ntrk, primVrt, jetDir);
202 if(trkScore[0] < 0.1) continue; //Remove very low track HF score
203 }
204
205 double Signif3DS = m_fitSvc->VKalGetImpact(ctx, i_ntrk, fitVertex , 1, Impact, ImpactError);
206 if(Signif3DS > 10.) continue;
207
208 getPixelLayers(i_ntrk , hitIBL , hitBL, hitL1, nLays);
209 if( hitIBL<=0 && hitBL<=0 ) continue; // No IBL and BL pixel hits => non-precise track
210
211 double Signif3DP = m_fitSvc->VKalGetImpact(ctx, i_ntrk, primVrt.position(), 1, Impact, ImpactError);
212 if(Signif3DP<1.)continue;
213
214 if(m_fillHist){
215 Hists& h = getHists();
216 h.m_hb_diffPS->Fill( Signif3DP-Signif3DS, evtWgt);
217 }
218
219 if(Signif3DP-Signif3DS>4.0) AdditionalTracks[Signif3DP-Signif3DS] = i_ntrk;
220 }
221 }
222
223 //
224 // Add found tracks and refit
225 //
226 if(!AdditionalTracks.empty()){
227 while (AdditionalTracks.size()>3) AdditionalTracks.erase(AdditionalTracks.begin());//Tracks are in increasing DIFF order.
228 for (auto atrk : AdditionalTracks) listSecondTracks.push_back(atrk.second); //3tracks with max DIFF are selected
229 trkRank.clear();
230 for(const auto *tk : listSecondTracks){
231 float rank = m_useTrackClassificator ? m_trackClassificator->trkTypeWgts(ctx, tk, primVrt, jetDir)[0] : 1;
232 trkRank.push_back( rank );
233 }
234 Chi2 = fitCommonVrt(ctx, listSecondTracks, trkRank, primVrt, jetDir, inpMass, fitVertex, errorMatrix, Momentum, TrkAtVrt);
235 ATH_MSG_DEBUG("Added track fitCommonVrt output="<< Chi2);
236 if(Chi2 < 0) return nullptr;
237 }
238
239 //
240 // Saving of results
241 //
242 if( listSecondTracks.size()==2 ){ // If there are 2 only tracks
243 ATH_MSG_DEBUG("Start Ntr=2 vertex check");
244 int Charge = 0;
245 for (const auto *i_ntrk : listSecondTracks) Charge += static_cast<int>( i_ntrk->charge() );
246 vrtVrtDist(primVrt, fitVertex, errorMatrix, Signif3D);
247
248 // Check track pixel hit patterns vs vertex position.
250 if(!check2TrVertexInPixel(listSecondTracks[0],listSecondTracks[1],fitVertex,errorMatrix)) return nullptr;
251 }
252
253 // Check track first measured points vs vertex position.
255 float hitR1 = listSecondTracks[0]->radiusOfFirstHit();
256 float hitR2 = listSecondTracks[1]->radiusOfFirstHit();
257 float vrErr = vrtRadiusError(fitVertex, errorMatrix);
258 if(std::abs(hitR1-hitR2)>25.) return nullptr; // Hits in different pixel layers
259 if(fitVertex.perp()-std::min(hitR1,hitR2) > 2.*vrErr) return nullptr; // Vertex is behind hit in pixel
260 }
261
262 //--------
263 //
264 if(m_fillHist){
265 Hists& h = getHists();
266 if(Charge){
267 h.m_hb_totmass2T1->Fill(Momentum.M(),evtWgt);
268 }
269 else{
270 h.m_hb_totmass2T0->Fill(Momentum.M(),evtWgt);
271 }
272 }
273
274 if( !Charge && std::abs(Momentum.M()-m_massK0)<15. ) { // Final rejection of K0
275 trkFromV0.push_back(listSecondTracks[0]);
276 trkFromV0.push_back(listSecondTracks[1]);
277 if( trkFromV0.size() > 1) {
278 removeDoubleEntries(trkFromV0);
279 AnalysisUtils::Sort::pT (&trkFromV0);
280 }
281 return nullptr;
282 }
283 ATH_MSG_DEBUG("Ntr=2 vertex check passed");
284 }
285
286
287 double jetVrtDir = projSV_PV(fitVertex,primVrt,jetDir);
288 ATH_MSG_DEBUG("Combined SV neg.dir="<<jetVrtDir);
290 if(jetVrtDir > 0.) return nullptr;
291 }
292 else if(!m_getNegativeTail){
293 if(jetVrtDir < 0.) return nullptr;
294 }
295
296 double xvt = fitVertex.x();
297 double yvt = fitVertex.y();
298 double R = std::hypot(xvt, yvt);
299 std::vector<double> distMat = {39.9, // Maximum distance
300 std::abs(R-m_beampipeR),
301 std::abs(R-m_rLayerB),
302 std::abs(R-m_rLayer1),
303 std::abs(R-m_rLayer2)};
304 if(m_existIBL) distMat.push_back(std::abs(R-m_rLayer3)); // 4-layer pixel detector
305 double minDstMat = *(std::min_element(distMat.begin(), distMat.end()));
306
307 vrtVrtDist(primVrt, fitVertex, errorMatrix, Signif3D);
308 if(jetVrtDir < 0) Signif3D = -Signif3D;
309
310 results.push_back(Momentum.M()); //1st
311 double eRatio = Momentum.E()/MomentumJet.E();
312 results.push_back( eRatio<0.99999 ? eRatio : 0.99999 ); //2nd
313 results.push_back( static_cast<double>(Vrt2TrackNumber) ); //3rd
314 results.push_back( static_cast<double>(NTracks) ); //4th
315 results.push_back( static_cast<double>(listSecondTracks.size()) ); //5th
316 results.push_back( Signif3D ); //6th
317 results.push_back( MomentumJet.E() ); //7th
318 results.push_back( minDstMat ); //8th
319 double nRatio = Momentum.Et(jetDir.Vect())/std::sqrt(MomentumJet.Perp());
320 nRatio /= (nRatio+4.);
321 results.push_back( nRatio ); //9th New transverse energy ration
322 results.push_back( (Momentum.M()-2.*m_massPi) * eRatio/m_massB ); //10th "Product" variable
323 results.push_back( (Momentum.Pt()/Momentum.M()) * (m_massB/jetDir.Pt()) ); //11th "Boost" variable
324
325 if(m_fillHist){
326 // Find highest track Pt with respect to jet direction
327 double trackPt, trackPtMax = 0.;
328 for (unsigned int tr=0; tr<listSecondTracks.size(); tr++) {
329 if(listSecondTracks[tr]->pt()/jetDir.Pt() > 0.5) continue;
330 trackPt = pTvsDir(Amg::Vector3D(jetDir.X(),jetDir.Y(),jetDir.Z()) , TrkAtVrt[tr]);
331 if(trackPt>trackPtMax) trackPtMax = trackPt;
332 }
333
334 Hists& h = getHists();
335 h.m_hb_rNdc->Fill( fitVertex.perp(), evtWgt );
336 h.m_hb_trkPtMax->Fill( trackPtMax, evtWgt );
337 h.m_hb_mom->Fill( MomentumJet.E(), evtWgt );
338 h.m_hb_totmass->Fill( results[0], evtWgt );
339 h.m_hb_ratio->Fill( results[1], evtWgt );
340 h.m_hb_nvrt2->Fill( results[2], evtWgt );
341 h.m_hb_sig3DTot->Fill( Signif3D, evtWgt );
342 h.m_hb_dstToMat->Fill( minDstMat, evtWgt );
343 h.m_pr_effVrt->Fill( static_cast<float>(nRefPVTrk), 1. );
344 h.m_pr_effVrtEta->Fill( jetDir.Eta(), 1. );
345
346 float R = jetDir.DeltaR(TLorentzVector(fitVertex.x()-primVrt.x(), fitVertex.y()-primVrt.y(),
347 fitVertex.z()-primVrt.z(), 1.e4));
348 h.m_hb_deltaRSVPV->Fill( R, evtWgt );
349
350 if(h.m_curTup){
351 h.m_curTup->TotM = Momentum.M();
352 if(!m_multiVertex){
353 h.m_curTup->nNVrt = 1;
354 h.m_curTup->NVrtNT[0] = listSecondTracks.size();
355 h.m_curTup->NVrtDist2D[0] = fitVertex.perp();
356 h.m_curTup->NVrtSig3D[0] = Signif3D;
357 h.m_curTup->NVrtM[0] = Momentum.M();
358 h.m_curTup->NVrtChi2[0] = Chi2;
359 h.m_curTup->NVrtMaxW[0] = eRatio;
360 h.m_curTup->NVrtDR[0] = R;
361 }
362 }
363 }
364
365 //-------------------------------------------------------------------------------------
366 //Return xAOD::Vertex
367 xAOD::Vertex * tmpVertex = new (std::nothrow) xAOD::Vertex();
368 if(!tmpVertex) return nullptr;
369 tmpVertex->makePrivateStore();
370 tmpVertex->setPosition(fitVertex);
371
372 std::vector<float> floatErrMtx;
373 floatErrMtx.resize(errorMatrix.size());
374 for(unsigned int i=0; i<errorMatrix.size(); i++) floatErrMtx[i] = errorMatrix[i];
375
376 tmpVertex->setCovariance(floatErrMtx);
377 tmpVertex->setFitQuality(Chi2, static_cast<float>(listSecondTracks.size()*2.-3.));
378
379 for (const auto *i_ntrk : listSecondTracks){
380 ElementLink<xAOD::TrackParticleContainer> TEL;
381 TEL.setElement(i_ntrk);
382 const xAOD::TrackParticleContainer* cont = (const xAOD::TrackParticleContainer* ) (i_ntrk->container() );
383 TEL.setStorableObject(*cont);
384 tmpVertex->addTrackAtVertex(TEL,1.);
385 }
386 return tmpVertex;
387
388 }
ToolHandle< IInDetTrkInJetType > m_trackClassificator
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
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
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
TLorentzVector totalMom(const std::vector< const Trk::Perigee * > &inpTrk) const
static double pTvsDir(const Amg::Vector3D &Dir, const std::vector< double > &inpTrk)
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
bool check2TrVertexInPixel(const Track *p1, const Track *p2, Amg::Vector3D &, std::vector< double > &) const
virtual bool isValid() override final
Can the handle be successfully dereferenced?
void addTrackAtVertex(const ElementLink< TrackParticleContainer > &tr, float weight=1.0)
Add a new track to the vertex.
void setCovariance(const std::vector< float > &value)
Sets the covariance matrix as a simple vector of values.
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
const Amg::Vector3D & position() const
Returns the 3-pos.
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:140
void pT(COLL *coll)
sort by pT
float median(std::vector< float > &Vec)
bool trackPt(const xAOD::TauJet &, const xAOD::TauTrack &track, float &out)
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".

◆ getVrtSecMulti()

std::vector< xAOD::Vertex * > InDet::InDetVKalVxInJetTool::getVrtSecMulti ( workVectorArrxAOD * xAODwrk,
const xAOD::Vertex & primVrt,
const TLorentzVector & jetDir,
std::vector< double > & results,
compatibilityGraph_t & compatibilityGraph ) const
private

Definition at line 41 of file BTagVrtSecMulti.cxx.

46{
47
48 const double probVrtMergeLimit = 0.01;
49
50 int inpNPart = 0;
51 if (xAODwrk) {
52 inpNPart = xAODwrk->InpTrk.size();
53 xAODwrk->FoundSecondTracks.clear(); // Input clearing for failure return
54 results.clear(); // Input clearing for failure return
55 }
56 ATH_MSG_DEBUG( "InDet getVrtSecMulti() called with NPart=" << inpNPart );
57
58 std::vector<xAOD::Vertex*> finalVertices(0);
59
60 if (inpNPart < 2) {
61 return finalVertices;
62 } // 0,1 track => nothing to do!
63
64 float evtWgt = 1.;
65 const EventContext & ctx = Gaudi::Hive::currentContext();
66 SG::ReadHandle<xAOD::EventInfo> eventInfo{m_eventInfoKey,ctx};
67 if (eventInfo.isValid()) {
68 if(eventInfo->hasBeamSpotWeight()) evtWgt *= eventInfo->beamSpotWeight();
69 } else ATH_MSG_DEBUG("No event info object found!");
70
71
72 long int nTracks = 0;
73 TLorentzVector momentumJet;
74 int nRefPVTrk = 0;
75 if (xAODwrk) {
76 nRefPVTrk = selGoodTrkParticle(xAODwrk->InpTrk, primVrt, jetDir, xAODwrk->listJetTracks,evtWgt);
77 while (!xAODwrk->listJetTracks.empty() &&
78 xAODwrk->listJetTracks[0]->pt() / jetDir.Pt() > 1.){
79 xAODwrk->listJetTracks.erase(xAODwrk->listJetTracks.begin());
80 }
81 nTracks = xAODwrk->listJetTracks.size();
82 momentumJet = totalMom(xAODwrk->listJetTracks);
83 }
84
85 if (nTracks < 2) {
86 return finalVertices;
87 } // 0,1 selected track => nothing to do!
88
89
90 ATH_MSG_DEBUG("Number of selected tracks inside jet= " << nTracks);
91
92 if (m_fillHist) {
93 Hists& h = getHists();
94 h.m_hb_jmom->Fill(momentumJet.Perp(), evtWgt);
95 h.m_hb_ntrkjet->Fill(static_cast<double>(nTracks), evtWgt);
96 }
97
98 //
99 // InpTrk[] - input track list
100 // listJetTracks[] - list of good tracks in jet for vertex search
101 //------------------------------------------------------------
102 // Initial track list ready
103 // Find 2track vertices
104 //
105
106 std::vector<double> inpMass(nTracks, m_massPi);
107 double vrt2TrackNumber = 0;
108
109 if (xAODwrk) {
110 select2TrVrt(ctx,
111 xAODwrk->listJetTracks,
112 xAODwrk->TracksForFit,
113 primVrt,
114 jetDir,
115 inpMass,
116 nRefPVTrk,
117 xAODwrk->TrkFromV0,
118 xAODwrk->listSecondTracks,
119 compatibilityGraph);
120 if (xAODwrk->TrkFromV0.size() > 1) {
121 removeDoubleEntries(xAODwrk->TrkFromV0);
122 AnalysisUtils::Sort::pT(&(xAODwrk->TrkFromV0));
123 }
124 vrt2TrackNumber = xAODwrk->listSecondTracks.size()/2.0;
125 removeDoubleEntries(xAODwrk->listSecondTracks);
126 AnalysisUtils::Sort::pT(&(xAODwrk->listSecondTracks));
127 }
128
129
130 ATH_MSG_DEBUG(" Found different tracks in pairs=" << vrt2TrackNumber);
131
132 //
133 // listSecondTracks[] - list of all tracks which participate in some
134 // 2-track vertex TrkFromV0[] - "bad" tracks from any
135 // V0/material/conversion m_Incomp[] - main vector of pointers for
136 // multivertex search
137 //-----------------------------------------------------------------------------------------------------
138 // Secondary track list is ready
139 // Creation of initial vertex set
140 //
141
142 std::unique_ptr<std::vector<WrkVrt>> wrkVrtSet = std::make_unique<std::vector<WrkVrt>>();
143 WrkVrt newvrt;
144 newvrt.Good = true;
145 std::unique_ptr<Trk::IVKalState> state = m_fitSvc->makeState(ctx);
147
148 //================================================== Boost version (don't
149 //forget to uncomment addEdge in select2TrVrt()
150 std::vector<std::vector<int>> allCliques;
151 bron_kerbosch_all_cliques(compatibilityGraph, clique_visitor(allCliques));
152
153 for (const auto& clique : allCliques) {
154
155 newvrt.selTrk.clear();
156 if (xAODwrk) xAODwrk->tmpListTracks.clear();
157
158 for (int i_trk : clique){
159 newvrt.selTrk.push_back(i_trk);
160 if(xAODwrk) xAODwrk->tmpListTracks.push_back(xAODwrk->listJetTracks.at(i_trk));
161 }
162
163 if (xAODwrk) sc = VKalVrtFitFastBase(xAODwrk->tmpListTracks, newvrt.vertex, *state);
164 if (sc.isFailure() ||
165 newvrt.vertex.perp() > m_rLayer2 * 2.) {
166 // No initial estimation
167 m_fitSvc->setApproximateVertex(primVrt.x(),
168 primVrt.y(),
169 primVrt.z(),
170 *state); // Use as starting point
172 m_fitSvc->setApproximateVertex(0., 0., 0., *state);
173 } else {
174 Amg::Vector3D vDist = newvrt.vertex - primVrt.position();
175 double jetVrtDir = jetDir.Px() * vDist.x() + jetDir.Py() * vDist.y() +
176 jetDir.Pz() * vDist.z();
177 if (m_multiWithPrimary) jetVrtDir = std::abs(jetVrtDir); // Always positive when primary vertex is seeked for
178 if (jetVrtDir > 0.) {
179 // Good initial estimation
180 m_fitSvc->setApproximateVertex(newvrt.vertex.x(),
181 newvrt.vertex.y(),
182 newvrt.vertex.z(),
183 *state); //Use as starting point
184 } else {
185 m_fitSvc->setApproximateVertex(primVrt.x(), primVrt.y(), primVrt.z(), *state);
186 }
187 }
188
189 sc = StatusCode::FAILURE;
190 if (xAODwrk) {
191 sc = VKalVrtFitBase(xAODwrk->tmpListTracks,
192 newvrt.vertex,
193 newvrt.vertexMom,
194 newvrt.vertexCharge,
195 newvrt.vertexCov,
196 newvrt.chi2PerTrk,
197 newvrt.trkAtVrt,
198 newvrt.chi2,
199 *state,
200 false);
201 }
202 if (sc.isFailure()) continue; // Bad fit - goto next solution
203
204 if (clique.size() == 2 && newvrt.chi2 > 10.) continue; // Bad 2track vertex
205
206 if (newvrt.chi2PerTrk.size() == 2){
207 newvrt.chi2PerTrk[0] = newvrt.chi2PerTrk[1] = newvrt.chi2 / 2.;
208 }
209 newvrt.Good = true;
210 newvrt.nCloseVrt = 0;
211 newvrt.dCloseVrt = 1000000.;
212 newvrt.projectedVrt =
213 jetProjDist(newvrt.vertex, primVrt, jetDir); // 3D SV-PV distance
214 wrkVrtSet->push_back(newvrt);
215 }
216
217 //
218 //========= Initial cleaning of solutions
219 //-Remove worst track from vertices with very bad Chi2
220 bool disassembled = false;
221
222 do {
223 disassembled = false;
224 int NSoluI = (*wrkVrtSet).size();
225 for (int iv = 0; iv < NSoluI; iv++) {
226 WrkVrt vrt = (*wrkVrtSet)[iv];
227 if (!vrt.Good || vrt.selTrk.size() == 2) continue;
228 if (TMath::Prob(vrt.chi2, 2 * vrt.selTrk.size() - 3) < 1.e-3) {
229 if (xAODwrk) disassembleVertex(wrkVrtSet.get(), iv, xAODwrk->listJetTracks, *state);
230 disassembled = true;
231 }
232 }
233 }while(disassembled);
234
235 //-Remove vertices fully contained in other vertices
236 while( (*wrkVrtSet).size()>1 ){
237 int tmpN = (*wrkVrtSet).size();
238
239 int iv = 0;
240 for(; iv<tmpN-1; iv++){
241 WrkVrt vert_i = (*wrkVrtSet)[iv];
242 if(!vert_i.Good ) continue;
243 int ntrk_i = (*wrkVrtSet)[iv].selTrk.size();
244
245 int jv = iv+1;
246 for(; jv<tmpN; jv++){
247 WrkVrt vert_j = (*wrkVrtSet)[jv];
248 if(!vert_j.Good ) continue;
249 int ntrk_j = (*wrkVrtSet)[jv].selTrk.size();
250
251 int nTCom = nTrkCommon(wrkVrtSet.get(), iv, jv);
252 if(nTCom==ntrk_i){
253 (*wrkVrtSet).erase((*wrkVrtSet).begin()+iv);
254 break;
255 }
256 else if(nTCom==ntrk_j){
257 (*wrkVrtSet).erase((*wrkVrtSet).begin()+jv);
258 break;
259 }
260 }
261 if(jv!=tmpN) break; // One vertex is erased. Restart check
262
263 }
264 if(iv==tmpN-1) break; // No vertex deleted
265
266 } // end while( (*wrkVrtSet).size()>1 )
267
268
269 //
270 //- Try to merge all vertices with common tracks
271 std::multimap<int,std::pair<int,int>> vrtWithCommonTrk;
272 std::multimap<int,std::pair<int,int>>::reverse_iterator icvrt;
273 do{
274 int NSoluI = (*wrkVrtSet).size();
275 vrtWithCommonTrk.clear();
276 for(int iv = 0; iv<NSoluI-1; iv++ ){
277 for(int jv = iv+1; jv<NSoluI; jv++){
278 if(!(*wrkVrtSet)[iv].Good || !(*wrkVrtSet)[jv].Good) continue;
279 int nTCom=nTrkCommon(wrkVrtSet.get(), iv, jv);
280 if(!nTCom)continue;
281 vrtWithCommonTrk.emplace(nTCom,std::make_pair(iv,jv));
282 }
283 }
284
285 for(icvrt = vrtWithCommonTrk.rbegin(); icvrt!=vrtWithCommonTrk.rend(); ++icvrt){
286 int nTCom = (*icvrt).first;
287 int iv = (*icvrt).second.first;
288 int jv = (*icvrt).second.second;
289 int nTrkI = (*wrkVrtSet)[iv].selTrk.size();
290 int nTrkJ = (*wrkVrtSet)[jv].selTrk.size();
291 double probV = -1.;
292 if (xAODwrk) {
293 probV = mergeAndRefitVertices(wrkVrtSet.get(), iv, jv, newvrt, xAODwrk->listJetTracks, *state);
294 }
295
296 if(probV<probVrtMergeLimit){
297 if(nTrkI==2 || nTrkJ==2 || nTCom<2) {
298 continue;
299 }
300 if(nTCom>nTrkI-nTCom || nTCom>nTrkJ-nTCom){
301 //2 and more common tracks for NTr>=3 vertices. Merge anyway.
302 if(xAODwrk) mergeAndRefitOverlapVertices( wrkVrtSet.get(), iv, jv, xAODwrk->listJetTracks, *state);
303 break; //Vertex list is changed. Restart merging from scratch.
304 }
305 continue; //Continue merging loop
306 }
307
308 newvrt.Good = true;
309 (*wrkVrtSet).push_back(newvrt);
310 (*wrkVrtSet)[iv].Good = false;
311 (*wrkVrtSet)[jv].Good = false;
312 break; //Merging successful. Break merging loop and remake list of connected vertices
313 } // end for(icvrt)
314
315 } while( icvrt != vrtWithCommonTrk.rend() );
316
317
318 if(m_fillHist){
319 int cvgood=0;
320 for(const auto& vrt : (*wrkVrtSet)){
321 if(vrt.Good) cvgood++;
322 }
323 Hists& h = getHists();
324 h.m_hb_rawVrtN->Fill( static_cast<float>(cvgood), evtWgt);
325 }
326
327 //-Remove all bad vertices from the working set
328 for(auto &tmpV : (*wrkVrtSet) ) {
329 if(tmpV.vertex.perp()>m_rLayer3+10.) tmpV.Good = false; //Vertices outside Pixel detector
330 TLorentzVector SVPV(tmpV.vertex.x()-primVrt.x(),
331 tmpV.vertex.y()-primVrt.y(),
332 tmpV.vertex.z()-primVrt.z(), 1.);
333 if(jetDir.DeltaR(SVPV)>m_coneForTag) tmpV.Good = false; // SV is outside of the jet cone
334 }
335
336 unsigned int tmpV = 0;
337 while( tmpV<(*wrkVrtSet).size() ){
338 if( !(*wrkVrtSet)[tmpV].Good ) (*wrkVrtSet).erase((*wrkVrtSet).begin()+tmpV);
339 else tmpV++;
340 }
341
342 if((*wrkVrtSet).empty()){ // No vertices at all
343 return finalVertices;
344 }
345
346 std::vector< std::vector<float> > trkScore(0);
347 if(xAODwrk && m_useTrackClassificator){
348 for(auto &trk : xAODwrk->listJetTracks) trkScore.push_back(m_trackClassificator->trkTypeWgts(ctx, trk, primVrt, jetDir));
349 }
350
351 for(auto &tmpV : (*wrkVrtSet) ) tmpV.projectedVrt=jetProjDist(tmpV.vertex, primVrt, jetDir); //Setup ProjectedVrt
352
353 //----------------------------------------------------------------------------
354 // Here we have the overlapping solutions.
355 // Vertices may have only 1 common track.
356 // Now solution cleaning
357
358 std::unique_ptr<std::vector< std::deque<long int> > > trkInVrt = std::make_unique<std::vector<std::deque<long int>>>(nTracks);
359 trackClassification(wrkVrtSet.get(), trkInVrt.get());
360
361 double foundMaxT;
362 long int selectedTrack, selectedVertex;
363 int foundV1, foundV2;
364
365 state = m_fitSvc->makeState(ctx);
366 while( ( foundMaxT = MaxOfShared(wrkVrtSet.get(), trkInVrt.get(), selectedTrack, selectedVertex) ) > 0) {
367
368 double foundMinVrtDst = 1000000.;
369 if(foundMaxT<m_trackDetachCut) foundMinVrtDst = minVrtVrtDist(wrkVrtSet.get(), foundV1, foundV2);
370
371 //Choice of action
372 if( foundMaxT<m_trackDetachCut && foundMinVrtDst<m_vertexMergeCut
373 && nTrkCommon(wrkVrtSet.get(), foundV1, foundV2) ){
374
375 bool vrtMerged=false; //to check whether something is really merged
376 while(foundMinVrtDst<m_vertexMergeCut){
377 if(foundV1<foundV2) std::swap(foundV1, foundV2); // Always drop vertex with smallest number
378
379 double probV = 0.;
380 if (xAODwrk) probV = mergeAndRefitVertices(wrkVrtSet.get(), foundV1, foundV2, newvrt, xAODwrk->listJetTracks, *state);
381
382 if(probV>probVrtMergeLimit && newvrt.vertexMom.M()<c_vrtBCMassLimit){
383 // Good merged vertex found
384 double tstDst = jetProjDist(newvrt.vertex, primVrt, jetDir);
385 if(tstDst>0.){
386 // only positive vertex directions are accepted as merging result
387 std::swap((*wrkVrtSet)[foundV1], newvrt);
388 (*wrkVrtSet)[foundV1].projectedVrt = tstDst;
389 (*wrkVrtSet)[foundV2].Good = false; //Drop vertex
390 (*wrkVrtSet)[foundV2].selTrk.clear(); //Clean dropped vertex
391 vrtMerged=true;
392 }
393 }
394
395 (*wrkVrtSet)[foundV1].nCloseVrt = -1;
396 (*wrkVrtSet)[foundV1].dCloseVrt = 1000000.; //For minVrtVrtDistNext optimisation(!)
397 (*wrkVrtSet)[foundV2].nCloseVrt = -1;
398 (*wrkVrtSet)[foundV2].dCloseVrt = 1000000.; //Exclude given pair
399 foundMinVrtDst = minVrtVrtDistNext(wrkVrtSet.get(), foundV1, foundV2); //Check other vertices
400
401 } // end while(foundMinVrtDst<m_vertexMergeCut)
402
403 if(vrtMerged){
404 trkInVrt->resize(nTracks);
405 trackClassification(wrkVrtSet.get(), trkInVrt.get());
406 continue; // Something was merged => goto next cycle. Otherwise break the found track-vertex link
407 }
408
409 } // end choice of action
410
411 removeTrackFromVertex(wrkVrtSet.get(), trkInVrt.get(), selectedTrack, selectedVertex);
412
413 sc = StatusCode::FAILURE;
414 if(xAODwrk) sc = refitVertex( wrkVrtSet.get(), selectedVertex, xAODwrk->listJetTracks, *state, false);
415
416 (*wrkVrtSet)[selectedVertex].projectedVrt = jetProjDist((*wrkVrtSet)[selectedVertex].vertex, primVrt, jetDir);
417
418 if( sc.isFailure() ) (*wrkVrtSet)[selectedVertex].Good = false; //bad vertex
419 if( (*wrkVrtSet)[selectedVertex].projectedVrt<0.
420 && (*wrkVrtSet)[selectedVertex].selTrk.size()==2 ){
421 (*wrkVrtSet)[selectedVertex].Good = false; // 2track vertex migrates behind PV - drop it.
422 }
423
424 } // end while( (foundMaxT = MaxOfShared)>0 )
425
426
427 //
428 // Final check/merge for close vertices
429 //
430 double minDistVV = minVrtVrtDist( wrkVrtSet.get(), foundV1, foundV2); //recalculate VV distances
431 while ( minDistVV < m_vertexMergeCut) {
432 if(foundV1<foundV2) std::swap(foundV1, foundV2);
433
434 double probV = 0.;
435 if(xAODwrk) probV = mergeAndRefitVertices(wrkVrtSet.get(), foundV1, foundV2, newvrt, xAODwrk->listJetTracks, *state);
436
437 if(probV>probVrtMergeLimit && newvrt.vertexMom.M()<c_vrtBCMassLimit){
438 // Good merged vertex found
439 double tstDst = jetProjDist(newvrt.vertex, primVrt, jetDir);
440 if(tstDst>0.){
441 // only positive vertex directions are accepted as merging result
442 std::swap((*wrkVrtSet)[foundV1],newvrt);
443 (*wrkVrtSet)[foundV1].projectedVrt = tstDst;
444 (*wrkVrtSet)[foundV2].Good = false; //Drop vertex
445 (*wrkVrtSet)[foundV2].selTrk.clear(); //Clean dropped vertex
446 }
447 }
448
449 (*wrkVrtSet)[foundV1].nCloseVrt = -1;
450 (*wrkVrtSet)[foundV1].dCloseVrt = 1000000.; //For minVrtVrtDistNext optimisation(!)
451 (*wrkVrtSet)[foundV2].nCloseVrt = -1;
452 (*wrkVrtSet)[foundV2].dCloseVrt = 1000000.; //Exclude given pair
453 minDistVV = minVrtVrtDistNext(wrkVrtSet.get(), foundV1, foundV2);
454 }
455
456 //
457 // Try to improve vertices with big Chi2 if something went wrong. Just precaution.
458 for(unsigned int iv=0; iv<wrkVrtSet->size(); iv++) {
459 WrkVrt vert_i = (*wrkVrtSet)[iv];
460 if(!vert_i.Good) continue; //don't work on vertex which is already bad
461 if( vert_i.selTrk.size()<3 ) continue;
462
463 double tmpProb = TMath::Prob( vert_i.chi2, 2*vert_i.selTrk.size()-3 ); //Chi2 of the original vertex
464 if(tmpProb<0.001){
465 if(xAODwrk) tmpProb = improveVertexChi2(wrkVrtSet.get(), iv, xAODwrk->listJetTracks, *state, false);
466 if(tmpProb<0.001) vert_i.Good = false;
467 vert_i.projectedVrt = jetProjDist(vert_i.vertex, primVrt, jetDir);
468 }
469 }
470
471 // Final vertex selection/cleaning
472 state = m_fitSvc->makeState(ctx);
473
474 //--------- Start with 1-track vertices
475 //=First check if the track was detached from a multitrack vertex. If so - reattach.
476 for(auto &ntrVrt : (*wrkVrtSet)){
477 if(!ntrVrt.Good || ntrVrt.selTrk.size()<=1) continue;
478
479 for(auto &onetVrt : (*wrkVrtSet)){
480 if(!onetVrt.Good || onetVrt.selTrk.size()!=1) continue;
481
482 if(ntrVrt.detachedTrack==onetVrt.selTrk[0]){
483 WrkVrt newV(ntrVrt);
484 newV.selTrk.push_back(ntrVrt.detachedTrack);
485 double vProb = 0.;
486 if(xAODwrk) vProb = refitVertex(newV, xAODwrk->listJetTracks, *state, true);
487 if(vProb>probVrtMergeLimit){
488 onetVrt.Good=false;
489 ntrVrt=newV;
490 ntrVrt.detachedTrack=-1;
491 }
492 break;
493 }
494 }
495 }
496
497 //=Recheck if the track was detached from a 2track vertex. If so - reattach.
498 for(auto &iVrt : (*wrkVrtSet)){
499 if(!iVrt.Good || iVrt.selTrk.size()!=1) continue;
500
501 for(auto &jVrt : (*wrkVrtSet)){
502 if(!jVrt.Good || jVrt.selTrk.size()!=1) continue;
503
504 if(iVrt.detachedTrack==jVrt.selTrk[0]){
505 WrkVrt newV(iVrt);
506 newV.selTrk.push_back(iVrt.detachedTrack);
507 double vProb = 0.;
508 if(xAODwrk) vProb = refitVertex(newV, xAODwrk->listJetTracks, *state, true);
509 if(vProb>probVrtMergeLimit){
510 jVrt.Good = false;
511 iVrt = newV;
512 iVrt.detachedTrack = -1;
513 }
514 break;
515 }
516 }
517
518 }
519
520
521 for(auto &ntrVrt : (*wrkVrtSet)){
522 if(!ntrVrt.Good || ntrVrt.selTrk.size()<=1) continue;
523
524 for(auto tr : ntrVrt.selTrk){
525 for(auto &onetVrt : (*wrkVrtSet)){
526 if(!onetVrt.Good || onetVrt.selTrk.size()!=1) continue;
527
528 if(onetVrt.detachedTrack==tr){
529 WrkVrt newV(ntrVrt);
530 newV.selTrk.push_back(onetVrt.selTrk[0]);
531 double vProb = 0.;
532 if(xAODwrk) vProb = refitVertex( newV, xAODwrk->listJetTracks, *state, true);
533 if(vProb>probVrtMergeLimit){
534 onetVrt.Good = false;
535 ntrVrt = newV;
536 }
537 }
538
539 }
540 }
541
542 } // end for(auto &ntrVrt : (*wrkVrtSet))
543
544
545 for(auto & curVrt : (*wrkVrtSet) ) {
546 if(!curVrt.Good ) continue; //don't work on vertex which is already bad
547 if( std::abs(curVrt.vertex.z())>650. ){
548 curVrt.Good = false;
549 continue;
550 } //vertex outside Pixel det. For ALL vertices
551 if(curVrt.selTrk.size() != 1) continue;
552
553 curVrt.Good = false; // Make them bad by default
554
556 // 1track vertices left unassigned from good 2tr vertices
557 double Signif3D = 0.;
558 vrtVrtDist(primVrt,curVrt.vertex, curVrt.vertexCov, Signif3D); //VK non-projected Signif3D is worse
559 double tmpProb = TMath::Prob(curVrt.chi2, 1); //Chi2 of the original 2tr vertex
560
561 bool trkGood = false;
562 if(xAODwrk) trkGood = check1TrVertexInPixel(xAODwrk->listJetTracks[curVrt.selTrk[0]], curVrt.vertex, curVrt.vertexCov);
563
564 if(trkGood && tmpProb>0.01){
565 // accept only good tracks coming from good 2tr vertex
566 std::vector<double> Impact,ImpactError;
567 double Signif3DP = 0;
568 if(xAODwrk) Signif3DP = m_fitSvc->VKalGetImpact(xAODwrk->listJetTracks[curVrt.selTrk[0]], primVrt.position(), 1, Impact, ImpactError, *state);
569
570 if(m_fillHist && curVrt.vertex.perp()>20.){
571 Hists& h = getHists();
572 h.m_hb_diffPS->Fill(Signif3DP, evtWgt);
573 }
574
575 if(Signif3DP>2.*m_trkSigCut && Signif3D>m_sel2VrtSigCut) curVrt.Good = true; // accept only tracks which are far from primary vertex
576 }
577
578 }
579
580 } // end for(auto & curVrt : (*wrkVrtSet) )
581
582
583 for(auto& curVrt : (*wrkVrtSet)){
584 if(!curVrt.Good ) continue; //don't work on vertex which is already bad
585 int nth = curVrt.selTrk.size();
586 if(nth==1) continue; // 1track vertices are treated already
587
588 double Signif3D = 0.;
589 vrtVrtDist(primVrt,curVrt.vertex, curVrt.vertexCov, Signif3D); //VK non-projected Signif3D is worse
590 if(xAODwrk) xAODwrk->tmpListTracks.resize(nth);
591
592 for(int i = 0; i < nth; i++) {
593 if(xAODwrk) xAODwrk->tmpListTracks[i] = xAODwrk->listJetTracks[curVrt.selTrk[i]];
594 }
595 curVrt.Good = false; // Make all vertices bad for futher selection
596
597 if(nth <= 1) continue; // Definitely bad vertices
598 if(curVrt.projectedVrt<0.) continue; // Remove vertices behind primary one
599
600 if(TMath::Prob( curVrt.chi2, 2*nth-3)<0.001) continue; // Bad Chi2 of refitted vertex
601
602 if(nth==2 && xAODwrk){
603 // Check track pixel hit patterns vs vertex position.
605 if(!check2TrVertexInPixel(xAODwrk->tmpListTracks[0],xAODwrk->tmpListTracks[1],curVrt.vertex,curVrt.vertexCov))continue;
606 }
607
608 // Check track first measured points vs vertex position.
610 float ihitR = xAODwrk->tmpListTracks[0]->radiusOfFirstHit();
611 float jhitR = xAODwrk->tmpListTracks[1]->radiusOfFirstHit();
612 float vrErr = vrtRadiusError(curVrt.vertex, curVrt.vertexCov);
613 if(std::abs(ihitR-jhitR)>25.) continue; // Hits in different pixel layers
614 if(curVrt.vertex.perp()-std::min(ihitR,jhitR) > 2.*vrErr) continue; // Vertex is behind hit in pixel
615 }
616
617 }
618
619 //--- Check interactions on pixel layers
620 if(m_fillHist && nth==2){
621 Hists& h = getHists();
622 h.m_hb_r2d->Fill(curVrt.vertex.perp(), evtWgt);
623 }
624
626 double xvt = curVrt.vertex.x();
627 double yvt = curVrt.vertex.y();
628 double zvt = curVrt.vertex.z();
629 double Rvt = std::hypot(xvt,yvt);
630 int bin = m_ITkPixMaterialMap->FindBin(zvt,Rvt);
631 if(m_ITkPixMaterialMap->GetBinContent(bin)>0) continue;
632 }
633
634 if(m_fillHist && nth==2){
635 Hists& h = getHists();
636 h.m_hb_r2d->Fill(curVrt.vertex.perp(), evtWgt);
637 }
638
639 //--- Check V0s and conversions
640 if(nth==2 && curVrt.vertexCharge==0 && curVrt.detachedTrack<0){
641 double mass_PiPi = curVrt.vertexMom.M();
642 double mass_PPi = massV0(curVrt.trkAtVrt,m_massP,m_massPi);
643 double mass_EE = massV0(curVrt.trkAtVrt,m_massE,m_massE);
644 if(m_fillHist){
645 Hists& h = getHists();
646 h.m_hb_massPiPi->Fill(mass_PiPi, evtWgt);
647 h.m_hb_massPPi ->Fill(mass_PPi, evtWgt);
648 if(curVrt.vertex.perp()>20.) h.m_hb_massEE->Fill(mass_EE, evtWgt);
649 }
650
651 if(std::abs(mass_PiPi-m_massK0) < 22.) continue;
652 if(std::abs(mass_PPi-m_massLam) < 8.) continue;
653 if(mass_EE < 60. && curVrt.vertex.perp() > 20.) continue;
654 }
655
656 if(m_fillHist){
657 Hists& h = getHists();
658 h.m_hb_sig3DTot->Fill(Signif3D, evtWgt);
659 }
660 if(Signif3D<m_sel2VrtSigCut)continue; //Main PV-SV distance quality cut
661
662 curVrt.Good = true; // Vertex is absolutely good
663
664 } // end for(auto& curVrt : (*wrkVrtSet))
665
666 //--Final cleaning of the 1-track vertices set. Must be behind all other cleanings.
667 if(m_multiWithOneTrkVrt) clean1TrVertexSet(wrkVrtSet.get());
668
669 //Checks
670 int n2trVrt = 0; // N of vertices with 2 tracks
671 int nNtrVrt = 0; // N vertices with 3 and more tracks
672 int ngoodVertices = 0; // Final number of good vertices
673 std::vector<WrkVrt> goodVertices(0);
674
675 for(auto & iv : (*wrkVrtSet)) {
676 int nth = iv.selTrk.size();
677 if(nth == 0) continue; // Definitely bad vertices
678
679 if(iv.Good){
680 ngoodVertices++;
681 goodVertices.emplace_back(iv);
682 if(nth==2) n2trVrt++;
683 if(nth>=3) nNtrVrt++;
684 }
685 }
686
687 if(ngoodVertices == 0 || (n2trVrt+nNtrVrt)==0){ // No good vertices at all
688 return finalVertices;
689 }
690
691 //sorting
692 while(1){
693 bool swapDone = false; // Sort on XY distance from (0.,0.)
694 for(unsigned int iv = 0; iv<goodVertices.size()-1; iv++) {
695 if(goodVertices[iv].vertex.perp() > goodVertices[iv+1].vertex.perp()){
696 std::swap( goodVertices[iv], goodVertices[iv+1] );
697 swapDone = true;
698 }
699 }
700 if(!swapDone) break;
701 }
702
703 while(1){
704 bool swapDone = false; // Then sort on Projected dist if R<20.
705 for(unsigned int iv = 0; iv<goodVertices.size()-1; iv++) {
706 if(goodVertices[iv+1].vertex.perp() > 400.) continue;
707 if(goodVertices[iv].projectedVrt > goodVertices[iv+1].projectedVrt){
708 std::swap( goodVertices[iv], goodVertices[iv+1] );
709 swapDone = true;
710 }
711 }
712 if(!swapDone) break;
713 }
714
715 if(ngoodVertices>1){
716 if( goodVertices[1].vertexMom.M()-goodVertices[0].vertexMom.M() > 5000.){
717 std::swap( goodVertices[0], goodVertices[1] );
718 }
719 }
720
721 if(m_fillHist){
722 Hists& h = getHists();
723 h.m_hb_distVV->Fill(minVrtVrtDist(wrkVrtSet.get(), foundV1, foundV2), evtWgt);
724 }
725
726
727 //----------------------------------------------------------------------------------
728 // Nonused tracks for one-track-vertex search
729 //
730 // VK - It tries to recover tracks which were already rejected on previous stages of algorithm.
731
732 std::vector<int> nonusedTrk(0);
733 for(int trk=0; trk<nTracks; trk++){
734 bool present = false;
735
736 for(const auto& iv : (*wrkVrtSet)){
737 if(iv.Good){
738 for(auto t_in_V : iv.selTrk){
739 if(trk==t_in_V){
740 present = true;
741 break;
742 }
743 }
744 }
745 if(present) break;
746 }
747
748 if(!present) nonusedTrk.push_back(trk);
749 }
750
751 struct MatchedSV{int indVrt; double Signif3D;};
752 std::vector<MatchedSV> matchSV(0);
753
754 for(const auto& i_trk : nonusedTrk){
755 MatchedSV tmpV = {0, 1.e9};
756
757 for(unsigned int iv = 0; iv<goodVertices.size(); iv++){
758 //--Find vertex closest to the given track
759 if(!goodVertices[iv].Good) continue;
760 if(goodVertices[iv].selTrk.size()<2) continue;
761 if(vrtVrtDist(primVrt, goodVertices[iv].vertex, goodVertices[iv].vertexCov, jetDir) < 10.) continue; //--Too close to PV
762
763 double Signif = 0.;
764 std::vector<double> Impact, ImpactError;
765 if(xAODwrk) Signif = m_fitSvc->VKalGetImpact(xAODwrk->listJetTracks[i_trk], goodVertices[iv].vertex, 1, Impact, ImpactError, *state);
766 if(Signif<tmpV.Signif3D){
767 tmpV.Signif3D = Signif;
768 tmpV.indVrt=iv;
769 }
770 }
771
772 matchSV.push_back(tmpV);
773 }
774
775 for(int iv = 0; iv<static_cast<int>(goodVertices.size()); iv++){
776 WrkVrt newV(goodVertices[iv]);
777 bool addedT = false;
778 std::map<double,int> addTrk;
779
780 for(unsigned int it = 0; it<nonusedTrk.size(); it++){
781 if(matchSV[it].indVrt==iv) addTrk[matchSV[it].Signif3D]=it;
782 }
783
784 std::map<double,int>::iterator atrk=addTrk.begin();
785 if(!addTrk.empty()){
786 if(atrk->first<4.){
787 newV.selTrk.push_back(nonusedTrk[atrk->second]);
788 addedT=true;
789 }
790 }
791
792 if(addTrk.size()>1){
793 ++atrk;
794 if(atrk->first<4.){
795 newV.selTrk.push_back(nonusedTrk[atrk->second]);
796 }
797 }
798
799 if(addedT){
800 double vProb = 0.;
801 if(xAODwrk) vProb = refitVertex(newV, xAODwrk->listJetTracks, *state, true);
802 if(vProb>0.01) goodVertices[iv] = newV;
803 else{
804 std::vector<WrkVrt> TestVertices(1,newV);
805 if(xAODwrk) vProb = improveVertexChi2(&TestVertices, 0, xAODwrk->listJetTracks, *state, true);
806 if(vProb>0.01) goodVertices[iv] = TestVertices[0];
807 }
808 }
809
810 } // end for(unsigned int iv)
811
812
813 //-------------------------------------------
814 // Saving and final cleaning
815 //
816 int ngoodVertices_final = 0; // Final number of good vertices
817 int n1trVrt = 0; // Final number of good 1-track vertices
818 TLorentzVector vertexMom;
819 bool isPrimaryVertex = true;
820
821 for(auto& vrt : goodVertices){
822 int nth = vrt.selTrk.size();
823 if(xAODwrk) xAODwrk->tmpListTracks.clear();
824
825 for(int i = 0; i < nth; i++) {
826 int j = vrt.selTrk[i]; // Track number
827 if(xAODwrk) xAODwrk->tmpListTracks.push_back( xAODwrk->listJetTracks[j] );
828 }
829
830 if( m_fillHist ){
831 Hists& h = getHists();
832 if(nth==1) h.m_hb_r1dc->Fill(vrt.vertex.perp(), evtWgt);
833 if(nth==2) h.m_hb_r2dc->Fill(vrt.vertex.perp(), evtWgt);
834 if(nth==3) h.m_hb_r3dc->Fill(vrt.vertex.perp(), evtWgt);
835 if(nth> 3) h.m_hb_rNdc->Fill(vrt.vertex.perp(), evtWgt);
836 double Signif3D = vrtVrtDist(primVrt, vrt.vertex, vrt.vertexCov, jetDir);
837
838 if(nth==2){
839 if(vrt.vertexCharge==0) h.m_hb_totmass2T1->Fill(vrt.vertexMom.M(), evtWgt);
840 else h.m_hb_totmass2T2->Fill(vrt.vertexMom.M(), evtWgt);
841 h.m_hb_sig3D2tr->Fill(Signif3D , evtWgt);
842 if(vrt.vertexCharge==0) h.m_hb_totmassEE->Fill(massV0(vrt.trkAtVrt, m_massE, m_massE), evtWgt);
843
844 }
845 else if(vrt.vertexMom.M()>6000.) h.m_hb_sig3D1tr->Fill(Signif3D, evtWgt);
846 else h.m_hb_sig3DNtr->Fill(Signif3D, evtWgt);
847 }
848
849 // xAOD::Vertex creation-----------------------------
850 xAOD::Vertex * tmpVertex=new (std::nothrow) xAOD::Vertex();
851 if(!tmpVertex){ //Premature stop due memory allocation failure
852 return finalVertices;
853 }
854 tmpVertex->makePrivateStore();
855 tmpVertex->setPosition(vrt.vertex);
856
857 std::vector<float> floatErrMtx;
858 floatErrMtx.resize(6);
859 for(int i = 0; i<6; i++) floatErrMtx[i] = vrt.vertexCov[i];
860 tmpVertex->setCovariance(floatErrMtx);
861
862 tmpVertex->setFitQuality(vrt.chi2, (float)(nth*2-3));
863
864 std::vector<Trk::VxTrackAtVertex> & tmpVTAV = tmpVertex->vxTrackAtVertex();
865 tmpVTAV.clear();
866
867 for(int ii = 0; ii<nth; ii++) {
868 AmgSymMatrix(5) CovMtxP;
869 CovMtxP.setIdentity();
870 Trk::Perigee * tmpMeasPer = new Trk::Perigee( 0., 0.,
871 vrt.trkAtVrt[ii][0],
872 vrt.trkAtVrt[ii][1],
873 vrt.trkAtVrt[ii][2],
874 Trk::PerigeeSurface(vrt.vertex),
875 std::move(CovMtxP) );
876 tmpVTAV.emplace_back( 1., tmpMeasPer );
877
878 if(xAODwrk){
879 ElementLink<xAOD::TrackParticleContainer> TEL;
880 TEL.setElement( xAODwrk->tmpListTracks[ii] );
881 const xAOD::TrackParticleContainer* cont = (const xAOD::TrackParticleContainer* ) (xAODwrk->tmpListTracks[ii]->container() );
882 TEL.setStorableObject(*cont);
883 tmpVertex->addTrackAtVertex(TEL,1.);
884 }
885 }
886
887 finalVertices.push_back(tmpVertex);
888 ngoodVertices_final++;
889 if(nth==1) n1trVrt++;
890
891 if(isPrimaryVertex && m_multiWithPrimary ){ // skip primary vertex if present
892 isPrimaryVertex = false; // for next vertices in the loop
893 continue;
894 }
895
896 vertexMom += vrt.vertexMom;
897
898 } // end for(const auto& vrt : goodVertices)
899
900 if(m_fillHist){
901 Hists& h = getHists();
902 h.m_hb_goodvrtN->Fill(ngoodVertices_final+0.1, evtWgt);
903 h.m_curTup->ewgt = evtWgt;
904 if(n1trVrt) h.m_hb_goodvrtN->Fill(n1trVrt+15., evtWgt);
905 fillNVrtNTup(goodVertices, trkScore, primVrt, jetDir);
906 }
907
908 if(ngoodVertices_final==0){
909 return finalVertices;
910 }
911
912 //-----------------------------------------------------------------------------------
913 // Saving of results
914 //
915 //
916 double totMass = vertexMom.M();
917 results.push_back(totMass); //1st
918 double eRatio = vertexMom.E()/momentumJet.E();
919 results.push_back(eRatio<1. ? eRatio : 1.); //2nd
920 results.push_back(vrt2TrackNumber); //3rd
921 results.push_back(nTracks); //4th
922 if(xAODwrk) results.push_back(xAODwrk->listSecondTracks.size()); //5th
923 results.push_back(0.); //6th - not clear what to use here -> return 0.
924 results.push_back(momentumJet.E()); //7th
925
926 if(m_fillHist){
927 Hists& h = getHists();
928 h.m_hb_ratio->Fill( results[1], evtWgt);
929 h.m_hb_totmass->Fill( results[0], evtWgt);
930 h.m_hb_nvrt2->Fill( results[2], evtWgt);
931 h.m_hb_mom->Fill( momentumJet.Perp(), evtWgt);
932 }
933
934 return finalVertices;
935
936}
#define AmgSymMatrix(dim)
if(pathvar)
static void clean1TrVertexSet(std::vector< WrkVrt > *WrkVrtSet)
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
void disassembleVertex(std::vector< WrkVrt > *WrkVrtSet, int iv, std::vector< const Particle * > AllTracks, Trk::IVKalState &istate) const
void removeTrackFromVertex(std::vector< WrkVrt > *wrkVrtSet, std::vector< std::deque< long int > > *trkInVrt, long int &selectedTrack, long int &selectedVertex) const
static double jetProjDist(Amg::Vector3D &SecVrt, const xAOD::Vertex &primVrt, const TLorentzVector &JetDir)
static void trackClassification(std::vector< WrkVrt > *wrkVrtSet, std::vector< std::deque< long int > > *trkInVrt)
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
double mergeAndRefitVertices(std::vector< WrkVrt > *WrkVrtSet, int V1, int V2, WrkVrt &newvrt, std::vector< const Particle * > &AllTrackList, Trk::IVKalState &istate) 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)
bool check1TrVertexInPixel(const Track *p1, Amg::Vector3D &, std::vector< double > &) const
static int nTrkCommon(std::vector< WrkVrt > *WrkVrtSet, int V1, int V2)
void mergeAndRefitOverlapVertices(std::vector< WrkVrt > *WrkVrtSet, int V1, int V2, std::vector< const Particle * > &AllTrackLis, Trk::IVKalState &istate) const
std::vector< Trk::VxTrackAtVertex > & vxTrackAtVertex()
Non-const access to the VxTrackAtVertex vector.
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)

◆ improveVertexChi2()

template<class Particle>
double InDet::InDetVKalVxInJetTool::improveVertexChi2 ( std::vector< WrkVrt > * WrkVrtSet,
int V,
std::vector< const Particle * > & AllTracks,
Trk::IVKalState & istate,
bool ifCovV0 ) const
private

Definition at line 1513 of file BTagVrtSecMulti.cxx.

1517 {
1518 WrkVrt vrt = (*wrkVrtSet)[V];
1519 int NTrk = vrt.selTrk.size();
1520 if( NTrk<2 ) return 0.;
1521
1522 double Prob=TMath::Prob(vrt.chi2, 2*NTrk-3);
1523 //----Start track removal iterations
1524 while(Prob<0.01){
1525 NTrk = vrt.selTrk.size();
1526 if(NTrk==2) return Prob;
1527
1528 int SelT = -1;
1529 double Chi2Max = 0.;
1530 for(int i = 0; i<NTrk; i++){
1531 double Chi2 = vrt.chi2PerTrk[i];
1532 if(Chi2>Chi2Max){
1533 Chi2Max = Chi2;
1534 SelT = i;
1535 }
1536 }
1537
1538 if (SelT<0) return 0;
1539 vrt.detachedTrack=vrt.selTrk[SelT];
1540 vrt.selTrk.erase( vrt.selTrk.begin() + SelT ); //remove track
1541 StatusCode sc = refitVertex(wrkVrtSet, V, AllTrackList, istate, ifCovV0);
1542 if(sc.isFailure()) return 0.;
1543
1544 Prob = TMath::Prob(vrt.chi2, 2*(NTrk-1)-3);
1545 }
1546 return Prob;
1547 }

◆ initialize()

StatusCode InDet::InDetVKalVxInJetTool::initialize ( )
overridevirtual

Definition at line 43 of file InDetVKalVxInJetTool.cxx.

43 {
44 ATH_MSG_DEBUG("InDetVKalVxInJetTool initialize() called");
45
47 ATH_CHECK(m_trackClassificator.retrieve( DisableTool{!m_useTrackClassificator} ));
48 if(!m_useTrackClassificator) ATH_MSG_DEBUG("TrackClassificator disabled");
49
53 ATH_MSG_DEBUG("Using InDetEtaDependentCutsSvc. Individual inclusive track selections from config not used");
54 }
55 else{
56 ATH_MSG_DEBUG("Using individual inclusive track selections from config");
57 }
58
59 if (m_fitter.retrieve().isFailure()) {
60 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) << "Could not find Trk::TrkVKalVrtFitter" << endmsg;
61 return StatusCode::SUCCESS;
62 } else {
63 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) << "InDetVKalVxInJetTool TrkVKalVrtFitter found" << endmsg;
64 }
65 m_fitSvc = dynamic_cast<Trk::TrkVKalVrtFitter*>(&(*m_fitter));
66 if(!m_fitSvc){
67 if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<<" No implemented Trk::ITrkVKalVrtFitter interface" << endmsg;
68 return StatusCode::SUCCESS;
69 }
70
71 ATH_CHECK( m_eventInfoKey.initialize() );
72 //------------------------------------------
73 if(msgLvl(MSG::DEBUG)) ATH_CHECK(m_timingProfile.retrieve());
74//------------------------------------------
75// Chose whether IBL is installed
76 if(m_existIBL){ // 4-layer pixel detector
77 if( m_beampipeR==0.) m_beampipeR=24.0;
78 if( m_rLayerB ==0.) m_rLayerB =34.0;
79 if( m_rLayer1 ==0.) m_rLayer1 =51.6;
80 if( m_rLayer2 ==0.) m_rLayer2 =90.0;
81 m_rLayer3 =122.5;
82 } else { // 3-layer pixel detector
83 if( m_beampipeR==0.) m_beampipeR=29.4;
84 if( m_rLayerB ==0.) m_rLayerB =51.5;
85 if( m_rLayer1 ==0.) m_rLayer1 =90.0;
86 if( m_rLayer2 ==0.) m_rLayer2 =122.5;
87 }
88
89 if(m_fillHist){
90 if (Gaudi::Concurrency::ConcurrencyFlags::numThreads() > 1) {
91 ATH_MSG_FATAL("Filling histograms not supported in MT jobs.");
92 return StatusCode::FAILURE;
93 }
94
95 SmartIF<ITHistSvc> hist_root{Gaudi::svcLocator()->service("THistSvc")};
96 ATH_CHECK(hist_root.isValid());
97 ATH_MSG_DEBUG( "InDetVKalVxInJetTool Histograms found" );
98
99 std::string histDir;
100 if(m_multiVertex) histDir="/file1/stat/MSVrtInJet"+name()+"/";
101 else histDir="/file1/stat/SVrtInJet"+name()+"/";
102 m_h = std::make_unique<Hists>();
103 ATH_CHECK( m_h->book (*hist_root, histDir) );
104
105//-------------------------------------------------------
106 }
107
109
111 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Negative TAG is requested! " << endmsg;
112 if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Not compatible with negativeTAIL option, so getNegativeTail is set to FALSE." << endmsg;
113 m_getNegativeTail=false;
114 }
115
116 for(int ntv=2; ntv<=10; ntv++) m_chiScale[ntv]=TMath::ChisquareQuantile(0.9,2.*ntv-3.)/ntv;
118 for(int ntv=2; ntv<=10; ntv++) m_chiScale[ntv]/=m_chiScale[0];
119
122
124
125 ATH_CHECK(detStore()->retrieve(m_beamPipeMgr, "BeamPipe"));
126 ATH_CHECK(detStore()->retrieve(m_pixelManager, "ITkPixel"));
127
128 InDetMaterialVeto matVeto(m_beamPipeMgr, m_pixelManager);
129
130 m_ITkPixMaterialMap = matVeto.ITkPixMaterialMap();
131
132 }
133
134 return StatusCode::SUCCESS;
135
136 }
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
static const Attributes_t empty
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
const BeamPipeDetectorManager * m_beamPipeMgr
ToolHandle< Trk::IVertexFitter > m_fitter
const InDetDD::PixelDetectorManager * m_pixelManager

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ insideMatLayer()

bool InDet::InDetVKalVxInJetTool::insideMatLayer ( float xvt,
float yvt ) const
private

Definition at line 109 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

110 {
111 float R = std::hypot(xvt, yvt);
112 if(m_existIBL){ // 4-layer pixel detector
113 if( std::abs(R-m_beampipeR)< 1.0) return true; // Beam Pipe removal
114 if( std::abs(R-m_rLayerB) < 2.5) return true;
115 if( std::abs(R-m_rLayer1) < 3.0) return true;
116 if( std::abs(R-m_rLayer2) < 3.0) return true;
117 }else{ // 3-layer pixel detector
118 if( std::abs(R-m_beampipeR)< 1.5) return true; // Beam Pipe removal
119 if( std::abs(R-m_rLayerB) < 3.5) return true;
120 if( std::abs(R-m_rLayer1) < 4.0) return true;
121 if( std::abs(R-m_rLayer2) < 5.0) return true;
122 }
123 return false;
124 }

◆ isPart()

bool InDet::InDetVKalVxInJetTool::isPart ( std::deque< long int > test,
std::deque< long int > base )
staticprivate

Definition at line 1597 of file BTagVrtSecMulti.cxx.

1598 {
1599 std::deque<long int>::iterator trk = test.begin();
1600 for(trk = test.begin(); trk!=test.end(); ++trk){
1601 if(std::find(base.begin(), base.end(), (*trk)) == base.end()) return false; //element not found => test is not part of base
1602 }
1603 return true;
1604 }
std::string base
Definition hcg.cxx:83

◆ jetProjDist()

double InDet::InDetVKalVxInJetTool::jetProjDist ( Amg::Vector3D & SecVrt,
const xAOD::Vertex & primVrt,
const TLorentzVector & JetDir )
staticprivate

Definition at line 1606 of file BTagVrtSecMulti.cxx.

1607 {
1608 Amg::Vector3D vv = SecVrt-primVrt.position();
1609 return ( vv.x()*jetDir.X()+vv.y()*jetDir.Y()+vv.z()*jetDir.Z() )/ jetDir.P();
1610 }

◆ makeVrtCovMatrix()

Amg::MatrixX InDet::InDetVKalVxInJetTool::makeVrtCovMatrix ( std::vector< double > & ErrorMatrix)
staticprivate

Definition at line 511 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

513 {
514 Amg::MatrixX vrtCovMtx(3,3);
515 vrtCovMtx(0,0) = errorMatrix[0];
516 vrtCovMtx(0,1) = vrtCovMtx(1,0) = errorMatrix[1];
517 vrtCovMtx(1,1) = errorMatrix[2];
518 vrtCovMtx(0,2) = vrtCovMtx(2,0) = errorMatrix[3];
519 vrtCovMtx(1,2) = vrtCovMtx(2,1) = errorMatrix[4];
520 vrtCovMtx(2,2) = errorMatrix[5];
521 return vrtCovMtx;
522 }
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.

◆ massV0()

double InDet::InDetVKalVxInJetTool::massV0 ( std::vector< std::vector< double > > & trkAtVrt,
double massP,
double massPi )
staticprivate

Definition at line 292 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

295 {
296 double ap1=1./std::abs(trkAtVrt[0][2]);
297 double ap2=1./std::abs(trkAtVrt[1][2]);
298 CxxUtils::sincos phi1 (trkAtVrt[0][0]);
299 CxxUtils::sincos theta1(trkAtVrt[0][1]);
300 CxxUtils::sincos phi2 (trkAtVrt[1][0]);
301 CxxUtils::sincos theta2(trkAtVrt[1][1]);
302 double px = phi1.cs*theta1.sn*ap1
303 + phi2.cs*theta2.sn*ap2;
304 double py = phi1.sn*theta1.sn*ap1
305 + phi2.sn*theta2.sn*ap2;
306 double pz = theta1.cs*ap1
307 + theta2.cs*ap2;
308 double ee= (ap1 > ap2) ?
309 (std::sqrt(ap1*ap1+massP*massP)+std::sqrt(ap2*ap2+massPi*massPi)):
310 (std::sqrt(ap2*ap2+massP*massP)+std::sqrt(ap1*ap1+massPi*massPi));
311 double test=(ee-pz)*(ee+pz)-px*px-py*py;
312 return test>0 ? std::sqrt(test) : 0.;
313 }

◆ MaxOfShared()

double InDet::InDetVKalVxInJetTool::MaxOfShared ( std::vector< WrkVrt > * WrkVrtSet,
std::vector< std::deque< long int > > * trkInVrt,
long int & selectedTrack,
long int & selectedVertex )
staticprivate

Definition at line 1101 of file BTagVrtSecMulti.cxx.

1106 {
1107 long int NTrack = TrkInVrt->size();
1108 double MaxOf = -999999999, SelectedProb = -1.;
1109 int NShareMax = 0;
1110 for(const auto& trk : (*TrkInVrt)){
1111 int NVrt = trk.size(); // Number of vertices for this track
1112 if(NVrt > NShareMax) NShareMax=NVrt;
1113 }
1114 if(NShareMax<=1) return MaxOf; // No shared tracks
1115
1116 for(int it = 0; it<NTrack; it++) {
1117 int NVrt = (*TrkInVrt)[it].size(); // Number of vertices for this track
1118 if( NVrt <= 1 ) continue; // Should ALWAYS be checked for safety
1119 if( NVrt < NShareMax ) continue; // Not a shared track with maximal sharing
1120
1121 int N2trVrt = 0;
1122 for(auto &vrtn : (*TrkInVrt)[it] ){
1123 if((*wrkVrtSet).at(vrtn).selTrk.size()==2) N2trVrt++;
1124 } //count number of 2-track vertices
1125
1126 for(const auto& VertexNumber : (*TrkInVrt)[it]){
1127 const WrkVrt& vrt = (*wrkVrtSet).at(VertexNumber);
1128 if(!vrt.Good) continue;
1129 int NTrkInVrt = vrt.selTrk.size();
1130 if( NTrkInVrt <= 1) continue; // one track vertex - nothing to do
1131 if(N2trVrt>0 && N2trVrt<NShareMax && NTrkInVrt>2) continue; // Mixture of multi-track and 2-track vrts. Skip multi-track then.
1132
1133 for(int itmp = 0; itmp<NTrkInVrt; itmp++){
1134 if( vrt.selTrk[itmp] == it ) { // Track found.
1135 double Chi2Red = vrt.chi2PerTrk.at(itmp); // Normal Chi2 seems the best
1136 if(NTrkInVrt==2){
1137 Chi2Red = vrt.chi2/2.; //VK 2track vertices with Normal Chi2Red
1138 if(vrt.vertexMom.M()>c_vrtBCMassLimit) Chi2Red = 100.; //VK break immediately very heavy 2tr vertices
1139 }
1140
1141 double prob_vrt = TMath::Prob(vrt.chi2, 2*vrt.selTrk.size()-3);
1142 if( MaxOf < Chi2Red ){
1143 if(MaxOf>0 && prob_vrt>0.01 && SelectedProb<0.01) continue; // Don't disassemble good vertices if a bad one is present
1144 MaxOf = Chi2Red;
1145 selectedTrack = it;
1146 selectedVertex = VertexNumber;
1147 SelectedProb = prob_vrt;
1148 }
1149 }
1150 }
1151
1152 } // end for(const auto& VertexNumber)
1153
1154 } // end for(int it = 0; it<NTrack; it++)
1155
1156 //-- Additional check for a common track in 2tr-2tr/Ntr vertex topology
1157 if( (*TrkInVrt)[selectedTrack].size() == 2){
1158 int v1 = (*TrkInVrt)[selectedTrack][0];
1159 int v2 = (*TrkInVrt)[selectedTrack][1];
1160 const WrkVrt& vrt1 = (*wrkVrtSet)[v1];
1161 const WrkVrt& vrt2 = (*wrkVrtSet)[v2];
1162 double prb1 = TMath::Prob(vrt1.chi2, 2*vrt1.selTrk.size()-3);
1163 double prb2 = TMath::Prob(vrt2.chi2, 2*vrt2.selTrk.size()-3);
1164 double dst1 = vrt1.projectedVrt;
1165 double dst2 = vrt2.projectedVrt;
1166
1167 if(prb1>0.05 && prb2>0.05){
1168 if(vrt1.selTrk.size()==2 && vrt2.selTrk.size()==2){
1169 if (selectedVertex==v1 && dst2<dst1) selectedVertex = v2; // Swap to remove the closest to PV vertex
1170 else if(selectedVertex==v2 && dst1<dst2) selectedVertex = v1; // Swap to remove the closest to PV vertex
1171
1172 double M1 = vrt1.vertexMom.M();
1173 double M2 = vrt2.vertexMom.M();
1174 if( M1>c_vrtBCMassLimit && M2<c_vrtBCMassLimit ) selectedVertex = v1;
1175 if( M1<c_vrtBCMassLimit && M2>c_vrtBCMassLimit ) selectedVertex = v2;
1176 }
1177
1178 if( vrt1.selTrk.size()+vrt2.selTrk.size() > 4){
1179 if( vrt1.selTrk.size()==2 && dst1>dst2) selectedVertex = v2;
1180 if( vrt2.selTrk.size()==2 && dst2>dst1) selectedVertex = v1;
1181 }
1182 }
1183 }
1184
1185 return MaxOf;
1186 }
size_t size() const
Number of registered mappings.

◆ mergeAndRefitOverlapVertices()

template<class Particle>
void InDet::InDetVKalVxInJetTool::mergeAndRefitOverlapVertices ( std::vector< WrkVrt > * WrkVrtSet,
int V1,
int V2,
std::vector< const Particle * > & AllTrackLis,
Trk::IVKalState & istate ) const
private

Definition at line 1388 of file BTagVrtSecMulti.cxx.

1391 {
1392 WrkVrt vrt1 = (*wrkVrtSet)[V1];
1393 WrkVrt vrt2 = (*wrkVrtSet)[V2];
1394 if(!vrt1.Good)return; //bad vertex
1395 if(!vrt2.Good)return; //bad vertex
1396
1397 WrkVrt newvrt;
1398 newvrt.Good = true;
1399 if( nTrkCommon( wrkVrtSet, V1, V2)<2 )return; //No overlap
1400 //- V1 should become ref. vertex. Another Vrt tracks will be added to it.
1401 if( vrt1.selTrk.size() < vrt2.selTrk.size() ) std::swap(V1,V2); //Vertex with NTrk=max is chosen
1402 else if( vrt1.selTrk.size() == vrt2.selTrk.size() ){
1403 if( vrt1.chi2 > vrt2.chi2 ) std::swap(V1,V2); // Vertex with minimal Chi2 is chosen
1404 }
1405
1406 //- Fill base track list for new vertex
1407 newvrt.selTrk.resize( vrt1.selTrk.size() );
1408 std::copy(vrt1.selTrk.begin(), vrt1.selTrk.end(), newvrt.selTrk.begin());
1409 //- Identify non-common tracks in second vertex
1410 std::vector<int> noncommonTrk(0);
1411 for(auto &it : vrt2.selTrk){
1412 if( std::find(vrt1.selTrk.begin(), vrt1.selTrk.end(), it) == vrt1.selTrk.end() ) noncommonTrk.push_back(it);
1413 }
1414
1415 // Try to add non-common tracks one by one
1416 std::vector<const Particle*> fitTrackList(0);
1417 std::vector<int> detachedTrk(0);
1418 StatusCode sc;
1419 WrkVrt bestVrt;
1420 bool foundMerged = false;
1421
1422 for(auto nct : noncommonTrk){
1423 fitTrackList.clear();
1424 for(const auto& trk : newvrt.selTrk) fitTrackList.push_back( AllTrackList[trk] );
1425 fitTrackList.push_back( AllTrackList.at(nct) );
1426
1427 m_fitSvc->setApproximateVertex(vrt1.vertex[0], vrt1.vertex[1], vrt1.vertex[2], istate);
1428 sc = VKalVrtFitBase(fitTrackList, newvrt.vertex, newvrt.vertexMom,
1429 newvrt.vertexCharge, newvrt.vertexCov,
1430 newvrt.chi2PerTrk, newvrt.trkAtVrt, newvrt.chi2,
1431 istate, false);
1432 if( sc.isFailure() || TMath::Prob(newvrt.chi2, 2*newvrt.selTrk.size()+2-3)<0.001 ) {
1433 detachedTrk.push_back(nct);
1434 continue;
1435 }
1436
1437 newvrt.selTrk.push_back(nct); // Compatible track. Add to common vertex.
1438 bestVrt = newvrt;
1439 foundMerged = true;
1440 }
1441
1442 if(foundMerged) vrt1=bestVrt;
1443 vrt2.Good=false;
1444
1445 // Now detached tracks
1446 if(detachedTrk.size()>1){
1447 WrkVrt nVrt;
1448 fitTrackList.clear();
1449 nVrt.selTrk.clear();
1450
1451 for(auto nct : detachedTrk){
1452 fitTrackList.push_back( AllTrackList[nct] );
1453 nVrt.selTrk.push_back(nct);
1454 }
1455
1456 m_fitSvc->setApproximateVertex(vrt2.vertex[0], vrt2.vertex[1], vrt2.vertex[2], istate);
1457 sc = VKalVrtFitBase(fitTrackList, nVrt.vertex, nVrt.vertexMom,
1458 nVrt.vertexCharge, nVrt.vertexCov,
1459 nVrt.chi2PerTrk, nVrt.trkAtVrt, nVrt.chi2,
1460 istate, false);
1461 if(sc.isSuccess()) (*wrkVrtSet).push_back(nVrt);
1462
1463 } else if( detachedTrk.size()==1 ){
1464 bool tFound = false;
1465 for( auto &vrt : (*wrkVrtSet) ){
1466 if( !vrt.Good || vrt.selTrk.size()<2 ) continue;
1467 if( std::find(vrt.selTrk.begin(), vrt.selTrk.end(), detachedTrk[0]) != vrt.selTrk.end() ) {
1468 tFound=true; break;
1469 }
1470 }
1471
1472 if(!tFound) { //Track is not present in other vertices.
1473 double Chi2min = 1.e9;
1474 int selectedTrk = -1;
1475 WrkVrt saveVrt;
1476 fitTrackList.resize(2);
1477 fitTrackList[0]= AllTrackList[detachedTrk[0]];
1478
1479 for(auto trk : vrt2.selTrk){
1480 if(trk==detachedTrk[0]) continue;
1481 WrkVrt nVrt;
1482 nVrt.Good = true;
1483 fitTrackList[1] = AllTrackList[trk];
1484 m_fitSvc->setApproximateVertex(vrt2.vertex[0], vrt2.vertex[1], vrt2.vertex[2], istate);
1485 sc = VKalVrtFitBase(fitTrackList, nVrt.vertex, nVrt.vertexMom,
1486 nVrt.vertexCharge, nVrt.vertexCov,
1487 nVrt.chi2PerTrk, nVrt.trkAtVrt, nVrt.chi2,
1488 istate, false);
1489 if(sc.isSuccess() && nVrt.chi2<Chi2min) {
1490 Chi2min = nVrt.chi2;
1491 saveVrt = nVrt;
1492 selectedTrk = trk;
1493 }
1494 }
1495
1496 if(Chi2min<1.e9){
1497 saveVrt.selTrk.resize(1);
1498 saveVrt.selTrk[0] = detachedTrk[0];
1499 saveVrt.detachedTrack = selectedTrk;
1500 saveVrt.vertexMom = momAtVrt(saveVrt.trkAtVrt[0]); //redefine vertex momentum
1501 (*wrkVrtSet).push_back(saveVrt);
1502 }
1503 } // end if(!tFound)
1504
1505 } // end else if( detachedTrk.size()==1 )
1506
1507 }
TLorentzVector momAtVrt(const std::vector< double > &inpTrk) const

◆ mergeAndRefitVertices()

template<class Particle>
double InDet::InDetVKalVxInJetTool::mergeAndRefitVertices ( std::vector< WrkVrt > * WrkVrtSet,
int V1,
int V2,
WrkVrt & newvrt,
std::vector< const Particle * > & AllTrackList,
Trk::IVKalState & istate ) const
private

Definition at line 1339 of file BTagVrtSecMulti.cxx.

1343 {
1344 WrkVrt vrt1 = (*wrkVrtSet)[V1];
1345 WrkVrt vrt2 = (*wrkVrtSet)[V2];
1346 if(!vrt1.Good) return -1.; //bad vertex
1347 if(!vrt2.Good) return -1.; //bad vertex
1348
1349 newvrt.Good = true;
1350 int NTrk_V1 = vrt1.selTrk.size();
1351 int NTrk_V2 = vrt2.selTrk.size();
1352 newvrt.selTrk.resize(NTrk_V1+NTrk_V2);
1353 std::copy(vrt1.selTrk.begin(), vrt1.selTrk.end(), newvrt.selTrk.begin());
1354 std::copy(vrt2.selTrk.begin(), vrt2.selTrk.end(), newvrt.selTrk.begin()+NTrk_V1);
1355
1356 std::deque<long int>::iterator TransfEnd ;
1357 sort( newvrt.selTrk.begin(), newvrt.selTrk.end() );
1358 TransfEnd = unique( newvrt.selTrk.begin(), newvrt.selTrk.end() );
1359 newvrt.selTrk.erase( TransfEnd, newvrt.selTrk.end());
1360
1361 std::vector<const Particle*> fitTrackList(0);
1362 for(const auto& trk : newvrt.selTrk) fitTrackList.push_back( AllTrackList[trk] );
1363
1364 m_fitSvc->setApproximateVertex( 0.5*(vrt1.vertex[0]+vrt2.vertex[0]),
1365 0.5*(vrt1.vertex[1]+vrt2.vertex[1]),
1366 0.5*(vrt1.vertex[2]+vrt2.vertex[2]),
1367 istate);
1368
1369 StatusCode sc=VKalVrtFitBase(fitTrackList,
1370 newvrt.vertex,
1371 newvrt.vertexMom,
1372 newvrt.vertexCharge,
1373 newvrt.vertexCov,
1374 newvrt.chi2PerTrk,
1375 newvrt.trkAtVrt,
1376 newvrt.chi2,
1377 istate,
1378 false);
1379 if( sc.isFailure() ) return -1.;
1380 if( newvrt.chi2>500. ) return -1.; //VK protection
1381 if( newvrt.chi2PerTrk.size()==2) newvrt.chi2PerTrk[0] = newvrt.chi2PerTrk[1] = newvrt.chi2/2.;
1382 return TMath::Prob(newvrt.chi2, 2*newvrt.selTrk.size()-3);
1383 }
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
DataModel_detail::iterator< DVL > unique(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of unique for DataVector/List.

◆ minVrtVrtDist()

double InDet::InDetVKalVxInJetTool::minVrtVrtDist ( std::vector< WrkVrt > * WrkVrtSet,
int & V1,
int & V2 ) const
private

Definition at line 1264 of file BTagVrtSecMulti.cxx.

1266 {
1267 V1 = V2 = 0;
1268 for(auto& vrt : (*wrkVrtSet)){
1269 vrt.dCloseVrt = 1000000.;
1270 vrt.nCloseVrt = -1;
1271 }
1272 double foundMinVrtDst = 1000000.;
1273
1274 for(unsigned int iv = 0; iv<wrkVrtSet->size()-1; iv++) {
1275 WrkVrt vrt_i = (*wrkVrtSet)[iv];
1276 if( vrt_i.selTrk.size()< 2) continue; // Bad vertices
1277 if(!vrt_i.Good ) continue; // Bad vertices
1278
1279 for(unsigned int jv = iv+1; jv<wrkVrtSet->size(); jv++) {
1280 WrkVrt vrt_j = (*wrkVrtSet)[jv];
1281 if( vrt_j.selTrk.size()< 2) continue; // Bad vertices
1282 if(!vrt_j.Good ) continue; // Bad vertices
1283 double tmp = std::abs(vrt_i.vertex.x()-vrt_j.vertex.x())
1284 + std::abs(vrt_i.vertex.y()-vrt_j.vertex.y())
1285 + std::abs(vrt_i.vertex.z()-vrt_j.vertex.z());
1286 if(tmp>20.) continue;
1287
1288 double tmpDst = vrtVrtDist(vrt_i.vertex, vrt_i.vertexCov,
1289 vrt_j.vertex, vrt_j.vertexCov);
1290 if(tmpDst < foundMinVrtDst){
1291 foundMinVrtDst = tmpDst;
1292 V1 = iv;
1293 V2 = jv;
1294 }
1295 if(tmpDst < vrt_i.dCloseVrt){
1296 vrt_i.dCloseVrt = tmpDst;
1297 vrt_i.nCloseVrt = jv;
1298 }
1299 if(tmpDst < vrt_j.dCloseVrt){
1300 vrt_j.dCloseVrt=tmpDst;
1301 vrt_j.nCloseVrt=iv;
1302 }
1303
1304 }
1305 }
1306
1307 return foundMinVrtDst;
1308 }

◆ minVrtVrtDistNext()

double InDet::InDetVKalVxInJetTool::minVrtVrtDistNext ( std::vector< WrkVrt > * WrkVrtSet,
int & V1,
int & V2 )
staticprivate

Definition at line 1313 of file BTagVrtSecMulti.cxx.

1314 {
1315 V1 = 0; V2 = 0;
1316 double foundMinVrtDst = 1000000.;
1317
1318 for(unsigned int iv = 0; iv<wrkVrtSet->size()-1; iv++) {
1319 const WrkVrt& vrt_i = (*wrkVrtSet)[iv];
1320 if(vrt_i.selTrk.size()< 2) continue; // Bad vertex
1321 if(vrt_i.nCloseVrt==-1) continue; // Used vertex
1322
1323 if(vrt_i.dCloseVrt<foundMinVrtDst){
1324 int vtmp = vrt_i.nCloseVrt;
1325 if((*wrkVrtSet)[vtmp].nCloseVrt==-1) continue; // Close vertex to given [iv] one is modified already
1326 foundMinVrtDst = vrt_i.dCloseVrt;
1327 V1 = iv;
1328 V2 = vtmp;
1329 }
1330 }
1331
1332 return foundMinVrtDst;
1333 }

◆ momAtVrt()

TLorentzVector InDet::InDetVKalVxInJetTool::momAtVrt ( const std::vector< double > & inpTrk) const
private

Definition at line 385 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

387 {
388 double api=1./std::abs(inpTrk[2]);
389 CxxUtils::sincos phi (inpTrk[0]);
390 CxxUtils::sincos theta(inpTrk[1]);
391 double px = phi.cs * theta.sn*api;
392 double py = phi.sn * theta.sn*api;
393 double pz = theta.cs*api;
394 double ee = std::sqrt( api*api + m_massPi*m_massPi);
395 return {px,py,pz,ee};
396 }
Scalar phi() const
phi method
Scalar theta() const
theta method

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ notFromBC()

int InDet::InDetVKalVxInJetTool::notFromBC ( int PDGID)
staticprivate

Definition at line 606 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

606 {
607 int noBC=0;
608 if(PDGID<=0)return 1;
609 if(PDGID>600 && PDGID<4000)noBC=1;
610 if(PDGID<400 || PDGID>5600)noBC=1;
611 if(PDGID==513 || PDGID==523 || PDGID==533 || PDGID==543)noBC=1; //Remove tracks from B* (they are in PV)
612 if(PDGID==5114 || PDGID==5214 || PDGID==5224 || PDGID==5314 || PDGID==5324)noBC=1; //Remove tracks from B_Barions* (they are in PV)
613 //if(PDGID==413 || PDGID==423 || PDGID==433 )continue; //Keep tracks from D* (they are from B vertex)
614 //if(PDGID==4114 || PDGID==4214 || PDGID==4224 || PDGID==4314 || PDGID==4324)continue;
615 return noBC;
616 }

◆ nTrkCommon()

int InDet::InDetVKalVxInJetTool::nTrkCommon ( std::vector< WrkVrt > * WrkVrtSet,
int V1,
int V2 )
staticprivate

Definition at line 1239 of file BTagVrtSecMulti.cxx.

1242 {
1243 WrkVrt vrt1 = (*wrkVrtSet).at(V1);
1244 WrkVrt vrt2 = (*wrkVrtSet).at(V2);
1245 int NTrk_V1 = vrt1.selTrk.size(); if( NTrk_V1< 2) return 0; // Bad vertex
1246 int NTrk_V2 = vrt2.selTrk.size(); if( NTrk_V2< 2) return 0; // Bad vertex
1247
1248 int nTrkCom = 0;
1249 if(NTrk_V1 < NTrk_V2){
1250 for(const auto& trk : vrt1.selTrk){
1251 if(std::find(vrt2.selTrk.begin(), vrt2.selTrk.end(), trk) != vrt2.selTrk.end()) nTrkCom++;
1252 }
1253 } else {
1254 for(const auto& trk : vrt2.selTrk){
1255 if( std::find(vrt1.selTrk.begin(), vrt1.selTrk.end(), trk) != vrt1.selTrk.end()) nTrkCom++;
1256 }
1257 }
1258 return nTrkCom;
1259 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ printWrkSet()

void InDet::InDetVKalVxInJetTool::printWrkSet ( const std::vector< WrkVrt > * WrkSet,
const std::string & name ) const
private

Definition at line 80 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

80 {
81 int nGoodV=0;
82 for(const auto & iv : *wrkVrtSet) {
83 std::ostringstream ostr1,ostr2;
84 for(long kk : iv.selTrk) {ostr1<<kk<<", ";}
85 for(int kk=0; kk<(int)iv.selTrk.size(); kk++) {ostr2<<momAtVrt(iv.trkAtVrt[kk]).Perp()<<", ";}
86 ATH_MSG_DEBUG(name
87 <<"= "<<iv.vertex[0]
88 <<", "<<iv.vertex[1]
89 <<", "<<iv.vertex[2]
90 <<" NTrk="<<iv.selTrk.size()
91 <<" is good="<<std::boolalpha<<iv.Good<<std::noboolalpha
92 <<" Chi2="<<iv.chi2
93 <<" Mass="<<iv.vertexMom.M()
94 <<" detached="<<iv.detachedTrack
95 <<" proj.dist="<<iv.projectedVrt
96 <<" trk="<<ostr1.str()<<" trk Pt="<<ostr2.str());
97 if(iv.Good)nGoodV++;
98 }
99 ATH_MSG_DEBUG(name<<" N="<<nGoodV);
100 }

◆ projSV_PV()

double InDet::InDetVKalVxInJetTool::projSV_PV ( const Amg::Vector3D & SV,
const xAOD::Vertex & PV,
const TLorentzVector & Jet )
staticprivate

Definition at line 103 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

104 {
105 TVector3 SV_PV( SV.x()-PV.x(), SV.y()-PV.y(), SV.z()-PV.z() );
106 return Jet.Vect().Unit()*SV_PV.Unit();
107 }
Jet_v1 Jet
Definition of the current "jet version".

◆ pTvsDir()

double InDet::InDetVKalVxInJetTool::pTvsDir ( const Amg::Vector3D & Dir,
const std::vector< double > & inpTrk )
staticprivate

Definition at line 333 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

335 {
336 double norm=std::hypot(dir.x(),dir.y(),dir.z());
337 double sx=dir.x()/norm; double sy=dir.y()/norm; double sz=dir.z()/norm;
338
339 double px=0.,py=0.,pz=0.; double scale;
340 double api=1./std::abs(inpTrk[2]);
341 CxxUtils::sincos phi (inpTrk[0]);
342 CxxUtils::sincos theta(inpTrk[1]);
343
344 px = phi.cs * theta.sn*api;
345 py = phi.sn * theta.sn*api;
346 pz = theta.cs*api;
347 scale = px*sx + py*sy + pz*sz;
348 px -= sx*scale;
349 py -= sy*scale;
350 pz -= sz*scale;
351 return std::hypot(px,py,pz);
352 }
static Double_t sz

◆ rankBTrk()

double InDet::InDetVKalVxInJetTool::rankBTrk ( double TrkPt,
double JetPt,
double Signif ) const
private

Definition at line 21 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

22 {
23 double p_prob=0.;
24 double s_prob=0.;
25 if(TrkPt > 0. && JetPt > 0.){
26 double coeffPt=10.;
27 double pfrac=(TrkPt-m_cutPt)/std::sqrt(JetPt);
28 p_prob= pfrac/(coeffPt+pfrac); // Old probability to be b-track
29 if (Signif == 0.) return p_prob; //should be less than some epsilon?
30 }
31 if( Signif != 0.) {
32 double coeffSig=1.0;
33 s_prob=(Signif-coeffSig)/Signif; // Old probability to be b-track
34 if(TrkPt + JetPt == 0.) return s_prob;
35 }
36 //----------------------------------Initial definition of selective variable
37 double contrib=0.4;
38 return (1.+contrib)*std::max(s_prob,0.)+(1.-contrib)*p_prob;
39 }

◆ refitVertex() [1/2]

template<class Particle>
StatusCode InDet::InDetVKalVxInJetTool::refitVertex ( std::vector< WrkVrt > * WrkVrtSet,
int selectedVertex,
std::vector< const Particle * > & selectedTracks,
Trk::IVKalState & istate,
bool ifCovV0 ) const
private

Definition at line 1551 of file BTagVrtSecMulti.cxx.

1556 {
1557 WrkVrt vrt = (*wrkVrtSet)[selectedVertex];
1558 int nth = vrt.selTrk.size();
1559 if(nth<2) return StatusCode::SUCCESS;
1560
1561 double vProb = refitVertex(vrt, selectedTracks, istate, ifCovV0);
1562 if(vProb<0) return StatusCode::FAILURE;
1563 else return StatusCode::SUCCESS;
1564 }

◆ refitVertex() [2/2]

template<class Particle>
double InDet::InDetVKalVxInJetTool::refitVertex ( WrkVrt & Vrt,
std::vector< const Particle * > & SelectedTracks,
Trk::IVKalState & istate,
bool ifCovV0 ) const
private

Definition at line 1568 of file BTagVrtSecMulti.cxx.

1572 {
1573 int nth = Vrt.selTrk.size();
1574 if(nth<2) return -1.;
1575
1576 std::vector<const Particle*> ListTracks(0);
1577 for(const auto& j : Vrt.selTrk) ListTracks.push_back( selectedTracks[j] );
1578 Vrt.Good = false;
1579 Vrt.chi2PerTrk.resize(nth);
1580 for(int i = 0; i < nth; i++) Vrt.chi2PerTrk[i]=100000.+i; //VK safety
1581
1582 m_fitSvc->setApproximateVertex(Vrt.vertex[0], Vrt.vertex[1], Vrt.vertex[2], istate);
1583 StatusCode SC = VKalVrtFitBase(ListTracks, Vrt.vertex, Vrt.vertexMom,
1584 Vrt.vertexCharge, Vrt.vertexCov,
1585 Vrt.chi2PerTrk, Vrt.trkAtVrt, Vrt.chi2,
1586 istate, ifCovV0);
1587 if(SC.isSuccess()) Vrt.Good = true;
1588 else{
1589 Vrt.Good = false;
1590 return -1.;
1591 }
1592
1593 if(Vrt.chi2PerTrk.size()==2) Vrt.chi2PerTrk[0] = Vrt.chi2PerTrk[1] = Vrt.chi2/2.;
1594 return TMath::Prob(Vrt.chi2, 2*nth-1);
1595 }
const float SC[NC]
Cross sections for Carbon.

◆ removeDoubleEntries()

template<class Trk>
void InDet::InDetVKalVxInJetTool::removeDoubleEntries ( std::vector< const Trk * > & ListTracks) const
private

Definition at line 584 of file InDetVKalVxInJetTool.h.

585 {
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());
590 }

◆ removeEntryInList()

template<class Trk>
void InDet::InDetVKalVxInJetTool::removeEntryInList ( std::vector< const Trk * > & ListTracks,
std::vector< float > & rank,
int Outlier ) const
private

Definition at line 575 of file InDetVKalVxInJetTool.h.

576 {
577 if(Outlier < 0 ) return;
578 if(Outlier >= (int)ListTracks.size() ) return;
579 ListTracks.erase( ListTracks.begin()+Outlier);
580 rank.erase( rank.begin()+Outlier);
581 }

◆ removeTrackFromVertex()

void InDet::InDetVKalVxInJetTool::removeTrackFromVertex ( std::vector< WrkVrt > * wrkVrtSet,
std::vector< std::deque< long int > > * trkInVrt,
long int & selectedTrack,
long int & selectedVertex ) const
private

Definition at line 1189 of file BTagVrtSecMulti.cxx.

1194 {
1195 int posInVrtFit = 0; //Position of selectedTrack in vertex fit track list.
1196 std::deque<long int>::iterator it;
1197 WrkVrt vrt = (*wrkVrtSet)[selectedVertex];
1198 std::deque<long int> trk = (*TrkInVrt).at(selectedTrack);
1199
1200 for(it = vrt.selTrk.begin(); it!=vrt.selTrk.end(); ++it) {
1201 if( (*it) == selectedTrack ) {
1202 vrt.selTrk.erase(it); break;
1203 }
1204 posInVrtFit++;
1205 }
1206
1207 for(it = trk.begin(); it!=trk.end(); ++it) {
1208 if( (*it) == selectedVertex ) {
1209 trk.erase(it); break;
1210 }
1211 }
1212
1213 vrt.detachedTrack = selectedTrack;
1214
1215 //Check if track is removed from 2tr vertex => then sharing of track left should also be decreased
1216 if( vrt.selTrk.size() == 1){
1217 long int LeftTrack = vrt.selTrk[0]; // track left in 1tr vertex
1218 for(it = (*TrkInVrt).at(LeftTrack).begin(); it!=(*TrkInVrt)[LeftTrack].end(); ++it) {
1219 if( (*it) == selectedVertex ) {
1220 (*TrkInVrt)[LeftTrack].erase(it); break;
1221 }
1222 }
1223
1224 if( TMath::Prob(vrt.chi2, 1) < 0.05 ) vrt.Good = false; // Not really good Chi2 for one-track vertex
1225 if( vrt.vertexMom.M()>c_vrtBCMassLimit) vrt.Good = false; // Vertex is too heavy
1226
1227 int ipos = 0;
1228 if(posInVrtFit==0) ipos = 1; // Position of remaining track in previous 2track vertex fit
1229 vrt.vertexMom = momAtVrt(vrt.trkAtVrt[ipos]); //Redefine vertexMom using remaining track
1230 if(!(*TrkInVrt)[LeftTrack].empty()) vrt.Good = false; //Vertex is declared false only if remaining track is still linked to another vertex
1231 vrt.trkAtVrt.erase(vrt.trkAtVrt.begin()+posInVrtFit); //Remove also TrkAtVrt
1232 }
1233
1234 }

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ select2TrVrt() [1/2]

template<class Track>
int InDet::InDetVKalVxInJetTool::select2TrVrt ( const EventContext & ctx,
std::vector< const Track * > & selectedTracks,
std::vector< const Track * > & tracksForFit,
const xAOD::Vertex & primVrt,
const TLorentzVector & jetDir,
std::vector< double > & inpMass,
int & nRefPVTrk,
std::vector< const Track * > & trkFromV0,
std::vector< const Track * > & listSecondTracks,
compatibilityGraph_t & compatibilityGraph,
float evtWgt ) const

Definition at line 562 of file BTagVrtSec.cxx.

574 {
576 std::vector<Vrt2Tr> all2TrVrt(0);
577 int NTracks = static_cast<int>( selectedTracks.size() );
578 std::vector< std::vector<float> > trkScore(NTracks);
579
580 //
581 // Impact parameters with sign calculations
582 //
583 for (int i=0; i<NTracks; i++) {
584 std::vector<double> Impact, ImpactError;
585 double TrkSig3D = m_fitSvc->VKalGetImpact(ctx, selectedTracks[i], primVrt.position(), 1, Impact, ImpactError);
586
587 AmgVector(5) tmpPerigee = getPerigee(selectedTracks[i])->parameters();
588 if( sin(tmpPerigee[2]-jetDir.Phi())*Impact[0] < 0 ) Impact[0] = -std::abs(Impact[0]);
589 else Impact[0] = std::abs(Impact[0]);
590 if( (tmpPerigee[3]-jetDir.Theta())*Impact[1] < 0 ) Impact[1] = -std::abs(Impact[1]);
591 else Impact[1] = std::abs(Impact[1]);
592
593 double SignifR = Impact[0]/ std::sqrt(ImpactError[0]);
594 double SignifZ = Impact[1]/ std::sqrt(ImpactError[2]);
595 int hitIBL=0, hitBL=0, hL1=0, nLays=0;
596 getPixelLayers(selectedTracks[i] , hitIBL, hitBL, hL1, nLays );
597
598 if(m_useTrackClassificator) trkScore[i] = m_trackClassificator->trkTypeWgts(ctx, selectedTracks[i], primVrt, jetDir);
599
600 if(m_fillHist){
601 Hists& h = getHists();
602 h.m_hb_impactR->Fill(SignifR, evtWgt);
603 h.m_hb_impactZ->Fill(SignifZ, evtWgt);
604 h.m_hb_impactRZ->Fill(SignifR, SignifZ, evtWgt);
605 h.m_hb_impact->Fill(TrkSig3D, evtWgt);
606
607 if(i<DevTuple::maxNTrk && h.m_curTup){
608 h.m_curTup->etatrk[i] = selectedTracks[i]->eta();
609 h.m_curTup->p_prob[i] = rankBTrk(selectedTracks[i]->pt(),jetDir.Pt(),0.);
610 h.m_curTup->s_prob[i] = rankBTrk(0.,0.,TrkSig3D);
611 h.m_curTup->SigR[i] = SignifR;
612 h.m_curTup->SigZ[i] = SignifZ;
613 h.m_curTup->d0[i] = Impact[0];
614 h.m_curTup->Z0[i] = Impact[1];
615 h.m_curTup->idMC[i] = getG4Inter(selectedTracks[i]);
616 if(getIdHF(selectedTracks[i])) h.m_curTup->idMC[i] = 2;
617 if(getMCPileup(selectedTracks[i])) h.m_curTup->idMC[i] = 3;
618 h.m_curTup->wgtB[i] = m_useTrackClassificator ? trkScore[i][0] : -1.;
619 h.m_curTup->wgtL[i] = m_useTrackClassificator ? trkScore[i][1] : -1.;
620 h.m_curTup->wgtG[i] = m_useTrackClassificator ? trkScore[i][2] : -1.;
621 h.m_curTup->sig3D[i] = TrkSig3D;
622 h.m_curTup->chg[i] = tmpPerigee[4]<0. ? 1: -1;
623 h.m_curTup->ibl[i] = hitIBL;
624 h.m_curTup->bl[i] = hitBL;
625 h.m_curTup->fhitR[i] = selectedTracks[i]->radiusOfFirstHit();
626 TLorentzVector TLV = selectedTracks[i]->p4();
627 h.m_curTup->pTvsJet[i] = TLV.Perp(jetDir.Vect());
628 TLorentzVector normJ;
629 normJ.SetPtEtaPhiM(1.,jetDir.Eta(),jetDir.Phi(),0.);
630 h.m_curTup->prodTJ[i] = std::sqrt(std::abs(TLV.Dot(normJ)));
631 h.m_curTup->nVrtT[i] = 0;
632 }
633 }
634
635 } // end for (int i=0; i<NTracks; i++)
636
637 if(m_fillHist){
638 Hists& h = getHists();
639 h.m_curTup->ptjet = jetDir.Perp();
640 h.m_curTup->etajet = jetDir.Eta();
641 h.m_curTup->phijet = jetDir.Phi();
642 h.m_curTup->nTrkInJet = std::min(NTracks,DevTuple::maxNTrk);
643 }
644
645 listSecondTracks.reserve(2*NTracks); // Reserve memory for single vertex
646
647 Amg::Vector3D iniVrt(0.,0.,0.);
648
649 for (int i=0; i<NTracks-1; i++) {
652 if(trkScore[i][2] > 0.75) continue; //---- Use classificator to remove Pileup+Interactions only
653 }
654 else{
655 if(trkScore[i][0]==0.) continue; //Explicitly remove non-classified tracks
656 }
657 }
658
659 for (int j=i+1; j<NTracks; j++) {
661 if(m_multiWithPrimary) { // For multi-vertex with primary one search
662 if(trkScore[j][2] > 0.75)continue;
663 }else{
664 if(trkScore[j][0]==0.)continue;
665 if(getVrtScore(i,j,trkScore) < m_cutBVrtScore) continue;
666 }
667 }
668
669 int badTracks = 0; //Bad tracks identification
670 tracksForFit.resize(2);
671 std::unique_ptr<Trk::IVKalState> state = m_fitSvc->makeState(ctx);
672 m_fitSvc->setMassInputParticles( inpMass, *state ); // Use pion masses for fit
673 tracksForFit[0] = selectedTracks[i];
674 tracksForFit[1] = selectedTracks[j];
675
676 Vrt2Tr tmpVrt;
677 sc = VKalVrtFitFastBase(tracksForFit, tmpVrt.fitVertex, *state); // Fast crude estimation
678 if( sc.isFailure() || tmpVrt.fitVertex.perp() > m_rLayer2*2. ) { // No initial estimation
679 iniVrt = primVrt.position();
680 if(m_multiWithPrimary) iniVrt.setZero();
681 } else {
682 double jetVrtDir = projSV_PV(tmpVrt.fitVertex,primVrt,jetDir);
683 if(m_multiWithPrimary) jetVrtDir = std::abs(jetVrtDir); // Always positive when primary vertex is seeked for
684 if( jetVrtDir>0. ) iniVrt = tmpVrt.fitVertex; // Good initial estimation
685 else iniVrt = primVrt.position();
686 }
687
688 m_fitSvc->setApproximateVertex(iniVrt.x(), iniVrt.y(), iniVrt.z(),*state);
689 tmpVrt.i = i;
690 tmpVrt.j = j;
691 m_fitSvc->setRobustness(6, *state);
692
693 long int Charge;
694 sc = VKalVrtFitBase(tracksForFit, tmpVrt.fitVertex, tmpVrt.momentum, Charge,
695 tmpVrt.errorMatrix, tmpVrt.chi2PerTrk, tmpVrt.trkAtVrt, tmpVrt.chi2,
696 *state, true);
697 if(sc.isFailure()) continue; // No fit
698 if(tmpVrt.chi2 > m_sel2VrtChi2Cut) continue; // Bad Chi2
699 if(std::abs(tmpVrt.fitVertex.z())> 650.) continue; // definitely outside of Pixel detector
700 double Dist2D = tmpVrt.fitVertex.perp();
701 if(Dist2D > 180. ) continue; // can't be from B decay
702
703 double vrErr = vrtRadiusError(tmpVrt.fitVertex, tmpVrt.errorMatrix);
705 if(vrErr>1.5&&getVrtScore(i,j,trkScore) < 4.*m_cutBVrtScore) continue;
706 }
707
708 double mass_PiPi = tmpVrt.momentum.M();
709 if(mass_PiPi > m_vrt2TrMassLimit) continue; // can't be from B decay
710 vrtVrtDist(primVrt, tmpVrt.fitVertex, tmpVrt.errorMatrix, tmpVrt.signif3D);
711 vrtVrtDist2D(primVrt, tmpVrt.fitVertex, tmpVrt.errorMatrix, tmpVrt.signif2D);
712
713 TVector3 SVmPV(tmpVrt.fitVertex.x()-primVrt.x(),
714 tmpVrt.fitVertex.y()-primVrt.y(),
715 tmpVrt.fitVertex.z()-primVrt.z());
716 double jetVrtDir = SVmPV.Dot(jetDir.Vect());
717 if(jetVrtDir > 0) {tmpVrt.dRSVPV = jetDir.DeltaR(TLorentzVector(SVmPV, 1.));} //DeltaR SV-PV vs jet
718 else{tmpVrt.dRSVPV = jetDir.DeltaR(TLorentzVector(-SVmPV, 1.));}
719 if(tmpVrt.dRSVPV > m_coneForTag ) continue; // SV is outside of the jet cone
720
721 double vPos = SVmPV.Dot(tmpVrt.momentum.Vect())/tmpVrt.momentum.Rho();
722 if((!m_multiWithPrimary) &&(!m_getNegativeTail) &&( ((!m_getNegativeTag) && jetVrtDir<0.) || (m_getNegativeTag && jetVrtDir > 0.) )) continue; // secondary vertex behind primary
723 if(vPos<-100.) continue; // Secondary vertex is too far behind primary
724
725 // Check track pixel hit patterns vs vertex position.
726 if(m_useVertexCleaningPix && !check2TrVertexInPixel(selectedTracks[i], selectedTracks[j], tmpVrt.fitVertex, tmpVrt.errorMatrix)) continue;
727 // Check track first measured points vs vertex position.
729 float ihitR = selectedTracks[i]->radiusOfFirstHit();
730 float jhitR = selectedTracks[j]->radiusOfFirstHit();
731 if(std::abs(ihitR-jhitR)>25.) continue; // Hits in different pixel layers
732 if(tmpVrt.fitVertex.perp()-std::min(ihitR,jhitR) > 2.*vrErr) continue; // Vertex is behind hit in pixel
733 }
734
735 tmpVrt.signif3DProj = vrtVrtDist(primVrt, tmpVrt.fitVertex, tmpVrt.errorMatrix, jetDir);
736 if(m_fillHist){
737 Hists& h = getHists();
738 double Signif3DSign = tmpVrt.signif3D;
739 if(jetVrtDir<0) Signif3DSign = -tmpVrt.signif3D;
740 h.m_hb_signif3D->Fill(Signif3DSign, evtWgt);
741 h.m_hb_sig3DNtr->Fill(tmpVrt.signif3DProj, evtWgt);
742 }
743
744 if(m_multiWithPrimary) continue; // Multivertex with primary one. All below is not needed
745
746 //
747 // Check if V0 or material interaction on Pixel layer is present
748 //
749 if(Charge==0 && tmpVrt.signif3D>8. && mass_PiPi<900.) {
750 double mass_PPi = massV0(tmpVrt.trkAtVrt, m_massP, m_massPi);
751 double mass_EE = massV0(tmpVrt.trkAtVrt, m_massE, m_massE);
753 Hists& h = getHists();
754 h.m_hb_massEE->Fill(mass_EE, evtWgt);
755 }
756
757 if(mass_EE < 40.) badTracks = 3;
758 else{
760 Hists& h = getHists();
761 h.m_hb_massPiPi->Fill(mass_PiPi, evtWgt);
762 h.m_hb_massPPi->Fill(mass_PPi, evtWgt);
763 }
764 if(std::abs(mass_PiPi-m_massK0) < 22.) badTracks = 1;
765 if(std::abs(mass_PPi-m_massLam) < 8.) badTracks = 2;
766 }
767
768 //
769 // Creation of V0 tracks
770 //
771 if(badTracks){
772 std::vector<double> inpMassV0;
773 //Reset VKalVrt settings
774 state = m_fitSvc->makeState(ctx);
775 //matrix are calculated
776
777 if(badTracks==1) { // K0 case
778 inpMassV0.push_back(m_massPi);
779 inpMassV0.push_back(m_massPi);
780 m_fitSvc->setMassInputParticles(inpMassV0, *state);
781 m_fitSvc->setMassForConstraint(m_massK0, *state);
782 m_fitSvc->setCnstType(1, *state); // Set mass constraint
783 }
784
785 else if(badTracks==2) { // Lambda case
786 if( std::abs(tmpVrt.trkAtVrt[0][2]) < std::abs(tmpVrt.trkAtVrt[1][2]) ) {
787 inpMassV0.push_back(m_massP);
788 inpMassV0.push_back(m_massPi);
789 } else {
790 inpMassV0.push_back(m_massPi);
791 inpMassV0.push_back(m_massP);
792 }
793 m_fitSvc->setMassInputParticles(inpMassV0, *state);
794 m_fitSvc->setMassForConstraint(m_massLam, *state);
795 m_fitSvc->setCnstType(1, *state); // Set mass constraint
796 }
797
798 else if(badTracks==3) { // Gamma case
799 inpMassV0.push_back(m_massE);
800 inpMassV0.push_back(m_massE);
801 m_fitSvc->setMassInputParticles( inpMassV0, *state );
802 m_fitSvc->setCnstType(12, *state); // Set 3d angular constraint
803 }
804
805 m_fitSvc->setApproximateVertex(tmpVrt.fitVertex.x(), tmpVrt.fitVertex.y(), tmpVrt.fitVertex.z(), *state);
806
807 TLorentzVector MomentumV0;
808 Amg::Vector3D fitVertexV0;
809 std::vector< std::vector<double> > TrkAtVrtV0;
810 std::vector<double> errorMatrixV0;
811 double Chi2V0;
812 std::vector<double> Chi2PerTrk;
813
814 sc = VKalVrtFitBase(tracksForFit, fitVertexV0, MomentumV0, Charge,
815 errorMatrixV0, Chi2PerTrk, TrkAtVrtV0, Chi2V0,
816 *state, true);
817 if(sc.isSuccess()) {
818
819 std::vector<double> VKPerigee, CovPerigee;
820 sc = m_fitSvc->VKalVrtCvtTool(fitVertexV0, MomentumV0, errorMatrixV0, 0,
821 VKPerigee, CovPerigee, *state);
822
823 if(sc.isSuccess()) {
824 std::unique_ptr<Trk::Perigee> perigee = m_fitSvc->CreatePerigee(VKPerigee, CovPerigee, *state);
825 std::vector<double> Impact, ImpactError;
826 double ImpactSignifV0 = m_fitSvc->VKalGetImpact(perigee.get(), primVrt.position(), 0, Impact, ImpactError, *state);
827
828 if(m_fillHist){
829 Hists& h = getHists();
830 h.m_hb_impV0->Fill( ImpactSignifV0, evtWgt);
831 }
832
833 if(ImpactSignifV0>3.0) badTracks = 0;
834 } else {
835 badTracks = 0;
836 }
837 }
838
839 } // end if(badTracks)
840
841 } // end if(Charge==0 && tmpVrt.signif3D>8. && mass_PiPi<900.)
842
843 //
844 // Check interactions on material layers
845 //
847 float xvt = tmpVrt.fitVertex.x();
848 float yvt = tmpVrt.fitVertex.y();
849 float zvt = tmpVrt.fitVertex.z();
850 float Rvt = std::hypot(xvt,yvt);
851 int bin = m_ITkPixMaterialMap->FindBin(zvt,Rvt);
852 if(m_ITkPixMaterialMap->GetBinContent(bin)>0) badTracks = 4;
853 } else {
854 float minWgtI = m_useTrackClassificator ? std::min(trkScore[i][2],trkScore[j][2]) : 1.0; // Use dummy value of 1.0 to pass minWgt requirement in case trackClassificator is not used
855 if(minWgtI > 0.50 && Dist2D > m_beampipeR-vrtRadiusError(tmpVrt.fitVertex, tmpVrt.errorMatrix)) badTracks = 4;
856 }
857
858 tmpVrt.badVrt = badTracks;
859 all2TrVrt.push_back(tmpVrt);
860
861 if(m_fillHist){
862 Hists& h = getHists();
863 h.m_hb_r2d->Fill(tmpVrt.fitVertex.perp(), evtWgt);
864 }
865
866 //
867 // Creation of tracks from V0 list
868 //
869 if(badTracks){
870 trkFromV0.push_back(selectedTracks[i]);
871 trkFromV0.push_back(selectedTracks[j]);
872 }
873
874 } // end loop over j
875 } // end loop over i
876
877 //============================================================================
878 //-- Save results
879 listSecondTracks.clear();
880 std::map<int,int> trkHF; // use map with track index as key + value to get list of tracks in 2-track vertices without duplicates
881 for(auto &vv : all2TrVrt){
882 if(vv.badVrt){
883 if(m_useITkMaterialRejection)continue;
884 if(!m_multiVertex && m_rejectBadVertices)continue;
885 }
886 if(m_multiWithPrimary || m_multiVertex) add_edge(vv.i,vv.j,compatibilityGraph);
887 trkHF[vv.i] = vv.i;
888 trkHF[vv.j] = vv.j;
889 }
890
891 for(auto it : trkHF) listSecondTracks.push_back(selectedTracks[it.second]);
892
893 //-Debug
894 if(m_fillHist){
895 Hists& h = getHists();
896 if (h.m_curTup){
897 h.m_curTup->ewgt = evtWgt;
898 for(auto &it : trkHF) h.m_curTup->itHF[h.m_curTup->NTHF++] = it.second;
899 for(auto &vv : all2TrVrt){
900 h.m_curTup->nVrtT[vv.i]++;
901 h.m_curTup->nVrtT[vv.j]++;
902 }
903 fillVrtNTup(all2TrVrt);
904 }
905 }
906
907 //
908 //--------------------------------------------------------------------
909 //-- Post-selection checks
910 //--------------------------------------------------------------------
911 if(m_fillHist){
912 float weight = listSecondTracks.empty() ? 0. : 1.;
913 Hists& h = getHists();
914 h.m_pr_effVrt2tr->Fill(static_cast<float>(nRefPVTrk), weight);
915 h.m_pr_effVrt2trEta->Fill(jetDir.Eta(), weight);
916 }
917
918 return all2TrVrt.size();
919
920 }
#define AmgVector(rows)
@ Phi
Definition RPCdef.h:8
double rankBTrk(double TrkPt, double JetPt, double Signif) const
double vrtVrtDist2D(const xAOD::Vertex &primVrt, const Amg::Vector3D &SecVrt, const std::vector< double > &VrtErr, double &Signif) const
static const Trk::Perigee * getPerigee(const xAOD::TrackParticle *)
float getVrtScore(int i, int j, std::vector< std::vector< float > > &trkScore)

◆ select2TrVrt() [2/2]

template<class Trk>
int InDet::InDetVKalVxInJetTool::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
private

◆ selGoodTrkParticle()

int InDet::InDetVKalVxInJetTool::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
private

Definition at line 103 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/CutTrk.cxx.

109 {
110
111 std::vector<const xAOD::TrackParticle*>::const_iterator i_ntrk;
112 std::vector<double> Impact,ImpactError;
113 std::multimap<double,const xAOD::TrackParticle*> orderedTrk;
114 int nPrimTrk=0;
115 for (i_ntrk = InpTrk.begin(); i_ntrk < InpTrk.end(); ++i_ntrk) {
116
117 if((*i_ntrk)->numberDoF() == 0) continue; //Protection
118 if( (*i_ntrk)->pt() > JetDir.Pt() ) continue;
119
120 //
121 //-- Perigee in TrackParticle
122 //
123 const Trk::Perigee mPer=(*i_ntrk)->perigeeParameters() ;
124 AmgVector(5) VectPerig = mPer.parameters();
125
126
127 double trkChi2 = (*i_ntrk)->chiSquared() / (*i_ntrk)->numberDoF();
128
129 double CovTrkMtx11 = (*i_ntrk)->definingParametersCovMatrix()(0,0);
130 double CovTrkMtx22 = (*i_ntrk)->definingParametersCovMatrix()(1,1);
131 double CovTrkMtx55 = (*i_ntrk)->definingParametersCovMatrix()(4,4);
132 double ConeDist = coneDist(VectPerig,JetDir);
133
134 double trkP=1./std::abs(VectPerig[4]);
135 double trkPErr=std::sqrt(CovTrkMtx55)*trkP ;
136
137 uint8_t PixelHits,SctHits,BLayHits,sctSharedHits,pixSharedHits;
138 if( !((*i_ntrk)->summaryValue(PixelHits,xAOD::numberOfPixelHits)) ) continue; // Track is
139 if( !((*i_ntrk)->summaryValue( SctHits,xAOD::numberOfSCTHits)) ) continue; // definitely bad
140 if( !((*i_ntrk)->summaryValue(BLayHits,xAOD::numberOfInnermostPixelLayerHits))) BLayHits=0;
141 if( !((*i_ntrk)->summaryValue(sctSharedHits,xAOD::numberOfSCTSharedHits))) sctSharedHits=0; //VK Bad for high Pt
142 if( !((*i_ntrk)->summaryValue(pixSharedHits,xAOD::numberOfPixelSharedHits)))pixSharedHits=0; //and many tracks
143 long int SharedHits = sctSharedHits+pixSharedHits;
144
145 uint8_t splSCTHits,outSCTHits,splPixHits,outPixHits;
146 if( !((*i_ntrk)->summaryValue(splSCTHits,xAOD::numberOfSCTSpoiltHits))) splSCTHits=0;
147 if( !((*i_ntrk)->summaryValue(outSCTHits,xAOD::numberOfSCTOutliers))) outSCTHits=0;
148 if( !((*i_ntrk)->summaryValue(splPixHits,xAOD::numberOfPixelSpoiltHits)))splPixHits=0;
149 if( !((*i_ntrk)->summaryValue(outPixHits,xAOD::numberOfPixelOutliers))) outPixHits=0;
150 bool badHits = ( splSCTHits || outSCTHits || outPixHits || splPixHits );
151
152 Amg::Vector3D perigeePos=mPer.position();
153 double ImpactA0=std::sqrt( (perigeePos.x()-PrimVrt.x())*(perigeePos.x()-PrimVrt.x())
154 +(perigeePos.y()-PrimVrt.y())*(perigeePos.y()-PrimVrt.y()) );
155 double ImpactZ=perigeePos.z()-PrimVrt.z();
156 double ImpactSignif=std::sqrt(ImpactA0*ImpactA0/CovTrkMtx11+ImpactZ*ImpactZ/CovTrkMtx22);
157
158 if(m_fillHist){
159 Hists& h = getHists();
160 h.m_hb_trkD0->Fill( ImpactA0, evtWgt);
161 }
162
163 double eta = (*i_ntrk)->eta();
164
165 std::unordered_map<std::string,double> TrkVarDouble;
166 std::unordered_map<std::string,int> TrkVarInt;
167
168 TrkVarDouble["eta"] = eta;
169 TrkVarDouble["PInvVert"] = VectPerig[4];
170 TrkVarDouble["ThetaVert"] = VectPerig[3];
171 TrkVarDouble["A0Vert"] = ImpactA0;
172 TrkVarDouble["ZVert"] = ImpactZ;
173 TrkVarDouble["Chi2"] = trkChi2;
174 TrkVarDouble["ConeDist"] = ConeDist;
175 TrkVarDouble["CovTrkMtx11"] = CovTrkMtx11;
176 TrkVarDouble["CovTrkMtx22"] = CovTrkMtx22;
177 TrkVarDouble["trkP"] = trkP;
178 TrkVarDouble["trkPErr"] = trkPErr;
179
180 TrkVarInt["PixelHits"] = PixelHits;
181 TrkVarInt["SctHits"] = SctHits;
182 TrkVarInt["BLayHits"] = BLayHits;
183 TrkVarInt["badHits"] = badHits;
184 TrkVarInt["SharedHits"] = SharedHits;
185
186 StatusCode sc = cutTrk(TrkVarDouble, TrkVarInt);
187 if( sc.isFailure() ) continue;
188
189 double rnkBTrk=rankBTrk(0.,0.,ImpactSignif);
190 if(rnkBTrk<0.7)nPrimTrk += 1;
191 orderedTrk.emplace(rnkBTrk,*i_ntrk);
192 }
193
194 //---- Order tracks according to ranks
195 std::map<double,const xAOD::TrackParticle*>::reverse_iterator rt=orderedTrk.rbegin();
196 SelectedTracks.resize(orderedTrk.size());
197 for ( int cntt=0; rt!=orderedTrk.rend(); ++rt,++cntt) {SelectedTracks[cntt]=(*rt).second;}
198 return nPrimTrk;
199 }
Eigen::Matrix< double, 3, 1 > Vector3D
#define y
#define x
#define z
static double coneDist(const AmgVector(5) &, const TLorentzVector &)
StatusCode cutTrk(const std::unordered_map< std::string, double > &TrkVarDouble, const std::unordered_map< std::string, int > &TrkVarInt, float evtWgt=1.) const
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ totalMom() [1/2]

TLorentzVector InDet::InDetVKalVxInJetTool::totalMom ( const std::vector< const Trk::Perigee * > & inpTrk) const
private

Definition at line 354 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

356 {
357 AmgVector(5) vectPerig; vectPerig.setZero();
358 double px=0.,py=0.,pz=0.,ee=0.;
359 for (const auto *i : inpTrk) {
360 if(!i) continue;
361 vectPerig = i->parameters();
362 double api=1./std::abs(vectPerig[4]);
363 CxxUtils::sincos phi (vectPerig[2]);
364 CxxUtils::sincos theta(vectPerig[3]);
365 px += phi.cs * theta.sn*api;
366 py += phi.sn * theta.sn*api;
367 pz += theta.cs*api;
368 ee += std::sqrt( api*api + m_massPi*m_massPi);
369 }
370 return {px,py,pz,ee};
371 }

◆ totalMom() [2/2]

TLorentzVector InDet::InDetVKalVxInJetTool::totalMom ( const std::vector< const xAOD::TrackParticle * > & inpTrk)
staticprivate

Definition at line 373 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

375 {
376 TLorentzVector sum(0.,0.,0.,0.);
377 for (const auto *i : InpTrk) {
378 if( i == nullptr ) continue;
379 sum += i->p4();
380 }
381 return sum;
382 }

◆ trackClassification()

void InDet::InDetVKalVxInJetTool::trackClassification ( std::vector< WrkVrt > * wrkVrtSet,
std::vector< std::deque< long int > > * trkInVrt )
staticprivate

Definition at line 1083 of file BTagVrtSecMulti.cxx.

1086 {
1087 int NSet = wrkVrtSet->size();
1088 for(int iv = 0; iv<NSet; iv++) {
1089 if(!(*wrkVrtSet)[iv].Good) continue;
1090 int NTrkAtVrt = (*wrkVrtSet)[iv].selTrk.size();
1091 if(NTrkAtVrt<2) continue;
1092
1093 for(int jt = 0; jt<NTrkAtVrt; jt++){
1094 int tracknum = (*wrkVrtSet)[iv].selTrk[jt];
1095 (*TrkInVrt).at(tracknum).push_back(iv);
1096 }
1097 }
1098 }

◆ trackDecorationNames()

virtual std::vector< std::string > InDet::ISecVertexInJetFinder::trackDecorationNames ( ) const
inlinevirtualinherited

Return a list of the names of track decorations created by this tool, in order to allow them to be locked when the calling algorithm completes.

Return an empty list by default.

Reimplemented in InDet::InDetImprovedJetFitterVxFinder.

Definition at line 69 of file ISecVertexInJetFinder.h.

70 {
71 return std::vector<std::string>();
72 }

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

◆ VKalVrtFitBase()

StatusCode InDet::InDetVKalVxInJetTool::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
private

Definition at line 417 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

427 {
428 std::vector<const xAOD::NeutralParticle*> netralPartDummy(0);
429 return m_fitSvc->VKalVrtFit( listPart, netralPartDummy,Vertex, Momentum, Charge,
430 ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2,
431 istate, ifCovV0 );
432
433 }
boost::graph_traits< boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS > >::vertex_descriptor Vertex

◆ VKalVrtFitFastBase()

StatusCode InDet::InDetVKalVxInJetTool::VKalVrtFitFastBase ( const std::vector< const xAOD::TrackParticle * > & listPart,
Amg::Vector3D & Vertex,
Trk::IVKalState & istate ) const
private

Definition at line 408 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

412 {
413 return m_fitSvc->VKalVrtFitFast(listTrk, FitVertex, istate);
414 }

◆ vrtRadiusError()

double InDet::InDetVKalVxInJetTool::vrtRadiusError ( const Amg::Vector3D & secVrt,
const std::vector< double > & vrtErr )
staticprivate

Definition at line 262 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

263 {
264 double DirX=SecVrt.x(), DirY=SecVrt.y();
265 double Covar = DirX*VrtErr[0]*DirX
266 +2.*DirX*VrtErr[1]*DirY
267 +DirY*VrtErr[2]*DirY;
268 Covar /= DirX*DirX + DirY*DirY;
269 Covar=std::sqrt(Covar);
270 if(Covar != Covar) Covar = 0.;
271 return Covar;
272 }

◆ vrtVrtDist() [1/3]

double InDet::InDetVKalVxInJetTool::vrtVrtDist ( const Amg::Vector3D & Vrt1,
const std::vector< double > & VrtErr1,
const Amg::Vector3D & Vrt2,
const std::vector< double > & VrtErr2 ) const
private

Definition at line 227 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

230 {
231 double Signif;
232 Amg::Vector3D SVPV(Vrt1.x()- Vrt2.x(),Vrt1.y()- Vrt2.y(),Vrt1.z()- Vrt2.z());
233
234 AmgSymMatrix(3) PrimCovMtx; //Create
235 PrimCovMtx(0,0) = VrtErr1[0]+VrtErr2[0];
236 PrimCovMtx(0,1) = PrimCovMtx(1,0) = VrtErr1[1]+VrtErr2[1];
237 PrimCovMtx(1,1) = VrtErr1[2]+VrtErr2[2];
238 PrimCovMtx(0,2) = PrimCovMtx(2,0) = VrtErr1[3]+VrtErr2[3];
239 PrimCovMtx(1,2) = PrimCovMtx(2,1) = VrtErr1[4]+VrtErr2[4];
240 PrimCovMtx(2,2) = VrtErr1[5]+VrtErr2[5];
241
242 bool success=true;
243 AmgSymMatrix(3) WgtMtx;
244 PrimCovMtx.computeInverseWithCheck(WgtMtx, success);
245 if( !success || WgtMtx(0,0)<=0. || WgtMtx(1,1)<=0. || WgtMtx(2,2)<=0. ){
246 ATH_MSG_DEBUG(" Cov.matrix inversion failure in vertex distance significane");
247 return 1.e10;
248 }
249
250 Signif=SVPV.transpose()*WgtMtx*SVPV;
251 if(Signif<=0.)return 1.e10; //Something is wrong in distance significance.
252 Signif=std::sqrt(Signif);
253 if(Signif != Signif) Signif = 0.;
254 return Signif;
255 }

◆ vrtVrtDist() [2/3]

double InDet::InDetVKalVxInJetTool::vrtVrtDist ( const xAOD::Vertex & primVrt,
const Amg::Vector3D & SecVrt,
const std::vector< double > & SecVrtErr,
const TLorentzVector & JetDir ) const
private

Definition at line 192 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

195 {
196 Amg::Vector3D jetDir(JetDir.Vect().Unit().X(), JetDir.Vect().Unit().Y(), JetDir.Vect().Unit().Z());
197 double projDist=(SecVrt-PrimVrt.position()).dot(jetDir);
198 Amg::Vector3D SVPV=jetDir*projDist;
199
200 AmgSymMatrix(3) PrimCovMtx=PrimVrt.covariancePosition(); //Create
201 PrimCovMtx(0,0) += SecVrtErr[0];
202 PrimCovMtx(0,1) += SecVrtErr[1];
203 PrimCovMtx(1,0) += SecVrtErr[1];
204 PrimCovMtx(1,1) += SecVrtErr[2];
205 PrimCovMtx(0,2) += SecVrtErr[3];
206 PrimCovMtx(2,0) += SecVrtErr[3];
207 PrimCovMtx(1,2) += SecVrtErr[4];
208 PrimCovMtx(2,1) += SecVrtErr[4];
209 PrimCovMtx(2,2) += SecVrtErr[5];
210
211 bool success=true;
212 AmgSymMatrix(3) WgtMtx;
213 PrimCovMtx.computeInverseWithCheck(WgtMtx, success);
214 if( !success || WgtMtx(0,0)<=0. || WgtMtx(1,1)<=0. || WgtMtx(2,2)<=0. ){
215 ATH_MSG_DEBUG(" Cov.matrix inversion failure in vertex distance significane");
216 return 1.e10;
217 }
218
219 double Signif=SVPV.transpose()*WgtMtx*SVPV;
220 if(Signif<=0.)return 1.e10; //Something is wrong in distance significance.
221 Signif=std::sqrt(Signif);
222 if( Signif!=Signif ) Signif = 0.;
223 if(projDist<0)Signif=-Signif;
224 return Signif;
225 }

◆ vrtVrtDist() [3/3]

double InDet::InDetVKalVxInJetTool::vrtVrtDist ( const xAOD::Vertex & primVrt,
const Amg::Vector3D & SecVrt,
const std::vector< double > & VrtErr,
double & Signif ) const
private

Definition at line 126 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

129 {
130
131 Amg::Vector3D SVPV(PrimVrt.x()- SecVrt.x(),PrimVrt.y()- SecVrt.y(),PrimVrt.z()- SecVrt.z());
132
133 AmgSymMatrix(3) PrimCovMtx=PrimVrt.covariancePosition(); //Create
134 PrimCovMtx(0,0) += SecVrtErr[0];
135 PrimCovMtx(0,1) += SecVrtErr[1];
136 PrimCovMtx(1,0) += SecVrtErr[1];
137 PrimCovMtx(1,1) += SecVrtErr[2];
138 PrimCovMtx(0,2) += SecVrtErr[3];
139 PrimCovMtx(2,0) += SecVrtErr[3];
140 PrimCovMtx(1,2) += SecVrtErr[4];
141 PrimCovMtx(2,1) += SecVrtErr[4];
142 PrimCovMtx(2,2) += SecVrtErr[5];
143
144 bool success=true;
145 AmgSymMatrix(3) WgtMtx;
146 PrimCovMtx.computeInverseWithCheck(WgtMtx, success);
147 if( !success || WgtMtx(0,0)<=0. || WgtMtx(1,1)<=0. || WgtMtx(2,2)<=0. ){
148 ATH_MSG_DEBUG(" Cov.matrix inversion failure in vertex distance significane");
149 return 1.e10;
150 }
151
152 Signif=SVPV.transpose()*WgtMtx*SVPV;
153
154 if(Signif<=0.)return 1.e10; //Something is wrong in distance significance.
155 Signif=std::sqrt(Signif);
156 if( Signif!=Signif ) Signif = 0.;
157 return SVPV.norm();
158 }

◆ vrtVrtDist2D()

double InDet::InDetVKalVxInJetTool::vrtVrtDist2D ( const xAOD::Vertex & primVrt,
const Amg::Vector3D & SecVrt,
const std::vector< double > & VrtErr,
double & Signif ) const
private

Definition at line 160 of file InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx.

163 {
164 Amg::Vector2D SVPV(PrimVrt.x()- SecVrt.x(),PrimVrt.y()- SecVrt.y());
165
166 AmgSymMatrix(3) PrimCovMtx=PrimVrt.covariancePosition(); //Create
167 AmgSymMatrix(2) CovMtx;
168 CovMtx(0,0) = PrimCovMtx(0,0) + SecVrtErr[0];
169 CovMtx(0,1) = PrimCovMtx(0,1) + SecVrtErr[1];
170 CovMtx(1,0) = PrimCovMtx(1,0) + SecVrtErr[1];
171 CovMtx(1,1) = PrimCovMtx(1,1) + SecVrtErr[2];
172
173 bool success=true;
174 AmgSymMatrix(2) WgtMtx;
175 CovMtx.computeInverseWithCheck(WgtMtx, success);
176 if( !success || WgtMtx(0,0)<=0. || WgtMtx(1,1)<=0. ){
177 ATH_MSG_DEBUG(" Cov.matrix inversion failure in vertex distance significane");
178 return 1.e10;
179 }
180
181 Signif=SVPV.transpose()*WgtMtx*SVPV;
182
183 if(Signif<=0.)return 1.e10; //Something is wrong in distance significance.
184 Signif=std::sqrt(Signif);
185 if( Signif!=Signif ) Signif = 0.;
186 return SVPV.norm();
187 }
Eigen::Matrix< double, 2, 1 > Vector2D

Member Data Documentation

◆ m_a0TrkErrorCut

DoubleProperty InDet::InDetVKalVxInJetTool::m_a0TrkErrorCut
private
Initial value:
{this, "A0TrkErrorCut", 1.,
"Track A0 error cut"}

Definition at line 202 of file InDetVKalVxInJetTool.h.

202 {this, "A0TrkErrorCut", 1.,
203 "Track A0 error cut"};

◆ m_beamPipeMgr

const BeamPipeDetectorManager* InDet::InDetVKalVxInJetTool::m_beamPipeMgr = nullptr
private

Definition at line 268 of file InDetVKalVxInJetTool.h.

◆ m_beampipeR

double InDet::InDetVKalVxInJetTool::m_beampipeR = 0.
private

Definition at line 221 of file InDetVKalVxInJetTool.h.

◆ m_chiScale

float InDet::InDetVKalVxInJetTool::m_chiScale[11] {}
private

Definition at line 364 of file InDetVKalVxInJetTool.h.

364{};

◆ m_coneForTag

DoubleProperty InDet::InDetVKalVxInJetTool::m_coneForTag
private
Initial value:
{this, "ConeForTag", 0.4,
"Cone around jet direction for track selection"}

Definition at line 194 of file InDetVKalVxInJetTool.h.

194 {this, "ConeForTag", 0.4,
195 "Cone around jet direction for track selection"};

◆ m_cutA0

DoubleProperty InDet::InDetVKalVxInJetTool::m_cutA0 {this, "CutA0", 5., "Track A0 selection cut"}
private

Definition at line 190 of file InDetVKalVxInJetTool.h.

190{this, "CutA0", 5., "Track A0 selection cut"};

◆ m_cutBLayHits

IntegerProperty InDet::InDetVKalVxInJetTool::m_cutBLayHits
private
Initial value:
{this, "CutBLayHits", 0,
"Remove track is it has less B-layer hits"}

Definition at line 184 of file InDetVKalVxInJetTool.h.

184 {this, "CutBLayHits", 0,
185 "Remove track is it has less B-layer hits"};

◆ m_cutBVrtScore

DoubleProperty InDet::InDetVKalVxInJetTool::m_cutBVrtScore
private
Initial value:
{this, "CutBVrtScore", 0.015,
"B vertex selection cut on 2track vertex score (probability-like) based on track classification"}

Definition at line 206 of file InDetVKalVxInJetTool.h.

206 {this, "CutBVrtScore", 0.015,
207 "B vertex selection cut on 2track vertex score (probability-like) based on track classification"};

◆ m_cutChi2

DoubleProperty InDet::InDetVKalVxInJetTool::m_cutChi2 {this, "CutChi2", 5., "Track Chi2 selection cut"}
private

Definition at line 191 of file InDetVKalVxInJetTool.h.

191{this, "CutChi2", 5., "Track Chi2 selection cut"};

◆ m_cutPixelHits

IntegerProperty InDet::InDetVKalVxInJetTool::m_cutPixelHits
private
Initial value:
{this, "CutPixelHits", 1,
"Remove track is it has less Pixel hits"}

Definition at line 180 of file InDetVKalVxInJetTool.h.

180 {this, "CutPixelHits", 1,
181 "Remove track is it has less Pixel hits"};

◆ m_cutPt

DoubleProperty InDet::InDetVKalVxInJetTool::m_cutPt {this, "CutPt", 700., "Track Pt selection cut"}
private

Definition at line 188 of file InDetVKalVxInJetTool.h.

188{this, "CutPt", 700., "Track Pt selection cut"};

◆ m_cutSctHits

IntegerProperty InDet::InDetVKalVxInJetTool::m_cutSctHits
private
Initial value:
{this, "CutSctHits", 4,
"Remove track is it has less SCT hits"}

Definition at line 178 of file InDetVKalVxInJetTool.h.

178 {this, "CutSctHits", 4,
179 "Remove track is it has less SCT hits"};

◆ m_cutSharedHits

IntegerProperty InDet::InDetVKalVxInJetTool::m_cutSharedHits
private
Initial value:
{this, "CutSharedHits", 1000,
"Reject final 2tr vertices if tracks have shared hits"}

Definition at line 186 of file InDetVKalVxInJetTool.h.

186 {this, "CutSharedHits", 1000,
187 "Reject final 2tr vertices if tracks have shared hits"};

◆ m_cutSiHits

IntegerProperty InDet::InDetVKalVxInJetTool::m_cutSiHits
private
Initial value:
{this, "CutSiHits", 7,
"Remove track is it has less Pixel+SCT hits"}

Definition at line 182 of file InDetVKalVxInJetTool.h.

182 {this, "CutSiHits", 7,
183 "Remove track is it has less Pixel+SCT hits"};

◆ m_cutZVrt

DoubleProperty InDet::InDetVKalVxInJetTool::m_cutZVrt {this, "CutZVrt", 15., "Track Z impact selection cut"}
private

Definition at line 189 of file InDetVKalVxInJetTool.h.

189{this, "CutZVrt", 15., "Track Z impact selection cut"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 393 of file AthCommonDataStore.h.

◆ m_etaDependentCutsSvc

ServiceHandle<InDet::IInDetEtaDependentCutsSvc> InDet::InDetVKalVxInJetTool::m_etaDependentCutsSvc {this, "InDetEtaDependentCutsSvc", ""}
private

service to get cut values depending on different variable

Definition at line 262 of file InDetVKalVxInJetTool.h.

263{this, "InDetEtaDependentCutsSvc", ""};

◆ m_eventInfoKey

SG::ReadHandleKey<xAOD::EventInfo> InDet::InDetVKalVxInJetTool::m_eventInfoKey {this, "EventInfoName", "EventInfo"}
private

Definition at line 257 of file InDetVKalVxInJetTool.h.

258{this, "EventInfoName", "EventInfo"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 390 of file AthCommonDataStore.h.

◆ m_existIBL

BooleanProperty InDet::InDetVKalVxInJetTool::m_existIBL
private
Initial value:
{this, "ExistIBL", true,
"Inform whether 3-layer or 4-layer detector is used"}

Definition at line 215 of file InDetVKalVxInJetTool.h.

215 {this, "ExistIBL", true,
216 "Inform whether 3-layer or 4-layer detector is used"};

◆ m_fillHist

BooleanProperty InDet::InDetVKalVxInJetTool::m_fillHist
private
Initial value:
{this, "FillHist", false,
"Fill technical histograms"}

Definition at line 213 of file InDetVKalVxInJetTool.h.

213 {this, "FillHist", false,
214 "Fill technical histograms"};

◆ m_fitSvc

Trk::TrkVKalVrtFitter* InDet::InDetVKalVxInJetTool::m_fitSvc {}
private

Definition at line 251 of file InDetVKalVxInJetTool.h.

251{};

◆ m_fitter

ToolHandle< Trk::IVertexFitter > InDet::InDetVKalVxInJetTool::m_fitter {this, "VertexFitterTool", "Trk::TrkVKalVrtFitter/VertexFitterTool"}
private

Definition at line 249 of file InDetVKalVxInJetTool.h.

250{this, "VertexFitterTool", "Trk::TrkVKalVrtFitter/VertexFitterTool"};

◆ m_getNegativeTag

BooleanProperty InDet::InDetVKalVxInJetTool::m_getNegativeTag
private
Initial value:
{this, "getNegativeTag", false,
"Return ONLY negative secondary vertices (not for multivertex!)"}

Definition at line 239 of file InDetVKalVxInJetTool.h.

239 {this, "getNegativeTag", false,
240 "Return ONLY negative secondary vertices (not for multivertex!)"};

◆ m_getNegativeTail

BooleanProperty InDet::InDetVKalVxInJetTool::m_getNegativeTail
private
Initial value:
{this, "getNegativeTail", false,
"Allow secondary vertex behind the primary one (negative) w/r jet direction (not for multivertex!)"}

Definition at line 237 of file InDetVKalVxInJetTool.h.

237 {this, "getNegativeTail", false,
238 "Allow secondary vertex behind the primary one (negative) w/r jet direction (not for multivertex!)"};

◆ m_h

std::unique_ptr<Hists> InDet::InDetVKalVxInJetTool::m_h
private

Definition at line 176 of file InDetVKalVxInJetTool.h.

◆ m_ITkPixMaterialMap

std::unique_ptr<TH2D> InDet::InDetVKalVxInJetTool::m_ITkPixMaterialMap
private

Definition at line 270 of file InDetVKalVxInJetTool.h.

◆ m_massB

const double InDet::InDetVKalVxInJetTool::m_massB =5279.400
private

Definition at line 277 of file InDetVKalVxInJetTool.h.

◆ m_massE

const double InDet::InDetVKalVxInJetTool::m_massE = ParticleConstants::electronMassInMeV
private

Definition at line 274 of file InDetVKalVxInJetTool.h.

◆ m_massK0

const double InDet::InDetVKalVxInJetTool::m_massK0 = ParticleConstants::KZeroMassInMeV
private

Definition at line 275 of file InDetVKalVxInJetTool.h.

◆ m_massLam

const double InDet::InDetVKalVxInJetTool::m_massLam = ParticleConstants::lambdaMassInMeV
private

Definition at line 276 of file InDetVKalVxInJetTool.h.

◆ m_massP

const double InDet::InDetVKalVxInJetTool::m_massP = ParticleConstants::protonMassInMeV
private

Definition at line 273 of file InDetVKalVxInJetTool.h.

◆ m_massPi

const double InDet::InDetVKalVxInJetTool::m_massPi = ParticleConstants::chargedPionMassInMeV
private

Definition at line 272 of file InDetVKalVxInJetTool.h.

◆ m_multiVertex

BooleanProperty InDet::InDetVKalVxInJetTool::m_multiVertex
private
Initial value:
{this, "MultiVertex", false,
"Run Multiple Secondary Vertices in jet finder"}

Definition at line 233 of file InDetVKalVxInJetTool.h.

233 {this, "MultiVertex", false,
234 "Run Multiple Secondary Vertices in jet finder"};

◆ m_multiWithOneTrkVrt

BooleanProperty InDet::InDetVKalVxInJetTool::m_multiWithOneTrkVrt
private
Initial value:
{this, "MultiWithOneTrkVrt", true,
"Allow one-track-vertex addition to already found secondary vertices. MultiVertex Finder only!"}

Definition at line 241 of file InDetVKalVxInJetTool.h.

241 {this, "MultiWithOneTrkVrt", true,
242 "Allow one-track-vertex addition to already found secondary vertices. MultiVertex Finder only!"};

◆ m_multiWithPrimary

BooleanProperty InDet::InDetVKalVxInJetTool::m_multiWithPrimary
private
Initial value:
{this, "MultiWithPrimary", false,
"Find Multiple Secondary Vertices + primary vertex in jet. MultiVertex Finder only!"}

Definition at line 235 of file InDetVKalVxInJetTool.h.

235 {this, "MultiWithPrimary", false,
236 "Find Multiple Secondary Vertices + primary vertex in jet. MultiVertex Finder only!"};

◆ m_pixelManager

const InDetDD::PixelDetectorManager* InDet::InDetVKalVxInJetTool::m_pixelManager = nullptr
private

Definition at line 269 of file InDetVKalVxInJetTool.h.

◆ m_rejectBadVertices

BooleanProperty InDet::InDetVKalVxInJetTool::m_rejectBadVertices
private
Initial value:
{this, "rejectBadVertices", false,
"Reject V0s after checking 3D PV impact"}

Definition at line 231 of file InDetVKalVxInJetTool.h.

231 {this, "rejectBadVertices", false,
232 "Reject V0s after checking 3D PV impact"};

◆ m_rLayer1

double InDet::InDetVKalVxInJetTool::m_rLayer1 = 0.
private

Definition at line 223 of file InDetVKalVxInJetTool.h.

◆ m_rLayer2

double InDet::InDetVKalVxInJetTool::m_rLayer2 = 0.
private

Definition at line 224 of file InDetVKalVxInJetTool.h.

◆ m_rLayer3

double InDet::InDetVKalVxInJetTool::m_rLayer3 = 0.
private

Definition at line 225 of file InDetVKalVxInJetTool.h.

◆ m_rLayerB

double InDet::InDetVKalVxInJetTool::m_rLayerB = 0.
private

Definition at line 222 of file InDetVKalVxInJetTool.h.

◆ m_RobustFit

IntegerProperty InDet::InDetVKalVxInJetTool::m_RobustFit
private
Initial value:
{this, "RobustFit", 1,
"Use vertex fit with RobustFit functional(VKalVrt) for common secondary vertex fit"}

Definition at line 218 of file InDetVKalVxInJetTool.h.

218 {this, "RobustFit", 1,
219 "Use vertex fit with RobustFit functional(VKalVrt) for common secondary vertex fit"};

◆ m_secTrkChi2Cut

DoubleProperty InDet::InDetVKalVxInJetTool::m_secTrkChi2Cut
private
Initial value:
{this, "SecTrkChi2Cut", 10.,
"Track - common secondary vertex association cut. Single Vertex Finder only"}

Definition at line 192 of file InDetVKalVxInJetTool.h.

192 {this, "SecTrkChi2Cut", 10.,
193 "Track - common secondary vertex association cut. Single Vertex Finder only"};

◆ m_sel2VrtChi2Cut

DoubleProperty InDet::InDetVKalVxInJetTool::m_sel2VrtChi2Cut
private
Initial value:
{this, "Sel2VrtChi2Cut", 10.,
"Cut on Chi2 of 2-track vertex for initial selection"}

Definition at line 196 of file InDetVKalVxInJetTool.h.

196 {this, "Sel2VrtChi2Cut", 10.,
197 "Cut on Chi2 of 2-track vertex for initial selection"};

◆ m_sel2VrtSigCut

DoubleProperty InDet::InDetVKalVxInJetTool::m_sel2VrtSigCut
private
Initial value:
{this, "Sel2VrtSigCut", 4.,
"Cut on significance of 3D distance between initial 2-track vertex and PV"}

Definition at line 198 of file InDetVKalVxInJetTool.h.

198 {this, "Sel2VrtSigCut", 4.,
199 "Cut on significance of 3D distance between initial 2-track vertex and PV"};

◆ m_timingProfile

ServiceHandle<IChronoStatSvc> InDet::InDetVKalVxInJetTool::m_timingProfile {this,"ChronoStatSvc","ChronoStatSvc"}
private

Definition at line 252 of file InDetVKalVxInJetTool.h.

252{this,"ChronoStatSvc","ChronoStatSvc"};

◆ m_trackClassificator

ToolHandle< IInDetTrkInJetType > InDet::InDetVKalVxInJetTool::m_trackClassificator {this, "TrackClassTool", "InDet::InDetTrkInJetType"}
private

Definition at line 255 of file InDetVKalVxInJetTool.h.

256{this, "TrackClassTool", "InDet::InDetTrkInJetType"};

◆ m_trackDetachCut

DoubleProperty InDet::InDetVKalVxInJetTool::m_trackDetachCut
private
Initial value:
{this, "TrackDetachCut", 6.,
"To allow track from vertex detachment for MultiVertex Finder"}

Definition at line 246 of file InDetVKalVxInJetTool.h.

246 {this, "TrackDetachCut", 6.,
247 "To allow track from vertex detachment for MultiVertex Finder"};

◆ m_trkSigCut

DoubleProperty InDet::InDetVKalVxInJetTool::m_trkSigCut
private
Initial value:
{this, "TrkSigCut", 2.,
"Track 3D impact significance w/r primary vertex"}

Definition at line 200 of file InDetVKalVxInJetTool.h.

200 {this, "TrkSigCut", 2.,
201 "Track 3D impact significance w/r primary vertex"};

◆ m_useEtaDependentCuts

bool InDet::InDetVKalVxInJetTool::m_useEtaDependentCuts = false
private

Definition at line 260 of file InDetVKalVxInJetTool.h.

◆ m_useFrozenVersion

BooleanProperty InDet::InDetVKalVxInJetTool::m_useFrozenVersion
private
Initial value:
{this, "UseFrozenVersion", false,
"Switch from default frozen version to the development/improved one"}

Definition at line 211 of file InDetVKalVxInJetTool.h.

211 {this, "UseFrozenVersion", false,
212 "Switch from default frozen version to the development/improved one"};

◆ m_useITkMaterialRejection

BooleanProperty InDet::InDetVKalVxInJetTool::m_useITkMaterialRejection
private
Initial value:
{this, "useITkMaterialRejection", false,
"Reject vertices from hadronic interactions in detector material using ITk layout"}

Definition at line 265 of file InDetVKalVxInJetTool.h.

266 {this, "useITkMaterialRejection", false,
267 "Reject vertices from hadronic interactions in detector material using ITk layout"};

◆ m_useTrackClassificator

bool InDet::InDetVKalVxInJetTool::m_useTrackClassificator = true
private

Definition at line 254 of file InDetVKalVxInJetTool.h.

◆ m_useVertexCleaningFMP

BooleanProperty InDet::InDetVKalVxInJetTool::m_useVertexCleaningFMP
private
Initial value:
{this, "useVertexCleaningFMP", false,
"Clean vertices requiring track F(irst) M(easured) P(oints) matching to vertex position"}

Definition at line 229 of file InDetVKalVxInJetTool.h.

229 {this, "useVertexCleaningFMP", false,
230 "Clean vertices requiring track F(irst) M(easured) P(oints) matching to vertex position"};

◆ m_useVertexCleaningPix

BooleanProperty InDet::InDetVKalVxInJetTool::m_useVertexCleaningPix
private
Initial value:
{this, "useVertexCleaningPix", false,
"Clean vertices requiring track pixel hit patterns according to vertex position"}

Definition at line 227 of file InDetVKalVxInJetTool.h.

227 {this, "useVertexCleaningPix", false,
228 "Clean vertices requiring track pixel hit patterns according to vertex position"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vertexMergeCut

DoubleProperty InDet::InDetVKalVxInJetTool::m_vertexMergeCut
private
Initial value:
{this, "VertexMergeCut", 3.,
"To allow vertex merging for MultiVertex Finder"}

Definition at line 244 of file InDetVKalVxInJetTool.h.

244 {this, "VertexMergeCut", 3.,
245 "To allow vertex merging for MultiVertex Finder"};

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_vrt2TrMassLimit

DoubleProperty InDet::InDetVKalVxInJetTool::m_vrt2TrMassLimit
private
Initial value:
{this, "Vrt2TrMassLimit", 4000.,
"Maximal allowed mass for 2-track vertices"}

Definition at line 208 of file InDetVKalVxInJetTool.h.

208 {this, "Vrt2TrMassLimit", 4000.,
209 "Maximal allowed mass for 2-track vertices"};

◆ m_zTrkErrorCut

DoubleProperty InDet::InDetVKalVxInJetTool::m_zTrkErrorCut
private
Initial value:
{this, "ZTrkErrorCut", 5.,
"Track Z impact error cut"}

Definition at line 204 of file InDetVKalVxInJetTool.h.

204 {this, "ZTrkErrorCut", 5.,
205 "Track Z impact error cut"};

The documentation for this class was generated from the following files: