BmnRoot
Loading...
Searching...
No Matches
BmnGlobalTracking.cxx
Go to the documentation of this file.
1
7#include "BmnGlobalTracking.h"
8
9#include "BmnEventHeader.h"
10#include "BmnFieldMap.h"
11#include "BmnGemStripHit.h"
12#include "TFile.h"
13#include "TVectorD.h"
14#include "omp.h"
15
16#include <algorithm>
17#include <iterator>
18#include <map>
19#include <vector>
20
21using namespace TMath;
22
24 : fInnerTracks(nullptr)
25 , fGemTracks(nullptr)
26 , fGemVertex(nullptr)
27 , fGemHits(nullptr)
28 , fSilHits(nullptr)
29 , fCscHits(nullptr)
30 , fDchHits(nullptr)
31 , fTof1Hits(nullptr)
32 , fTof2Hits(nullptr)
33 , fGemLowerCluster(nullptr)
34 , fEvHead(nullptr)
35 , fMCTracks(nullptr)
36 , fStsHits(nullptr)
37 , fStsTracks(nullptr)
38 , fGlobalTracks(nullptr)
39 , fScWall(nullptr)
40 , fInnerTrackBranchName("StsTrack")
41 , fDoAlign(kFALSE)
42 , fEventNo(0)
43 , fPDG(2212)
44 , fChiSqCut(100.)
45 , fVertex(nullptr)
46 , fVertexL1(nullptr)
47 , fKalman(nullptr)
48 , fTime(0.0)
49 , fTOF400_file(0)
50 , fTOF700_file(0)
51 , fCalib1_file(0)
52 , fCalib2_file(0)
53 , fNMatchedDch1(0)
54 , fNMatchedDch2(0)
55 , fNMatchedTof400(0)
56 , fNMatchedTof700(0)
57 , fNMatchedNearCsc(0)
58 , fNMatchedFarCsc(0)
59 , fNInnerTracks(0)
60 , fNGoodInnerTracks(0)
61 , fNGoodGlobalTracks(0)
62{}
63
64BmnGlobalTracking::BmnGlobalTracking(Bool_t isExp, Bool_t doAlign)
65 : fInnerTracks(nullptr)
66 , fGemTracks(nullptr)
67 , fGemVertex(nullptr)
68 , fGemHits(nullptr)
69 , fCscHits(nullptr)
70 , fDchHits(nullptr)
71 , fTof1Hits(nullptr)
72 , fTof2Hits(nullptr)
73 , fGemLowerCluster(nullptr)
74 , fEvHead(nullptr)
75 , fMCTracks(nullptr)
76 , fStsHits(nullptr)
77 , fStsTracks(nullptr)
78 , fGlobalTracks(nullptr)
79 , fScWall(nullptr)
80 , fInnerTrackBranchName("StsTrack")
81 , fPeriod(8)
82 , fIsExp(isExp)
83 , fDoAlign(doAlign)
84 , fEventNo(0)
85 , fPDG(2212)
86 , fChiSqCut(100.)
87 , fVertex(nullptr)
88 , fVertexL1(nullptr)
89 , fTime(0.0)
90 , fTOF400_file(0)
91 , fTOF700_file(0)
92 , fCalib1_file(0)
93 , fCalib2_file(0)
94 , fNMatchedDch1(0)
95 , fNMatchedDch2(0)
96 , fNMatchedTof400(0)
97 , fNMatchedTof700(0)
98 , fNMatchedNearCsc(0)
99 , fNMatchedFarCsc(0)
100 , fNInnerTracks(0)
101 , fNGoodInnerTracks(0)
102 , fNGoodGlobalTracks(0)
103{}
104
106{
107 if (fGlobalTracks) {
108 fGlobalTracks->Delete();
109 delete fGlobalTracks;
110 }
111 if (fTOF400_file)
112 delete fTOF400_file;
113 if (fTOF700_file)
114 delete fTOF700_file;
115 if (fCalib1_file)
116 delete fCalib1_file;
117 if (fCalib2_file)
118 delete fCalib2_file;
119}
120
122{
123 if (fVerbose > 1)
124 cout << "BmnGlobalTracking::Init started\n";
125
126 fKalman = new BmnKalmanFilter();
127
128 FairRootManager* ioman = FairRootManager::Instance();
129 if (!ioman)
130 Fatal("Init", "FairRootManager is not instantiated");
131
132 fSilHits = (TClonesArray*)ioman->GetObject("BmnSiliconHit");
133 fGemHits = (TClonesArray*)ioman->GetObject("BmnGemStripHit");
134 fCscHits = (TClonesArray*)ioman->GetObject("BmnCSCHit");
135 fTof1Hits = (TClonesArray*)ioman->GetObject("BmnTof400Hit");
136 fTof2Hits = (TClonesArray*)ioman->GetObject("BmnTof700Hit");
137
138 fVertexL1 = (CbmVertex*)ioman->GetObject("MpdVertex.");
139 fScWall = (BmnScWallEvent*)ioman->GetObject("ScWallEvent");
140
141 fStsTracks = (TClonesArray*)ioman->GetObject(fInnerTrackBranchName);
142 fStsHits = (TClonesArray*)ioman->GetObject("StsHit");
143 fGemLowerCluster = (TClonesArray*)ioman->GetObject("BmnGemLowerCluster");
144 if (fStsTracks) {
145 printf("BmnGlobalTracking::Init(): branch %s was found!\n", fInnerTrackBranchName.Data());
146 fGlobalTracks = new TClonesArray("BmnGlobalTrack", 100); // out
147 ioman->Register("BmnGlobalTrack", "GLOBAL", fGlobalTracks, kTRUE);
148 } else {
149 fInnerTracks = (TClonesArray*)ioman->GetObject("BmnGlobalTrack");
150 fGemTracks = (TClonesArray*)ioman->GetObject("BmnGemTrack");
151 if (!fInnerTracks) {
152 cout << "BmnGlobalTracking::Init(): branch BmnInnerTrack not found! Task will be deactivated" << endl;
153 SetActive(kFALSE);
154 return kERROR;
155 } else {
156 printf("BmnGlobalTracking::Init(): branch BmnInnerTrack was found! Global tracks will be based on BMN "
157 "tracks \n");
158 }
159 }
160
161 fDchTracks = (TClonesArray*)ioman->GetObject("BmnDchTrack");
162 // if (!fDchTracks)
163 // cout << "BmnGlobalTracking::Init(): branch BmnDchTrack not found!" << endl;
164
165 if (fIsExp) { // In case of exp data we create artificial hits
166 fDchHits = new TClonesArray("BmnHit", 100); // out
167 // ioman->Register("BmnDchHit", "DCH", fDchHits, kTRUE);
168 } else { // In case of MC data we get hits from indput tree
169 fDchHits = (TClonesArray*)ioman->GetObject("BmnDchHit");
170 }
171
172 TString dir = getenv("VMCWORKDIR");
173 // TString path = dir + "/input/tof700_strip_time_shifts.txt";
174 // ifstream infile(path.Data());
175
176 // Int_t m, s, n;
177 // Float_t sh;
178 // while (infile >> m >> s >> n >> sh) {
179 // timeShiftsTof700[m][s] = sh;
180 // }
181
182 // coefficients from the first iteration
183 TString calibFileName1 = dir + "/input/q_calib1.root";
184 fCalib1_file = TFile::Open(calibFileName1);
185 for (Int_t i = 0; i < nGemSt; ++i) {
186 TH1F* hA0 = (TH1F*)fCalib1_file->Get(Form("hA0_run_%d", i));
187 TH1F* hA1 = (TH1F*)fCalib1_file->Get(Form("hA1_run_%d", i));
188 TH1F* hB0 = (TH1F*)fCalib1_file->Get(Form("hB0_run_%d", i));
189 TH1F* hB1 = (TH1F*)fCalib1_file->Get(Form("hB1_run_%d", i));
190
191 qCalib_a0[i] = hA0->GetBinContent(hA0->FindBin(fRunId));
192 qCalib_a1[i] = hA1->GetBinContent(hA1->FindBin(fRunId));
193 qCalib_b0[i] = hB0->GetBinContent(hB0->FindBin(fRunId));
194 qCalib_b1[i] = hB1->GetBinContent(hB1->FindBin(fRunId));
195
196 // cout << a0[i] << " " << a1[i] << " " << b0[i] << " " << b1[i] << endl;
197 }
198 fCalib1_file->Close();
199
200 // coefficients from the second iteration
201 TString calibFileName2 = dir + "/input/q_calib2.root";
202 fCalib2_file = TFile::Open(calibFileName2);
203 for (Int_t i = 0; i < nGemSt; ++i) {
204 TH1F* hA0 = (TH1F*)fCalib2_file->Get(Form("hA0_run_%d", i));
205 TH1F* hA1 = (TH1F*)fCalib2_file->Get(Form("hA1_run_%d", i));
206 TH1F* hB0 = (TH1F*)fCalib2_file->Get(Form("hB0_run_%d", i));
207 TH1F* hB1 = (TH1F*)fCalib2_file->Get(Form("hB1_run_%d", i));
208
209 qCalib_a0[i] *= hA0->GetBinContent(hA0->FindBin(fRunId));
210 qCalib_a1[i] *= hA1->GetBinContent(hA1->FindBin(fRunId));
211 qCalib_b0[i] =
212 qCalib_b0[i] * hA0->GetBinContent(hA0->FindBin(fRunId)) + hB0->GetBinContent(hB0->FindBin(fRunId));
213 qCalib_b1[i] =
214 qCalib_b1[i] * hA1->GetBinContent(hA1->FindBin(fRunId)) + hB1->GetBinContent(hB1->FindBin(fRunId));
215
216 // cout << a0[i] << " " << a1[i] << " " << b0[i] << " " << b1[i] << endl;
217 }
218 fCalib2_file->Close();
219
220 TString ResXY_vs_mom_TOF400 = dir + "/input/fitFunctions_ResXY_vs_mom_TOF400.root";
221 fTOF400_file = TFile::Open(ResXY_vs_mom_TOF400);
222 fitMeanPosResX_tof400 = (TF1*)fTOF400_file->Get("fitMeanPosResX");
223 fitMeanPosResY_tof400 = (TF1*)fTOF400_file->Get("fitMeanPosResY");
224 fitMeanNegResX_tof400 = (TF1*)fTOF400_file->Get("fitMeanNegResX");
225 fitMeanNegResY_tof400 = (TF1*)fTOF400_file->Get("fitMeanNegResY");
226 fitSigmaPosResX_tof400 = (TF1*)fTOF400_file->Get("fitSigmaPosResX");
227 fitSigmaPosResY_tof400 = (TF1*)fTOF400_file->Get("fitSigmaPosResY");
228 fitSigmaNegResX_tof400 = (TF1*)fTOF400_file->Get("fitSigmaNegResX");
229 fitSigmaNegResY_tof400 = (TF1*)fTOF400_file->Get("fitSigmaNegResY");
230 fTOF400_file->Close();
231
232 TString ResXY_vs_mom_TOF700 = dir + "/input/fitFunctions_ResXY_vs_mom_TOF700.root";
233 fTOF700_file = TFile::Open(ResXY_vs_mom_TOF700);
234 fitMeanPosResX_tof700 = (TF1*)fTOF700_file->Get("fitMeanPosResX");
235 fitMeanPosResY_tof700 = (TF1*)fTOF700_file->Get("fitMeanPosResY");
236 fitMeanNegResX_tof700 = (TF1*)fTOF700_file->Get("fitMeanNegResX");
237 fitMeanNegResY_tof700 = (TF1*)fTOF700_file->Get("fitMeanNegResY");
238 fitSigmaPosResX_tof700 = (TF1*)fTOF700_file->Get("fitSigmaPosResX");
239 fitSigmaPosResY_tof700 = (TF1*)fTOF700_file->Get("fitSigmaPosResY");
240 fitSigmaNegResX_tof700 = (TF1*)fTOF700_file->Get("fitSigmaNegResX");
241 fitSigmaNegResY_tof700 = (TF1*)fTOF700_file->Get("fitSigmaNegResY");
242 fTOF700_file->Close();
243
244 fEvHead = (TClonesArray*)ioman->GetObject("EventHeader");
245 if (!fEvHead)
246 if (fVerbose > 1)
247 cout << "Init. No EventHeader array!" << endl;
248
249 if (fVerbose > 1)
250 cout << "BmnGlobalTracking::Init finished\n";
251 return kSUCCESS;
252}
253
254void BmnGlobalTracking::Exec(Option_t* opt)
255{
256 TStopwatch sw;
257 sw.Start();
258
259 fEventNo++;
260 if (fStsTracks)
261 fGlobalTracks->Delete();
262
263 if (!IsActive())
264 return;
265
266 if (fVerbose > 1)
267 cout << "\n======================== Global tracking exec started =====================\n" << endl;
268
269 if (!fVertexL1)
270 return;
271 if (fVertexL1->GetNTracks() < 2)
272 return;
273
274 // if (!fInnerTracks) return;
275 if (fIsExp) {
276 if (fDchHits)
277 fDchHits->Delete();
278 }
279
280 // Alignment. FIXME: move to DB
281
282 if (fIsExp) {
283 if (fPeriod == 7) {
284 if (fDchTracks) {
285 Double_t dchTxCorr = +0.006;
286 Double_t dchTyCorr = -0.0003;
287 Double_t dchXCorr = -6.97;
288 Double_t dchYCorr = -2.92;
289 for (Int_t trIdx = 0; trIdx < fDchTracks->GetEntriesFast(); ++trIdx) {
290 BmnTrack* dchTr = (BmnTrack*)fDchTracks->At(trIdx);
291 FairTrackParam* parDch = dchTr->GetParamFirst();
292 Double_t zDCH = parDch->GetZ();
293 if (zDCH < 550) { // dch1
294 } else if (zDCH > 650) { // dch2
295 } else { // global dch
296 parDch->SetTx(parDch->GetTx() + dchTxCorr);
297 parDch->SetTy(parDch->GetTy() + dchTyCorr);
298 parDch->SetX(parDch->GetX() + dchXCorr);
299 parDch->SetY(parDch->GetY() + dchYCorr);
300 }
301 }
302 }
303 if (fCscHits) {
304 Double_t cscXCorr = +0.87;
305 Double_t cscYCorr = -0.12;
306 for (Int_t hitIdx = 0; hitIdx < fCscHits->GetEntriesFast(); ++hitIdx) {
307 BmnHit* hit = (BmnHit*)fCscHits->At(hitIdx);
308 hit->SetX(hit->GetX() + cscXCorr);
309 hit->SetY(hit->GetY() + cscYCorr);
310 }
311 }
312 if (fTof1Hits) {
313 Double_t tof400XCorr = -2.03;
314 Double_t tof400YCorr = +0.60;
315 for (Int_t hitIdx = 0; hitIdx < fTof1Hits->GetEntriesFast(); ++hitIdx) {
316 BmnHit* hit = (BmnHit*)fTof1Hits->At(hitIdx);
317 hit->SetX(hit->GetX() + tof400XCorr);
318 hit->SetY(hit->GetY() + tof400YCorr);
319 }
320 }
321 if (fTof2Hits) {
322 Double_t tof700XCorr = +2.00;
323 Double_t tof700YCorr = -5.74;
324 for (Int_t hitIdx = 0; hitIdx < fTof2Hits->GetEntriesFast(); ++hitIdx) {
325 BmnHit* hit = (BmnHit*)fTof2Hits->At(hitIdx);
326 hit->SetX(hit->GetX() + tof700XCorr);
327 hit->SetY(hit->GetY() + tof700YCorr);
328 }
329 }
330 }
331 }
332
333 if (fStsTracks) { // for run-8
334 for (Int_t i = 0; i < fStsTracks->GetEntriesFast(); ++i) {
335 CbmStsTrack* cbmTrack = (CbmStsTrack*)fStsTracks->At(i);
336
337 fNInnerTracks++;
338
339 if (cbmTrack->GetNStsHits() < 4)
340 continue;
341
342 BmnGlobalTrack globTr;
343
344 globTr.SetGemTrackIndex(i);
345 globTr.SetParamFirst(*(cbmTrack->GetParamFirst()));
346 globTr.SetParamLast(*(cbmTrack->GetParamLast()));
347 globTr.SetNHits(cbmTrack->GetNStsHits());
348 globTr.SetNDF(cbmTrack->GetNDF());
349 globTr.SetChi2(cbmTrack->GetChi2());
350 FairTrackParam par(*(globTr.GetParamLast()));
351 fPDG = (globTr.GetP() > 0.) ? 2212 : -211;
352 Double_t len = 0.0;
353 const Float_t tZ = -0.01942; // z-coordinate of target for RUN-8
354 if (fKalman->TGeoTrackPropagate(&par, tZ, fPDG, nullptr, &len) == kBMNERROR)
355 continue;
356 globTr.SetLength(len);
357
358 FairTrackParam parF(*(globTr.GetParamFirst()));
359 if (fKalman->TGeoTrackPropagate(&parF, fVertexL1->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
360 continue;
361 Float_t dca = Sqrt(Sq(fVertexL1->GetX() - parF.GetX()) + Sq(fVertexL1->GetY() - parF.GetY()));
362 globTr.SetParamFirst(parF);
363 globTr.SetDCAInVertex(dca);
364
365 BmnHit* virtualVertexHit = new BmnHit();
366 virtualVertexHit->SetXYZ(fVertexL1->GetX(), fVertexL1->GetY(), fVertexL1->GetZ());
367 virtualVertexHit->SetDxyz(Sqrt(fVertexL1->GetCovariance(0, 0)), Sqrt(fVertexL1->GetCovariance(1, 1)),
368 Sqrt(fVertexL1->GetCovariance(2, 2)));
369
370 Double_t chi = 0;
371 fKalman->Update(&parF, virtualVertexHit, chi);
372 globTr.SetChi2InVertex(chi);
373
374 CalcdQdn(&globTr);
375
376 fNGoodInnerTracks++;
377 new ((*fGlobalTracks)[fGlobalTracks->GetEntriesFast()]) BmnGlobalTrack(globTr);
378 }
379
380 MatchingTOF400();
381 MatchingTOF700();
382 MatchingScWall();
383 MatchingFarCsc();
384
385 // for (Int_t i = 0; i < fStsTracks->GetEntriesFast(); ++i) {
386 // CbmStsTrack* cbmTrack = (CbmStsTrack*)fStsTracks->At(i);
387
388 // fNInnerTracks++;
389
390 // if (cbmTrack->GetNStsHits() < 4) continue;
391
392 // BmnGlobalTrack globTr;
393
394 // globTr.SetGemTrackIndex(i);
395 // globTr.SetParamFirst(*(cbmTrack->GetParamFirst()));
396 // globTr.SetParamLast(*(cbmTrack->GetParamLast()));
397 // globTr.SetNHits(cbmTrack->GetNStsHits());
398 // globTr.SetNDF(cbmTrack->GetNDF());
399 // globTr.SetChi2(cbmTrack->GetChi2());
400 // FairTrackParam par(*(globTr.GetParamLast()));
401 // fPDG = (globTr.GetP() > 0.) ? 2212 : -211;
402 // Double_t len = 0.0;
403 // Double_t zTarget = (fVertexL1) ? fVertexL1->GetZ() : 0.0;
404 // if (fKalman->TGeoTrackPropagate(&par, zTarget, fPDG, nullptr, &len) == kBMNERROR) continue;
405 // globTr.SetLength(len);
406
407 // fNGoodInnerTracks++;
408
409 // //Matching with Small CSC1
410 // //vector<Int_t> nearCSCst = { 0, 1 };
411 // // MatchingCSC(&globTr);
412 // //Matching with TOF-400
413 // // MatchingTOF(&globTr, 1);
414 // //Matching with Small CSC2
415 // //vector<Int_t> farCSCst = { 2, 3 };
416 // //MatchingCSC(&globTr, farCSCst);
417 // //Matching with DCH1
418 // // MatchingDCH(&globTr, 1);
419 // //Matching with TOF-700
420 // MatchingTOF(&globTr, 2);
421 // //Matching with DCH2
422 // // MatchingDCH(&globTr, 2);
423
424 // if (Refit(&globTr) == kBMNERROR) continue;
425
426 // fNGoodGlobalTracks++;
427 // new ((*fGlobalTracks)[fGlobalTracks->GetEntriesFast()]) BmnGlobalTrack(globTr);
428 // }
429 } else if (fInnerTracks) {
430 // for (Int_t i = 0; i < fInnerTracks->GetEntriesFast(); ++i) {
431 // BmnGlobalTrack* glTrack = (BmnGlobalTrack*)fInnerTracks->At(i);
432
433 // //Downstream
434 // //Matching with Small CSC1
435 // //vector<Int_t> nearCSCst = { 0, 1 };
436 // if (!fIsSRC) MatchingCSC(glTrack);
437 // if (!fIsSRC) MatchingTOF(glTrack, 1);
438 // MatchingDCH(glTrack);
439 // MatchingTOF(glTrack, 2);
440
441 // //Upstream
442 // if (fIsSRC) MatchingUpstream(glTrack);
443
444 // Refit(glTrack);
445 // //cout << glTrack->GetP() << endl;
446 // if (fIsSRC) UpdateMomentum(glTrack);
447 // CalcdQdn(glTrack);
448
449 // // NDF = (N counts in ZX plane + N counts in ZY plane) - 2 parameters of Line in ZY plane - 3 parameters
450 // of Circle in ZX plane
451 // // Check it!!!
452 // glTrack->SetNDF(glTrack->GetNHits() * 2 - 5);
453 // }
454 }
455
456 sw.Stop();
457 fTime += sw.RealTime();
458
459 // if (fVerbose) cout << "GLOBAL_TRACKING: Number of merged tracks: " << fGlobalTracks->GetEntriesFast() << endl;
460 if (fVerbose > 1)
461 cout << "\n======================== Global tracking exec finished ====================\n" << endl;
462}
463
464BmnStatus BmnGlobalTracking::MatchingTOF400()
465{
466 if (fVerbose)
467 cout << "Matching of TOF-400 started" << endl;
468 TClonesArray* tofHits = fTof1Hits;
469 if (!tofHits)
470 return kBMNERROR;
471
472 // residuals after peak fitting of all-to-all histograms
473 // Double_t sigmaXtof1gemResid = (fIsExp) ? 2.0 : 2.0; // 6.2; //1.34;
474 // Double_t sigmaYtof1gemResid = (fIsExp) ? 2.0 : 2.0; // 1.38;
475 // Double_t xCut = 3 * sigmaXtof1gemResid;
476 // Double_t yCut = 3 * sigmaYtof1gemResid;
477
478 map<Float_t, pair<Int_t, Int_t>> distPairs = FindPairsTof400(fGlobalTracks, tofHits, -1, -1);
479
480 for (auto const& distPair : distPairs) {
481 // Float_t dist = distPair.first;
482 pair<Int_t, Int_t> idxes = distPair.second;
483 BmnGlobalTrack* track = (BmnGlobalTrack*)fGlobalTracks->At(idxes.first);
484 if (track->GetTof1HitIndex() != -1)
485 continue;
486 BmnHit* hit = (BmnHit*)tofHits->At(idxes.second);
487 if (hit->IsUsed())
488 continue;
489
490 Double_t len = 0.0;
491 FairTrackParam par(*(track->GetParamLast()));
492 fKalman->TGeoTrackPropagate(&par, hit->GetZ(), fPDG, nullptr, &len);
493 Float_t mom = 1.0 / par.GetQp();
494 Float_t xMomCorr = (mom > 0) ? fitMeanPosResX_tof400->Eval(mom) : fitMeanNegResX_tof400->Eval(mom);
495 Float_t yMomCorr = (mom > 0) ? fitMeanPosResY_tof400->Eval(mom) : fitMeanNegResY_tof400->Eval(mom);
496 hit->SetResXY(par.GetX() - xMomCorr - hit->GetX(), par.GetY() - yMomCorr - hit->GetY());
497 track->SetParamLast(par);
498 track->SetTof1HitIndex(idxes.second);
499 len += track->GetLength();
500 track->SetBeta(len / hit->GetTimeStamp() / (TMath::C() * 1e-7), 1);
501 hit->SetUsing(kTRUE);
502 hit->SetLength(len); // length from target to Tof-400 hit
503 hit->SetModule(((hit->GetDetectorID() & 0x0000FF00) >> 8) - 1);
504 track->SetNHits(track->GetNHits() + 1);
505 track->SetLength(len);
506 fNMatchedTof400++;
507 }
508 return kBMNSUCCESS;
509}
510
511BmnStatus BmnGlobalTracking::MatchingTOF700()
512{
513 if (fVerbose)
514 cout << "Matching of TOF-700 started" << endl;
515 TClonesArray* tofHits = fTof2Hits;
516 if (!tofHits)
517 return kBMNERROR;
518
519 map<Float_t, pair<Int_t, Int_t>> distPairs = FindPairsTof700(fGlobalTracks, tofHits, -1, -1);
520
521 for (auto const& distPair : distPairs) {
522 // Float_t dist = distPair.first;
523 pair<Int_t, Int_t> idxes = distPair.second;
524 BmnGlobalTrack* track = (BmnGlobalTrack*)fGlobalTracks->At(idxes.first);
525 if (track->GetTof2HitIndex() != -1)
526 continue;
527 BmnHit* hit = (BmnHit*)tofHits->At(idxes.second);
528 if (hit->IsUsed())
529 continue;
530
531 Double_t len = 0.0;
532 FairTrackParam par(*(track->GetParamLast()));
533 fKalman->TGeoTrackPropagate(&par, hit->GetZ(), fPDG, nullptr, &len);
534 Float_t mom = 1.0 / par.GetQp();
535 Float_t xMomCorr = (mom > 0) ? fitMeanPosResX_tof700->Eval(mom) : fitMeanNegResX_tof700->Eval(mom);
536 Float_t yMomCorr = (mom > 0) ? fitMeanPosResY_tof700->Eval(mom) : fitMeanNegResY_tof700->Eval(mom);
537 hit->SetResXY(par.GetX() - xMomCorr - hit->GetX(), par.GetY() - yMomCorr - hit->GetY());
538 track->SetParamLast(par);
539 track->SetTof2HitIndex(idxes.second);
540 len += track->GetLength();
541 track->SetBeta(len / (hit->GetTimeStamp()) / (TMath::C() * 1e-7), 2);
542 hit->SetUsing(kTRUE);
543 hit->SetLength(len); // length from target to Tof-700 hit
544 hit->SetModule(((hit->GetDetectorID() & 0x0000FF00) >> 8) - 1);
545 track->SetNHits(track->GetNHits() + 1);
546 track->SetLength(len);
547 fNMatchedTof700++;
548 }
549 return kBMNSUCCESS;
550}
551
552BmnStatus BmnGlobalTracking::MatchingScWall()
553{
554 if (fVerbose)
555 cout << "Matching of ScWall started " << fScWall << endl;
556 if (!fScWall)
557 return kBMNERROR;
558
559 for (Int_t trIdx = 0; trIdx < fGlobalTracks->GetEntriesFast(); ++trIdx) {
560 BmnGlobalTrack* tr = (BmnGlobalTrack*)fGlobalTracks->At(trIdx);
561 FairTrackParam par(*(tr->GetParamLast()));
562 Double_t minDX = DBL_MAX;
563 Double_t minDY = DBL_MAX;
564 Float_t xCut = 20.0; // cm
565 Float_t yCut = 20.0; // cm
566 Int_t minIdx = -1;
567
568 Float_t z = 741.5;
569 Int_t nCells = 174; // BmnScWallEvent::fgkMaxCells; //174
570 if (fKalman->TGeoTrackPropagate(&par, z, fPDG, nullptr, nullptr) == kBMNERROR)
571 return kBMNERROR;
572
573 for (Int_t i = 1; i <= nCells; ++i) {
574 BmnScWallCell* cell = fScWall->GetCell(i);
575 if (cell->GetSignal() < 0.001)
576 continue; // skip empty cells
577
578 Float_t dX = par.GetX() - cell->GetX();
579 Float_t dY = par.GetY() - cell->GetY();
580
581 if (Abs(dX) < xCut && Abs(dY) < yCut && Abs(dX) < Abs(minDX) && Abs(dY) < Abs(minDY)) {
582 minDX = dX;
583 minDY = dY;
584 minIdx = i;
585 }
586 }
587 // cout << minDX << " " << minDY << endl;
588
589 if (minIdx == -1)
590 continue;
591 tr->SetScWallCellId(minIdx);
592 tr->SetScWallSignal(fScWall->GetCell(minIdx)->GetSignal());
593 }
594 return kBMNSUCCESS;
595}
596
597BmnStatus BmnGlobalTracking::MatchingFarCsc()
598{
599 if (fVerbose)
600 cout << "Matching of LCSC started" << endl;
601 if (!fCscHits)
602 return kBMNERROR;
603
604 Double_t dX = 0;
605 Double_t dY = 0;
606 Double_t dZ = fDoAlign ? -7 : 0;
607 const Double_t dXX[] = {0.944, 0.891, 0.885, 0.992, 0.559, 0.582, 0.606, 0.588};
608 const Double_t dYY[] = {-0.735, -0.653, -0.583, -1.219, -0.458, -0.376, -0.506, -0.128};
609
610 // residuals after peak fitting of all-to-all histograms
611 Double_t sigmaXResid = (fIsExp) ? 2.0 : 2.0;
612 Double_t sigmaYResid = (fIsExp) ? 2.0 : 2.0;
613 Double_t xCut = 3 * sigmaXResid;
614 Double_t yCut = 3 * sigmaYResid;
615
616 Int_t N_tr = fGlobalTracks->GetEntriesFast();
617 Int_t N_csc = fCscHits->GetEntriesFast();
618
619 TString VMCWORKDIR = gSystem->Getenv("VMCWORKDIR");
620 BmnCSCStationSet stationSet(VMCWORKDIR + "/parameters/csc/XMLConfigs/" + "FullCSCRun8.xml");
621 BmnCSCStation* pStation = stationSet.GetStation(4);
622
623 Double_t minZ = 1e5;
624 for (Int_t i_csc = 0; i_csc < N_csc; i_csc++) {
625 BmnCSCHit* pCscHit = (BmnCSCHit*)fCscHits->At(i_csc);
626 if (pCscHit->GetStation() != 4)
627 continue;
628 if (minZ > pCscHit->GetZ())
629 minZ = pCscHit->GetZ();
630 }
631
632 for (Int_t i_tr = 0; i_tr < N_tr; i_tr++) {
633 BmnGlobalTrack* track = (BmnGlobalTrack*)fGlobalTracks->At(i_tr);
634 FairTrackParam parMinZ(*(track->GetParamLast()));
635 if (fKalman->TGeoTrackPropagate(&parMinZ, minZ, fPDG, nullptr, nullptr) == kBMNERROR)
636 continue;
637 for (Int_t i_csc = 0; i_csc < N_csc; i_csc++) {
638 BmnCSCHit* pCscHit = (BmnCSCHit*)fCscHits->At(i_csc);
639 Int_t st_id = pCscHit->GetStation();
640 if (st_id != 4)
641 continue;
642 if (pCscHit->IsUsed())
643 continue;
644 if (track->GetCscHitIndex(st_id - 1) != -1)
645 continue;
646 FairTrackParam p = parMinZ;
647 Double_t len = 0.0;
648 if (fKalman->TGeoTrackPropagate(&p, pCscHit->GetZ() + dZ, fPDG, nullptr, &len) == kBMNERROR)
649 continue;
650 Int_t mod_id = pCscHit->GetModule();
651 if (fDoAlign) {
652 dX = dXX[mod_id];
653 dY = dYY[mod_id];
654 }
655 if (pStation->GetPointModuleOwnership(-1.0 * (p.GetX() - dX), p.GetY() - dY, p.GetZ() - dZ) != mod_id)
656 continue; // check if track is in current CSC
657 Double_t dx = p.GetX() - (pCscHit->GetX() + dX);
658 Double_t dy = p.GetY() - (pCscHit->GetY() + dY);
659 if (Abs(dx) < xCut && Abs(dy) < yCut) {
660 // Double_t chi = 0;
661 pCscHit->SetResXY(dx, dy);
662 // fKalman->Update(&p, pCscHit, chi);
663 // track->SetChi2(track->GetChi2() + chi);
664 // track->SetParamLast(p);
665 // track->AddCscHitIndex(st_id - 1,i_csc);
666 // len += track->GetLength();
668 pCscHit->SetUsing(kTRUE);
669 pCscHit->SetLength(len); // length from target to Tof-700 hit
670 // track->SetNHits(track->GetNHits() + 1);
671 // track->SetLength(len);
672 fNMatchedFarCsc++;
673 }
674 }
675 }
676
677 return kBMNSUCCESS;
678}
679
680void BmnGlobalTracking::CalcdQdn(BmnGlobalTrack* gl)
681{
682 // BmnGemTrack* gemTrack = (BmnGemTrack*)fGemTracks->At(tr->GetGemTrackIndex());
683 // Double_t totSigLow = 0.0;
684 // Double_t totSigUp = 0.0;
685 // for (Int_t hitIdx = 0; hitIdx < gemTrack->GetNHits(); ++hitIdx) {
686 // BmnGemStripHit* hit = (BmnGemStripHit*)fGemHits->At(gemTrack->GetHitIndex(hitIdx));
687 // totSigLow += hit->GetStripTotalSignalInLowerLayer();
688 // totSigUp += hit->GetStripTotalSignalInUpperLayer();
689 // }
690 // totSigLow /= gemTrack->GetNHits();
691 // totSigUp /= gemTrack->GetNHits();
692 // tr->SetdQdNLower(totSigLow);
693 // tr->SetdQdNUpper(totSigUp);
694
695 Float_t mom = gl->GetP();
696 if (mom < 0.0)
697 return;
698
699 CbmStsTrack* tr = (CbmStsTrack*)fStsTracks->At(gl->GetGemTrackIndex());
700
701 set<Float_t> signalsLow;
702 Int_t nHits = tr->GetNStsHits();
703 Int_t nGemHits = 0;
704 for (Int_t hitIdx = 0; hitIdx < nHits; ++hitIdx) {
705 CbmStsHit* hit = (CbmStsHit*)fStsHits->At(tr->GetStsHitIndex(hitIdx));
706 if (hit->GetSystemId() != kGEM)
707 continue;
708 nGemHits++;
709 StripCluster* low = (StripCluster*)fGemLowerCluster->At(hit->fDigiF % 1000000);
710 Int_t idx =
711 hit->GetStationNr() - 1 - 4; //(hit.GetStationNr() - 1) - station number from 0, -4 for excluding FSD
712 Float_t a = (hit->GetY() > 0) ? qCalib_a0[idx] : qCalib_a1[idx];
713 Float_t b = (hit->GetY() > 0) ? qCalib_b0[idx] : qCalib_b1[idx];
714 signalsLow.insert(low->TotalSignal * a + b);
715 }
716
717 Int_t usedHits = (nGemHits == 3) ? 2
718 : (nGemHits == 4) ? 2
719 : (nGemHits == 5) ? 3
720 : (nGemHits == 6) ? 4
721 : (nGemHits == 7) ? 4
722 : 0;
723 auto it = signalsLow.begin();
724 Float_t totSigLow = 0.0;
725 for (Int_t i = 0; i < usedHits; ++i) {
726 totSigLow += (*it);
727 it++;
728 }
729 Float_t dedx = (usedHits > 0) ? totSigLow / usedHits : -100;
730 gl->SetdQdNLower(dedx);
731
732 TF1* hypCut = new TF1("hypCut", "20000*TMath::Exp(-2.0*TMath::Sqrt(x)) + 600.0", 0, 15);
733
734 if (dedx > hypCut->Eval(mom))
735 gl->SetZ(2);
736 else
737 gl->SetZ(1);
738
739 delete hypCut;
740}
741
742Int_t BmnGlobalTracking::FindNearestHit(FairTrackParam* par, TClonesArray* hits, Float_t xCut, Float_t yCut)
743{
744 if (!hits || !par)
745 return -1;
746
747 Double_t minDX = DBL_MAX;
748 Double_t minDY = DBL_MAX;
749 Int_t minIdx = -1;
750 BmnHit* minHit = nullptr;
751
752 Double_t minZ = 10000.0;
753 for (Int_t hitIdx = 0; hitIdx < hits->GetEntriesFast(); ++hitIdx) {
754 BmnHit* hit = (BmnHit*)hits->At(hitIdx);
755 if (hit->GetZ() < minZ)
756 minZ = hit->GetZ();
757 }
758
759 FairTrackParam parMinZ(*par);
760 if (fKalman->TGeoTrackPropagate(&parMinZ, minZ, fPDG, nullptr, nullptr) == kBMNERROR)
761 return -1;
762
763 for (Int_t hitIdx = 0; hitIdx < hits->GetEntriesFast(); ++hitIdx) {
764 BmnHit* hit = (BmnHit*)hits->At(hitIdx);
765
766 FairTrackParam param = parMinZ;
767 if (fKalman->TGeoTrackPropagate(&param, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
768 continue;
769
770 Float_t dX = param.GetX() - hit->GetX();
771 Float_t dY = param.GetY() - hit->GetY();
772
773 if (Abs(dX) < xCut && Abs(dY) < yCut && Abs(dX) < Abs(minDX) && Abs(dY) < Abs(minDY)) {
774 minDX = dX;
775 minDY = dY;
776 minIdx = hitIdx;
777 minHit = hit;
778 }
779 }
780 if (!minHit)
781 return -1;
782
783 minHit->SetResXY(minDX, minDY);
784
785 return minIdx;
786}
787
788map<Float_t, pair<Int_t, Int_t>> BmnGlobalTracking::FindPairsTof700(TClonesArray* tracks,
789 TClonesArray* hits,
790 Float_t xCut,
791 Float_t yCut)
792{
793
794 Bool_t useFixCutX = (xCut > 0);
795 Bool_t useFixCutY = (yCut > 0);
796
797 map<Float_t, pair<Int_t, Int_t>> distancesPairs;
798
799 Double_t minZ = 10000.0;
800 for (Int_t hitIdx = 0; hitIdx < hits->GetEntriesFast(); ++hitIdx) {
801 BmnHit* hit = (BmnHit*)hits->At(hitIdx);
802 if (hit->GetZ() < minZ)
803 minZ = hit->GetZ();
804 }
805
806 for (Int_t trIdx = 0; trIdx < tracks->GetEntriesFast(); ++trIdx) {
807 BmnGlobalTrack* tr = (BmnGlobalTrack*)tracks->At(trIdx);
808 FairTrackParam parMinZ(*(tr->GetParamLast()));
809 if (fKalman->TGeoTrackPropagate(&parMinZ, minZ, fPDG, nullptr, nullptr) == kBMNERROR)
810 continue;
811 for (Int_t hitIdx = 0; hitIdx < hits->GetEntriesFast(); ++hitIdx) {
812
813 BmnHit* hit = (BmnHit*)hits->At(hitIdx);
814 FairTrackParam param = parMinZ;
815 if (fKalman->TGeoTrackPropagate(&param, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
816 continue;
817 Float_t mom = 1.0 / param.GetQp();
818 Float_t xMomCorr = (mom > 0) ? fitMeanPosResX_tof700->Eval(mom) : fitMeanNegResX_tof700->Eval(mom);
819 Float_t yMomCorr = (mom > 0) ? fitMeanPosResY_tof700->Eval(mom) : fitMeanNegResY_tof700->Eval(mom);
820 Float_t xSigma = (mom > 0) ? fitSigmaPosResX_tof700->Eval(mom) : fitSigmaNegResX_tof700->Eval(mom);
821 Float_t ySigma = (mom > 0) ? fitSigmaPosResY_tof700->Eval(mom) : fitSigmaNegResY_tof700->Eval(mom);
822
823 Float_t dX = Abs(param.GetX() - xMomCorr - hit->GetX());
824 Float_t dY = Abs(param.GetY() - yMomCorr - hit->GetY());
825 if (!useFixCutX)
826 xCut = 3.0 * xSigma;
827 if (!useFixCutY)
828 yCut = 3.0 * ySigma;
829 if (dX < xCut && dY < yCut) {
830 Float_t dist = Sqrt(dX * dX + dY * dY);
831 distancesPairs.insert(pair<Float_t, pair<Int_t, Int_t>>(dist, pair<Int_t, Int_t>(trIdx, hitIdx)));
832 }
833 }
834 }
835
836 return distancesPairs;
837}
838
839map<Float_t, pair<Int_t, Int_t>> BmnGlobalTracking::FindPairsTof400(TClonesArray* tracks,
840 TClonesArray* hits,
841 Float_t xCut,
842 Float_t yCut)
843{
844
845 Bool_t useFixCutX = (xCut > 0);
846 Bool_t useFixCutY = (yCut > 0);
847
848 map<Float_t, pair<Int_t, Int_t>> distancesPairs;
849
850 Double_t minZ = 10000.0;
851 for (Int_t hitIdx = 0; hitIdx < hits->GetEntriesFast(); ++hitIdx) {
852 BmnHit* hit = (BmnHit*)hits->At(hitIdx);
853 if (hit->GetZ() < minZ)
854 minZ = hit->GetZ();
855 }
856
857 for (Int_t trIdx = 0; trIdx < tracks->GetEntriesFast(); ++trIdx) {
858 BmnGlobalTrack* tr = (BmnGlobalTrack*)tracks->At(trIdx);
859 FairTrackParam parMinZ(*(tr->GetParamLast()));
860 if (fKalman->TGeoTrackPropagate(&parMinZ, minZ, fPDG, nullptr, nullptr) == kBMNERROR)
861 continue;
862 for (Int_t hitIdx = 0; hitIdx < hits->GetEntriesFast(); ++hitIdx) {
863
864 BmnHit* hit = (BmnHit*)hits->At(hitIdx);
865 FairTrackParam param = parMinZ;
866 if (fKalman->TGeoTrackPropagate(&param, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
867 continue;
868 Float_t mom = 1.0 / param.GetQp();
869 Float_t xMomCorr = (mom > 0) ? fitMeanPosResX_tof400->Eval(mom) : fitMeanNegResX_tof400->Eval(mom);
870 Float_t yMomCorr = (mom > 0) ? fitMeanPosResY_tof400->Eval(mom) : fitMeanNegResY_tof400->Eval(mom);
871 Float_t xSigma = (mom > 0) ? fitSigmaPosResX_tof400->Eval(mom) : fitSigmaNegResX_tof400->Eval(mom);
872 Float_t ySigma = (mom > 0) ? fitSigmaPosResY_tof400->Eval(mom) : fitSigmaNegResY_tof400->Eval(mom);
873
874 Float_t dX = Abs(param.GetX() - xMomCorr - hit->GetX());
875 Float_t dY = Abs(param.GetY() - yMomCorr - hit->GetY());
876 if (!useFixCutX)
877 xCut = 3.0 * xSigma;
878 if (!useFixCutY)
879 yCut = 3.0 * ySigma;
880 if (dX < xCut && dY < yCut) {
881 Float_t dist = Sqrt(dX * dX + dY * dY);
882 distancesPairs.insert(pair<Float_t, pair<Int_t, Int_t>>(dist, pair<Int_t, Int_t>(trIdx, hitIdx)));
883 }
884 }
885 }
886
887 return distancesPairs;
888}
889
890Int_t BmnGlobalTracking::FindNearestHit(FairTrackParam* par,
891 TClonesArray* hits,
892 Float_t xCut,
893 Float_t yCut,
894 vector<Int_t> stations)
895{
896 if (!hits || !par)
897 return -1;
898
899 Double_t minDX = DBL_MAX;
900 Double_t minDY = DBL_MAX;
901 Int_t minIdx = -1;
902 BmnHit* minHit = nullptr;
903
904 Double_t minZ = 10000.0;
905 for (Int_t hitIdx = 0; hitIdx < hits->GetEntriesFast(); ++hitIdx) {
906 BmnHit* hit = (BmnHit*)hits->At(hitIdx);
907 Int_t st = hit->GetStation();
908 if (st != stations[0] && st != stations[1])
909 continue;
910 if (hit->GetZ() < minZ)
911 minZ = hit->GetZ();
912 }
913
914 FairTrackParam parMinZ(*par);
915 if (fKalman->TGeoTrackPropagate(&parMinZ, minZ, fPDG, nullptr, nullptr) == kBMNERROR)
916 return -1;
917
918 for (Int_t hitIdx = 0; hitIdx < hits->GetEntriesFast(); ++hitIdx) {
919 BmnHit* hit = (BmnHit*)hits->At(hitIdx);
920
921 Int_t st = hit->GetStation();
922 if (st != stations[0] && st != stations[1])
923 continue;
924
925 FairTrackParam param = parMinZ;
926 if (fKalman->TGeoTrackPropagate(&param, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
927 continue;
928
929 Float_t dX = param.GetX() - hit->GetX();
930 Float_t dY = param.GetY() - hit->GetY();
931
932 if (Abs(dX) < xCut && Abs(dY) < yCut && Abs(dX) < Abs(minDX) && Abs(dY) < Abs(minDY)) {
933 minDX = dX;
934 minDY = dY;
935 minIdx = hitIdx;
936 minHit = hit;
937 }
938 }
939 if (!minHit)
940 return -1;
941
942 minHit->SetResXY(minDX, minDY);
943
944 return minIdx;
945}
946
947BmnStatus BmnGlobalTracking::MatchingCSC(BmnGlobalTrack* glTr)
948{
949
950 if (fVerbose)
951 cout << "Matching of CSC started" << endl;
952 if (!fCscHits)
953 return kBMNERROR;
954
955 fPDG = (glTr->GetP() > 0.) ? 2212 : -211;
956
957 // residuals after peak fitting of all-to-all histograms
958 Double_t sigmaXcscgemResid = 2.0;
959 Double_t sigmaYcscgemResid = 2.0;
960 Double_t xCut = 3 * sigmaXcscgemResid;
961 Double_t yCut = 3 * sigmaYcscgemResid;
962
963 // Double_t minDX = DBL_MAX;
964 // Double_t minDY = DBL_MAX;
965 // Double_t dX = DBL_MAX;
966 // Double_t dY = DBL_MAX;
967
968 Int_t minIdx = FindNearestHit(glTr->GetParamLast(), fCscHits, xCut, yCut);
969 if (minIdx == -1)
970 return kBMNERROR;
971
972 BmnHit* minHit = (BmnHit*)fCscHits->At(minIdx);
973 glTr->AddCscHitIndex(minHit->GetStation(), minIdx);
974
975 Double_t len = 0.0;
976 FairTrackParam par(*(glTr->GetParamLast()));
977 if (fKalman->TGeoTrackPropagate(&par, minHit->GetZ(), fPDG, nullptr, &len) == kBMNERROR)
978 return kBMNERROR;
979 Double_t chi = 0;
980 if (fKalman->Update(&par, minHit, chi) == kBMNERROR)
981 return kBMNERROR;
982 glTr->SetChi2(glTr->GetChi2() + chi);
983 glTr->SetParamLast(par);
984 len += glTr->GetLength();
985 glTr->SetLength(len);
986 minHit->SetUsing(kTRUE);
987 glTr->SetNHits(glTr->GetNHits() + 1);
988 if (minHit->GetStation() < 4)
989 fNMatchedNearCsc++;
990 else
991 fNMatchedFarCsc++;
992 return kBMNSUCCESS;
993}
994
995// BmnStatus BmnGlobalTracking::MatchingCSC(BmnGlobalTrack* glTr, vector<Int_t> stations) {
996
997// if (fVerbose) cout << "Matching of CSC started" << endl;
998// if (!fCscHits) return kBMNERROR;
999
1000// fPDG = (glTr->GetP() > 0.) ? 2212 : -211;
1001
1002// //residuals after peak fitting of all-to-all histograms
1003// Double_t sigmaXcscgemResid = 2.0;
1004// Double_t sigmaYcscgemResid = 2.0;
1005// Double_t xCut = 3 * sigmaXcscgemResid;
1006// Double_t yCut = 3 * sigmaYcscgemResid;
1007
1008// Double_t minDX = DBL_MAX;
1009// Double_t minDY = DBL_MAX;
1010// Double_t dX = DBL_MAX;
1011// Double_t dY = DBL_MAX;
1012
1013// Int_t minIdx = FindNearestHit(glTr->GetParamLast(), fCscHits, xCut, yCut, stations);
1014// if (minIdx == -1) return kBMNERROR;
1015
1016// Int_t id = (stations[0] < 2) ? 0 : 1;
1017// glTr->AddCscHitIndex(id, minIdx);
1018
1019// BmnHit* minHit = (BmnHit*)fCscHits->At(minIdx);
1020
1021// Double_t len = 0.0;
1022// FairTrackParam par(*(glTr->GetParamLast()));
1023// if (fKalman->TGeoTrackPropagate(&par, minHit->GetZ(), fPDG, nullptr, &len) == kBMNERROR) return kBMNERROR;
1024// Double_t chi = 0;
1025// if (fKalman->Update(&par, minHit, chi) == kBMNERROR) return kBMNERROR;
1026// glTr->SetChi2(glTr->GetChi2() + chi);
1027// glTr->SetParamLast(par);
1028// len += glTr->GetLength();
1029// glTr->SetLength(len);
1030// minHit->SetUsing(kTRUE);
1031// glTr->SetNHits(glTr->GetNHits() + 1);
1032// if (id == 0) fNMatchedNearCsc++;
1033// else fNMatchedFarCsc++;
1034// return kBMNSUCCESS;
1035// }
1036
1037BmnStatus BmnGlobalTracking::MatchingDCH(BmnGlobalTrack* tr)
1038{
1039
1040 if (fVerbose)
1041 cout << "Matching of DCH started" << endl;
1042
1043 if (!fDchTracks)
1044 return kBMNERROR;
1045 if (fDchTracks->GetEntriesFast() == 0)
1046 return kBMNERROR;
1047 fPDG = (tr->GetP() > 0.) ? 2212 : -211;
1048
1049 Double_t minDX = DBL_MAX;
1050 Double_t minDY = DBL_MAX;
1051 BmnTrack* minTrack = nullptr;
1052 Int_t minTrackId = -1;
1053
1054 // residuals after peak fitting of all-to-all histograms
1055 Double_t sigmaXdchGgemResid = (fIsExp) ? 5.54 : 1;
1056 Double_t sigmaYdchGgemResid = (fIsExp) ? 2.33 : 1;
1057 Double_t xCut = 3 * sigmaXdchGgemResid;
1058 Double_t yCut = 3 * sigmaYdchGgemResid;
1059
1060 for (Int_t iTr = 0; iTr < fDchTracks->GetEntriesFast(); ++iTr) {
1061 BmnTrack* dchTr = (BmnTrack*)fDchTracks->At(iTr);
1062 if (!dchTr)
1063 continue;
1064 if (dchTr->GetNHits() < 10)
1065 continue; // use only global DCH tracks
1066 FairTrackParam glPar(*(tr->GetParamLast()));
1067 FairTrackParam dchPar(*(dchTr->GetParamFirst()));
1068 if (fKalman->TGeoTrackPropagate(&glPar, dchPar.GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1069 continue;
1070 // Double_t dist = Sqrt(Sq(par.GetX() - hit->GetX()) + Sq(par.GetY() - hit->GetY()));
1071 Double_t dX = glPar.GetX() - dchPar.GetX();
1072 Double_t dY = glPar.GetY() - dchPar.GetY();
1073 if (Abs(dX) < xCut && Abs(dY) < yCut && Abs(dX) < minDX && Abs(dY) < minDY) {
1074 minTrack = dchTr;
1075 minTrackId = iTr;
1076 minDX = dX;
1077 minDY = dY;
1078 }
1079 }
1080
1081 if (minTrack == nullptr)
1082 return kBMNERROR;
1083
1084 FairTrackParam glPar(*(tr->GetParamLast()));
1085 FairTrackParam dchPar(*(minTrack->GetParamFirst()));
1086 Double_t len = tr->GetLength();
1087 fKalman->TGeoTrackPropagate(&glPar, dchPar.GetZ(), fPDG, nullptr, &len);
1088 Double_t chi = 0;
1089 UpdateTrackParam(&glPar, &dchPar, chi);
1090 tr->SetChi2(tr->GetChi2() + chi);
1091
1092 tr->SetDchTrackIndex(minTrackId);
1093 tr->SetNHits(tr->GetNHits() + minTrack->GetNHits());
1094 tr->SetParamLast(glPar);
1095 return kBMNSUCCESS;
1096}
1097
1098BmnStatus BmnGlobalTracking::MatchingDCH(BmnGlobalTrack* tr, Int_t num)
1099{
1100
1101 if (fVerbose)
1102 cout << "Matching of DCH started" << endl;
1103
1104 if (!fDchTracks)
1105 return kBMNERROR;
1106 if (fDchTracks->GetEntriesFast() == 0)
1107 return kBMNERROR;
1108 fPDG = (tr->GetP() > 0.) ? 2212 : -211;
1109
1110 // residuals after peak fitting of all-to-all histograms
1111 Double_t sigmaXdchGgemResid = (fIsExp) ? 5.54 : 1;
1112 Double_t sigmaYdchGgemResid = (fIsExp) ? 2.33 : 1;
1113 Double_t xCut = 3 * sigmaXdchGgemResid;
1114 Double_t yCut = 3 * sigmaYdchGgemResid;
1115
1116 // dch1 ~510, dch2 ~710, dchGlob ~610
1117 Double_t zDchTh1 = 550.0;
1118 Double_t zDchTh2 = 650.0;
1119
1120 Double_t minZ = 10000.0;
1121 for (Int_t iTr = 0; iTr < fDchTracks->GetEntriesFast(); ++iTr) {
1122 BmnTrack* dchTr = (BmnTrack*)fDchTracks->At(iTr);
1123 Double_t trZ = dchTr->GetParamFirst()->GetZ();
1124 Bool_t ok = kFALSE;
1125 if (trZ < zDchTh1 && num == 1)
1126 ok = kTRUE;
1127 if (trZ > zDchTh2 && num == 2)
1128 ok = kTRUE;
1129 if (!ok)
1130 continue;
1131 if (trZ < minZ)
1132 minZ = trZ;
1133 }
1134
1135 FairTrackParam parMinZ(*(tr->GetParamLast()));
1136 if (fKalman->TGeoTrackPropagate(&parMinZ, minZ, fPDG, nullptr, nullptr) == kBMNERROR)
1137 return kBMNERROR;
1138
1139 Double_t minDX = DBL_MAX;
1140 Double_t minDY = DBL_MAX;
1141 BmnTrack* minTrack = nullptr;
1142 Int_t minIdx = -1;
1143
1144 for (Int_t iTr = 0; iTr < fDchTracks->GetEntriesFast(); ++iTr) {
1145 BmnTrack* dchTr = (BmnTrack*)fDchTracks->At(iTr);
1146 if (!dchTr)
1147 continue;
1148
1149 Double_t trZ = dchTr->GetParamFirst()->GetZ();
1150
1151 Bool_t ok = kFALSE;
1152 if (trZ < zDchTh1 && num == 1)
1153 ok = kTRUE;
1154 if (trZ > zDchTh2 && num == 2)
1155 ok = kTRUE;
1156 if (!ok)
1157 continue;
1158
1159 FairTrackParam param = parMinZ;
1160 if (fKalman->TGeoTrackPropagate(&param, trZ, fPDG, nullptr, nullptr) == kBMNERROR)
1161 continue;
1162
1163 Float_t dX = param.GetX() - dchTr->GetParamFirst()->GetX();
1164 Float_t dY = param.GetY() - dchTr->GetParamFirst()->GetY();
1165
1166 if (Abs(dX) < xCut && Abs(dY) < yCut && Abs(dX) < Abs(minDX) && Abs(dY) < Abs(minDY)) {
1167 minTrack = dchTr;
1168 minIdx = iTr;
1169 minDX = dX;
1170 minDY = dY;
1171 }
1172 }
1173 if (minIdx == -1)
1174 return kBMNERROR;
1175
1176 Double_t len = 0.0;
1177 FairTrackParam par(*(tr->GetParamLast()));
1178 FairTrackParam dchPar(*(minTrack->GetParamFirst()));
1179 if (fKalman->TGeoTrackPropagate(&par, dchPar.GetZ(), fPDG, nullptr, &len) == kBMNERROR)
1180 return kBMNERROR;
1181 Double_t chi = 0;
1182 UpdateTrackParam(&par, &dchPar, chi);
1183 tr->SetChi2(tr->GetChi2() + chi);
1184 tr->SetParamLast(par);
1185 len += tr->GetLength();
1186 tr->SetNHits(tr->GetNHits() + 1);
1187 tr->SetLength(len);
1188
1189 if (num == 1) {
1190 tr->SetDch1TrackIndex(minIdx);
1191 fNMatchedDch1++;
1192 } else {
1193 tr->SetDch2TrackIndex(minIdx);
1194 fNMatchedDch2++;
1195 }
1196 return kBMNSUCCESS;
1197}
1198
1199BmnStatus BmnGlobalTracking::Refit(BmnGlobalTrack* tr)
1200{
1201
1202 if (fVerbose)
1203 cout << "REFIT started" << endl;
1204
1205 FairTrackParam parFirst = *(tr->GetParamFirst());
1206 fPDG = (parFirst.GetQp() > 0.) ? 2212 : -211;
1207 Double_t chi = 0.0;
1208 Double_t totChi2 = 0.0;
1209
1210 //================Refitting to the end of the global track===========================
1211 // if (tr->GetSilTrackIndex() != -1) {
1212 // BmnTrack* silTrack = (BmnTrack*)fSiliconTracks->At(tr->GetSilTrackIndex());
1213 // for (Int_t hitIdx = 0; hitIdx < silTrack->GetNHits(); hitIdx++) {
1214 // BmnSiliconHit* hit = (BmnSiliconHit*)fSilHits->At(silTrack->GetHitIndex(hitIdx));
1215 // if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR) return
1216 // kBMNERROR; if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR) return kBMNERROR;
1217 // }
1218 // }
1219
1220 if (fStsTracks) {
1221 CbmStsTrack* cbmTrack = (CbmStsTrack*)fStsTracks->At(tr->GetGemTrackIndex());
1222 for (Int_t hitIdx = 0; hitIdx < cbmTrack->GetNStsHits(); hitIdx++) {
1223 CbmStsHit* hit = (CbmStsHit*)fStsHits->At(cbmTrack->GetStsHitIndex(hitIdx));
1224 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1225 return kBMNERROR;
1226 if (fKalman->Update(&parFirst, (BmnHit*)hit, chi) == kBMNERROR)
1227 return kBMNERROR;
1228 }
1229 } else if (fInnerTracks) {
1230 BmnGemTrack* gemTrack = (BmnGemTrack*)fGemTracks->At(tr->GetGemTrackIndex());
1231 for (Int_t hitIdx = 0; hitIdx < gemTrack->GetNHits(); hitIdx++) {
1232 BmnGemStripHit* hit = (BmnGemStripHit*)fGemHits->At(gemTrack->GetHitIndex(hitIdx));
1233 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1234 return kBMNERROR;
1235 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1236 return kBMNERROR;
1237 }
1238 }
1239
1240 if (tr->GetCscHitIndex(0) != -1) {
1241 BmnHit* hit = (BmnHit*)fCscHits->At(tr->GetCscHitIndex(0));
1242 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1243 return kBMNERROR;
1244 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1245 return kBMNERROR;
1246 totChi2 += chi;
1247 }
1248
1249 if (tr->GetTof1HitIndex() != -1) {
1250 BmnHit* hit = (BmnHit*)fTof1Hits->At(tr->GetTof1HitIndex());
1251 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1252 return kBMNERROR;
1253 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1254 return kBMNERROR;
1255 }
1256
1257 if (tr->GetCscHitIndex(1) != -1) {
1258 BmnHit* hit = (BmnHit*)fCscHits->At(tr->GetCscHitIndex(1));
1259 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1260 return kBMNERROR;
1261 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1262 return kBMNERROR;
1263 totChi2 += chi;
1264 }
1265
1266 if (tr->GetTof2HitIndex() != -1) {
1267 BmnHit* hit = (BmnHit*)fTof2Hits->At(tr->GetTof2HitIndex());
1268 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1269 return kBMNERROR;
1270 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1271 return kBMNERROR;
1272 }
1273
1274 if (tr->GetDchTrackIndex() != -1) {
1275 BmnTrack* dchTrack = (BmnTrack*)fDchTracks->At(tr->GetDchTrackIndex());
1276 FairTrackParam dchPar(*(dchTrack->GetParamFirst()));
1277 if (fKalman->TGeoTrackPropagate(&parFirst, dchPar.GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1278 return kBMNERROR;
1279 UpdateTrackParam(&parFirst, &dchPar, chi);
1280 totChi2 += chi;
1281 }
1282
1283 if (!IsParCorrect(&parFirst))
1284 tr->SetFlag(-1);
1285 tr->SetParamLast(parFirst);
1286
1287 FairTrackParam parLast = *(tr->GetParamLast());
1288
1289 // =============Refitting to the vertex =================
1290
1291 if (tr->GetTof2HitIndex() != -1) {
1292 BmnHit* hit = (BmnHit*)fTof2Hits->At(tr->GetTof2HitIndex());
1293 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1294 return kBMNERROR;
1295 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1296 return kBMNERROR;
1297 totChi2 += chi;
1298 }
1299
1300 if (tr->GetCscHitIndex(1) != -1) {
1301 BmnHit* hit = (BmnHit*)fCscHits->At(tr->GetCscHitIndex(1));
1302 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1303 return kBMNERROR;
1304 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1305 return kBMNERROR;
1306 totChi2 += chi;
1307 }
1308
1309 if (tr->GetTof1HitIndex() != -1) {
1310 BmnHit* hit = (BmnHit*)fTof1Hits->At(tr->GetTof1HitIndex());
1311 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1312 return kBMNERROR;
1313 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1314 return kBMNERROR;
1315 totChi2 += chi;
1316 }
1317
1318 if (tr->GetCscHitIndex(0) != -1) {
1319 BmnHit* hit = (BmnHit*)fCscHits->At(tr->GetCscHitIndex(0));
1320 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1321 return kBMNERROR;
1322 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1323 return kBMNERROR;
1324 totChi2 += chi;
1325 }
1326
1327 if (fStsTracks) {
1328 CbmStsTrack* cbmTrack = (CbmStsTrack*)fStsTracks->At(tr->GetGemTrackIndex());
1329 for (Int_t hitIdx = cbmTrack->GetNStsHits() - 1; hitIdx >= 0; hitIdx--) {
1330 CbmStsHit* hit = (CbmStsHit*)fStsHits->At(cbmTrack->GetStsHitIndex(hitIdx));
1331 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1332 return kBMNERROR;
1333 if (fKalman->Update(&parFirst, (BmnHit*)hit, chi) == kBMNERROR)
1334 return kBMNERROR;
1335 totChi2 += chi;
1336 }
1337 } else if (fInnerTracks) {
1338 BmnGemTrack* gemTrack = (BmnGemTrack*)fGemTracks->At(tr->GetGemTrackIndex());
1339 for (Int_t hitIdx = gemTrack->GetNHits() - 1; hitIdx >= 0; hitIdx--) {
1340 BmnGemStripHit* hit = (BmnGemStripHit*)fGemHits->At(gemTrack->GetHitIndex(hitIdx));
1341 if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR)
1342 return kBMNERROR;
1343 if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR)
1344 return kBMNERROR;
1345 totChi2 += chi;
1346 }
1347 }
1348
1349 // if (tr->GetSilTrackIndex() != -1) {
1350 // BmnTrack* silTrack = (BmnTrack*)fSiliconTracks->At(tr->GetSilTrackIndex());
1351 // for (Int_t hitIdx = silTrack->GetNHits() - 1; hitIdx >= 0; hitIdx--) {
1352 // BmnSiliconHit* hit = (BmnSiliconHit*)fSilHits->At(silTrack->GetHitIndex(hitIdx));
1353 // if (fKalman->TGeoTrackPropagate(&parFirst, hit->GetZ(), fPDG, nullptr, nullptr) == kBMNERROR) return
1354 // kBMNERROR; if (fKalman->Update(&parFirst, hit, chi) == kBMNERROR) return kBMNERROR; totChi2 += chi;
1355 // }
1356 // }
1357
1358 // if (tr->GetUpstreamTrackIndex() != -1) {
1359 // BmnTrack* upsTrack = (BmnTrack*)fUpstreamTracks->At(tr->GetUpstreamTrackIndex());
1360 // FairTrackParam upsPar(*(upsTrack->GetParamLast()));
1361 // if (fKalman->TGeoTrackPropagate(&parFirst, upsPar.GetZ(), fPDG, nullptr, nullptr) == kBMNERROR) return
1362 // kBMNERROR; UpdateTrackParam(&parFirst, &upsPar, chi); totChi2 += chi;
1363 // }
1364
1365 TVector3 pos;
1366 if (fVertexL1) {
1367 pos = TVector3(fVertexL1->GetX(), fVertexL1->GetY(), fVertexL1->GetZ());
1368 } else {
1369 pos = TVector3(0.0, 0.0, 0.0);
1370 }
1371 TVector3 dpos = TVector3(0.05, 0.05, 0.0);
1372 if (fKalman->TGeoTrackPropagate(&parFirst, pos.z(), fPDG, nullptr, nullptr) == kBMNERROR)
1373 return kBMNERROR;
1374 // update in virtual vertex hit
1375 BmnHit* vertexHit = new BmnHit(0, pos, dpos, -1);
1376 // printf("BEFORE\n"); parFirst.Print();
1377 if (fKalman->Update(&parFirst, vertexHit, chi) == kBMNERROR)
1378 return kBMNERROR;
1379 // printf("AFTER\n"); parFirst.Print();
1380 // printf("chiInVertex = %f\n", chi);
1381 tr->SetChi2InVertex(chi);
1382
1383 if (!IsParCorrect(&parFirst))
1384 tr->SetFlag(-1);
1385 tr->SetChi2(totChi2);
1386 tr->SetParamFirst(parFirst);
1387
1388 return kBMNSUCCESS;
1389}
1390
1391BmnStatus BmnGlobalTracking::UpdateMomentum(BmnGlobalTrack* tr)
1392{
1393 FairTrackParam par = *(tr->GetParamFirst());
1394 Int_t pdg = (par.GetQp() > 0) ? 2212 : -211;
1395 fKalman->TGeoTrackPropagate(&par, -200, pdg, nullptr, nullptr);
1396 Double_t Alpha_in = ATan(par.GetTx());
1397 // Double_t Bdl = 2.856; //Abs(MagFieldIntegral(par, -200.0, 1000.0, 1.0) * 0.001);
1398 Double_t Bdl = Abs(MagFieldIntegral(par, -200.0, 600.0, 1.0) * 0.001);
1399 fKalman->TGeoTrackPropagate(&par, 600, pdg, nullptr, nullptr);
1400 Double_t Alpha_out = ATan(par.GetTx());
1401 if (tr->GetDchTrackIndex() != -1) {
1402 BmnTrack* matchedDch = (BmnTrack*)fDchTracks->At(tr->GetDchTrackIndex());
1403 Alpha_out = ATan(matchedDch->GetParamFirst()->GetTx());
1404 }
1405 // if (tr->GetUpstreamTrackIndex() != -1) {
1406 // BmnTrack* upTrack = (BmnTrack*)fUpstreamTracks->At(tr->GetUpstreamTrackIndex());
1407 // if (upTrack != nullptr)
1408 // Alpha_in = ATan(upTrack->GetParamLast()->GetTx());
1409 // }
1410 Double_t momInt = 0.3 * Bdl / (Sin(Alpha_out) - Sin(Alpha_in));
1411 // Double_t momInt = 0.3 * Bdl / (Alpha_out - Alpha_in);
1412 if (!IsNaN(momInt) && Abs(momInt) > 0.01 && Abs(momInt) < 100) {
1413 tr->GetParamFirst()->SetQp(1.0 / momInt);
1414 }
1415 // cout << Alpha_in << " " << Alpha_out << " " << Bdl << " " << momInt << endl;
1416
1417 return kBMNSUCCESS;
1418}
1419
1421{
1422 delete fKalman;
1423 printf("Work time of BmnGlobalTracking: %4.2f sec.\n", fTime);
1424 PrintStatistics();
1425}
1426
1427Double_t BmnGlobalTracking::MagFieldIntegral(FairTrackParam& par, Double_t zMin, Double_t zMax, Double_t step)
1428{
1429 /*
1430 field in kG
1431 step in cm
1432 */
1433 Int_t pdg = (par.GetQp() > 0.) ? 2212 : -211;
1434 FairField* field = FairRunAna::Instance()->GetField();
1435 fKalman->TGeoTrackPropagate(&par, zMin, pdg, NULL, NULL, kTRUE);
1436 Double_t z = par.GetZ();
1437 Double_t integral = 0.0;
1438 while (z < zMax) {
1439 z += step;
1440 fKalman->TGeoTrackPropagate(&par, z, pdg, NULL, NULL, kTRUE);
1441 integral += field->GetBy(par.GetX(), par.GetY(), par.GetZ());
1442 }
1443 integral *= step;
1444 return integral;
1445}
1446
1447void BmnGlobalTracking::PrintStatistics()
1448{
1449 printf("================================================================================\n");
1450 printf("======= Statistics of Global tracking\n");
1451 printf("======= Number of input inner tracks: %ld\n", fNInnerTracks);
1452 printf("======= Number of input inner tracks with 4+ hits extrapolated to the Vertex: %ld (%4.1f%%)\n",
1453 fNGoodInnerTracks, fNGoodInnerTracks * 100.0 / fNInnerTracks);
1454 printf("======= Number of tracks matched with near CSC: %ld\n", fNMatchedNearCsc);
1455 printf("======= Number of tracks matched with TOF-400: %ld\n", fNMatchedTof400);
1456 printf("======= Number of tracks matched with far CSC: %ld\n", fNMatchedFarCsc);
1457 printf("======= Number of tracks matched with DCH-1: %ld\n", fNMatchedDch1);
1458 printf("======= Number of tracks matched with TOF-700: %ld\n", fNMatchedTof700);
1459 printf("======= Number of tracks matched with DCH-2: %ld\n", fNMatchedDch2);
1460 printf("======= Number of refitted output tracks: %ld (%4.1f%%)\n", fNGoodGlobalTracks,
1461 fNGoodGlobalTracks * 100.0 / fNInnerTracks);
1462 printf("================================================================================\n");
1463}
1464
1465void BmnGlobalTracking::OnlineWrite(const std::unique_ptr<TTree>& resultTree)
1466{
1467 if (!IsActive())
1468 return;
1469
1470 resultTree->Branch("BmnDchHit", &fDchHits);
1471 if (fStsTracks) {
1472 resultTree->Branch("BmnGlobalTrack", &fGlobalTracks);
1473 }
1474 resultTree->Fill();
1475}
void UpdateTrackParam(FairTrackParam *initPar, const FairTrackParam *detPar, Double_t &chiSq)
Definition BmnMath.cxx:1048
vector< Double_t > dist(vector< Double_t > qp, Double_t mu)
Definition BmnMath.cxx:869
Bool_t IsParCorrect(const FairTrackParam *par, const Bool_t isField)
Definition BmnMath.cxx:59
int i
Definition P4_F32vec4.h:22
@ kGEM
BmnStatus
Definition BmnEnums.h:24
@ kBMNERROR
Definition BmnEnums.h:26
@ kBMNSUCCESS
Definition BmnEnums.h:25
Int_t GetPointModuleOwnership(Double_t xcoord, Double_t ycoord, Double_t zcoord)
void SetChi2InVertex(Double_t chi)
void SetScWallSignal(Double_t sig)
void SetGemTrackIndex(Int_t iGem)
void SetZ(Int_t z)
void AddCscHitIndex(Int_t i, Int_t iCsc)
Int_t GetTof2HitIndex() const
Int_t GetDchTrackIndex() const
void SetDch1TrackIndex(Int_t iDch1Track)
void SetTof2HitIndex(Int_t iTof2Hit)
void SetDchTrackIndex(Int_t iDch)
Int_t GetCscHitIndex(Int_t idx) const
void SetDCAInVertex(Double_t chi)
Int_t GetGemTrackIndex() const
void SetBeta(Double_t b, Int_t tofID)
Int_t GetTof1HitIndex() const
void SetdQdNLower(Double_t q)
void SetDch2TrackIndex(Int_t iDch2Track)
void SetScWallCellId(Int_t iScWall)
void SetTof1HitIndex(Int_t iTof1Hit)
BmnGlobalTracking()
Constructor.
virtual ~BmnGlobalTracking()
Destructor.
virtual void Exec(Option_t *opt)
Inherited from FairTask.
virtual void OnlineWrite(const std::unique_ptr< TTree > &resultTree)
Write task resul to tree.
virtual InitStatus Init()
Inherited from FairTask.
virtual void Finish()
Inherited from FairTask.
void SetModule(Int_t mod)
Definition BmnHit.h:73
void SetLength(Double_t len)
Definition BmnHit.h:61
Int_t GetModule()
Definition BmnHit.h:77
void SetUsing(Bool_t use)
Definition BmnHit.h:53
Bool_t IsUsed() const
Definition BmnHit.h:29
void SetResXY(Double_t resX, Double_t resY)
Definition BmnHit.h:93
Short_t GetStation() const
Definition BmnHit.h:45
BmnStatus TGeoTrackPropagate(FairTrackParam *par, Double_t zOut, Int_t pdg, vector< Double_t > *F, Double_t *length, Bool_t isField)
BmnStatus Update(FairTrackParam *par, const BmnHit *hit, Double_t &chiSq)
Class for Bmn ScWall module data container in event.
float GetSignal() const
Deposited Signal.
Class for Bmn ScWall data container in event.
BmnScWallCell * GetCell(uint8_t cell_id)
Cell info.
void SetChi2(Double_t chi2)
Definition BmnTrack.h:97
Float_t GetLength() const
Definition BmnTrack.h:68
void SetParamLast(FairTrackParam &par)
Definition BmnTrack.h:89
void SetFlag(Int_t flag)
Definition BmnTrack.h:93
FairTrackParam * GetParamFirst()
Definition BmnTrack.h:72
Float_t GetChi2() const
Definition BmnTrack.h:56
Int_t GetNHits() const
Definition BmnTrack.h:44
Int_t GetHitIndex(Int_t iHit) const
Definition BmnTrack.h:48
Double_t GetP()
Definition BmnTrack.h:80
void SetNHits(Int_t n)
Definition BmnTrack.h:105
void SetParamFirst(FairTrackParam &par)
Definition BmnTrack.h:85
FairTrackParam * GetParamLast()
Definition BmnTrack.h:76
void SetLength(Double_t length)
Definition BmnTrack.h:113
void SetNDF(Int_t ndf)
Definition BmnTrack.h:101
virtual Int_t GetStationNr() const
Definition CbmStsHit.h:66
Int_t GetSystemId() const
Definition CbmStsHit.h:64
Int_t fDigiF
Definition CbmStsHit.h:92
FairTrackParam * GetParamLast()
Definition CbmStsTrack.h:70
Int_t GetNStsHits() const
Definition CbmStsTrack.h:60
Double_t GetChi2() const
Definition CbmStsTrack.h:66
Int_t GetStsHitIndex(Int_t iHit) const
Definition CbmStsTrack.h:62
FairTrackParam * GetParamFirst()
Definition CbmStsTrack.h:69
Int_t GetNDF() const
Definition CbmStsTrack.h:67
Double_t GetZ() const
Definition CbmVertex.h:60
Double_t GetX() const
Definition CbmVertex.h:58
Int_t GetNTracks() const
Definition CbmVertex.h:63
Double_t GetCovariance(Int_t i, Int_t j) const
Double_t GetY() const
Definition CbmVertex.h:59
Double_t TotalSignal