7#include "GaudiKernel/EventContext.h"
8#include "GaudiKernel/IChronoStatSvc.h"
31 const std::string& name,
32 const IInterface* parent):
33 base_class(
type,name,parent)
35 declareInterface<IVertexFitter>(
this);
36 declareInterface<ITrkVKalVrtFitter>(
this);
37 declareInterface<IVertexCascadeFitter>(
this);
53 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"TrkVKalVrtFitter destructor called" <<
endmsg;
57std::unique_ptr<IVKalState>
60 auto state = std::make_unique<State>();
67 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
"TrkVKalVrtFitter finalize() successful" <<
endmsg;
68 return StatusCode::SUCCESS;
100 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"External propagator is not supplied - use internal one"<<
endmsg;
105 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"TrkVKalVrtFitter will uses internal propagator" <<
endmsg;
116 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"TrkVKalVrtFitter initialize() successful" <<
endmsg;
117 if(msgLvl(MSG::DEBUG)){
118 msg(MSG::DEBUG)<<
"TrkVKalVrtFitter configuration:" <<
endmsg;
130 msg(MSG::DEBUG)<<
" with particles M=";
135 msg(MSG::DEBUG)<<
" Default iteration number limit 50 is used " <<
endmsg;
141 else {
msg(MSG::DEBUG)<<
" Constant magnetic field is used! B="<<
m_BMAG<<
endmsg; }
144 else {
msg(MSG::DEBUG)<<
" Internal VKalVrt extrapolator is used!"<<
endmsg;}
149 else {
msg(MSG::DEBUG)<<
" VKalVrt will use Perigee strategy in fits with InDetExtrapolator"<<
endmsg; }
154 return StatusCode::SUCCESS;
168 if (fieldCondObj ==
nullptr) {
198 const std::vector<const TrackParameters*> & perigeeListC,
209 std::vector<const NeutralParameters*> perigeeListN(0);
211 TLorentzVector Momentum;
214 std::vector<double> Chi2PerTrk;
215 std::vector< std::vector<double> > TrkAtVrt;
218 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
228 const std::vector<const TrackParameters*> & perigeeListC,
229 const std::vector<const NeutralParameters*> & perigeeListN,
241 TLorentzVector Momentum;
244 std::vector<double> Chi2PerTrk;
245 std::vector< std::vector<double> > TrkAtVrt;
248 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
264 const std::vector<const TrackParameters*> & perigeeListC,
271 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
294 std::vector<const NeutralParameters*> perigeeListN(0);
296 TLorentzVector Momentum;
299 std::vector<double> Chi2PerTrk;
300 std::vector< std::vector<double> > TrkAtVrt;
303 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
314 const std::vector<const TrackParameters*> & perigeeListC,
315 const std::vector<const NeutralParameters*> & perigeeListN,
323 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
347 TLorentzVector Momentum;
350 std::vector<double> Chi2PerTrk;
351 std::vector< std::vector<double> > TrkAtVrt;
354 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
366std::unique_ptr<xAOD::Vertex>
368 const std::vector<const xAOD::TrackParticle*>& xtpListC,
375 return std::unique_ptr<xAOD::Vertex>(
fit(xtpListC, startingPoint, state));
382 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
385 std::unique_ptr<xAOD::Vertex> tmpVertex;
390 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
392 TLorentzVector Momentum;
395 std::vector<double> Chi2PerTrk;
396 std::vector< std::vector<double> > TrkAtVrt;
399 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
406 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
407 else tmpVertex->addTrackAtVertex(TEL,1.);
415 const std::vector<const xAOD::TrackParticle*> & xtpListC,
416 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
423 std::unique_ptr<xAOD::Vertex> tmpVertex;
429 TLorentzVector Momentum;
432 std::vector<double> Chi2PerTrk;
433 std::vector< std::vector<double> > TrkAtVrt;
436 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
442 if(ii<(
int)xtpListC.size()) {
444 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
445 else tmpVertex->addTrackAtVertex(TEL,1.);
448 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
449 else tmpVertex->addNeutralAtVertex(TEL,1.);
460 const std::vector<const xAOD::TrackParticle*> & xtpListC,
467 return fit (xtpListC, constraint, state);
473 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
476 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
477 std::unique_ptr<xAOD::Vertex> tmpVertex;
491 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
493 TLorentzVector Momentum;
496 std::vector<double> Chi2PerTrk;
497 std::vector< std::vector<double> > TrkAtVrt;
500 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
507 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
508 else tmpVertex->addTrackAtVertex(TEL,1.);
516 const std::vector<const xAOD::TrackParticle*> & xtpListC,
517 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
525 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
526 std::unique_ptr<xAOD::Vertex> tmpVertex;
541 TLorentzVector Momentum;
544 std::vector<double> Chi2PerTrk;
545 std::vector< std::vector<double> > TrkAtVrt;
548 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
554 if(ii<(
int)xtpListC.size()) {
556 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
557 else tmpVertex->addTrackAtVertex(TEL,1.);
560 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
561 else tmpVertex->addNeutralAtVertex(TEL,1.);
571 const std::vector<const TrackParameters*> & perigeeListC)
const
580 std::vector<const NeutralParameters*> perigeeListN(0);
582 TLorentzVector Momentum;
585 std::vector<double> Chi2PerTrk;
586 std::vector< std::vector<double> > TrkAtVrt;
589 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
598 const std::vector<const TrackParameters*> & perigeeListC,
599 const std::vector<const NeutralParameters*> & perigeeListN)
const
609 TLorentzVector Momentum;
612 std::vector<double> Chi2PerTrk;
613 std::vector< std::vector<double> > TrkAtVrt;
616 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
633 CovMtx.setIdentity();
634 if(
Matrix.size() < 21)
return;
638 CovMtx.fillSymmetric(2,3,
Matrix[13]);
640 CovMtx.fillSymmetric(2,4,
Matrix[18]);
641 CovMtx.fillSymmetric(3,4,
Matrix[19]);
649 int NContent =
Matrix.size();
650 CovMtx.setIdentity();
653 int pnt = (iTmp+1)*iTmp/2 + iTmp;
if( pnt > NContent )
return;
654 CovMtx(2,2) =
Matrix[pnt];
655 pnt = (iTmp+1+1)*(iTmp+1)/2 + iTmp;
if( pnt+1 > NContent ){ CovMtx.setIdentity();
return; }
656 CovMtx.fillSymmetric(2,3,
Matrix[pnt]);
657 CovMtx(3,3) =
Matrix[pnt+1];
658 pnt = (iTmp+2+1)*(iTmp+2)/2 + iTmp;
if( pnt+2 > NContent ){ CovMtx.setIdentity();
return; }
659 CovMtx.fillSymmetric(2,4,
Matrix[pnt]);
660 CovMtx.fillSymmetric(3,4,
Matrix[pnt+1]);
661 CovMtx(4,4) =
Matrix[pnt+2];
670 for(
int i=1; i<=(3+3*NTrk); i++){
671 for(
int j=1; j<=i; j++){
672 if(i==j){ (*mtx)(i-1,j-1)=
Matrix[ij];}
673 else { (*mtx).fillSymmetric(i-1,j-1,
Matrix[ij]);}
684 const std::vector<double> & Chi2PerTrk,
const std::vector< std::vector<double> >& TrkAtVrt,
691 auto tmpVertex = std::make_unique<xAOD::Vertex>();
692 tmpVertex->makePrivateStore();
693 tmpVertex->setPosition(
Vertex);
694 tmpVertex->setFitQuality(Chi2, (
float)Ndf);
696 std::vector<VxTrackAtVertex> & tmpVTAV=tmpVertex->vxTrackAtVertex();
698 std::vector <double> CovFull;
700 int covarExist=0;
if(
sc.isSuccess() ) covarExist=1;
702 std::vector<float> floatErrMtx;
704 floatErrMtx.resize(CovFull.size());
705 for(
int i=0; i<(int)CovFull.size(); i++) {
706 if( CovFull[i] < std::numeric_limits<float>::max() &&
707 CovFull[i] > std::numeric_limits<float>::lowest() ){
708 floatErrMtx[i]=
static_cast<float>(CovFull[i]);
710 floatErrMtx[i]=std::numeric_limits<float>::max();
714 floatErrMtx.resize(fitErrorMatrix.size());
715 for(
int i=0; i<(int)fitErrorMatrix.size(); i++) {
716 if( fitErrorMatrix[i] < std::numeric_limits<float>::max() &&
717 fitErrorMatrix[i] > std::numeric_limits<float>::lowest() ){
718 floatErrMtx[i]=
static_cast<float>(fitErrorMatrix[i]);
720 floatErrMtx[i]=std::numeric_limits<float>::max();
724 tmpVertex->setCovariance(floatErrMtx);
726 for(
int ii=0; ii<NTrk ; ii++) {
728 if(covarExist){
FillMatrixP( ii, CovMtxP, CovFull );}
729 else { CovMtxP.setIdentity();}
732 if(ii<NTrk-Neutrals){
733 tmpChargPer =
new Perigee( 0.,0., TrkAtVrt[ii][0],
742 std::move(CovMtxP) );
744 tmpVTAV.emplace_back(Chi2PerTrk[ii], tmpChargPer, tmpNeutrPer );
#define AmgSymMatrix(dim)
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
ElementLink implementation for ROOT usage.
bool setElement(ElementType element)
Set link to point to an Element (slowest).
Class describing the Line to which the Perigee refers to.
VKalAtlasMagFld m_fitField
std::vector< double > m_MassInputParticles
MagField::AtlasFieldCache m_fieldCache
std::vector< double > m_VertexForConstraint
bool m_allowUltraDisplaced
std::vector< double > m_CovVrtForConstraint
VKalVrtControl m_vkalFitControl
double m_massForConstraint
const EventContext * m_eventContext
bool m_frozenVersionForBTagging
TrkVKalVrtFitter(const std::string &t, const std::string &name, const IInterface *parent)
virtual std::unique_ptr< xAOD::Vertex > fit(const EventContext &ctx, const std::vector< const TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const override final
Interface for MeasuredPerigee with starting point.
const IExtrapolator * m_InDetExtrapolator
Pointer to Extrapolator AlgTool.
Gaudi::Property< bool > m_makeExtendedVertex
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
static Amg::MatrixX * GiveFullMatrix(int NTrk, std::vector< double > &)
Gaudi::Property< bool > m_usePhiCnst
virtual void setCovVrtForConstraint(double XX, double XY, double YY, double XZ, double YZ, double ZZ, IVKalState &istate) const override final
virtual StatusCode VKalVrtFitFast(std::span< const xAOD::TrackParticle *const >, Amg::Vector3D &Vertex, double &minDZ, IVKalState &istate) const
virtual void setVertexForConstraint(const xAOD::Vertex &, IVKalState &istate) const override final
Gaudi::Property< bool > m_usePointingCnst
ToolHandle< IExtrapolator > m_extPropagator
Gaudi::Property< int > m_IterationNumber
virtual ~TrkVKalVrtFitter()
Gaudi::Property< bool > m_allowUltraDisplaced
Gaudi::Property< double > m_RobustScale
void initState(const EventContext &ctx, State &state) const
virtual StatusCode initialize() override final
Gaudi::Property< std::vector< double > > m_c_CovVrtForConstraint
virtual StatusCode VKalGetFullCov(long int, dvect &CovMtx, IVKalState &istate, bool=false) const override final
Gaudi::Property< double > m_massForConstraint
virtual StatusCode VKalVrtFit(const std::vector< const xAOD::TrackParticle * > &, const std::vector< const xAOD::NeutralParticle * > &, Amg::Vector3D &Vertex, TLorentzVector &Momentum, long int &Charge, dvect &ErrorMatrix, dvect &Chi2PerTrk, std::vector< std::vector< double > > &TrkAtVrt, double &Chi2, IVKalState &istate, bool ifCovV0=false) const override final
Gaudi::Property< bool > m_frozenVersionForBTagging
Gaudi::Property< bool > m_firstMeasuredPoint
Gaudi::Property< int > m_Robustness
virtual StatusCode VKalGetTrkWeights(dvect &Weights, const IVKalState &istate) const override final
static int VKalGetNDOF(const State &state)
Gaudi::Property< bool > m_usePassWithTrkErr
static void FillMatrixP(AmgSymMatrix(5)&, std::vector< double > &)
Gaudi::Property< bool > m_useZPointingCnst
Gaudi::Property< bool > m_useAprioriVertex
Gaudi::Property< bool > m_useFixedField
std::unique_ptr< xAOD::Vertex > makeXAODVertex(int, const Amg::Vector3D &, const dvect &, const dvect &, const std::vector< dvect > &, double, State &state) const
virtual StatusCode finalize() override final
Gaudi::Property< bool > m_usePassNear
VKalExtPropagator * m_fitPropagator
virtual void setApproximateVertex(double X, double Y, double Z, IVKalState &istate) const override final
Gaudi::Property< std::vector< double > > m_c_MassInputParticles
Gaudi::Property< std::vector< double > > m_c_VertexForConstraint
Gaudi::Property< bool > m_firstMeasuredPointLimit
virtual std::unique_ptr< IVKalState > makeState(const EventContext &ctx) const override final
void setAthenaPropagator(const Trk::IExtrapolator *)
Gaudi::Property< bool > m_useThetaCnst
void setAtlasField(MagField::AtlasFieldCache *)
const basePropagator * vk_objProp
This class is a simplest representation of a vertex candidate.
const Amg::Vector3D & position() const
Returns the 3-pos.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
ParametersT< NeutralParametersDim, Neutral, PerigeeSurface > NeutralPerigee
@ z
global position (cartesian)
std::vector< double > dvect
Vertex_v1 Vertex
Define the latest version of the vertex class.