42 declareInterface<IVertexFitter>(
this);
49 StatusCode s = AlgTool::initialize();
52 msg(MSG::FATAL) <<
"AlgTool::initialize() failed" <<
endmsg;
53 return StatusCode::FAILURE;
57 return StatusCode::FAILURE;
64 return StatusCode::FAILURE;
71 return StatusCode::FAILURE;
78 return StatusCode::FAILURE;
85 return StatusCode::FAILURE;
95 return StatusCode::FAILURE;
103 return StatusCode::FAILURE;
108 return StatusCode::SUCCESS;
112 std::unique_ptr<xAOD::Vertex>
114 const EventContext& ctx,
115 const std::vector<const Trk::TrackParameters*>& perigeeList,
116 const std::vector<const Trk::NeutralParameters*>& neutralPerigeeList,
120 bool IsStartingPoint)
const
124 if ( (perigeeList.size() + neutralPerigeeList.size())<2 && !IsConstraint ) {
125 msg(MSG::WARNING) <<
"Not enough tracks (>2) to fit in this event (without constraint)." <<
endmsg;
128 if ((perigeeList.size() + neutralPerigeeList.size())<1 && IsConstraint) {
129 msg(MSG::WARNING) <<
"Not enough tracks (>1) to fit in this event (with constraint)." <<
endmsg;
136 if (IsStartingPoint) {
137 SeedPoint=startingPoint;
139 if (perigeeList.size()>1) {
141 SeedPoint=
m_SeedFinder->findSeed(perigeeList,&constraint);
146 else if (IsConstraint) {
147 SeedPoint=constraint.position();
156 SeedPoint=constraint.position();
164 std::vector<VxTrackAtVertex> theLinTracks;
166 std::vector<const Trk::TrackParameters*>::const_iterator perigeesBegin=perigeeList.begin();
167 std::vector<const Trk::TrackParameters*>::const_iterator perigeesEnd=perigeeList.end();
169 ATH_MSG_DEBUG(
"Inside fitter with track perigee parameters.");
173 for (std::vector<const Trk::TrackParameters*>::const_iterator perigeesIter=perigeesBegin;perigeesIter!=perigeesEnd;++perigeesIter) {
180 ATH_MSG_DEBUG(
"Track #" << myDebugNTrk++ <<
". TrackParameters: x = " << (*perigeesIter)->position().x() <<
", y = "<< (*perigeesIter)->position().y() <<
", z = "<< (*perigeesIter)->position().z() <<
". Covariance: " << *(*perigeesIter)->covariance());
188 msg(MSG::DEBUG) <<
"Adding compatibility to vertex information failed. Newton distance finder didn't converge..." <<
endmsg;
191 theLinTracks.push_back(*LinTrackToAdd);
193 delete LinTrackToAdd;
197 std::vector<const Trk::NeutralParameters*>::const_iterator neutralPerigeesBegin=neutralPerigeeList.begin();
198 std::vector<const Trk::NeutralParameters*>::const_iterator neutralPerigeesEnd =neutralPerigeeList.end();
200 ATH_MSG_DEBUG(
"Inside fitter with neutral perigee parameters.");
202 int myDebugNNeutral(0);
203 for (std::vector<const Trk::NeutralParameters*>::const_iterator neutralPerigeesIter=neutralPerigeesBegin;neutralPerigeesIter!=neutralPerigeesEnd;++neutralPerigeesIter) {
205 ATH_MSG_DEBUG(
"Neutral #" << myDebugNNeutral++ <<
". NeutralParameters: x = " << (*neutralPerigeesIter)->position().x() <<
", y = "<< (*neutralPerigeesIter)->position().y() <<
", z = "<< (*neutralPerigeesIter)->position().z());
206 ATH_MSG_DEBUG(
" Covariance: " << *(*neutralPerigeesIter)->covariance());
207 ATH_MSG_DEBUG(
" Momentum: x = " << (*neutralPerigeesIter)->momentum().x() <<
", y = "<< (*neutralPerigeesIter)->momentum().y() <<
", z = "<< (*neutralPerigeesIter)->momentum().z());
214 msg(MSG::DEBUG) <<
"Adding compatibility to vertex information failed. Newton distance finder didn't converge..." <<
endmsg;
217 theLinTracks.push_back(*LinTrackToAdd);
219 delete LinTrackToAdd;
226 if(msgLvl(MSG::VERBOSE))
235 ConstraintVertex.makePrivateStore();
238 ConstraintVertex.
setPosition( constraint.position() );
243 startingCovMatrix.setIdentity();
252 return dothefit(ctx,ConstraintVertex,SeedPoint,theLinTracks);
257 std::unique_ptr<xAOD::Vertex>
259 const EventContext& ctx,
260 const std::vector<const Trk::Track*>& VectorTrk,
264 bool IsStartingPoint)
const
267 ATH_MSG_DEBUG(
"Called Adaptive vertex with Trk::Track. N. Tracks = " << VectorTrk.size());
269 std::vector<const Trk::TrackParameters*> perigeeList;
270 for (
const auto *iter : VectorTrk) {
271 if (std::isnan(iter->perigeeParameters()->parameters()[
Trk::d0])) {
274 perigeeList.push_back(iter->perigeeParameters());
277 std::unique_ptr<xAOD::Vertex> FittedVertex =
_fit(ctx,perigeeList,constraint,startingPoint,IsConstraint,IsStartingPoint);
279 if (FittedVertex==
nullptr) {
286 const std::vector<const Trk::Track*>::const_iterator trkbegin=VectorTrk.begin();
287 const std::vector<const Trk::Track*>::const_iterator trkend=VectorTrk.end();
289 const std::vector<VxTrackAtVertex>::iterator vtxbegin=FittedVertex->vxTrackAtVertex().begin();
290 const std::vector<VxTrackAtVertex>::iterator vtxend=FittedVertex->vxTrackAtVertex().end();
292 for (std::vector<const Trk::Track*>::const_iterator trkiter=trkbegin;trkiter!=trkend;++trkiter)
294 for (std::vector<Trk::VxTrackAtVertex>::iterator vtxiter=vtxbegin;vtxiter!=vtxend;++vtxiter)
296 if(((*trkiter)->perigeeParameters()->momentum() -
297 (*vtxiter).initialPerigee()->momentum()).mag()< 1e-8 &&
298 ((*trkiter)->perigeeParameters()->position() -
299 (*vtxiter).initialPerigee()->position()).mag()< 1e-8)
303 link.setElement(*trkiter);
305 (*vtxiter).setOrigTrack(linkTT);
320 std::unique_ptr<xAOD::Vertex>
322 const EventContext& ctx,
325 std::vector<Trk::VxTrackAtVertex>& myLinTracks)
const
336 auto ActualVertex = std::make_unique<xAOD::Vertex>();
337 ActualVertex->makePrivateStore();
338 ActualVertex->setPosition( ConstraintVertex.
position() );
339 ActualVertex->setCovariancePosition( ConstraintVertex.covariancePosition() /
m_AnnealingMaker->getWeight(astate, 1.) );
340 ActualVertex->setFitQuality( ConstraintVertex.
chiSquared(), ConstraintVertex.
numberDoF() );
341 ActualVertex->vxTrackAtVertex() = myLinTracks;
348 if(msgLvl(MSG::VERBOSE))
354 std::vector<Trk::VxTrackAtVertex>::iterator lintracksBegin = ActualVertex->vxTrackAtVertex().begin();
355 std::vector<Trk::VxTrackAtVertex>::iterator lintracksEnd = ActualVertex->vxTrackAtVertex().end();
357 std::vector<Trk::VxTrackAtVertex>::iterator iter;
359 bool relinearization =
false;
363 ActualVertex->setPosition( ConstraintVertex.
position() );
364 ActualVertex->setCovariancePosition( ConstraintVertex.covariancePosition() /
m_AnnealingMaker->getWeight(astate, 1.) );
365 ActualVertex->setFitQuality( ConstraintVertex.
chiSquared(), ConstraintVertex.
numberDoF() );
367 if(msgLvl(MSG::DEBUG))
373 if(msgLvl(MSG::DEBUG))
375 msg(MSG::DEBUG) <<
"New fit step: step number " << num_steps <<
endmsg;
381 relinearization=
false;
383 relinearization=
true;
384 if(msgLvl(MSG::DEBUG))
386 msg(MSG::DEBUG) <<
"Actual vertex too far away from linearization point: have to linearize tracks again" <<
endmsg;
391 for (iter=lintracksBegin;iter!=lintracksEnd;++iter) {
396 msg(MSG::DEBUG) <<
"Adding compatibility to vertex information failed. Newton distance finder didn't converge..." <<
endmsg;
403 lintracksBegin=ActualVertex->vxTrackAtVertex().begin();
404 lintracksEnd=ActualVertex->vxTrackAtVertex().end();
407 for (iter=lintracksBegin;iter!=lintracksEnd;++iter) {
413 iter->setWeight(
m_AnnealingMaker->getWeight( astate, iter->vtxCompatibility() ) );
414 if(msgLvl(MSG::VERBOSE))
416 msg(MSG::VERBOSE) <<
"Before annealing: " << iter->vtxCompatibility() <<
417 " Annealing RESULT is:" << iter->weight() <<
" at T: " <<
425 for (iter=lintracksBegin;iter!=lintracksEnd;++iter) {
426 if(msgLvl(MSG::VERBOSE))
428 msg(MSG::VERBOSE) <<
"Updating vertex with a new track" <<
endmsg;
432 if ( iter->weight() > 1e-3 ) {
435 if ( iter->linState() ==
nullptr) {
437 if(msgLvl(MSG::VERBOSE))
439 msg(MSG::VERBOSE) <<
"Linearizing track for the first time" <<
endmsg;
443 ATH_MSG_DEBUG(
"Linearized track to Seed Point. " << *iter );
444 }
else if (relinearization) {
446 if(msgLvl(MSG::VERBOSE))
448 msg(MSG::VERBOSE) <<
"Relinearizing track " <<
endmsg;
452 ActualSeedPosition=NewVertex;
453 ATH_MSG_DEBUG(
"Linearized track to new seed Point " << NewVertex <<
". " << *iter );
457 if(msgLvl(MSG::VERBOSE))
459 msg(MSG::VERBOSE) <<
"Weight lower than 1e-3, so the track will not be considered anymore" <<
endmsg;
464 msg(MSG::WARNING) <<
"You have just lost a track" <<
endmsg;
469 if(msgLvl(MSG::DEBUG))
471 msg(MSG::DEBUG) <<
"New position x: " << ActualVertex->position().x() <<
" y: " << ActualVertex->position().y()
472 <<
" z: " << ActualVertex->position().z() <<
endmsg;
476 NewVertex = ActualVertex->position();
479 if(msgLvl(MSG::VERBOSE))
481 msg(MSG::VERBOSE) <<
"Now calling one step of annealing" <<
endmsg;
498 for (iter=lintracksBegin;iter!=lintracksEnd;++iter) {
505 if ( iter->initialPerigee() )
506 iter->setPerigeeAtVertex( ( iter->initialPerigee() )->clone() );
507 else if ( iter->initialNeutralPerigee() )
508 iter->setPerigeeAtVertex( ( iter->initialNeutralPerigee() )->clone() );
512 if(msgLvl(MSG::DEBUG))
514 msg(MSG::DEBUG) <<
"chi2: " << ActualVertex->chiSquared()
515 <<
"the ndf of the vertex is at fit end: " << ActualVertex->numberDoF() <<
endmsg;
523 std::unique_ptr<xAOD::Vertex>
525 const EventContext& ctx,
526 const std::vector<const Trk::TrackParameters*>& perigeeList,
527 const std::vector<const Trk::NeutralParameters*>& neutralPerigeeList,
531 return _fit(ctx,perigeeList,neutralPerigeeList,
xAOD::Vertex(),startingPoint,
false,
true);
534 std::unique_ptr<xAOD::Vertex>
536 const EventContext& ctx,
537 const std::vector<const Trk::TrackParameters*>& perigeeList,
538 const std::vector<const Trk::NeutralParameters*>& neutralPerigeeList,
541 return _fit(ctx,perigeeList,neutralPerigeeList,constraint,Amg::Vector3D::Zero(),
true);
544 std::unique_ptr<xAOD::Vertex>
546 const EventContext& ctx,
547 const std::vector<const Trk::TrackParameters*>& perigeeList,
548 const std::vector<const Trk::NeutralParameters*>& neutralPerigeeList,
552 return _fit(ctx,perigeeList,neutralPerigeeList,constraint,startingPoint,
true,
true);
555 std::unique_ptr<xAOD::Vertex>
557 const EventContext& ctx,
558 const std::vector<const Trk::TrackParameters*>& perigeeList,
559 const std::vector<const Trk::NeutralParameters*>& neutralPerigeeList)
const
564 std::unique_ptr<xAOD::Vertex>
566 const EventContext& ctx,
567 const std::vector<const Trk::TrackParameters*>& perigeeList,
570 const std::vector<const Trk::NeutralParameters*> neutralPerigeeList;
571 return fit(ctx, perigeeList, neutralPerigeeList, startingPoint);
574 std::unique_ptr<xAOD::Vertex>
576 const EventContext& ctx,
577 const std::vector<const Trk::TrackParameters*>& perigeeList,
580 const std::vector<const Trk::NeutralParameters*> neutralPerigeeList;
581 return fit(ctx, perigeeList, neutralPerigeeList, constraint);
584 std::unique_ptr<xAOD::Vertex>
586 const EventContext& ctx,
587 const std::vector<const Trk::TrackParameters*>& perigeeList,
591 const std::vector<const Trk::NeutralParameters*> neutralPerigeeList;
592 return fit(ctx, perigeeList, neutralPerigeeList, constraint, startingPoint);
595 std::unique_ptr<xAOD::Vertex>
597 const EventContext& ctx,
598 const std::vector<const Trk::TrackParameters*> & perigeeList)
const
600 const std::vector<const Trk::NeutralParameters*> neutralPerigeeList;
601 return fit(ctx,perigeeList,neutralPerigeeList);
604 std::unique_ptr<xAOD::Vertex>
606 const EventContext& ctx,
607 const std::vector<const Trk::TrackParameters*> & perigeeList,
611 bool IsStartingPoint)
const
613 const std::vector<const Trk::NeutralParameters*> neutralPerigeeList;
614 return _fit(ctx, perigeeList, neutralPerigeeList, constraint, startingPoint, IsConstraint, IsStartingPoint);
620 std::unique_ptr<xAOD::Vertex>
622 const EventContext& ctx,
623 const std::vector<const xAOD::TrackParticle*>& vectorTrk,
624 const std::vector<const xAOD::NeutralParticle*>& vectorNeut,
628 if (vectorTrk.empty()) {
629 msg(MSG::INFO) <<
"Empty vector of tracks passed" <<
endmsg;
633 if (vectorNeut.empty()) {
634 msg(MSG::VERBOSE) <<
"Empty vector of neutrals passed" <<
endmsg;
638 std::vector<const Trk::TrackParameters*> measuredPerigees;
640 for (
const auto *i : vectorTrk) {
643 if (tmpMeasPer !=
nullptr)
644 measuredPerigees.push_back(tmpMeasPer);
647 <<
"Failed to dynamic_cast this track parameters to perigee"
653 std::vector<const Trk::NeutralParameters*> measuredNeutralPerigees;
655 for (
const auto *i : vectorNeut) {
658 if (tmpMeasPer !=
nullptr)
659 measuredNeutralPerigees.push_back(tmpMeasPer);
662 <<
"Failed to dynamic_cast this neutral parameters to perigee"
667 std::unique_ptr<xAOD::Vertex> fittedVertex =
_fit(
670 measuredNeutralPerigees,
677 if (fittedVertex ==
nullptr) {
682 ->vxTrackAtVertexAvailable())
686 if (!fittedVertex->vxTrackAtVertex().empty()) {
687 for (
unsigned int i = 0; i < vectorTrk.size(); ++i) {
692 vectorTrk[i]->container());
694 if (!linkTT->toIndexedElement(*cont, vectorTrk[i]->index())) {
696 <<
"Failed to set the EL for this particle correctly" <<
endmsg;
700 <<
"Failed to identify a container for this TP" <<
endmsg;
704 (fittedVertex->vxTrackAtVertex())[i].setOrigTrack(linkTT);
707 for (
unsigned int i = 0; i < vectorNeut.size(); ++i) {
711 vectorNeut[i]->container());
713 if (!linkTT->toIndexedElement(*cont, vectorNeut[i]->index())) {
715 <<
"Failed to set the EL for this particle correctly" <<
endmsg;
719 <<
"Failed to identify a container for this TP" <<
endmsg;
723 (fittedVertex->vxTrackAtVertex())[i + vectorTrk.size()].setOrigTrack(
732 unsigned int VTAVsize = fittedVertex->vxTrackAtVertex().size();
733 for (
unsigned int i = 0; i < VTAVsize; ++i) {
738 "VxTrackAtVertex is not found");
750 fittedVertex->addTrackAtVertex(*linkToXAODTP, VTAV->
weight());
757 if (!linkToXAODTPneutral) {
759 "Skipping track. Trying to set link to something else than "
760 "xAOD::TrackParticle or xAOD::NeutralParticle.");
763 fittedVertex->addNeutralAtVertex(*linkToXAODTPneutral,
773 std::unique_ptr<xAOD::Vertex>
775 const EventContext& ctx,
776 const std::vector<const xAOD::TrackParticle*>& vectorTrk,
777 const std::vector<const xAOD::NeutralParticle*>& vectorNeut,
781 if(vectorTrk.empty())
783 msg(MSG::INFO)<<
"Empty vector of tracks passed"<<
endmsg;
787 if(vectorNeut.empty())
789 msg(MSG::INFO)<<
"Empty vector of neutrals passed"<<
endmsg;
793 std::vector<const Trk::TrackParameters*> measuredPerigees;
795 for(
const auto *i : vectorTrk)
799 if(tmpMeasPer!=
nullptr) measuredPerigees.push_back(tmpMeasPer);
800 else msg(MSG::INFO)<<
"Failed to dynamic_cast this track parameters to perigee"<<
endmsg;
804 std::vector<const Trk::NeutralParameters*> measuredNeutralPerigees;
806 for(
const auto *i : vectorNeut)
810 if(tmpMeasPer!=
nullptr) measuredNeutralPerigees.push_back(tmpMeasPer);
811 else msg(MSG::INFO)<<
"Failed to dynamic_cast this neutral parameters to perigee"<<
endmsg;
815 std::unique_ptr<xAOD::Vertex> fittedVertex =
_fit(ctx, measuredPerigees, measuredNeutralPerigees, constraint,
Amg::Vector3D(),
true);
820 if( fittedVertex->vxTrackAtVertexAvailable() )
822 if(!fittedVertex->vxTrackAtVertex().empty())
824 for(
unsigned int i = 0; i <vectorTrk.size(); ++i)
831 if( ! linkTT->toIndexedElement( *cont, vectorTrk[ i ]->index() ) )
833 msg(MSG::WARNING)<<
"Failed to set the EL for this particle correctly"<<
endmsg;
836 msg(MSG::WARNING)<<
"Failed to identify a container for this TP"<<
endmsg;
841 ( fittedVertex->vxTrackAtVertex() )[i].setOrigTrack(linkTT);
844 for(
unsigned int i = 0; i <vectorNeut.size(); ++i)
850 if( ! linkTT->toIndexedElement( *cont, vectorNeut[ i ]->index() ) )
852 msg(MSG::WARNING)<<
"Failed to set the EL for this particle correctly"<<
endmsg;
855 msg(MSG::WARNING)<<
"Failed to identify a container for this NP"<<
endmsg;
859 ( fittedVertex->vxTrackAtVertex() )[vectorTrk.size()+i].setOrigTrack(linkTT);
868 unsigned int VTAVsize = fittedVertex->vxTrackAtVertex().size();
869 for (
unsigned int i = 0 ; i < VTAVsize ; ++i)
874 ATH_MSG_WARNING (
" Trying to set link to xAOD::TrackParticle. The VxTrackAtVertex is not found");
886 fittedVertex->addTrackAtVertex(*linkToXAODTP, VTAV->
weight());
892 if (!linkToXAODTPneutral) {
893 ATH_MSG_WARNING (
"Skipping track. Trying to set link to something else than xAOD::TrackParticle or xAOD::NeutralParticle.");
896 fittedVertex->addNeutralAtVertex(*linkToXAODTPneutral, VTAV->
weight());
Scalar perp() const
perp method - perpendicular length
#define ATH_MSG_WARNING(x)
#define AmgSymMatrix(dim)
ElementLink implementation for ROOT usage.
std::unique_ptr< xAOD::Vertex > _fit(const EventContext &ctx, const std::vector< const Trk::TrackParameters * > &perigeeList, const std::vector< const Trk::NeutralParameters * > &neutralPerigeeList=std::vector< const Trk::NeutralParameters * >(), const xAOD::Vertex &constraint=xAOD::Vertex(), const Amg::Vector3D &startingPoint=Amg::Vector3D(), bool IsConstraint=false, bool IsStartingPoint=false) const
Internal method for fitting a list of TrackParameters and NeutralParameters, with or without constrai...
virtual ~AdaptiveVertexFitter()
destructor
ToolHandle< Trk::IVertexTrackCompatibilityEstimator > m_TrackCompatibilityEstimator
double m_initialError
Initial error in form of diagonal elements of the inverse of the covariance matrix (name is misleadin...
ToolHandle< Trk::IImpactPoint3dEstimator > m_ImpactPoint3dEstimator
bool m_doSmoothing
True if smoothing after fit iterations has to be performed: otherwise the Smoother AlgoTool provided ...
AdaptiveVertexFitter(const std::string &t, const std::string &n, const IInterface *p)
default constructor due to Athena interface
bool m_onlyzseed
Variable is true if seeding has to be performed only on the z direction.
ToolHandle< Trk::IVertexSmoother > m_VertexSmoother
virtual std::unique_ptr< xAOD::Vertex > fit(const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &vectorTrk, const std::vector< const xAOD::NeutralParticle * > &vectorNeut, const Amg::Vector3D &startingPoint) const override
Interface for xAOD::TrackParticle with starting point.
std::unique_ptr< xAOD::Vertex > dothefit(const EventContext &ctx, const xAOD::Vertex &ConstraintVertex, const Amg::Vector3D &SeedVertex, std::vector< VxTrackAtVertex > &myLinTracks) const
Internal method, called by the two _fit internal functions, in order to perform the fit,...
virtual StatusCode initialize() override
ToolHandle< Trk::IVertexAnnealingMaker > m_AnnealingMaker
ToolHandle< Trk::IVertexSeedFinder > m_SeedFinder
ToolHandle< Trk::IVertexUpdator > m_VertexUpdator
ToolHandle< Trk::IVertexLinearizedTrackFactory > m_LinearizedTrackFactory
double m_maxDistToLinPoint
Maximum distance of linearization point of track to actual fitted vertex before needing to relineariz...
long int m_maxIterations
Number of maximum iterations.
An abstract class which is meant to represent an element link to the Trk::Track or Trk::TrackParticle...
unsigned int AnnealingState
AUTO - An Undocumented Tracking Object.
Element link to XAOD NeutralParticle.
Element link to XAOD TrackParticle.
The VxTrackAtVertex is a common class for all present TrkVertexFitters The VxTrackAtVertex is designe...
double weight(void) const
Information about the weight of track in fit (given back by annealing): weight=ndf/2.
const ITrackLink * trackOrParticleLink(void) const
void setCovariancePosition(const AmgSymMatrix(3)&covariancePosition)
Sets the vertex covariance matrix.
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
float chiSquared() const
Returns the of the vertex fit as float.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
const Amg::Vector3D & position() const
Returns the 3-pos.
Eigen::Matrix< double, 3, 1 > Vector3D
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersBase< NeutralParametersDim, Neutral > NeutralParameters
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ NotSpecified
Default value, no explicit type set.
NeutralParticleContainer_v1 NeutralParticleContainer
Definition of the current "NeutralParticle container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".