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;
160 initState(Gaudi::Hive::currentContext(), state);
174 if (fieldCondObj ==
nullptr) {
212 std::vector<const NeutralParameters*> perigeeListN(0);
214 TLorentzVector Momentum;
217 std::vector<double> Chi2PerTrk;
218 std::vector< std::vector<double> > TrkAtVrt;
221 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
232 const std::vector<const NeutralParameters*> & perigeeListN,
242 TLorentzVector Momentum;
245 std::vector<double> Chi2PerTrk;
246 std::vector< std::vector<double> > TrkAtVrt;
249 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
270 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
293 std::vector<const NeutralParameters*> perigeeListN(0);
295 TLorentzVector Momentum;
298 std::vector<double> Chi2PerTrk;
299 std::vector< std::vector<double> > TrkAtVrt;
302 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
314 const std::vector<const NeutralParameters*> & perigeeListN,
320 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
344 TLorentzVector Momentum;
347 std::vector<double> Chi2PerTrk;
348 std::vector< std::vector<double> > TrkAtVrt;
351 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
364std::unique_ptr<xAOD::Vertex>
366 const std::vector<const xAOD::TrackParticle*>& xtpListC,
371 return std::unique_ptr<xAOD::Vertex>(
fit(xtpListC, startingPoint, state));
378 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
386 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
388 TLorentzVector Momentum;
391 std::vector<double> Chi2PerTrk;
392 std::vector< std::vector<double> > TrkAtVrt;
395 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
411 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
422 TLorentzVector Momentum;
425 std::vector<double> Chi2PerTrk;
426 std::vector< std::vector<double> > TrkAtVrt;
429 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
435 if(ii<(
int)xtpListC.size()) {
457 return fit (xtpListC, constraint, state);
463 assert(
dynamic_cast<State*
> (&istate)!=
nullptr);
466 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
481 std::vector<const xAOD::NeutralParticle*> xtpListN(0);
483 TLorentzVector Momentum;
486 std::vector<double> Chi2PerTrk;
487 std::vector< std::vector<double> > TrkAtVrt;
490 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
506 const std::vector<const xAOD::NeutralParticle*> & xtpListN,
512 if(msgLvl(MSG::DEBUG))
msg(MSG::DEBUG)<<
"A priori vertex constraint is activated in VKalVrt fitter!" <<
endmsg;
528 TLorentzVector Momentum;
531 std::vector<double> Chi2PerTrk;
532 std::vector< std::vector<double> > TrkAtVrt;
535 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
541 if(ii<(
int)xtpListC.size()) {
564 std::vector<const NeutralParameters*> perigeeListN(0);
566 TLorentzVector Momentum;
569 std::vector<double> Chi2PerTrk;
570 std::vector< std::vector<double> > TrkAtVrt;
573 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
583 const std::vector<const NeutralParameters*> & perigeeListN)
const
591 TLorentzVector Momentum;
594 std::vector<double> Chi2PerTrk;
595 std::vector< std::vector<double> > TrkAtVrt;
598 Vertex, Momentum, Charge,
ErrorMatrix, Chi2PerTrk, TrkAtVrt, Chi2, state,
true );
616 CovMtx.setIdentity();
617 if(
Matrix.size() < 21)
return;
621 CovMtx.fillSymmetric(2,3,
Matrix[13]);
623 CovMtx.fillSymmetric(2,4,
Matrix[18]);
624 CovMtx.fillSymmetric(3,4,
Matrix[19]);
632 int NContent =
Matrix.size();
633 CovMtx.setIdentity();
636 int pnt = (iTmp+1)*iTmp/2 + iTmp;
if( pnt > NContent )
return;
637 CovMtx(2,2) =
Matrix[pnt];
638 pnt = (iTmp+1+1)*(iTmp+1)/2 + iTmp;
if( pnt+1 > NContent ){ CovMtx.setIdentity();
return; }
639 CovMtx.fillSymmetric(2,3,
Matrix[pnt]);
640 CovMtx(3,3) =
Matrix[pnt+1];
641 pnt = (iTmp+2+1)*(iTmp+2)/2 + iTmp;
if( pnt+2 > NContent ){ CovMtx.setIdentity();
return; }
642 CovMtx.fillSymmetric(2,4,
Matrix[pnt]);
643 CovMtx.fillSymmetric(3,4,
Matrix[pnt+1]);
644 CovMtx(4,4) =
Matrix[pnt+2];
653 for(
int i=1; i<=(3+3*NTrk); i++){
654 for(
int j=1; j<=i; j++){
655 if(i==j){ (*mtx)(i-1,j-1)=
Matrix[ij];}
656 else { (*mtx).fillSymmetric(i-1,j-1,
Matrix[ij]);}
667 const std::vector<double> & Chi2PerTrk,
const std::vector< std::vector<double> >& TrkAtVrt,
681 std::vector <double> CovFull;
683 int covarExist=0;
if(
sc.isSuccess() ) covarExist=1;
685 std::vector<float> floatErrMtx;
687 floatErrMtx.resize(CovFull.size());
688 for(
int i=0; i<(int)CovFull.size(); i++) {
689 if( CovFull[i] < std::numeric_limits<float>::max() &&
690 CovFull[i] > std::numeric_limits<float>::lowest() ){
691 floatErrMtx[i]=
static_cast<float>(CovFull[i]);
693 floatErrMtx[i]=std::numeric_limits<float>::max();
697 floatErrMtx.resize(fitErrorMatrix.size());
698 for(
int i=0; i<(int)fitErrorMatrix.size(); i++) {
699 if( fitErrorMatrix[i] < std::numeric_limits<float>::max() &&
700 fitErrorMatrix[i] > std::numeric_limits<float>::lowest() ){
701 floatErrMtx[i]=
static_cast<float>(fitErrorMatrix[i]);
703 floatErrMtx[i]=std::numeric_limits<float>::max();
709 for(
int ii=0; ii<NTrk ; ii++) {
711 if(covarExist){
FillMatrixP( ii, CovMtxP, CovFull );}
712 else { CovMtxP.setIdentity();}
715 if(ii<NTrk-Neutrals){
716 tmpChargPer =
new Perigee( 0.,0., TrkAtVrt[ii][0],
725 std::move(CovMtxP) );
727 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 to point to an element.
void makePrivateStore()
Create a new (empty) private store for this object.
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
virtual std::unique_ptr< IVKalState > makeState() const
TrkVKalVrtFitter(const std::string &t, const std::string &name, const IInterface *parent)
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
virtual xAOD::Vertex * fit(const std::vector< const TrackParameters * > &perigeeList, const Amg::Vector3D &startingPoint) const override final
Interface for MeasuredPerigee with starting point.
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
xAOD::Vertex * makeXAODVertex(int, const Amg::Vector3D &, const dvect &, const dvect &, const std::vector< dvect > &, double, State &state) const
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
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
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.
void addTrackAtVertex(const ElementLink< TrackParticleContainer > &tr, float weight=1.0)
Add a new track to the vertex.
void addNeutralAtVertex(const ElementLink< NeutralParticleContainer > &tr, float weight=1.0)
Add a new neutral 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.
std::vector< Trk::VxTrackAtVertex > & vxTrackAtVertex()
Non-const access to the VxTrackAtVertex vector.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
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.