17 const std::string &name,
18 const std::string &
type,
19 const IInterface *parent
23 declareInterface<Prompt::IVertexMergingTool>(
this);
65 return StatusCode::SUCCESS;
69 const EventContext& ctx,
72 std::vector<std::unique_ptr<xAOD::Vertex>> &initVtxs,
73 const std::vector<const xAOD::TrackParticle *> &selectedTracks
80 ATH_MSG_DEBUG(
"===========================================================================" << std::endl
81 << name() <<
"::mergeInitVertices - start processing");
89 std::vector<std::unique_ptr<xAOD::Vertex>> vtxsInitPassed;
91 for(std::unique_ptr<xAOD::Vertex> &vtx: initVtxs) {
94 result.vtxsInitPassed.push_back(vtx.get());
95 vtxsInitPassed.push_back(std::move(vtx));
99 const unsigned nvtxInit = initVtxs.size();
100 const unsigned nvtxPass = result.vtxsInitPassed.size();
107 ATH_MSG_DEBUG(name() <<
"::mergeInitVertices - processes vertexes without lepton");
110 result.vtxsInitPassed, selectedTracks
116 ATH_MSG_DEBUG(
" number of tracks without good lepton+track vertex: " << tracksWithoutVertex.size() << std::endl
121 tracksWithoutVertex.erase(tracksWithoutVertex.begin() +
m_maxExtraTracks, tracksWithoutVertex.end());
129 name() <<
"::mergeInitVertices - will merge vertexes without lepton" << std::endl
130 <<
" number of selected tracks without good lepton+track vertex: "
131 << tracksWithoutVertex .
size() << std::endl
132 <<
" number of 2-track vertexes without lepton: "
151 ATH_MSG_DEBUG(name() <<
"::mergeInitVertices - finished merging vertexes without lepton" << std::endl
152 <<
" number of tracks without good lepton+track vertex: " << tracksWithoutVertex.size() << std::endl
153 <<
" number of 2-track vertexes without lepton: " << resultExtra.
vtxsInitPassed.size() << std::endl
154 <<
" number of unmerged 2-track vertexes without lepton: " << resultExtra.
vtxsInitPassedNotMerged.size() << std::endl
155 <<
" number of merged vertexes without lepton: " << resultExtra.
vtxsNewMerged.size());
160 ATH_MSG_DEBUG(
"===========================================================================" << std::endl
161 << name() <<
"::mergeInitVertices - process 2-track vertexes with lepton" << std::endl
162 <<
" lepton track pT=" << tracklep->
pt() << std::endl
163 <<
" number of initial 2-track vertices: " << initVtxs.size() << std::endl
164 <<
" number of selected 2-track vertices: " << result.vtxsInitPassed.size() << std::endl
165 <<
" number of selected ID tracks: " << selectedTracks.size() );
172 if(result.vtxsInitPassed.size() > 1) {
189 result.vtxsInitPassedNotMerged.insert(
190 result.vtxsInitPassedNotMerged.end(),
195 result.vtxsNewMerged.insert(
196 result.vtxsNewMerged.end(),
201 ATH_MSG_DEBUG(
"==========================================" << std::endl
202 <<
"mergeInitVertices report" << std::endl
203 <<
" \tnumber of initial 2-track vertices: "
204 << initVtxs.size() << std::endl
205 <<
"\tnumber of passed 2-track vertices: "
206 << result.vtxsInitPassed.size() << std::endl
207 <<
"\tnumber of unmerged 2-track vertices: "
208 << result.vtxsInitPassedNotMerged.size() << std::endl
209 <<
"\tnumber of merged vertices: "
210 << result.vtxsNewMerged.size() << std::endl
212 <<
"\tnumber of tracks without good lepton+track vertex: "
213 << tracksWithoutVertex.size() << std::endl
214 <<
"\tnumber of 2-track vertexes without lepton: "
216 <<
"\tnumber of unmerged 2-track vertexes without lepton: "
218 <<
"\tnumber of merged vertexes without lepton: "
220 << name() <<
"::mergeInitVertices - ALL DONE" << std::endl
221 <<
"=========================================="
229 const EventContext& ctx,
231 std::vector<std::unique_ptr<xAOD::Vertex>> &initVtxs,
251 if(result.vtxsInitPassed.size() < 2) {
252 result.vtxsInitPassedNotMerged = std::move(initVtxs);
254 ATH_MSG_DEBUG(name() <<
"::mergeIteratively2TrackVtxs - too few vertexes: nothing more to do");
262 std::vector<TwoTrackVtx> vtxs2Track;
264 for(std::unique_ptr<xAOD::Vertex> &vtx: initVtxs) {
265 if(vtx->nTrackParticles() != 2) {
266 ATH_MSG_WARNING(
"mergeIteratively2TrackVtxs - wrong number of tracks: " << vtx->nTrackParticles());
270 if(vtx->nTrackParticles() !=2 ) {
271 ATH_MSG_WARNING(
"mergeIteratively2TrackVtxs - vertex does not contain 2 TrackParticles: ntrack=" << vtx->nTrackParticles());
276 vtx2track.
trackId0 = vtx->trackParticle(0);
277 vtx2track.
trackId1 = vtx->trackParticle(1);
280 ATH_MSG_WARNING(
"mergeIteratively2TrackVtxs - failed to find TrackParticles for 2-track vertex");
284 vtx2track.
vertex = vtx.get();
288 vtxs2Track.push_back(vtx2track);
291 ATH_MSG_DEBUG(name() <<
"::mergeIteratively2TrackVtxs - start processing with " << vtxs2Track.size() <<
" input vertexes ");
293 if(vtxs2Track.size() < 2) {
294 ATH_MSG_WARNING(
"mergeIteratively2TrackVtxs - logic error: found only " << vtxs2Track.size() <<
" 2-track vertex");
303 ATH_MSG_DEBUG(name() <<
"::mergeIteratively2TrackVtxs - number of 2 track passed vertexes=" << vtxs2Track.size());
306 ATH_MSG_DEBUG(
"Input vertex with 2 tracks sum pT=" << vtx.sumTrackPt <<
"\n " <<
vtxAsStr(vtx.vertex,
true));
317 std::vector<TwoTrackVtx>::iterator currVit = vtxs2Track.begin();
323 while(currVit != vtxs2Track.end()) {
331 std::unique_ptr<xAOD::Vertex> newMergedVtx =
nullptr;
333 ctx, seedVtx, newMergedVtx, input, currVit, vtxs2Track, vtxType
343 currVit = vtxs2Track.begin();
345 ATH_MSG_DEBUG(name() <<
"::mergeIteratively2TrackVtxs - new merged vertex:\n" <<
vtxAsStr(newMergedVtx.get(),
false));
348 result.vtxsNewMerged.push_back(std::move(newMergedVtx));
356 ATH_MSG_DEBUG(name() <<
"::mergeIteratively2TrackVtxs - could not merge 2-track vertex:\n" <<
vtxAsStr(seedVtx,
false));
363 for(std::unique_ptr<xAOD::Vertex> &vtxUniquePtr: initVtxs) {
365 if (vtxUniquePtr.get() == vtx.vertex){
366 result.vtxsInitPassedNotMerged.push_back(std::move(vtxUniquePtr));
373 ATH_MSG_DEBUG(name() <<
"::mergeIteratively2TrackVtxs - finished processing:" << std::endl
374 <<
" number of unmerged 2-track vertexes=" << vtxs2Track .
size() << std::endl
375 <<
" number of merged vertexes=" << result.vtxsNewMerged.size() );
381 for(
const std::unique_ptr<xAOD::Vertex>& vtx: result.vtxsNewMerged) {
389 const EventContext& ctx,
391 std::unique_ptr<xAOD::Vertex> &newMergedVtx,
393 std::vector<TwoTrackVtx>::iterator &currVit,
394 std::vector<TwoTrackVtx> &vtxs2Track,
398 std::vector<TwoTrackVtx> others;
400 for(std::vector<TwoTrackVtx>::iterator vit = vtxs2Track.begin(); vit != vtxs2Track.end(); ++vit) {
402 others.push_back(*vit);
411 ctx, input, seedVtx, vtxType, others
423 if (mergedVtx == seedVtx){
424 newMergedVtx.reset(
nullptr);
426 newMergedVtx.reset(mergedVtx);
432 const EventContext& ctx,
436 std::vector<TwoTrackVtx> &others
455 ATH_MSG_WARNING(
"VertexIterativeFitMergingTool::fitSeedVertexCluster - current vertex is null pointer");
462 others.erase(others.begin());
468 ctx, input, seedVtx, currVtx, vtxType
476 ATH_MSG_DEBUG(
"fitSeedVertexCluster - NEW MERGED VERTEX FIT FAILED" << std::endl
477 <<
"---------------------------------------------------------------------------");
485 double probCandOverSeed = -1.0;
488 probCandOverSeed = probCand/probSeed;
491 const double distToSeed =
getDistance(seedVtx, candVtx.get());
492 const double distToCurr =
getDistance(currVtx, candVtx.get());
505 std::stringstream
str;
508 str <<
" dist to seed=" << distToSeed <<
", probCandOverSeed=" << probCandOverSeed << std::endl
509 <<
" seed: " <<
vtxAsStr(seedVtx,
false) << std::endl
510 <<
" curr: " <<
vtxAsStr(currVtx,
true)
511 <<
" cand: " <<
vtxAsStr(candVtx.get(),
true)
512 <<
"fitSeedVertexCluster - finished" << std::endl
513 <<
"---------------------------------------------------------------------------" << std::endl;
522 ATH_MSG_DEBUG(
"fitSeedVertexCluster - FAIL NEW MERGED VERTEX\n" <<
str.str());
545 ATH_MSG_DEBUG(
"fitSeedVertexCluster - PASS NEW MERGED VERTEX" <<
str.str());
555 const EventContext& ctx,
557 std::unique_ptr<xAOD::Vertex> & seedVtx,
559 std::vector<TwoTrackVtx> &others
567 if (iterationResult == originalSeed)
return seedVtx.release();
570 else return iterationResult;
575 std::vector<TwoTrackVtx> &vtxs
578 ATH_MSG_WARNING(
"VertexIterativeFitMergingTool::removeMerged2TrackVertexes - merged vertex is null pointer");
583 std::vector<TwoTrackVtx>::iterator vit = vtxs.begin();
585 while(vit != vtxs.end()) {
586 int iCountMatchedTrack = 0;
592 ATH_MSG_WARNING(
"removeMerged2TrackVertexes - merged vertex contains null TrackParticle pointer");
596 if(vit->trackId0 == track) { iCountMatchedTrack++; }
597 if(vit->trackId1 == track) { iCountMatchedTrack++; }
600 if(iCountMatchedTrack == 2) {
604 vit = vtxs.erase(vit);
607 ATH_MSG_DEBUG(
"removeMerged2TrackVertexes - removed merged 2-track vertex");
612 ATH_MSG_DEBUG(
"removeMerged2TrackVertexes - skip unmerged 2-track vertex");
617 name() <<
"::removeMerged2TrackVertexes - merged vertex ntrack=" << mergedVtx->
nTrackParticles()
618 <<
", removed " << icount <<
" merged 2-track vertexes"
626 const std::vector<TwoTrackVtx> &others
628 for(std::vector<TwoTrackVtx>::const_iterator fit = others.begin(); fit != others.end(); ++fit) {
629 for(std::vector<TwoTrackVtx>::const_iterator sit = fit+1; sit != others.end(); ++sit) {
631 const double sig1 =
Prompt::getNormDist(fit->vertex->position(), sit->vertex->position(), fit->vertex->covariance(),
msg(MSG::WARNING));
632 const double sig2 =
Prompt::getNormDist(fit->vertex->position(), sit->vertex->position(), sit->vertex->covariance(),
msg(MSG::WARNING));
644 const std::vector<xAOD::Vertex*> &passVtxs,
645 const std::vector<const xAOD::TrackParticle *> &selectedTracks
651 std::vector<const xAOD::TrackParticle *> tracksWithoutVertex;
653 unsigned iCountDoMatch = 0;
659 for(
unsigned k = 0; k < vtx->nTrackParticles(); ++k) {
662 if(vtxTrack == track) {
673 tracksWithoutVertex.push_back(track);
681 return tracksWithoutVertex;
708 const EventContext& ctx,
736 std::vector<const xAOD::TrackParticle *> tracks;
742 tracks.push_back(track);
745 ATH_MSG_WARNING(
"fitSeedPlusOtherVertex - seed vertex contains TrackParticle null pointer");
756 tracks.push_back(track);
759 ATH_MSG_WARNING(
"fitSeedPlusOtherVertex - other vertex contains TrackParticle null pointer");
767 ctx, input, tracks, seedVtx->
position(), vtxType
779 const EventContext& ctx,
781 std::vector<const xAOD::TrackParticle *> &selectedTracks,
788 std::vector<std::unique_ptr<xAOD::Vertex>> passVtxs;
790 if(selectedTracks.size() < 2) {
791 ATH_MSG_DEBUG(
"fit2TrackVertexeses - 0 or 1 input tracks - nothing to do");
795 ATH_MSG_DEBUG(name() <<
"::fit2TrackVertexes - start with " << selectedTracks.size() <<
" tracks");
804 for(std::vector<const xAOD::TrackParticle *>::const_iterator it1 = selectedTracks.begin(); it1 != selectedTracks.end(); ++it1) {
805 for(std::vector<const xAOD::TrackParticle *>::const_iterator it2 = it1 + 1; it2 != selectedTracks.end(); ++it2) {
809 if(!track1 || !track2) {
810 ATH_MSG_WARNING(
"fit2TrackVertexeses - logic error: TrackParticle null pointer");
814 std::vector<const xAOD::TrackParticle *> fit_tracks = {track1, track2};
820 ctx, input, fit_tracks, vtxType
832 passVtxs.push_back(std::move(vtx));
837 ATH_MSG_DEBUG(name() <<
"::fit2TrackVertexes - finished processing: " << std::endl
838 <<
" number of input tracks: " << selectedTracks.size() << std::endl
839 <<
" number of 2-track combinations: " << icount << std::endl
840 <<
" number of passed 2-track vertexes: " << passVtxs .size() << std::endl
841 << name() <<
"::fit2TrackVertexes - all is done" );
855 return StatusCode::SUCCESS;
858 const std::string hname = name() +
"_" + key;
861 h =
new TH1D(hname.c_str(), hname.c_str(), nbin,
xmin,
xmax);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
size_t size() const
Number of registered mappings.
Header file for AthHistogramAlgorithm.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
float chiSquared() const
Returns the of the vertex fit as float.
const Amg::Vector3D & position() const
Returns the 3-pos.
bool match(std::string s1, std::string s2)
match the individual directories of two strings
void fillTH1(TH1 *h, double val, double weight=1.0)
@ kTwoTrackVtxWithoutLepton
@ kIterativeFitVtxWithoutLepton
double getVertexFitProb(const xAOD::Vertex *vtx)
std::string vtxAsStr(const xAOD::Vertex *vtx, bool print_tracks=false)
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)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
std::vector< std::unique_ptr< xAOD::Vertex > > vtxsInitPassedNotMerged
std::vector< std::unique_ptr< xAOD::Vertex > > vtxsNewMerged
std::vector< xAOD::Vertex * > vtxsInitPassed
const xAOD::TrackParticle * trackId0
const xAOD::TrackParticle * trackId1