19 const std::string &
type,
23 declareInterface<Prompt::IVertexMergingTool>(
this);
31 return StatusCode::SUCCESS;
38 std::vector<std::unique_ptr<xAOD::Vertex>> &init_vtxs,
39 const std::vector<const xAOD::TrackParticle *> &selected_tracks
47 for(std::unique_ptr<xAOD::Vertex> &vtx: init_vtxs) {
48 if(passVertexSelection(vtx.get())) {
49 result.vtxsInitPassed.push_back(vtx.get());
54 <<
" number of initial 2-track vertices: " << init_vtxs.size() << endl
55 <<
" number of selected 2-track vertices: " <<
result.vtxsInitPassed.size() << endl
56 <<
" number of selected ID tracks: " << selected_tracks.size() );
58 const unsigned nvtx_init = init_vtxs.size();
59 const unsigned nvtx_pass =
result.vtxsInitPassed.size();
64 std::vector<std::unique_ptr<VtxCluster>>
clusters;
65 std::vector<std::unique_ptr<VtxCluster>> clusters_cand, clusters_1vtx;
69 for(std::unique_ptr<VtxCluster> &cluster:
clusters) {
70 ATH_MSG_DEBUG(
" cluster candidate with nvertex=" << cluster->vtxsInit.size());
72 if(cluster->vtxsInit.size() < 1) {
73 ATH_MSG_DEBUG(
"VertexMergingTool::mergeInitVertices - logic error: cluster with zero vertexes!!");
75 else if(cluster->vtxsInit.size() == 1) {
76 clusters_1vtx.push_back(std::move(cluster));
79 clusters_cand.push_back(std::move(cluster));
84 <<
" # pass vertexes: " << nvtx_pass << endl
85 <<
" cluster_1vtx size: " << clusters_1vtx.size() << endl
86 <<
" cluster_cand size: " << clusters_cand.size() );
91 if(clusters_cand.empty()) {
95 for(std::unique_ptr<VtxCluster> &cluster: clusters_cand) {
99 cluster->trksCurr = cluster->trksInit;
104 cluster->trksCurr.erase(
std::remove(cluster->trksCurr.begin(), cluster->trksCurr.end(), tracklep), cluster->trksCurr.end());
106 ATH_MSG_DEBUG(
"Cluster vtxsInit size=" << cluster->vtxsInit.size() << endl
107 <<
" trksInit size=" << cluster->trksInit.size() << endl
108 <<
" trksCurr size=" << cluster->trksCurr.size() );
120 if(cluster->trksCurr.size() != cluster->vtxsInit.size()) {
121 ATH_MSG_WARNING(
"mergeInitVertices - input vertices are not all 2-track: nvtx != ntrk: " << cluster->trksCurr.size() <<
"!=" << cluster->vtxsInit.size());
125 ATH_MSG_DEBUG(
"Process " << clusters_cand.size() <<
" candidate clusters");
127 for(std::unique_ptr<VtxCluster> &cluster: clusters_cand) {
131 fitVertexCluster(
input, tracklep, *cluster);
133 if(cluster->vtxMerged) {
134 result.vtxsNewMerged.push_back(std::move(cluster->vtxMerged));
140 cluster->vtxsFittedBad.clear();
167 return fit_prob > m_minFitProb;
172 std::vector<std::unique_ptr<VtxCluster>> &
clusters,
173 std::vector<xAOD::Vertex*> &init_vtxs
184 while(icurr_vtx != init_vtxs.end()) {
185 bool match_curr =
false;
190 for(std::unique_ptr<VtxCluster> &cluster:
clusters) {
191 if(matchVtxToCluster(*cluster, *icurr_vtx)) {
192 addInitVtxToCluster(*cluster, *icurr_vtx);
203 clusters.push_back(std::make_unique<VtxCluster>());
204 addInitVtxToCluster(*(
clusters.back()), std::move(*icurr_vtx));
210 init_vtxs.erase(icurr_vtx);
211 icurr_vtx = init_vtxs.begin();
231 bool match_vtx =
false;
236 if(m_useMinNormDist) { dist = getMinNormDistVtx (cluster_vtx, vtx); }
239 if(dist < m_minDistanceClusterVtx) {
272 ATH_MSG_WARNING(
"passVertexSelection - vertex contains TrackParticle null pointer");
294 ATH_MSG_WARNING(
"fitVertexCluster - number of input tracks is " << cluster.
trksCurr.size() <<
" - nothing to do");
299 <<
" lepton: " <<
trkAsStr(tracklep));
305 std::unique_ptr<xAOD::Vertex> secVtx = m_vertexFitterTool->fitVertexWithPrimarySeed(
314 if(passVertexSelection(secVtx.get())) {
332 double mini_normDist = 9999.0;
334 if((!vtx1) || (!vtx2)) {
335 return mini_normDist;
344 if (svtx12_normDist2 < svtx12_normDist1) { mini_normDist = svtx12_normDist2; }
345 else { mini_normDist = svtx12_normDist1; }
347 return mini_normDist;