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;
71 const std::vector<const xAOD::TrackParticle* > &tracks,
88 tracks, input.inDetTracks, input.priVtx->position()
100 ATH_MSG_WARNING(
"fitVertexWithPrimarySeed -- failed to get valid vertex");
111 typeAcc(*secondaryVtx) =
static_cast<int>(vtxType);
121 const std::vector<const xAOD::TrackParticle* > &tracks,
133 tracks, input.inDetTracks, seed
157 typeAcc(*secondaryVtx) =
static_cast<int>(vtxType);
170 bool bad_vtx =
false;
173 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- invalid vtx pointer!!!");
179 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- empty vtx covariance!!!");
182 float chisquared = -9999;
184 if(!
getVar(vtx, chisquared,
"chiSquared")) {
186 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- not valid vtx chiSquared!!!");
189 float numberdof = -9999;
191 if(!
getVar(vtx, numberdof,
"numberDoF")) {
193 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- not valid vtx numberDoF!!!");
196 if(std::isnan(vtx->
x()) || std::isnan(vtx->
y()) || std::isnan(vtx->
z())) {
198 ATH_MSG_WARNING(
"VertexFittingSvc::Validate_Vertex -- vertex coordinate is nan");
212 const unsigned nbefore = tracks.size();
214 sort(tracks.begin(), tracks.end());
216 typename std::vector<const xAOD::TrackParticle*>::iterator TransfEnd =
std::unique(tracks.begin(), tracks.end());
218 tracks.erase(TransfEnd, tracks.end());
220 if(nbefore != tracks.size()) {
221 ATH_MSG_DEBUG(
"removeDoubleEntries nbefore != tracks.size()): " << nbefore <<
" != " << tracks.size());
242 float distToPriVtx = -1;
243 float normDistToPriVtx = -1;
244 float distToRefittedPriVtx = -1;
245 float normDistToRefittedPriVtx = -1;
246 float distToRefittedRmLepPriVtx = -1;
247 float normDistToRefittedRmLepPriVtx = -1;
254 if(input.refittedPriVtx) {
259 if(input.refittedPriVtxWithoutLep) {
264 (*m_distToPriVtx) (*secVtx) = distToPriVtx;
265 (*m_normDistToPriVtx) (*secVtx) = normDistToPriVtx;
266 (*m_distToRefittedPriVtx) (*secVtx) = distToRefittedPriVtx;
267 (*m_normDistToRefittedPriVtx) (*secVtx) = normDistToRefittedPriVtx;
268 (*m_distToRefittedRmLepPriVtx) (*secVtx) = distToRefittedRmLepPriVtx;
269 (*m_normDistToRefittedRmLepPriVtx)(*secVtx) = normDistToRefittedRmLepPriVtx;
276 const std::vector<const xAOD::TrackParticle*> &tracks,
284 std::vector<const xAOD::TrackParticle*> tracksForFit(tracks);
286 ATH_MSG_DEBUG(
"getSecondaryVertexWithSeed -- before remove " << tracksForFit.size());
290 ATH_MSG_DEBUG(
"getSecondaryVertexWithSeed -- after remove " << tracksForFit.size());
292 if(tracksForFit.size() < 2) {
293 ATH_MSG_WARNING(
"getSecondaryVertexWithSeed -- cannot fit vertex with one or zero input track: ntrack=" << tracksForFit.size());
300 ATH_MSG_DEBUG(name() <<
"::getSecondaryVertexWithSeed -- N tracks = " << tracksForFit.size());
303 ATH_MSG_DEBUG( name() <<
"::getSecondaryVertexWithSeed -- track pt, eta = " << track->pt() <<
"," << track->eta());
304 ATH_MSG_DEBUG( name() <<
"::getSecondaryVertexWithSeed -- track chi2 = " << track->chiSquared());
308 std::unique_ptr<xAOD::Vertex> seedVertex;
311 seedVertex = std::unique_ptr<xAOD::Vertex>(
m_seedVertexFitter->fit(tracksForFit, seed));
314 ATH_MSG_DEBUG(
"getSecondaryVertexWithSeed -- failed to fit seed vertex");
320 if(seedVertex.get()) {
321 newVertex =
m_vertexFitter->fit(tracksForFit, seedVertex->position());
328 ATH_MSG_INFO(
"getSecondaryVertexWithSeed -- failed to fit vertex and fitter returned null xAOD::Vertex pointer");
335 std::vector<ElementLink< xAOD::TrackParticleContainer> > tpLinks;
345 tpLinks.push_back(tpLink);
351 TLorentzVector Momentum;
354 Momentum +=
static_cast<TLorentzVector
>(track->p4());
364 std::unique_ptr<xAOD::Vertex> returnPtr(newVertex);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
ElementLink implementation for ROOT usage.
bool toContainedElement(BaseConstReference data, ElementType element, IProxyDict *sg=0)
Set from element pointer and a reference to the container (storable)
SG::Accessor< T, ALLOC > Accessor
float z() const
Returns the z position.
void setTrackParticleLinks(const TrackParticleLinks_t &trackParticles)
Set all track particle links at once.
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".