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::TrackParameters*> & perigeeList,
100 const std::vector<const Trk::NeutralParameters*> & neutralPerigeeList,
104 constraint.makePrivateStore();
108 std::unique_ptr<xAOD::Vertex> FittedVertex =
fit(ctx, perigeeList, neutralPerigeeList, constraint);
111 if(FittedVertex !=
nullptr )
113 if(FittedVertex->vxTrackAtVertexAvailable())
115 if(!FittedVertex->vxTrackAtVertex().empty())
117 for(
unsigned int i = 0; i <perigeeList.size(); ++i)
120 (FittedVertex->vxTrackAtVertex())[i].setInitialPerigee(iPer);
123 for(
unsigned int i = 0; i <neutralPerigeeList.size(); ++i) {
125 (FittedVertex->vxTrackAtVertex())[perigeeList.size()+i].setInitialPerigee(iPer);
137 const std::vector<const Trk::TrackParameters*>& perigeeList,
138 const std::vector<const Trk::NeutralParameters*> & neutralPerigeeList)
const
144 return fit(ctx, perigeeList, neutralPerigeeList, start_point);
151 const std::vector<const Trk::TrackParameters*> & perigeeList,
152 const std::vector<const Trk::NeutralParameters*> & neutralPerigeeList,
157 if(perigeeList.empty())
159 ATH_MSG_INFO(
"Empty vector of tracks passed, returning 0" );
166 const AmgSymMatrix(3)& initialVertexError = constraint.covariancePosition();
172 bool priorInfo=
false;
175 if(initialVertexError.trace() == 0.)
180 float diag = 1000000.0;
183 priorErrorMatrix = in_m * diag;
191 priorErrorMatrix = initialVertexError;
194 std::unique_ptr<xAOD::Vertex> returnVertex = std::make_unique<xAOD::Vertex>();
195 returnVertex->makePrivateStore();
196 returnVertex->setPosition( priorVertexPosition );
197 returnVertex->setCovariancePosition( priorErrorMatrix );
198 returnVertex->setFitQuality( in_chi, in_ndf );
202 std::vector<Trk::VxTrackAtVertex> tracks_to_fit =
linearizeTracks(perigeeList, neutralPerigeeList, *returnVertex);
203 std::vector<Trk::VxTrackAtVertex> fittedTracks(0);
204 returnVertex->vxTrackAtVertex() = fittedTracks;
210 double newChi2= returnVertex->chiSquared();
211 double previousChi2{};
212 unsigned int n_iter = 0;
216 std::vector<Trk::VxTrackAtVertex>::iterator tracksBegin = tracks_to_fit.begin();
217 std::vector<Trk::VxTrackAtVertex>::iterator tracksEnd = tracks_to_fit.end();
218 auto deltaChi2 = [](
double chi1,
double chi0){
219 return std::abs((chi1-chi0)*2./(chi1+chi0+2.));
223 returnVertex->setPosition( newPosition );
224 returnVertex->setCovariancePosition( priorErrorMatrix );
225 returnVertex->setFitQuality( in_chi, in_ndf );
227 returnVertex->setPosition( priorVertexPosition );
228 returnVertex->setCovariancePosition( priorErrorMatrix );
229 returnVertex->setFitQuality( in_chi, in_ndf );
238 for(std::vector<Trk::VxTrackAtVertex>::iterator i = tracksBegin; i != tracksEnd;++i)
241 if (new_vertex != returnVertex.get()) {
242 returnVertex.reset( new_vertex );
247 previousPreviousPosition = previousPosition;
248 previousPosition = newPosition;
249 previousChi2 = newChi2;
250 newPosition = returnVertex->position();
251 newChi2 = returnVertex->chiSquared();
255 deltaR = (previousPosition - newPosition).
perp();
265 ATH_MSG_DEBUG(
" steps. Deltachi2: " << deltaChi2(newChi2, previousChi2) );
267 returnVertex.reset();
271 if(returnVertex !=
nullptr){
274 ATH_MSG_INFO(
"Sequential vertex fit fails:: zero pointer returned" );
284 const std::vector<const Trk::NeutralParameters*> & neutralPerigeeList,
289 std::vector<Trk::VxTrackAtVertex> out_tracks(0);
290 for(
const auto *i : perigeeList)
296 if( loc_per !=
nullptr)
307 out_tracks.push_back(*vTrack);
312 ATH_MSG_WARNING(
"Cannot linearize tracks; treatment of neutrals not yet supported" );
317 for(
const auto *i : neutralPerigeeList)
323 if( loc_per !=
nullptr)
333 out_tracks.push_back(*vTrack);
338 ATH_MSG_WARNING(
"Cannot linearize tracks; treatment of neutrals not yet supported" );
349 if ( linVertexPos.perp() >
m_maxR || std::abs(linVertexPos.z()) >
m_maxZ )
351 ATH_MSG_DEBUG(
" Linearization position outside ID. Setting back to (0,0,0) " );
357 std::vector<Trk::VxTrackAtVertex>& out_tracks = tracks;
358 std::vector<Trk::VxTrackAtVertex>::iterator i_end = out_tracks.end();
359 for(std::vector<Trk::VxTrackAtVertex>::iterator i = out_tracks.begin(); i!=i_end; ++i)
368 std::unique_ptr<xAOD::Vertex>
SequentialVertexFitter::fit(
const EventContext& ctx,
const std::vector<const xAOD::TrackParticle*>& vectorTrk,
const std::vector<const xAOD::NeutralParticle*>& vectorNeut,
const Amg::Vector3D& startingPoint)
const
371 constraint.makePrivateStore();
375 return fit(ctx, vectorTrk, vectorNeut, constraint);
379 std::unique_ptr<xAOD::Vertex>
SequentialVertexFitter::fit(
const EventContext& ctx,
const std::vector<const xAOD::TrackParticle*>& vectorTrk,
const std::vector<const xAOD::NeutralParticle*>& vectorNeut,
const xAOD::Vertex& constraint)
const
382 if(vectorTrk.empty())
388 if(vectorNeut.empty())
397 std::vector<const Trk::TrackParameters*> measuredPerigees;
398 std::vector<const xAOD::TrackParticle*> trkToFit;
400 for(std::vector<const xAOD::TrackParticle*>::const_iterator i = vectorTrk.begin(); i!= vectorTrk.end();++i)
403 bool foundDuplicate(
false);
404 for (std::vector<const xAOD::TrackParticle*>::const_iterator j = vectorTrk.begin(); j!= i; ++j) {
406 ATH_MSG_WARNING(
"Duplicate track given as input to the fitter. Ignored." );
407 foundDuplicate =
true;
411 if (foundDuplicate)
continue;
415 if(tmpMeasPer!=
nullptr) {
416 trkToFit.push_back(*i);
417 measuredPerigees.push_back(tmpMeasPer);
419 ATH_MSG_INFO(
"Failed to dynamic_cast this track parameters to perigee" );
424 std::vector<const Trk::NeutralParameters*> measuredNeutralPerigees;
425 std::vector<const xAOD::NeutralParticle*> neutToFit;
426 for(std::vector<const xAOD::NeutralParticle*>::const_iterator i = vectorNeut.begin(); i!= vectorNeut.end();++i)
429 bool foundDuplicate(
false);
430 for (std::vector<const xAOD::NeutralParticle*>::const_iterator j = vectorNeut.begin(); j!= i; ++j) {
432 ATH_MSG_WARNING(
"Duplicate neutral given as input to the fitter. Ignored." );
433 foundDuplicate =
true;
437 if (foundDuplicate)
continue;
441 if(tmpMeasPer!=
nullptr) {
442 neutToFit.push_back(*i);
443 measuredNeutralPerigees.push_back(tmpMeasPer);
445 ATH_MSG_INFO(
"Failed to dynamic_cast this neutral parameters to perigee" );
450 std::unique_ptr<xAOD::Vertex> fittedVertex =
fit( ctx, measuredPerigees, measuredNeutralPerigees, constraint );
454 if(fittedVertex ==
nullptr)
459 if( fittedVertex->vxTrackAtVertexAvailable() )
461 if(!fittedVertex->vxTrackAtVertex().empty())
463 for(
unsigned int i = 0; i <trkToFit.size(); ++i)
470 if( ! linkTT->toIndexedElement( *cont, trkToFit[ i ]->index() ) )
480 ( fittedVertex->vxTrackAtVertex() )[i].setOrigTrack(linkTT);
483 for(
unsigned int i = 0; i <neutToFit.size(); ++i)
489 if( ! linkTT->toIndexedElement( *cont, neutToFit[ i ]->index() ) )
498 ( fittedVertex->vxTrackAtVertex() )[trkToFit.size()+i].setOrigTrack(linkTT);
506 unsigned int VTAVsize = (fittedVertex && fittedVertex->vxTrackAtVertexAvailable()) ? fittedVertex->vxTrackAtVertex().size() : 0 ;
507 for (
unsigned int i = 0 ; i < VTAVsize ; ++i)
512 ATH_MSG_WARNING(
"Trying to set link to xAOD::TrackParticle. The VxTrackAtVertex is not found" );
524 fittedVertex->addTrackAtVertex(*linkToXAODTP, VTAV->
weight());
530 if (!linkToXAODTPneutral) {
531 ATH_MSG_WARNING(
"Skipping track. Trying to set link to something else than xAOD::TrackParticle or xAOD::NeutralParticle." );
534 fittedVertex->addNeutralAtVertex(*linkToXAODTPneutral, VTAV->
weight());
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)
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
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 and xAOD::NeutralParticle with starting point.
bool m_useLooseConvergence
Use loose convergence criterium (maxShift) or hard (+maxDeltaChi2).
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 setPosition(const Amg::Vector3D &position)
Sets the 3-position.
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".