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