22 const std::string&
t,
const std::string &
name,
const IInterface*
p
25 declareInterface<Prompt::IVertexFittingTool>(
this);
33 if(m_doSeedVertexFit) {
37 m_distToPriVtx = std::make_unique<SG::AuxElement::Decorator<float> > (m_distToPriVtxName);
38 m_normDistToPriVtx = std::make_unique<SG::AuxElement::Decorator<float> > (m_normDistToPriVtxName);
39 m_distToRefittedPriVtx = std::make_unique<SG::AuxElement::Decorator<float> > (m_distToRefittedPriVtxName);
40 m_normDistToRefittedPriVtx = std::make_unique<SG::AuxElement::Decorator<float> > (m_normDistToRefittedPriVtxName);
41 m_distToRefittedRmLepPriVtx = std::make_unique<SG::AuxElement::Decorator<float> > (m_distToRefittedRmLepPriVtxName);
42 m_normDistToRefittedRmLepPriVtx = std::make_unique<SG::AuxElement::Decorator<float> > (m_normDistToRefittedRmLepPriVtxName);
46 ATH_MSG_DEBUG(
"VertexFittingSvc::initialize - doSeedVertexFit = " << m_doSeedVertexFit);
47 ATH_MSG_DEBUG(
"VertexFittingSvc::initialize - vertexFitter = " << m_vertexFitter.name());
49 return StatusCode::SUCCESS;
60 ATH_MSG_INFO(
"VertexFittingSvc::finalize - number of total fits: " << m_countNumberOfFits);
61 ATH_MSG_INFO(
"VertexFittingSvc::finalize - number of failed fits: " << m_countNumberOfFitsFailed);
62 ATH_MSG_INFO(
"VertexFittingSvc::finalize - number of invalid vtxs: " << m_countNumberOfFitsInvalid);
65 return StatusCode::SUCCESS;
71 const std::vector<const xAOD::TrackParticle* > &tracks,
79 m_countNumberOfFits++;
87 std::unique_ptr<xAOD::Vertex> secondaryVtx = getSecondaryVertexWithSeed(
88 tracks, input.inDetTracks, input.priVtx->position()
92 m_countNumberOfFitsFailed++;
97 if(!isValidVertex(secondaryVtx.get())) {
98 m_countNumberOfFitsInvalid++;
100 ATH_MSG_WARNING(
"fitVertexWithPrimarySeed -- failed to get valid vertex");
104 m_secondaryVertexIndex++;
110 indexAcc(*secondaryVtx) = m_secondaryVertexIndex;
111 typeAcc(*secondaryVtx) =
static_cast<int>(vtxType);
113 decorateNewSecondaryVertex(input, secondaryVtx.get());
121 const std::vector<const xAOD::TrackParticle* > &tracks,
130 m_countNumberOfFits++;
132 std::unique_ptr<xAOD::Vertex> secondaryVtx = getSecondaryVertexWithSeed(
133 tracks, input.inDetTracks, seed
137 m_countNumberOfFitsFailed++;
143 if(!isValidVertex(secondaryVtx.get())) {
144 m_countNumberOfFitsInvalid++;
150 m_secondaryVertexIndex++;
156 indexAcc(*secondaryVtx) = m_secondaryVertexIndex;
157 typeAcc(*secondaryVtx) =
static_cast<int>(vtxType);
159 decorateNewSecondaryVertex(input, secondaryVtx.get());
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());
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());
288 removeDoubleEntries(tracksForFit);
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;
310 if(m_doSeedVertexFit) {
311 seedVertex = std::unique_ptr<xAOD::Vertex>(m_seedVertexFitter->fit(tracksForFit, seed));
313 if(seedVertex.get() && !isValidVertex(seedVertex.get())) {
314 ATH_MSG_DEBUG(
"getSecondaryVertexWithSeed -- failed to fit seed vertex");
320 if(seedVertex.get()) {
321 newVertex = m_vertexFitter->fit(tracksForFit, seedVertex->
position());
324 newVertex = m_vertexFitter->fit(tracksForFit, seed);
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);