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,
207 std::vector<const NeutralParameters*> perigeeListN(0);
209 TLorentzVector Momentum;
212 std::vector<double> Chi2PerTrk;
213 std::vector< std::vector<double> > TrkAtVrt;
216 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
226 const std::vector<const TrackParameters*> & perigeeListC,
227 const std::vector<const NeutralParameters*> & perigeeListN,
237 TLorentzVector Momentum;
240 std::vector<double> Chi2PerTrk;
241 std::vector< std::vector<double> > TrkAtVrt;
244 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
260 const std::vector<const TrackParameters*> & perigeeListC,
265 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
288 std::vector<const NeutralParameters*> perigeeListN(0);
290 TLorentzVector Momentum;
293 std::vector<double> Chi2PerTrk;
294 std::vector< std::vector<double> > TrkAtVrt;
297 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
308 const std::vector<const TrackParameters*> & perigeeListC,
309 const std::vector<const NeutralParameters*> & perigeeListN,
315 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
339 TLorentzVector Momentum;
342 std::vector<double> Chi2PerTrk;
343 std::vector< std::vector<double> > TrkAtVrt;
346 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
358std::unique_ptr<xAOD::Vertex>
360 const std::vector<const xAOD::TrackParticle*>& xtpListC,
365 return std::unique_ptr<xAOD::Vertex>(
fit(xtpListC, startingPoint, state));
372 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
375 std::unique_ptr<xAOD::Vertex> tmpVertex;
380 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
382 TLorentzVector Momentum;
385 std::vector<double> Chi2PerTrk;
386 std::vector< std::vector<double> > TrkAtVrt;
389 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
396 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
397 else tmpVertex->addTrackAtVertex(TEL,1.);
405 const std::vector<const xAOD::TrackParticle*> & xtpListC,
406 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
411 std::unique_ptr<xAOD::Vertex> tmpVertex;
417 TLorentzVector Momentum;
420 std::vector<double> Chi2PerTrk;
421 std::vector< std::vector<double> > TrkAtVrt;
424 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
430 if(ii<(
int)xtpListC.size()) {
432 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
433 else tmpVertex->addTrackAtVertex(TEL,1.);
436 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
437 else tmpVertex->addNeutralAtVertex(TEL,1.);
448 const std::vector<const xAOD::TrackParticle*> & xtpListC,
453 return fit (xtpListC, constraint, state);
459 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
462 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
463 std::unique_ptr<xAOD::Vertex> tmpVertex;
477 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
479 TLorentzVector Momentum;
482 std::vector<double> Chi2PerTrk;
483 std::vector< std::vector<double> > TrkAtVrt;
486 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
493 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
494 else tmpVertex->addTrackAtVertex(TEL,1.);
502 const std::vector<const xAOD::TrackParticle*> & xtpListC,
503 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
509 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
510 std::unique_ptr<xAOD::Vertex> tmpVertex;
525 TLorentzVector Momentum;
528 std::vector<double> Chi2PerTrk;
529 std::vector< std::vector<double> > TrkAtVrt;
532 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
538 if(ii<(
int)xtpListC.size()) {
540 if(!fittrkwgt.empty()) tmpVertex->addTrackAtVertex(TEL,fittrkwgt[ii]);
541 else tmpVertex->addTrackAtVertex(TEL,1.);
544 if(!fittrkwgt.empty()) tmpVertex->addNeutralAtVertex(TEL,fittrkwgt[ii]);
545 else tmpVertex->addNeutralAtVertex(TEL,1.);
555 const std::vector<const TrackParameters*> & perigeeListC)
const
562 std::vector<const NeutralParameters*> perigeeListN(0);
564 TLorentzVector Momentum;
567 std::vector<double> Chi2PerTrk;
568 std::vector< std::vector<double> > TrkAtVrt;
571 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
580 const std::vector<const TrackParameters*> & perigeeListC,
581 const std::vector<const NeutralParameters*> & perigeeListN)
const
589 TLorentzVector Momentum;
592 std::vector<double> Chi2PerTrk;
593 std::vector< std::vector<double> > TrkAtVrt;
596 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
613 CovMtx.setIdentity();
614 if(
Matrix.size() < 21)
return;
618 CovMtx.fillSymmetric(2,3,
Matrix[13]);
620 CovMtx.fillSymmetric(2,4,
Matrix[18]);
621 CovMtx.fillSymmetric(3,4,
Matrix[19]);
629 int NContent =
Matrix.size();
630 CovMtx.setIdentity();
633 int pnt = (iTmp+1)*iTmp/2 + iTmp;
if( pnt > NContent )
return;
634 CovMtx(2,2) =
Matrix[pnt];
635 pnt = (iTmp+1+1)*(iTmp+1)/2 + iTmp;
if( pnt+1 > NContent ){ CovMtx.setIdentity();
return; }
636 CovMtx.fillSymmetric(2,3,
Matrix[pnt]);
637 CovMtx(3,3) =
Matrix[pnt+1];
638 pnt = (iTmp+2+1)*(iTmp+2)/2 + iTmp;
if( pnt+2 > NContent ){ CovMtx.setIdentity();
return; }
639 CovMtx.fillSymmetric(2,4,
Matrix[pnt]);
640 CovMtx.fillSymmetric(3,4,
Matrix[pnt+1]);
641 CovMtx(4,4) =
Matrix[pnt+2];
650 for(
int i=1; i<=(3+3*NTrk); i++){
651 for(
int j=1; j<=i; j++){
652 if(i==j){ (*mtx)(i-1,j-1)=
Matrix[ij];}
653 else { (*mtx).fillSymmetric(i-1,j-1,
Matrix[ij]);}
664 const std::vector<double> & Chi2PerTrk,
const std::vector< std::vector<double> >& TrkAtVrt,
671 auto tmpVertex = std::make_unique<xAOD::Vertex>();
672 tmpVertex->makePrivateStore();
673 tmpVertex->setPosition(
Vertex);
674 tmpVertex->setFitQuality(Chi2, (
float)Ndf);
676 std::vector<VxTrackAtVertex> & tmpVTAV=tmpVertex->vxTrackAtVertex();
678 std::vector <double> CovFull;
680 int covarExist=0;
if(
sc.isSuccess() ) covarExist=1;
682 std::vector<float> floatErrMtx;
684 floatErrMtx.resize(CovFull.size());
685 for(
int i=0; i<(int)CovFull.size(); i++) {
686 if( CovFull[i] < std::numeric_limits<float>::max() &&
687 CovFull[i] > std::numeric_limits<float>::lowest() ){
688 floatErrMtx[i]=
static_cast<float>(CovFull[i]);
690 floatErrMtx[i]=std::numeric_limits<float>::max();
694 floatErrMtx.resize(fitErrorMatrix.size());
695 for(
int i=0; i<(int)fitErrorMatrix.size(); i++) {
696 if( fitErrorMatrix[i] < std::numeric_limits<float>::max() &&
697 fitErrorMatrix[i] > std::numeric_limits<float>::lowest() ){
698 floatErrMtx[i]=
static_cast<float>(fitErrorMatrix[i]);
700 floatErrMtx[i]=std::numeric_limits<float>::max();
704 tmpVertex->setCovariance(floatErrMtx);
706 for(
int ii=0; ii<NTrk ; ii++) {
708 if(covarExist){
FillMatrixP( ii, CovMtxP, CovFull );}
709 else { CovMtxP.setIdentity();}
712 if(ii<NTrk-Neutrals){
713 tmpChargPer =
new Perigee( 0.,0., TrkAtVrt[ii][0],
722 std::move(CovMtxP) );
724 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.