BmnRoot
Loading...
Searching...
No Matches
CbmGlobalTrackFitterKF.cxx
Go to the documentation of this file.
1// ------------------------------------------------------------------
2// ----- CbmGlobalTrackFitterKF -----
3// ----- Created 07/03/2006 by D.Kresan -----
4// ------------------------------------------------------------------
6
7#include "CbmKFStsHit.h"
8#include "CbmKFTrdHit.h"
9#include "CbmKFTrack.h"
10
11#include "FairRootManager.h"
12#include "CbmStsHit.h"
13#include "CbmTrdHit.h"
14#include "CbmTofHit.h"
15#include "CbmStsTrack.h"
16#include "CbmTrdTrack.h"
17#include "CbmGlobalTrack.h"
18#include "CbmVertex.h"
19
20#include "TClonesArray.h"
21#include "TMath.h"
22
23#include <iostream>
24
25using std::cout;
26using std::endl;
27using std::vector;
28
29//___________________________________________________________________
30//
31// CbmGlobalTrackFitterKF
32//
33// Concrete implementation of global track fitting based on the
34// Kalman filter
35//
36
37
38// ------------------------------------------------------------------
40 fArrayStsHit(NULL),
41 fArrayTrdHit(NULL),
42 fArrayTofHit(NULL),
43 fArrayStsTrack(NULL),
44 fArrayTrdTrack(NULL),
45 fPrimVertex(NULL),
46 fKfTrack(NULL)
47{
48 // Default constructor
49
50 fKfTrack = new CbmKFTrack();
51 // Set mass hypothesis
52 fKfTrack->SetPID(211);
53 fVerbose = 0;
54}
55// ------------------------------------------------------------------
56
57
58// ------------------------------------------------------------------
60{
61 // Destructor
62 delete fKfTrack;
63}
64// ------------------------------------------------------------------
65
66
67// ------------------------------------------------------------------
69{
70 // Initialisation
71
72 // Get pointer to the ROOT I/O manager
73 FairRootManager* rootMgr = FairRootManager::Instance();
74 if(NULL == rootMgr) {
75 cout << "-E- CbmGlobalTrackFitterKF::Init :"
76 << " ROOT manager is not instantiated" << endl;
77 return;
78 }
79 // Get hit arrays
80 fArrayStsHit = (TClonesArray*) rootMgr->GetObject("StsHit");
81 if(NULL == fArrayStsHit) {
82 cout << "-W- CbmGlobalTrackFitterKF::Init :"
83 << " no Sts hit array" << endl;
84 }
85 fArrayTrdHit = (TClonesArray*) rootMgr->GetObject("TrdHit");
86 if(NULL == fArrayTrdHit) {
87 cout << "-W- CbmGlobalTrackFitterKF::Init :"
88 << " no TRD hit array" << endl;
89 }
90 fArrayTofHit = (TClonesArray*) rootMgr->GetObject("TofHit");
91 if(NULL == fArrayTofHit) {
92 cout << "-W- CbmGlobalTrackFitterKF::Init :"
93 << " no TOF hit array" << endl;
94 }
95 // Get track arrays
96 fArrayStsTrack = (TClonesArray*) rootMgr->GetObject("StsTrack");
97 if(NULL == fArrayStsTrack) {
98 cout << "-W- CbmGlobalTrackFitterKF::Init : "
99 << "no STS track array!" << endl;
100 }
101 fArrayTrdTrack = (TClonesArray*) rootMgr->GetObject("TrdTrack");
102 if(NULL == fArrayTrdTrack) {
103 cout << "-W- CbmGlobalTrackFitterKF::Init : "
104 << "no TRD track array!" << endl;
105 }
106 fPrimVertex = (CbmVertex*) rootMgr->GetObject("PrimaryVertex");
107 if(NULL == fPrimVertex) {
108 cout << "-W- CbmGlobalTrackFitterKF::Init : "
109 << "no Primary Vertex!" << endl;
110 }
111}
112// ------------------------------------------------------------------
113
114
115// ------------------------------------------------------------------
117{
118 // Implementation of the fitting algorithm
119 if(NULL==glbTrack || NULL==fArrayStsTrack || NULL==fArrayTrdTrack ||
120 NULL==fArrayStsHit || NULL==fArrayTrdHit || NULL==fPrimVertex) return;
121
122
123 Double_t x_old;
124 Double_t y_old;
125 Double_t z_old;
126 Double_t x_new;
127 Double_t y_new;
128 Double_t z_new;
129 Double_t z = fPrimVertex->GetZ();
130 Double_t length = 0.;
131
132
133 // Get STS track index
134 Int_t stsTrackIndex = glbTrack->GetStsTrackIndex();
135 if(-1 == stsTrackIndex) {
136 return;
137 }
138 // Get STS track
139 CbmStsTrack* stsTrack = (CbmStsTrack*) fArrayStsTrack->
140 At(stsTrackIndex);
141 if(NULL == stsTrack) {
142 return;
143 }
144 FairTrackParam *paramFirst;
145 paramFirst = stsTrack->GetParamFirst();
146 fKfTrack->SetTrackParam(*paramFirst);
147 fKfTrack->Extrapolate(z);
148 x_old = fKfTrack->GetTrack()[0];
149 y_old = fKfTrack->GetTrack()[1];
150 z_old = z;
151 Double_t p = 1.;
152 if(paramFirst->GetQp()) {
153 p = TMath::Abs(1./paramFirst->GetQp());
154 }
155
156 // Int_t stsHitIndex;
157 // CbmStsHit* stsHit;
158 // // Loop over hits of the STS track
159 // for(Int_t iHit = 0; iHit < stsTrack->GetNStsHits(); iHit++) {
160 // // Get hit index
161 // stsHitIndex = stsTrack->GetStsHitIndex(iHit);
162 // // Get hit
163 // stsHit = (CbmStsHit*) fArrayStsHit->At(stsHitIndex);
164 // x_new = stsHit->GetX();
165 // y_new = stsHit->GetY();
166 // z_new = stsHit->GetZ();
167 // length += TMath::Sqrt(TMath::Power(x_new-x_old, 2) +
168 // TMath::Power(y_new-y_old, 2) +
169 // TMath::Power(z_new-z_old, 2));
170 // // cout << z_old << " -> " << z_new << " => " << length << endl;
171 // x_old = x_new;
172 // y_old = y_new;
173 // z_old = z_new;
174 // }
175
176
177 // Get TRD track index
178 Int_t trdTrackIndex = glbTrack->GetTrdTrackIndex();
179 if(-1 == trdTrackIndex) {
180 return;
181 }
182 // Get TRD track
183 CbmTrdTrack* trdTrack = (CbmTrdTrack*) fArrayTrdTrack->
184 At(trdTrackIndex);
185 if(NULL == trdTrack) {
186 return;
187 }
188 if(trdTrack->GetNofHits() < 2) {
189 return;
190 }
191 Int_t trdHitIndex = trdTrack->GetHitIndex(0);
192 CbmTrdHit* trdHit = (CbmTrdHit*) fArrayTrdHit->At(trdHitIndex);
193
194 while(z < (trdHit->GetZ()-2.)) {
195 z += p*1.;
196
197 fKfTrack->Extrapolate(z);
198 x_new = fKfTrack->GetTrack()[0];
199 y_new = fKfTrack->GetTrack()[1];
200 z_new = z;
201
202 length += TMath::Sqrt(TMath::Power(x_new-x_old, 2) +
203 TMath::Power(y_new-y_old, 2) +
204 TMath::Power(z_new-z_old, 2));
205 x_old = x_new;
206 y_old = y_new;
207 z_old = z_new;
208 }
209
210 // Loop over hits of the TRD track
211 for(Int_t iTrd = 1; iTrd < trdTrack->GetNofHits(); iTrd++) {
212 // Get hit index
213 trdHitIndex = trdTrack->GetHitIndex(iTrd);
214 // Get hit
215 trdHit = (CbmTrdHit*) fArrayTrdHit->At(trdHitIndex);
216 z = trdHit->GetZ();
217 fKfTrack->Extrapolate(z);
218 if(trdHit->GetDx() > trdHit->GetDy()) {
219 x_new = fKfTrack->GetTrack()[0];
220 y_new = trdHit->GetY();
221 } else {
222 x_new = trdHit->GetX();
223 y_new = fKfTrack->GetTrack()[1];
224 }
225 z_new = z;
226 length += TMath::Sqrt(TMath::Power(x_new-x_old, 2) +
227 TMath::Power(y_new-y_old, 2) +
228 TMath::Power(z_new-z_old, 2));
229 x_old = x_new;
230 y_old = y_new;
231 z_old = z_new;
232 }
233
234
235 Int_t tofIndex = glbTrack->GetTofHitIndex();
236 if(-1 == tofIndex) {
237 return;
238 }
239 CbmTofHit *tofHit = (CbmTofHit*)fArrayTofHit->At(tofIndex);
240 x_new = tofHit->GetX();
241 y_new = tofHit->GetY();
242 z_new = tofHit->GetZ();
243 length += TMath::Sqrt(TMath::Power(x_new-x_old, 2) +
244 TMath::Power(y_new-y_old, 2) +
245 TMath::Power(z_new-z_old, 2));
246
247
248 glbTrack->SetLength(length);
249}
250// ------------------------------------------------------------------
void DoFit(CbmGlobalTrack *glbTrack)
Int_t GetTrdTrackIndex() const
void SetLength(Double_t length)
Int_t GetTofHitIndex() const
Int_t GetStsTrackIndex() const
Int_t Extrapolate(Double_t z, Double_t *QP0=0, Bool_t line=false)
Access to i-th hit.
void SetTrackParam(FairTrackParam &track)
Double_t * GetTrack()
Is it electron.
Definition CbmKFTrack.h:51
void SetPID(Int_t pidHypo)
FairTrackParam * GetParamFirst()
Definition CbmStsTrack.h:69
Double_t GetZ() const
Definition CbmVertex.h:60