CbmRoot
Loading...
Searching...
No Matches
CbmDcaVertexFinder.cxx
Go to the documentation of this file.
1/* Copyright (C) 2023 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Dario Ramirez [committer] */
4
6
7#include "CbmGlobalTrack.h"
8#include "CbmVertex.h"
9
10#include <Logger.h>
11
13 : fMaxDca(0.1)
15 , fNbPairs(0)
16 , fQA(std::nullopt)
17{
18 LOG(debug) << "Creating CbmDcaVertexFinder ...";
19 fCovMatrix.ResizeTo(3, 3);
20}
21
23 : fMaxDca(max_dca)
25 , fNbPairs(0)
26 , fQA(std::nullopt)
27{
28 LOG(debug) << "Creating CbmDcaVertexFinder ...";
29 fCovMatrix.ResizeTo(3, 3);
30}
31
35CbmDcaVertexFinder::CbmDcaVertexFinder(const std::vector<CbmGlobalTrack*> tracks)
36 : fMaxDca(0.1)
38 , fNbPairs(0)
39 , fQA(std::nullopt)
40{
41 LOG(debug) << "Creating CbmDcaVertexFinder ...";
42 fCovMatrix.ResizeTo(3, 3);
43}
44
48CbmDcaVertexFinder::CbmDcaVertexFinder(const std::vector<CbmGlobalTrack*> tracks, const double max_dca)
49 : fMaxDca(max_dca)
51 , fNbPairs(0)
52 , fQA(std::nullopt)
53{
54 LOG(debug) << "Creating CbmDcaVertexFinder ...";
55 fCovMatrix.ResizeTo(3, 3);
56}
57
58void CbmDcaVertexFinder::SetTracks(const std::vector<CbmGlobalTrack*> tracks)
59{
60 fInputTracks.clear();
62}
63
66std::optional<CbmVertex> CbmDcaVertexFinder::FindVertex()
67{
68 // Reset the number of track pair used
69 fNbPairs = 0;
70 int n_of_trk = fInputTracks.size();
71 LOG(debug) << "- PCA - Find event vertex using CbmGlobalTracks: " << n_of_trk;
72 TVector3 vtx;
73 for (int trk_i_idx = 0; trk_i_idx < n_of_trk - 1; trk_i_idx++) {
74 for (int trk_j_idx = trk_i_idx + 1; trk_j_idx < n_of_trk; trk_j_idx++) {
75 auto pca = FindPca(fInputTracks[trk_i_idx], fInputTracks[trk_j_idx]);
76 if (pca.has_value() && pca->d_trk < fMaxDca) {
77 TVector3 pca_i_j = pca->point;
78 vtx += pca_i_j;
79 fNbPairs++;
80
81 if (fQA.has_value()) {
82 fQA->pca_y_vs_x->Fill(pca_i_j[0], pca_i_j[1]);
83 fQA->pca_x_vs_z->Fill(pca_i_j[2], pca_i_j[0]);
84 fQA->pca_y_vs_z->Fill(pca_i_j[2], pca_i_j[1]);
85 }
86 }
87 }
88 }
89 if (!fNbPairs) return std::nullopt;
90
91 vtx *= 1. / fNbPairs;
92
93 // WARNING LINE
94 return CbmVertex("EventVertex", "EventVertex", vtx[0], vtx[1], vtx[2], 0, 0, fNbPairs, fCovMatrix);
95}
96
97std::optional<CbmDcaVertexFinder::PCA> CbmDcaVertexFinder::FindPca(CbmGlobalTrack* trk_i, CbmGlobalTrack* trk_j)
98{
99 TVector3 r1(trk_i->GetParamFirst()->GetX(), trk_i->GetParamFirst()->GetY(), trk_i->GetParamFirst()->GetZ());
100 TVector3 e1(trk_i->GetParamFirst()->GetTx(), trk_i->GetParamFirst()->GetTy(), 1);
101
102 TVector3 r2(trk_j->GetParamFirst()->GetX(), trk_j->GetParamFirst()->GetY(), trk_j->GetParamFirst()->GetZ());
103 TVector3 e2(trk_j->GetParamFirst()->GetTx(), trk_j->GetParamFirst()->GetTy(), 1);
104
105 TVector3 n = e1.Cross(e2); // Directional vector for segment of the pca
106
107 float nn = n.Dot(n);
108 if (nn != 0) { // Non-Parallel tracks
109
110 TVector3 e1n = e1.Cross(n);
111 TVector3 e2n = e1.Cross(n);
112 TVector3 r21 = r2 - r1;
113
114 float t1 = e2n.Dot(r21) / nn;
115 float t2 = e1n.Dot(r21) / nn;
116
117 TVector3 p1 = r1 + t1 * e1; // Closest point on track 1
118 TVector3 p2 = r2 + t2 * e2; // Closest point on track 2
119 TVector3 p21 = p2 - p1;
120
121 TVector3 point = 0.5 * (p1 + p2);
122 double d_trk = 0.5 * p21.Mag();
123
124 return std::make_optional<PCA>({point, d_trk});
125 }
126 return std::nullopt;
127}
TClonesArray * tracks
void SetTracks(const std::vector< CbmGlobalTrack * > tracks)
Set input track.
std::vector< CbmGlobalTrack * > fInputTracks
std::optional< CbmVertex > FindVertex()
Run algorithm to find vertex.
std::optional< CbmDcaVertexFinder::PCA > FindPca(CbmGlobalTrack *trk_i, CbmGlobalTrack *trk_j)
Calculate the Point of Closest Approach of two straight tracks if tracks are parallel it return a nul...
std::optional< Qa > fQA
const FairTrackParam * GetParamFirst() const
Hash for CbmL1LinkKey.