BmnRoot 26.10.0-19-g6979a6c6
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
CbmStsKFTrackFitter.cxx
Go to the documentation of this file.
2
3#include "CbmKFMath.h"
4#include "CbmKFStsHit.h"
5#include "CbmKFTrack.h"
6#include "CbmKFVertex.h"
7#include "CbmMvdHit.h"
8#include "CbmStsTrack.h"
9#include "CbmVertex.h"
10#include "FairRootManager.h"
11#include "TClonesArray.h"
12#include "TMath.h"
13#include "math.h"
14
15#include <iostream>
16
17using std::cout;
18using std::endl;
19
21 : fHits()
22 , fMvdHitsArray(0)
23 , fStsHitsArray(0)
25 , fCheckTrigSi(CheckTrigSi)
26{}
27
29{
30 // Initialisation
31 FairRootManager* rootMgr = FairRootManager::Instance();
32 if (NULL == rootMgr) {
33 cout << "-E- CbmStsKFTrackFitter::Init(): "
34 << "ROOT manager is not instantiated!" << endl;
35 return;
36 }
37 if (!fCheckTrigSi) {
38 fStsHitsArray = reinterpret_cast<TClonesArray*>(rootMgr->GetObject("StsHit"));
39 if (!fStsHitsArray) {
40 cout << "-W- CbmStsKFTrackFitter::Init: "
41 << "no STS hits array" << endl;
42 // return;
43 }
44 } else {
45
46 fStsHitsArray = reinterpret_cast<TClonesArray*>(rootMgr->GetObject("StsHitSi"));
47 if (!fStsHitsArray) {
48 cout << "-W- CbmStsKFTrackFitter::Init: "
49 << "no STS hits array" << endl;
50 // return;
51 }
52 }
53 fMvdHitsArray = reinterpret_cast<TClonesArray*>(rootMgr->GetObject("MvdHit"));
54 if (!fMvdHitsArray) {
55 cout << "-W- CbmStsKFTrackFitter::Init: "
56 << "no MVD hits array" << endl;
57 // return;
58 }
60};
61
63{
64
65 T.fHits.clear();
66
67 if (!fIsInitialised)
68 Init();
69
70 Int_t NStsHits = (fStsHitsArray) ? track->GetNStsHits() : 0;
71 Int_t NMvdHits = (fMvdHitsArray) ? track->GetNMvdHits() : 0;
72 // cout<<" hits arr size: "<<NStsHits<<endl;
73 fHits.resize(NMvdHits + NStsHits);
74 if (NMvdHits > 0) {
75 for (Int_t i = 0; i < NMvdHits; i++) {
76 Int_t j = track->GetMvdHitIndex(i);
77 fHits[i].Create(reinterpret_cast<CbmMvdHit*>(fMvdHitsArray->At(j)));
78 T.fHits.push_back(&(fHits[i]));
79 }
80 }
81 if (NStsHits > 0 && fStsHitsArray) {
82 for (Int_t i = 0; i < NStsHits; i++) {
83 Int_t j = track->GetStsHitIndex(i);
84 // cout<<" hits arr index: "<<j<<endl;
85 if (!bkg)
86 fHits[NMvdHits + i].Create(reinterpret_cast<CbmStsHit*>(fStsHitsArray->At(j)));
87 // cout<<" hit: "<<(CbmStsHit*)track->GetStsHitArr()->At(j)<<endl;
88 if (bkg)
89 fHits[NMvdHits + i].Create(reinterpret_cast<CbmStsHit*>(track->GetStsHitArr()->At(i)));
90 T.fHits.push_back(&(fHits[NMvdHits + i]));
91 }
92 }
93}
94
96{
97 track->SetPidHypo(pidHypo);
98
99 CbmKFTrack T;
100 T.SetPID(pidHypo);
101 SetKFHits(T, track);
102 for (Int_t i = 0; i < 6; i++)
103 T.GetTrack()[i] = 0.; // no guess taken
104 T.Fit(1); // fit downstream
105 CheckTrack(T);
106 T.Fit(0); // fit upstream
107 CheckTrack(T);
108 Int_t err = T.Fit(1); // fit downstream
109 Bool_t ok = (!err) && CheckTrack(T);
110 if (ok) {
111 T.GetTrackParam(*track->GetParamLast()); // store fitted track & cov.matrix
112 err = T.Fit(0); // fit upstream
113 ok = ok && (!err) && CheckTrack(T);
114 if (ok)
115 T.GetStsTrack(*track, 1); // store fitted track & cov.matrix & chi2 & NDF
116 }
117 if (!ok) {
118 Double_t* t = T.GetTrack();
119 Double_t* c = T.GetCovMatrix();
120 for (int i = 0; i < 6; i++)
121 t[i] = 0;
122 for (int i = 0; i < 15; i++)
123 c[i] = 0;
124 c[0] = c[2] = c[5] = c[9] = c[14] = 100.;
125 T.GetRefChi2() = 100.;
126 T.GetRefNDF() = 0;
127 T.GetStsTrack(*track, 0);
128 T.GetStsTrack(*track, 1);
129 track->SetFlag(1);
130 } else {
131 track->SetFlag(0);
132 }
133 return !ok;
134}
135
136void CbmStsKFTrackFitter::Extrapolate(FairTrackParam* track, Double_t z, FairTrackParam* e_track)
137{
138 if (!track)
139 return;
140 CbmKFTrack T;
141 T.SetTrackParam(*track);
142 T.Extrapolate(z);
143 if (e_track)
144 T.GetTrackParam(*e_track);
145}
146
147void CbmStsKFTrackFitter::Extrapolate(CbmStsTrack* track, Double_t z, FairTrackParam* e_track)
148{
149 if (!track)
150 return;
151 CbmKFTrack T;
152 T.SetPID(track->GetPidHypo());
153 FairTrackParam *fpar = track->GetParamFirst(), *lpar = track->GetParamLast();
154 if (z <= fpar->GetZ()) { // extrapolate first parameters
155 T.SetTrackParam(*fpar);
156 T.Extrapolate(z);
157 } else if (z < fpar->GetZ() + 0.1) { // extrapolate first parameters
158 T.SetTrackParam(*fpar);
159 T.Propagate(z);
160 } else if (lpar->GetZ() <= z) { // extrapolate last parameters
161 T.SetTrackParam(*lpar);
162 T.Extrapolate(z);
163 } else if (lpar->GetZ() - 0.1 < z) { // extrapolate last parameters
164 T.SetTrackParam(*lpar);
165 T.Propagate(z);
166 } else { // refit with smoother
167 SetKFHits(T, track);
168 T.SetTrackParam(*fpar);
169 T.Smooth(z);
170 }
171 if (e_track)
172 T.GetTrackParam(*e_track);
173}
174
176{
177 if (!vtx) {
178 FairRootManager* fManger = FairRootManager::Instance();
179 vtx = reinterpret_cast<CbmVertex*>(fManger->GetObject("PrimaryVertex"));
180 if (!vtx) {
181 cout << "-W- CbmStsKFTrackFitter::GetChiToVertex: No Primary Vertex found!" << endl;
182 return 100.;
183 }
184 }
185 CbmKFTrack T;
186 T.SetStsTrack(*track, 1);
187 T.Extrapolate(vtx->GetZ());
188
189 TMatrixFSym tmp(3);
190 vtx->CovMatrix(tmp);
191 Double_t Cv[3] = {tmp(0, 0), tmp(0, 1), tmp(1, 1)};
192
193 return CbmKFMath::getDeviation(T.GetTrack()[0], T.GetTrack()[1], T.GetCovMatrix(), vtx->GetX(), vtx->GetY(), Cv);
194}
195
197{
198 Double_t ret = 100.;
199 if (!track || !vtx || !v_track)
200 return ret;
201 CbmKFTrack T(*track);
202 CbmKFVertex V(*vtx);
203 T.Fit2Vertex(V);
204 T.GetTrackParam(*v_track);
205 if (T.GetRefNDF() > 0 && T.GetRefChi2() >= 0) {
206 ret = T.GetRefChi2() / T.GetRefNDF();
207 if (finite(ret))
208 ret = sqrt(ret);
209 }
210 return ret;
211}
212
214{
215 Bool_t ok = 1;
216 Double_t* t = T.GetTrack();
217 Double_t* c = T.GetCovMatrix();
218 for (int i = 0; i < 6; i++)
219 ok = ok && finite(t[i]) && TMath::Abs(t[i]) < 1.e5;
220 for (int i = 0; i < 15; i++)
221 ok = ok && finite(c[i]);
222 ok = ok && finite(T.GetMass()) && finite(T.GetRefChi2());
223 if (ok) {
224 ok = ok && (c[0] > 0);
225 ok = ok && (c[2] > 0);
226 ok = ok && (c[5] > 0);
227 ok = ok && (c[9] > 0);
228 ok = ok && (c[14] > 0);
229 }
230 if (ok) { // correct the cov matrix
231 Double_t c00 = TMath::Sqrt(c[0]);
232 Double_t c11 = TMath::Sqrt(c[2]);
233 Double_t c22 = TMath::Sqrt(c[5]);
234 Double_t c33 = TMath::Sqrt(c[9]);
235 Double_t c44 = TMath::Sqrt(c[14]);
236 Double_t a = c11 * c00;
237 if (c[1] > a)
238 c[1] = a;
239 if (c[1] < -a)
240 c[1] = -a;
241 a = c22 * c00;
242 if (c[3] > a)
243 c[3] = a;
244 if (c[3] < -a)
245 c[3] = -a;
246 a = c22 * c11;
247 if (c[4] > a)
248 c[4] = a;
249 if (c[4] < -a)
250 c[4] = -a;
251 a = c33 * c00;
252 if (c[6] > a)
253 c[6] = a;
254 if (c[6] < -a)
255 c[6] = -a;
256 a = c33 * c11;
257 if (c[7] > a)
258 c[7] = a;
259 if (c[7] < -a)
260 c[7] = -a;
261 a = c33 * c22;
262 if (c[8] > a)
263 c[8] = a;
264 if (c[8] < -a)
265 c[8] = -a;
266 a = c44 * c00;
267 if (c[10] > a)
268 c[10] = a;
269 if (c[10] < -a)
270 c[10] = -a;
271 a = c44 * c11;
272 if (c[11] > a)
273 c[11] = a;
274 if (c[11] < -a)
275 c[11] = -a;
276 a = c44 * c22;
277 if (c[12] > a)
278 c[12] = a;
279 if (c[12] < -a)
280 c[12] = -a;
281 a = c44 * c33;
282 if (c[13] > a)
283 c[13] = a;
284 if (c[13] < -a)
285 c[13] = -a;
286 }
287 if (!ok) {
288 for (int i = 0; i < 6; i++)
289 t[i] = 0;
290 for (int i = 0; i < 15; i++)
291 c[i] = 0;
292 c[0] = c[2] = c[5] = c[9] = c[14] = 100.;
293 T.GetRefChi2() = 100.;
294 T.GetRefNDF() = 0;
295 }
296 return ok;
297}
int i
Definition P4_F32vec4.h:22
bool Bool_t
int Int_t
double Double_t
TMatrixTSym< Float_t > TMatrixFSym
static Double_t getDeviation(Double_t x, Double_t y, Double_t C[], Double_t vx, Double_t vy, Double_t Cv[]=0)
void SetStsTrack(CbmStsTrack &track, bool first=1)
void SetTrackParam(FairTrackParam &track)
void SetPID(Int_t pidHypo)
CbmMvdHit.h.
Definition CbmMvdHit.h:26
TClonesArray * fStsHitsArray
void SetKFHits(CbmKFTrack &T, CbmStsTrack *track)
CbmStsKFTrackFitter(Bool_t CheckTrigSi=false)
Default constructor.
Double_t GetChiToVertex(CbmStsTrack *track, CbmVertex *vtx=0)
Get normalized (in sigma's) impact parameter form vertex vtx if no vtx given, return deviation from p...
std::vector< CbmKFStsHit > fHits
void Extrapolate(CbmStsTrack *track, Double_t z, FairTrackParam *e_track)
Extrapolate track to any Z position.
Double_t FitToVertex(CbmStsTrack *track, CbmVertex *vtx, FairTrackParam *v_track)
Fit track to a vertex.
TClonesArray * fMvdHitsArray
Int_t DoFit(CbmStsTrack *track, Int_t pidHypo=211)
Fit given track using Kalman Filter algorithm.
Bool_t CheckTrack(CbmKFTrack &T)
void Init()
Initialisation.
FairTrackParam * GetParamLast()
Definition CbmStsTrack.h:70
Int_t GetNMvdHits() const
Definition CbmStsTrack.h:61
Int_t GetPidHypo() const
Definition CbmStsTrack.h:64
Int_t GetMvdHitIndex(Int_t iHit) const
Definition CbmStsTrack.h:63
TClonesArray * GetStsHitArr()
Definition CbmStsTrack.h:73
void SetFlag(Int_t flag)
Definition CbmStsTrack.h:85
Int_t GetNStsHits() const
Accessors.
Definition CbmStsTrack.h:60
Int_t GetStsHitIndex(Int_t iHit) const
Definition CbmStsTrack.h:62
FairTrackParam * GetParamFirst()
Definition CbmStsTrack.h:69
void SetPidHypo(Int_t pid)
Modifiers.
Definition CbmStsTrack.h:82
CbmVertex.h.
Definition CbmVertex.h:21
Double_t GetZ() const
Definition CbmVertex.h:60
void CovMatrix(TMatrixFSym &covMat) const
Double_t GetX() const
Accessors.
Definition CbmVertex.h:58
Double_t GetY() const
Definition CbmVertex.h:59
TObject * At(Int_t idx) const override
friend friend class TClonesArray
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
Double_t Sqrt(Double_t x)
Double_t Abs(Double_t d)