48 return StatusCode::SUCCESS;
54 return StatusCode::SUCCESS;
60 m_Updator(
"Trk::KalmanVertexUpdator", this),
74 declareProperty(
"MaxIterations",
m_maxStep);
80 declareProperty(
"VertexUpdator",
m_Updator);
86 declareProperty(
"ID_maxR",
m_maxR);
87 declareProperty(
"ID_maxZ",
m_maxZ);
99 const std::vector<const Trk::NeutralParameters*> & neutralPerigeeList,
107 xAOD::Vertex * FittedVertex =
fit(perigeeList, neutralPerigeeList, constraint);
110 if(FittedVertex !=
nullptr )
116 for(
unsigned int i = 0; i <perigeeList.size(); ++i)
122 for(
unsigned int i = 0; i <neutralPerigeeList.size(); ++i) {
124 (FittedVertex->
vxTrackAtVertex())[perigeeList.size()+i].setInitialPerigee(iPer);
136 const std::vector<const Trk::NeutralParameters*> & neutralPerigeeList)
const
142 return fit(perigeeList, neutralPerigeeList, start_point);
149 const std::vector<const Trk::NeutralParameters*> & neutralPerigeeList,
154 if(perigeeList.empty())
156 ATH_MSG_INFO(
"Empty vector of tracks passed, returning 0" );
163 const AmgSymMatrix(3)& initialVertexError = constraint.covariancePosition();
169 bool priorInfo=
false;
172 if(initialVertexError.trace() == 0.)
177 float diag = 1000000.0;
180 priorErrorMatrix = in_m * diag;
188 priorErrorMatrix = initialVertexError;
191 std::unique_ptr<xAOD::Vertex> returnVertex = std::make_unique<xAOD::Vertex>();
192 returnVertex->makePrivateStore();
193 returnVertex->setPosition( priorVertexPosition );
194 returnVertex->setCovariancePosition( priorErrorMatrix );
195 returnVertex->setFitQuality( in_chi, in_ndf );
199 std::vector<Trk::VxTrackAtVertex> tracks_to_fit =
linearizeTracks(perigeeList, neutralPerigeeList, *returnVertex);
200 std::vector<Trk::VxTrackAtVertex> fittedTracks(0);
201 returnVertex->vxTrackAtVertex() = fittedTracks;
207 double newChi2= returnVertex->chiSquared();
208 double previousChi2{};
209 unsigned int n_iter = 0;
213 std::vector<Trk::VxTrackAtVertex>::iterator tracksBegin = tracks_to_fit.begin();
214 std::vector<Trk::VxTrackAtVertex>::iterator tracksEnd = tracks_to_fit.end();
215 auto deltaChi2 = [](
double chi1,
double chi0){
216 return std::abs((chi1-chi0)*2./(chi1+chi0+2.));
220 returnVertex->setPosition( newPosition );
221 returnVertex->setCovariancePosition( priorErrorMatrix );
222 returnVertex->setFitQuality( in_chi, in_ndf );
224 returnVertex->setPosition( priorVertexPosition );
225 returnVertex->setCovariancePosition( priorErrorMatrix );
226 returnVertex->setFitQuality( in_chi, in_ndf );
235 for(std::vector<Trk::VxTrackAtVertex>::iterator i = tracksBegin; i != tracksEnd;++i)
238 if (new_vertex != returnVertex.get()) {
239 returnVertex.reset( new_vertex );
244 previousPreviousPosition = previousPosition;
245 previousPosition = newPosition;
246 previousChi2 = newChi2;
247 newPosition = returnVertex->position();
248 newChi2 = returnVertex->chiSquared();
252 deltaR = (previousPosition - newPosition).
perp();
262 ATH_MSG_DEBUG(
" steps. Deltachi2: " << deltaChi2(newChi2, previousChi2) );
264 returnVertex.reset();
268 if(returnVertex !=
nullptr){
271 ATH_MSG_INFO(
"Sequential vertex fit fails:: zero pointer returned" );
275 return returnVertex.release();
281 const std::vector<const Trk::NeutralParameters*> & neutralPerigeeList,
286 std::vector<Trk::VxTrackAtVertex> out_tracks(0);
287 for(
const auto *i : perigeeList)
293 if( loc_per !=
nullptr)
304 out_tracks.push_back(*vTrack);
309 ATH_MSG_WARNING(
"Cannot linearize tracks; treatment of neutrals not yet supported" );
314 for(
const auto *i : neutralPerigeeList)
320 if( loc_per !=
nullptr)
330 out_tracks.push_back(*vTrack);
335 ATH_MSG_WARNING(
"Cannot linearize tracks; treatment of neutrals not yet supported" );
346 if ( linVertexPos.perp() >
m_maxR || std::abs(linVertexPos.z()) >
m_maxZ )
348 ATH_MSG_DEBUG(
" Linearization position outside ID. Setting back to (0,0,0) " );
354 std::vector<Trk::VxTrackAtVertex>& out_tracks = tracks;
355 std::vector<Trk::VxTrackAtVertex>::iterator i_end = out_tracks.end();
356 for(std::vector<Trk::VxTrackAtVertex>::iterator i = out_tracks.begin(); i!=i_end; ++i)
372 return fit(vectorTrk, vectorNeut, constraint);
379 if(vectorTrk.empty())
385 if(vectorNeut.empty())
394 std::vector<const Trk::TrackParameters*> measuredPerigees;
395 std::vector<const xAOD::TrackParticle*> trkToFit;
397 for(std::vector<const xAOD::TrackParticle*>::const_iterator i = vectorTrk.begin(); i!= vectorTrk.end();++i)
400 bool foundDuplicate(
false);
401 for (std::vector<const xAOD::TrackParticle*>::const_iterator j = vectorTrk.begin(); j!= i; ++j) {
403 ATH_MSG_WARNING(
"Duplicate track given as input to the fitter. Ignored." );
404 foundDuplicate =
true;
408 if (foundDuplicate)
continue;
412 if(tmpMeasPer!=
nullptr) {
413 trkToFit.push_back(*i);
414 measuredPerigees.push_back(tmpMeasPer);
416 ATH_MSG_INFO(
"Failed to dynamic_cast this track parameters to perigee" );
421 std::vector<const Trk::NeutralParameters*> measuredNeutralPerigees;
422 std::vector<const xAOD::NeutralParticle*> neutToFit;
423 for(std::vector<const xAOD::NeutralParticle*>::const_iterator i = vectorNeut.begin(); i!= vectorNeut.end();++i)
426 bool foundDuplicate(
false);
427 for (std::vector<const xAOD::NeutralParticle*>::const_iterator j = vectorNeut.begin(); j!= i; ++j) {
429 ATH_MSG_WARNING(
"Duplicate neutral given as input to the fitter. Ignored." );
430 foundDuplicate =
true;
434 if (foundDuplicate)
continue;
438 if(tmpMeasPer!=
nullptr) {
439 neutToFit.push_back(*i);
440 measuredNeutralPerigees.push_back(tmpMeasPer);
442 ATH_MSG_INFO(
"Failed to dynamic_cast this neutral parameters to perigee" );
447 xAOD::Vertex* fittedVertex =
fit( measuredPerigees, measuredNeutralPerigees, constraint );
451 if(fittedVertex ==
nullptr)
460 for(
unsigned int i = 0; i <trkToFit.size(); ++i)
480 for(
unsigned int i = 0; i <neutToFit.size(); ++i)
495 ( fittedVertex->
vxTrackAtVertex() )[trkToFit.size()+i].setOrigTrack(linkTT);
504 for (
unsigned int i = 0 ; i < VTAVsize ; ++i)
509 ATH_MSG_WARNING(
"Trying to set link to xAOD::TrackParticle. The VxTrackAtVertex is not found" );
527 if (!linkToXAODTPneutral) {
528 ATH_MSG_WARNING(
"Skipping track. Trying to set link to something else than xAOD::TrackParticle or xAOD::NeutralParticle." );
Scalar perp() const
perp method - perpendicular length
Scalar deltaR(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define AmgSymMatrix(dim)
bool toIndexedElement(BaseConstReference data, index_type elemID, IProxyDict *sg=0)
Set the link to an element given by index and pointer to container.
void makePrivateStore()
Create a new (empty) private store for this object.
An abstract class which is meant to represent an element link to the Trk::Track or Trk::TrackParticle...
Element link to XAOD NeutralParticle.
Element link to XAOD TrackParticle.
bool m_doSmoothing
Flag controlling optional smoothing.
virtual StatusCode initialize() override
bool m_useLooseConvergence
Use loose convergence criterium (maxShift) or hard (+maxDeltaChi2)
virtual xAOD::Vertex * fit(const std::vector< const xAOD::TrackParticle * > &vectorTrk, const std::vector< const xAOD::NeutralParticle * > &vectorNeut, const Amg::Vector3D &startingPoint) const override
Interface for xAOD::TrackParticle and xAOD::NeutralParticle with starting point.
unsigned int m_maxStep
Max number of iterations to perform (in case of no convergence)
ToolHandle< IVertexUpdator > m_Updator
SequentialVertexFitter(const std::string &t, const std::string &n, const IInterface *p)
constructor
ToolHandle< IVertexSmoother > m_Smoother
float m_maxShift
Max shift (represents the convergence criterion)
float m_maxDeltaChi2
Max DeltaChi2 allowed in hard convergence criterium.
void reLinearizeTracks(std::vector< Trk::VxTrackAtVertex > &tracks, const Amg::Vector3D &vrt) const
Relinearization on iterations.
ToolHandle< Trk::IVertexLinearizedTrackFactory > m_LinTrkFactory
virtual StatusCode finalize() override
std::vector< Trk::VxTrackAtVertex > linearizeTracks(const std::vector< const Trk::TrackParameters * > &perigeeList, const std::vector< const Trk::NeutralParameters * > &neutralPerigeeList, const xAOD::Vertex &vrt) const
Internal method related to the linearization of tracks (initial linearization)
virtual ~SequentialVertexFitter()
destructor
The VxTrackAtVertex is a common class for all present TrkVertexFitters The VxTrackAtVertex is designe...
void setWeight(const double)
Set method for a weight.
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.
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 setPosition(const Amg::Vector3D &position)
Sets the 3-position.
bool vxTrackAtVertexAvailable() const
Check if VxTrackAtVertices are attached to the object.
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, 3, 1 > Vector3D
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
ParametersBase< NeutralParametersDim, Neutral > NeutralParameters
ParametersT< NeutralParametersDim, Neutral, PerigeeSurface > NeutralPerigee
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".