22 const std::string& t,
const std::string &name,
const IInterface* p
25 declareInterface<Prompt::IVertexFittingTool>(
this);
49 return StatusCode::SUCCESS;
65 return StatusCode::SUCCESS;
70 const EventContext& ctx,
72 const std::vector<const xAOD::TrackParticle* > &tracks,
89 ctx, tracks, input.inDetTracks, input.priVtx->position()
101 ATH_MSG_WARNING(
"fitVertexWithPrimarySeed -- failed to get valid vertex");
108 static const SG::AuxElement::Accessor<int> indexAcc(
"SecondaryVertexIndex");
109 static const SG::AuxElement::Accessor<int> typeAcc(
"SVType");
112 typeAcc(*secondaryVtx) =
static_cast<int>(vtxType);
121 const EventContext& ctx,
123 const std::vector<const xAOD::TrackParticle* > &tracks,
135 ctx, tracks, input.inDetTracks, seed
155 static const SG::AuxElement::Accessor<int> indexAcc(
"SecondaryVertexIndex");
156 static const SG::AuxElement::Accessor<int> typeAcc(
"SVType");
159 typeAcc(*secondaryVtx) =
static_cast<int>(vtxType);
172 bool bad_vtx =
false;
175 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- invalid vtx pointer!!!");
181 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- empty vtx covariance!!!");
184 float chisquared = -9999;
186 if(!
getVar(vtx, chisquared,
"chiSquared")) {
188 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- not valid vtx chiSquared!!!");
191 float numberdof = -9999;
193 if(!
getVar(vtx, numberdof,
"numberDoF")) {
195 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- not valid vtx numberDoF!!!");
198 if(std::isnan(vtx->
x()) || std::isnan(vtx->
y()) || std::isnan(vtx->
z())) {
200 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- vertex coordinate is nan");
214 const unsigned nbefore = tracks.size();
216 sort(tracks.begin(), tracks.end());
218 typename std::vector<const xAOD::TrackParticle*>::iterator TransfEnd =
std::unique(tracks.begin(), tracks.end());
220 tracks.erase(TransfEnd, tracks.end());
222 if(nbefore != tracks.size()) {
223 ATH_MSG_DEBUG(
"removeDoubleEntries nbefore != tracks.size()): " << nbefore <<
" != " << tracks.size());
244 float distToPriVtx = -1;
245 float normDistToPriVtx = -1;
246 float distToRefittedPriVtx = -1;
247 float normDistToRefittedPriVtx = -1;
248 float distToRefittedRmLepPriVtx = -1;
249 float normDistToRefittedRmLepPriVtx = -1;
256 if(input.refittedPriVtx) {
261 if(input.refittedPriVtxWithoutLep) {
266 (*m_distToPriVtx) (*secVtx) = distToPriVtx;
267 (*m_normDistToPriVtx) (*secVtx) = normDistToPriVtx;
268 (*m_distToRefittedPriVtx) (*secVtx) = distToRefittedPriVtx;
269 (*m_normDistToRefittedPriVtx) (*secVtx) = normDistToRefittedPriVtx;
270 (*m_distToRefittedRmLepPriVtx) (*secVtx) = distToRefittedRmLepPriVtx;
271 (*m_normDistToRefittedRmLepPriVtx)(*secVtx) = normDistToRefittedRmLepPriVtx;
278 const EventContext& ctx,
279 const std::vector<const xAOD::TrackParticle*> &tracks,
287 std::vector<const xAOD::TrackParticle*> tracksForFit(tracks);
289 ATH_MSG_DEBUG(
"getSecondaryVertexWithSeed -- before remove " << tracksForFit.size());
293 ATH_MSG_DEBUG(
"getSecondaryVertexWithSeed -- after remove " << tracksForFit.size());
295 if(tracksForFit.size() < 2) {
296 ATH_MSG_WARNING(
"getSecondaryVertexWithSeed -- cannot fit vertex with one or zero input track: ntrack=" << tracksForFit.size());
303 ATH_MSG_DEBUG(name() <<
"::getSecondaryVertexWithSeed -- N tracks = " << tracksForFit.size());
306 ATH_MSG_DEBUG( name() <<
"::getSecondaryVertexWithSeed -- track pt, eta = " << track->pt() <<
"," << track->eta());
307 ATH_MSG_DEBUG( name() <<
"::getSecondaryVertexWithSeed -- track chi2 = " << track->chiSquared());
310 std::unique_ptr<xAOD::Vertex> newVertex;
311 std::unique_ptr<xAOD::Vertex> seedVertex;
317 ATH_MSG_DEBUG(
"getSecondaryVertexWithSeed -- failed to fit seed vertex");
323 if(seedVertex.get()) {
324 newVertex =
m_vertexFitter->fit(ctx, tracksForFit, seedVertex->position());
331 ATH_MSG_INFO(
"getSecondaryVertexWithSeed -- failed to fit vertex and fitter returned null xAOD::Vertex pointer");
338 std::vector<ElementLink< xAOD::TrackParticleContainer> > tpLinks;
348 tpLinks.push_back(tpLink);
352 newVertex->setTrackParticleLinks(tpLinks);
354 TLorentzVector Momentum;
357 Momentum +=
static_cast<TLorentzVector
>(track->p4());
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
ElementLink implementation for ROOT usage.
bool toContainedElement(BaseConstReference container, ElementType element)
Set link to point to given element (slowest).
float z() const
Returns the z position.
float y() const
Returns the y position.
const Amg::Vector3D & position() const
Returns the 3-pos.
float x() const
Returns the x position.
const std::vector< float > & covariance() const
Returns the covariance matrix as a simple vector of values.
Eigen::Matrix< double, 3, 1 > Vector3D
std::string PrintResetStopWatch(TStopwatch &watch)
std::string printPromptVertexAsStr(const xAOD::Vertex *vtx, MsgStream &msg)
bool getVar(T1 &obj, T2 &value, const std::string &var_name)
double getNormDist(const Amg::Vector3D &PrimVtx, const Amg::Vector3D &SecVtx, const std::vector< float > &ErrorMatrix, MsgStream &msg)
double getDistance(const xAOD::Vertex *vtx1, const xAOD::Vertex *vtx2)
DataModel_detail::iterator< DVL > unique(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of unique for DataVector/List.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
void setVertexMass(xAOD::Vertex *, float value)
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".