CbmRoot
Loading...
Searching...
No Matches
CbmStsKFTrackFitter.cxx
Go to the documentation of this file.
1/* Copyright (C) 2006-2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Sergey Gorbunov, Denis Bertini [committer] */
4
6
7#include "CbmKF.h"
8#include "CbmKFMath.h"
9#include "CbmKFStsHit.h"
10#include "CbmKFTrack.h"
11#include "CbmKFVertex.h"
12#include "CbmMvdHit.h"
13#include "CbmStsTrack.h"
14#include "CbmVertex.h"
15#include "FairRootManager.h"
16#include "TClonesArray.h"
17#include "TMath.h"
18#include "TMatrixTSym.h"
19
20#include <cmath>
21#include <iostream>
22
23using std::cout;
24using std::endl;
25
26
28
29CbmStsKFTrackFitter::CbmStsKFTrackFitter() : fHits(), fMvdHitsArray(nullptr), fStsHitsArray(nullptr), fIsInitialised(0)
30{
31}
32
34{
35 // Initialisation
36 FairRootManager* rootMgr = FairRootManager::Instance();
37 if (nullptr == rootMgr) {
38 cout << "-E- CbmStsKFTrackFitter::Init(): "
39 << "ROOT manager is not instantiated!" << endl;
40 return;
41 }
42 fStsHitsArray = reinterpret_cast<TClonesArray*>(rootMgr->GetObject("StsHit"));
43 if (!fStsHitsArray) {
44 cout << "-W- CbmStsKFTrackFitter::Init: "
45 << "no STS hits array" << endl;
46 //return;
47 }
48 fMvdHitsArray = reinterpret_cast<TClonesArray*>(rootMgr->GetObject("MvdHit"));
49 if (!fMvdHitsArray) {
50 cout << "-W- CbmStsKFTrackFitter::Init: "
51 << "no MVD hits array" << endl;
52 //return;
53 }
54 auto* kf = CbmKF::Instance();
55 if (!kf) {
56 LOG(error) << "-E- CbmStsKFTrackFitter::Init(): CbmKF instance not found";
57 return;
58 }
59
61};
62
64{
65
66 T.fHits.clear();
67
68 if (!fIsInitialised) {
69 Init();
70 }
71
72 Int_t NStsHits = (fStsHitsArray) ? track->GetNofStsHits() : 0;
73 Int_t NMvdHits = (fMvdHitsArray) ? track->GetNofMvdHits() : 0;
74
75 fHits.resize(NMvdHits + NStsHits);
76 if (NMvdHits > 0) {
77 for (Int_t i = 0; i < NMvdHits; i++) {
78 Int_t j = track->GetMvdHitIndex(i);
79 fHits[i].Create(reinterpret_cast<CbmMvdHit*>(fMvdHitsArray->At(j)));
80 T.fHits.push_back(&(fHits[i]));
81 }
82 }
83 if (NStsHits > 0 && fStsHitsArray) {
84 for (Int_t i = 0; i < NStsHits; i++) {
85 Int_t j = track->GetStsHitIndex(i);
86 fHits[NMvdHits + i].Create(reinterpret_cast<CbmStsHit*>(fStsHitsArray->At(j)));
87 T.fHits.push_back(&(fHits[NMvdHits + i]));
88 }
89 }
90}
91
92Int_t CbmStsKFTrackFitter::DoFit(CbmStsTrack* track, Int_t pidHypo)
93{
94 track->SetPidHypo(pidHypo);
95
96 CbmKFTrack T;
97 T.SetPID(pidHypo);
98 SetKFHits(T, track);
99 for (Int_t i = 0; i < 6; i++) {
100 T.GetTrack()[i] = 0.; // no guess taken
101 }
102 T.Fit(1); // fit downstream
103 CheckTrack(T);
104 T.Fit(0); // fit upstream
105 CheckTrack(T);
106 Int_t err = T.Fit(1); // fit downstream
107 Bool_t ok = (!err) && CheckTrack(T);
108 if (ok) {
109 FairTrackParam par;
110 //T.GetTrackParam( *track->GetParamLast() ); // store fitted track & cov.matrix
111 T.GetTrackParam(par);
112 track->SetParamLast(&par);
113 err = T.Fit(0); // fit upstream
114 ok = ok && (!err) && CheckTrack(T);
115 if (ok) {
116 T.GetStsTrack(*track, 1); // store fitted track & cov.matrix & chi2 & NDF
117 }
118 }
119 if (!ok) {
120 Double_t* t = T.GetTrack();
121 Double_t* c = T.GetCovMatrix();
122 for (int i = 0; i < 6; i++) {
123 t[i] = 0;
124 }
125 for (int i = 0; i < 15; i++) {
126 c[i] = 0;
127 }
128 c[0] = c[2] = c[5] = c[9] = c[14] = 100.;
129 T.GetRefChi2() = 100.;
130 T.GetRefNDF() = 0;
131 T.GetStsTrack(*track, 0);
132 T.GetStsTrack(*track, 1);
133 track->SetFlag(1);
134 }
135 else {
136 track->SetFlag(0);
137 }
138 return !ok;
139}
140
141
142void CbmStsKFTrackFitter::Extrapolate(FairTrackParam* track, Double_t z, FairTrackParam* e_track)
143{
144 if (!track) {
145 return;
146 }
147 CbmKFTrack T;
148 T.SetTrackParam(*track);
149 T.Extrapolate(z);
150 if (e_track) {
151 T.GetTrackParam(*e_track);
152 }
153}
154
155
156void CbmStsKFTrackFitter::Extrapolate(CbmStsTrack* track, Double_t z, FairTrackParam* e_track)
157{
158 if (!track) {
159 return;
160 }
161 CbmKFTrack T;
162 T.SetPID(track->GetPidHypo());
163 const FairTrackParam *fpar = track->GetParamFirst(), *lpar = track->GetParamLast();
164
165 if (z <= fpar->GetZ()) { // extrapolate first parameters
166 T.SetTrackParam(*fpar);
167 T.Extrapolate(z);
168 }
169 else if (z < fpar->GetZ() + 0.1) { // extrapolate first parameters
170 T.SetTrackParam(*fpar);
171 T.Propagate(z);
172 }
173 else if (lpar->GetZ() <= z) { // extrapolate last parameters
174 T.SetTrackParam(*lpar);
175 T.Extrapolate(z);
176 }
177 else if (lpar->GetZ() - 0.1 < z) { // extrapolate last parameters
178 T.SetTrackParam(*lpar);
179 T.Propagate(z);
180 }
181 else { // refit with smoother
182 SetKFHits(T, track);
183 T.SetTrackParam(*fpar);
184 T.Smooth(z);
185 }
186 if (e_track) {
187 T.GetTrackParam(*e_track);
188 }
189}
190
191
193{
194 if (!vtx) {
195 FairRootManager* fManger = FairRootManager::Instance();
196 // Get pointer to PrimaryVertex object from IOManager if it exists
197 // The old name for the object is "PrimaryVertex" the new one
198 // "PrimaryVertex." Check first for the new name
199 // TODO: don't use reinterpret_cast
200 vtx = reinterpret_cast<CbmVertex*>(fManger->GetObject("PrimaryVertex."));
201 if (nullptr == vtx) {
202 vtx = reinterpret_cast<CbmVertex*>(fManger->GetObject("PrimaryVertex"));
203 }
204 if (!vtx) {
205 cout << "-W- CbmStsKFTrackFitter::GetChiToVertex: No Primary Vertex found!" << endl;
206 return 100.;
207 }
208 }
209 CbmKFTrack T;
210 T.SetStsTrack(*track, 1);
211 T.Extrapolate(vtx->GetZ());
212
213 TMatrixFSym tmp(3);
214 vtx->CovMatrix(tmp);
215 Double_t Cv[3] = {tmp(0, 0), tmp(0, 1), tmp(1, 1)};
216
217 return CbmKFMath::getDeviation(T.GetTrack()[0], T.GetTrack()[1], T.GetCovMatrix(), vtx->GetX(), vtx->GetY(), Cv);
218}
219
220
221Double_t CbmStsKFTrackFitter::FitToVertex(CbmStsTrack* track, CbmVertex* vtx, FairTrackParam* v_track)
222{
223 Double_t ret = 100.;
224 if (!track || !vtx || !v_track) {
225 return ret;
226 }
227 CbmKFTrack T(*track);
228 CbmKFVertex V(*vtx);
229 T.Fit2Vertex(V);
230 T.GetTrackParam(*v_track);
231 if (T.GetRefNDF() > 0 && T.GetRefChi2() >= 0) {
232 ret = T.GetRefChi2() / T.GetRefNDF();
233 if (std::isfinite(ret)) {
234 ret = sqrt(ret);
235 }
236 }
237 return ret;
238}
239
241{
242 Bool_t ok = 1;
243 Double_t* t = T.GetTrack();
244 Double_t* c = T.GetCovMatrix();
245 for (int i = 0; i < 6; i++) {
246 ok = ok && std::isfinite(t[i]) && TMath::Abs(t[i]) < 1.e5;
247 }
248 for (int i = 0; i < 15; i++) {
249 ok = ok && std::isfinite(c[i]);
250 }
251 ok = ok && std::isfinite(T.GetMass()) && std::isfinite(T.GetRefChi2());
252 if (ok) {
253 ok = ok && (c[0] > 0);
254 ok = ok && (c[2] > 0);
255 ok = ok && (c[5] > 0);
256 ok = ok && (c[9] > 0);
257 ok = ok && (c[14] > 0);
258 }
259 if (ok) { // correct the cov matrix
260 Double_t c00 = TMath::Sqrt(c[0]);
261 Double_t c11 = TMath::Sqrt(c[2]);
262 Double_t c22 = TMath::Sqrt(c[5]);
263 Double_t c33 = TMath::Sqrt(c[9]);
264 Double_t c44 = TMath::Sqrt(c[14]);
265 Double_t a = c11 * c00;
266 if (c[1] > a) {
267 c[1] = a;
268 }
269 if (c[1] < -a) {
270 c[1] = -a;
271 }
272 a = c22 * c00;
273 if (c[3] > a) {
274 c[3] = a;
275 }
276 if (c[3] < -a) {
277 c[3] = -a;
278 }
279 a = c22 * c11;
280 if (c[4] > a) {
281 c[4] = a;
282 }
283 if (c[4] < -a) {
284 c[4] = -a;
285 }
286 a = c33 * c00;
287 if (c[6] > a) {
288 c[6] = a;
289 }
290 if (c[6] < -a) {
291 c[6] = -a;
292 }
293 a = c33 * c11;
294 if (c[7] > a) {
295 c[7] = a;
296 }
297 if (c[7] < -a) {
298 c[7] = -a;
299 }
300 a = c33 * c22;
301 if (c[8] > a) {
302 c[8] = a;
303 }
304 if (c[8] < -a) {
305 c[8] = -a;
306 }
307 a = c44 * c00;
308 if (c[10] > a) {
309 c[10] = a;
310 }
311 if (c[10] < -a) {
312 c[10] = -a;
313 }
314 a = c44 * c11;
315 if (c[11] > a) {
316 c[11] = a;
317 }
318 if (c[11] < -a) {
319 c[11] = -a;
320 }
321 a = c44 * c22;
322 if (c[12] > a) {
323 c[12] = a;
324 }
325 if (c[12] < -a) {
326 c[12] = -a;
327 }
328 a = c44 * c33;
329 if (c[13] > a) {
330 c[13] = a;
331 }
332 if (c[13] < -a) {
333 c[13] = -a;
334 }
335 }
336 if (!ok) {
337 for (int i = 0; i < 6; i++) {
338 t[i] = 0;
339 }
340 for (int i = 0; i < 15; i++) {
341 c[i] = 0;
342 }
343 c[0] = c[2] = c[5] = c[9] = c[14] = 100.;
344 T.GetRefChi2() = 100.;
345 T.GetRefNDF() = 0;
346 }
347 return ok;
348}
static FairRootManager * rootMgr
ClassImp(CbmStsKFTrackFitter)
Data class for STS tracks.
friend fvec sqrt(const fvec &a)
static Double_t getDeviation(Double_t x, Double_t y, Double_t C[], Double_t vx, Double_t vy, Double_t Cv[]=nullptr)
void SetStsTrack(CbmStsTrack &track, bool first=1)
void SetTrackParam(const FairTrackParam &track)
void SetPID(Int_t pidHypo)
static CbmKF * Instance()
Definition CbmKF.h:40
data class for a reconstructed 3-d hit in the STS
Definition CbmStsHit.h:35
TClonesArray * fStsHitsArray
void SetKFHits(CbmKFTrack &T, CbmStsTrack *track)
std::vector< CbmKFStsHit > fHits
void Extrapolate(CbmStsTrack *track, Double_t z, FairTrackParam *e_track)
Double_t FitToVertex(CbmStsTrack *track, CbmVertex *vtx, FairTrackParam *v_track)
Double_t GetChiToVertex(CbmStsTrack *track, CbmVertex *vtx=nullptr)
TClonesArray * fMvdHitsArray
Int_t DoFit(CbmStsTrack *track, Int_t pidHypo=211)
Bool_t CheckTrack(CbmKFTrack &T)
int32_t GetNofMvdHits() const
Definition CbmStsTrack.h:87
int32_t GetMvdHitIndex(int32_t iHit) const
Definition CbmStsTrack.h:75
int32_t GetStsHitIndex(int32_t iHit) const
int32_t GetNofStsHits() const
Definition CbmStsTrack.h:93
int32_t GetPidHypo() const
Definition CbmTrack.h:61
const FairTrackParam * GetParamLast() const
Definition CbmTrack.h:69
void SetPidHypo(int32_t pid)
Definition CbmTrack.h:79
void SetFlag(int32_t flag)
Definition CbmTrack.h:80
const FairTrackParam * GetParamFirst() const
Definition CbmTrack.h:68
void SetParamLast(const FairTrackParam *par)
Definition CbmTrack.h:87
double GetZ() const
Definition CbmVertex.h:69
void CovMatrix(TMatrixFSym &covMat) const
double GetY() const
Definition CbmVertex.h:68
double GetX() const
Definition CbmVertex.h:67