BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnCellAutoTracking.cxx
Go to the documentation of this file.
2
3#include "BmnCellDuet.h"
4#include "BmnGemStripHit.h"
5#include "BmnKalmanFilter.h"
6#include "BmnMath.h"
7#include "FairRunAna.h"
8#include "FairTrackParam.h"
9#include "TStyle.h"
10
11#include <TCanvas.h>
12#include <TH2F.h>
13#include <TLine.h>
14#include <TMath.h>
15#include <map>
16#include <vector>
17#if defined(_OPENMP)
18#include "omp.h"
19#endif
20
21// Defines GCC_DIAGNOSTIC_AWARE if GCC 4.7 or above
22#define GCC_DIAGNOSTIC_AWARE 1
23#if GCC_DIAGNOSTIC_AWARE
24#pragma GCC diagnostic ignored "-Wunknown-pragmas"
25#endif
26
27//-----------------------------------------
28static Double_t workTime = 0.0;
29static Double_t createTime = 0.0;
30static Double_t stateTime = 0.0;
31static Double_t connectTime = 0.0;
32static Double_t sortTime = 0.0;
33static Double_t selectTime = 0.0;
34//-----------------------------------------
35
36using namespace std;
37using namespace TMath;
38
40 : fSteerFile(steerFile)
41 , fSteering(nullptr)
42{
46 // Deciding whether we are getting MC ...
47 if (run < 0) {
48 // MC-input given
49 if (run < -2)
50 Fatal("BmnCellAutoTracking()",
51 "Probably, run number has been changed manually in reco macro. Aborting ...");
52
53 // After the first decision made, we are selecting setup used in when preparing the MC-input
54 // When processing MC-input
55 // -2 means use of the SRC-setup
56 // -1 means use of the BM@N-setup
57 isSRC = (run == -2) ? kTRUE : kFALSE;
58 }
59 // Define a setup to be used by comparing with current runID, exp. data input given
60 else
61 {
62 const Int_t runTransition = 3589; // FIXME!
63 isSRC = (run < runTransition) ? kTRUE : kFALSE;
64 }
65
66 TString setup = isSRC ? "SRC" : "BMN";
67 if (steerFile == "")
68 fSteering = new BmnSteering(field ? TString(setup + "_run7_withField.dat")
69 : TString(setup + "_run7_noField.dat")); // FIXME (should be got from UniDb)
70 else
72 fPeriodId = period;
73 fEventNo = 0;
74 fIsField = field;
75 fIsTarget = target;
77 fGemHitsArray = nullptr;
78 fSilHitsArray = nullptr;
79 fSsdHitsArray = nullptr;
80 fHitsArray = nullptr;
81 fRoughVertex = (fPeriodId == 7) ? TVector3(0.5, -4.6, -2.3)
82 : (fPeriodId == 6) ? TVector3(0.0, -3.5, -21.9)
83 : TVector3(0.0, 0.0, 0.0);
85 fGlobTracksArray = nullptr;
86 fGemTracksArray = nullptr;
87 fSilTracksArray = nullptr;
88 fSsdTracksArray = nullptr;
89 fField = nullptr;
90 fGemHitsBranchName = "BmnGemStripHit";
91 fSilHitsBranchName = "BmnSiliconHit";
92 fSsdHitsBranchName = "BmnSSDHit";
93 fGlobTracksBranchName = "BmnGlobalTrack";
94 fGemTracksBranchName = "BmnGemTrack";
95 fSilTracksBranchName = "BmnSiliconTrack";
96 fSsdTracksBranchName = "BmnSSDTrack";
97 fNStations = fSteering->GetNStations();
98 fGemDetector = nullptr;
99 fSilDetector = nullptr;
100 fCellDistCut = nullptr;
101 fCellSlopeXZCutMin = nullptr;
102 fCellSlopeXZCutMax = nullptr;
103 fCellSlopeYZCutMin = nullptr;
104 fCellSlopeYZCutMax = nullptr;
105 fHitXCutMin = nullptr;
106 fHitXCutMax = nullptr;
107 fHitYCutMin = nullptr;
108 fHitYCutMax = nullptr;
109 fCellDiffSlopeXZCut = nullptr;
110 fCellDiffSlopeYZCut = nullptr;
111 fNHitsCut = 0.0;
112 kCellsCut = 10000000000; // fSteering->GetNCellsCut();
113 if (fVerbose > 1)
114 fSteering->PrintParamTable();
115}
116
118{
119 delete fKalman;
121 delete fGemDetector;
123 delete fSilDetector;
124 delete fCellDistCut;
125 delete fHitXCutMin;
126 delete fHitXCutMax;
127 delete fHitYCutMin;
128 delete fHitYCutMax;
129 delete fCellSlopeXZCutMin;
130 delete fCellSlopeXZCutMax;
131 delete fCellSlopeYZCutMin;
132 delete fCellSlopeYZCutMax;
133 delete fCellDiffSlopeXZCut;
134 delete fCellDiffSlopeYZCut;
135}
136
138{
139 if (fVerbose > 1)
140 cout << "======================== GEM tracking init started ====================" << endl;
141
142 // Get ROOT Manager
143 FairRootManager* ioman = FairRootManager::Instance();
144 if (!ioman)
145 Fatal("Init", "FairRootManager is not instantiated");
146
147 // MC tracks for drawing during debugging
148 fMCTracksArray = (TClonesArray*)ioman->GetObject("MCTrack"); // in
149
150 // GEM
152 fGemPointsArray = (TClonesArray*)ioman->GetObject("StsPoint"); // in
153 fGemHitsArray = (TClonesArray*)ioman->GetObject(fGemHitsBranchName); // in
154 fGemTracksArray = new TClonesArray("BmnTrack", 100); // out
155 ioman->Register(fGemTracksBranchName, "GEM", fGemTracksArray, kTRUE);
156 }
157
158 // SILICON
160 fSilPointsArray = (TClonesArray*)ioman->GetObject("SiliconPoint"); // in
161 fSilHitsArray = (TClonesArray*)ioman->GetObject(fSilHitsBranchName); // in
162 fSilTracksArray = new TClonesArray("BmnTrack", 100); // out
163 ioman->Register(fSilTracksBranchName, "SILICON", fSilTracksArray, kTRUE);
164 }
165
166 // SSD
168 fSsdPointsArray = (TClonesArray*)ioman->GetObject("SSDPoint"); // in
169 fSsdHitsArray = (TClonesArray*)ioman->GetObject(fSsdHitsBranchName); // in
170 fSsdTracksArray = new TClonesArray("BmnTrack", 100); // out
171 ioman->Register(fSsdTracksBranchName, "SSD", fSsdTracksArray, kTRUE);
172 }
173
175 cout << "BmnCellAutoTracking::Init(): branch " << fGemHitsBranchName << " not found! Task will be deactivated"
176 << endl;
177 SetActive(kFALSE);
178 return kERROR;
179 }
180
181 fGlobTracksArray = new TClonesArray("BmnGlobalTrack", 100); // out
182 ioman->Register(fGlobTracksBranchName, "GLOBAL", fGlobTracksArray, kTRUE);
183 fHitsArray = new TClonesArray("BmnHit", 100); // out
184 ioman->Register("BmnInnerHits", "HITS", fHitsArray, kTRUE);
185
186 fField = FairRunAna::Instance()->GetField();
187 if (!fField)
188 Fatal("Init", "No Magnetic Field found");
189
190 TString gPathConfig = gSystem->Getenv("VMCWORKDIR");
191
193 TString gPathGemConfig = gPathConfig + "/parameters/gem/XMLConfigs/";
194 TString confGem = (fPeriodId == 7) ? "GemRun" + TString(isSRC ? "SRC" : "") + "Spring2018.xml"
195 : (fPeriodId == 6) ? "GemRunSpring2017.xml"
196 : "GemRunSpring2017.xml";
197 fGemDetector = new BmnGemStripStationSet(gPathGemConfig + confGem);
198 }
199
201 TString gPathSiConfig = gPathConfig + "/parameters/silicon/XMLConfigs/";
202 TString confSi = (fPeriodId == 7) ? "SiliconRun" + TString(isSRC ? "SRC" : "") + "Spring2018.xml"
203 : "SiliconRunSpring2017.xml";
204 fSilDetector = new BmnSiliconStationSet(gPathSiConfig + confSi);
205 }
206 Int_t nGemStations = (fInnerTrackerSetup[kGEM]) ? fGemDetector->GetNStations() : 0;
207 Int_t nSilStations = (fInnerTrackerSetup[kSILICON]) ? fSilDetector->GetNStations() : 0;
208 Int_t nSsdStations = (fInnerTrackerSetup[kSSD]) ? 4 : 0;
209
210 if (isSRC)
211 nGemStations -= 4;
212
213 fNStations = nGemStations + nSilStations + nSsdStations;
214
226
227 if (fVerbose > 1)
228 cout << "======================== GEM tracking init finished ===================" << endl;
229
230 return kSUCCESS;
231}
232
234{
235 if (fVerbose > 1)
236 cout << "\n======================== GEM tracking exec started ====================" << endl;
237 if (fVerbose > 1)
238 cout << "\n Event number: " << fEventNo << endl;
239
240 if (!IsActive())
241 return;
242
243 clock_t tStart = clock();
244
246 fSilTracksArray->Delete();
248 fSsdTracksArray->Delete();
250 fGemTracksArray->Delete();
251 fGlobTracksArray->Delete();
252 fHitsArray->Delete();
253
254 fEventNo++;
255
256 Int_t nHitsCut = fSteering->GetNHitsCutTotal();
257
258 Int_t nSilStations = (fInnerTrackerSetup[kSILICON]) ? fSilDetector->GetNStations() : 0;
259 Int_t nSsdStations = (fInnerTrackerSetup[kSSD]) ? 4 : 0;
260
262 for (Int_t iHit = 0; iHit < fSilHitsArray->GetEntriesFast(); ++iHit) {
263 BmnHit hit = *((BmnHit*)fSilHitsArray->At(iHit));
264 hit.SetIndex(iHit);
265 hit.SetDetId(kSILICON);
266 new ((*fHitsArray)[fHitsArray->GetEntriesFast()]) BmnHit(hit);
267 }
268 }
270 for (Int_t iHit = 0; iHit < fSsdHitsArray->GetEntriesFast(); ++iHit) {
271 BmnHit hit = *((BmnHit*)fSsdHitsArray->At(iHit));
272 hit.SetStation(hit.GetStation() + nSilStations);
273 hit.SetIndex(iHit);
274 hit.SetDetId(kSSD);
275 new ((*fHitsArray)[fHitsArray->GetEntriesFast()]) BmnHit(hit);
276 }
277 }
279 for (Int_t iHit = 0; iHit < fGemHitsArray->GetEntriesFast(); ++iHit) {
280 BmnHit hit = *((BmnHit*)fGemHitsArray->At(iHit));
281 hit.SetStation(hit.GetStation() + (isSRC ? -4 : 0) + nSilStations
282 + nSsdStations); // shift for correct station numbering
283 hit.SetIndex(iHit);
284 hit.SetDetId(kGEM);
285 new ((*fHitsArray)[fHitsArray->GetEntriesFast()]) BmnHit(hit);
286 }
287 }
288
289 if (fHitsArray->GetEntriesFast() > nHitsCut || fHitsArray->GetEntriesFast() == 0)
290 return;
291
292 for (Int_t iStat = 0; iStat < fNStations; iStat++) {
293 fHitXCutMin[iStat] = fSteering->GetHitXCutMin()[iStat];
294 fHitXCutMax[iStat] = fSteering->GetHitXCutMax()[iStat];
295 fHitYCutMin[iStat] = fSteering->GetHitYCutMin()[iStat];
296 fHitYCutMax[iStat] = fSteering->GetHitYCutMax()[iStat];
297 fCellSlopeXZCutMin[iStat] = fSteering->GetCellSlopeXZCutMin()[iStat];
298 fCellSlopeXZCutMax[iStat] = fSteering->GetCellSlopeXZCutMax()[iStat];
299 fCellSlopeYZCutMin[iStat] = fSteering->GetCellSlopeYZCutMin()[iStat];
300 fCellSlopeYZCutMax[iStat] = fSteering->GetCellSlopeYZCutMax()[iStat];
301 }
302
303 fNHitsCut = fSteering->GetNHitsCut();
304
305 vector<BmnTrack> candidates;
306 vector<BmnTrack> sortedCandidates;
307
308 Double_t diffSlopeXZ0 = fSteering->GetDiffSlopeXZ0();
309 Double_t diffSlopeYZ0 = fSteering->GetDiffSlopeYZ0();
310 Double_t diffSlopeXZSlope = fSteering->GetDiffSlopeXZSlope();
311 Double_t diffSlopeYZSlope = fSteering->GetDiffSlopeYZSlope();
312 fChiSquareCut = fSteering->GetChiSquareCut();
313
314 const Int_t nIter = fSteering->GetNIter();
315
316 for (Int_t iter = 0; iter < nIter; ++iter) {
317 vector<BmnCellDuet> cells[fNStations];
318
319 for (Int_t iSt = 0; iSt < fNStations; ++iSt) {
320 fCellDiffSlopeXZCut[iSt] = diffSlopeXZ0 + iter * diffSlopeXZSlope;
321 fCellDiffSlopeYZCut[iSt] = diffSlopeYZ0 + iter * diffSlopeYZSlope;
322 }
323
324 clock_t t0 = clock();
325 CellsCreation(cells);
326 clock_t t1 = clock();
327 // StateCalculation(cells);
328 clock_t t2 = clock();
329 vector<BmnTrack> tmpVec = CellsConnection(cells);
330 for (BmnTrack tr : tmpVec)
331 candidates.push_back(tr);
332 clock_t t3 = clock();
333 if (fIsField)
334 TrackUpdateByKalman(candidates);
335 else
336 TrackUpdateByLine(candidates);
337 clock_t t4 = clock();
338
339 createTime += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
340 stateTime += ((Double_t)(t2 - t1)) / CLOCKS_PER_SEC;
341 connectTime += ((Double_t)(t3 - t2)) / CLOCKS_PER_SEC;
342 sortTime += ((Double_t)(t4 - t3)) / CLOCKS_PER_SEC;
343 }
344
345 clock_t t5 = clock();
346 SortTracks(candidates, sortedCandidates);
347 TrackSelection(sortedCandidates);
348 clock_t t6 = clock();
349 selectTime += ((Double_t)(t6 - t5)) / CLOCKS_PER_SEC;
350 // DrawHits();
351
352 clock_t tFinish = clock();
353 if (fVerbose > 0)
354 cout << "BmnCellAutoTracking: " << fGlobTracksArray->GetEntriesFast() << " tracks" << endl;
355
356 workTime += ((Double_t)(tFinish - tStart)) / CLOCKS_PER_SEC;
357
358 if (fVerbose > 1)
359 cout << "\n======================== GEM tracking exec finished ===================" << endl;
360}
361
362BmnStatus BmnCellAutoTracking::SortTracks(vector<BmnTrack>& inTracks, vector<BmnTrack>& sortedTracks)
363{
364 const Int_t n = fNStations - fNHitsCut + 1; // 6 for geometry 2018 (4, 5, 6, 7, 8, 9)
365 multimap<Float_t, Int_t> sortedMap[n]; // array of map<Chi2,trIdx>. Each element of array corresponds fixed number
366 // of hits on track (4, 5, 6)
367 for (size_t iTr = 0; iTr < inTracks.size(); ++iTr) {
368 if (inTracks.at(iTr).GetNHits() < fNHitsCut)
369 continue;
370 if (inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF() > fChiSquareCut)
371 continue;
372 sortedMap[inTracks.at(iTr).GetNHits() - fNHitsCut].insert(
373 pair<Float_t, Int_t>(inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF(), iTr));
374 }
375
376 for (Int_t i = n - 1; i >= 0; i--) {
377 for (auto it : sortedMap[i])
378 sortedTracks.push_back(inTracks.at(it.second));
379 sortedMap[i].clear();
380 }
381
382 // multimap <Float_t, Int_t> sortedTracksMap; //map<Chi2,trIdx>
383 // for (Int_t iTr = 0; iTr < inTracks.size(); ++iTr)
384 // sortedTracksMap.insert(pair<Float_t, Int_t>(inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF(), iTr));
385 //
386 // for (auto it : sortedTracksMap)
387 // sortedTracks.push_back(inTracks.at(it.second));
388
389 return kBMNSUCCESS;
390}
391
393{
394 ofstream outFile;
395 outFile.open("QA/timing.txt");
396 outFile << "Track Finder Time: " << workTime << endl;
397 if (fVerbose > 0) {
398 cout << "Cells creation time: " << createTime << endl;
399 cout << "States calculation time: " << stateTime << endl;
400 cout << "Cells connection time: " << connectTime << endl;
401 cout << "Tracks sorting time: " << sortTime << endl;
402 cout << "Tracks selection time: " << selectTime << endl;
403 }
404 cout << "Work time of the GEM tracking: " << workTime << endl;
405}
406
408{
409 vector<Int_t> hitsOnStation[fNStations];
410
411 for (Int_t iHit = 0; iHit < fHitsArray->GetEntriesFast(); ++iHit) {
412 BmnHit* hit = (BmnHit*)fHitsArray->At(iHit);
413 if (!hit)
414 continue;
415 if (hit->IsUsed())
416 continue;
417 Int_t station = hit->GetStation();
418 if (hit->GetX() > fHitXCutMax[station] || hit->GetX() < fHitXCutMin[station])
419 continue;
420 if (hit->GetY() > fHitYCutMax[station] || hit->GetY() < fHitYCutMin[station])
421 continue;
422 hitsOnStation[station].push_back(iHit);
423 }
424
425 // loop for virtual duets
426 for (size_t iHit = 0; iHit < hitsOnStation[0].size(); ++iHit) {
427 BmnHit* hit = (BmnHit*)fHitsArray->At(hitsOnStation[0].at(iHit));
428
429 Double_t x0 = fRoughVertex.X();
430 Double_t y0 = fRoughVertex.Y();
431 Double_t z0 = fRoughVertex.Z();
432 Double_t x1 = hit->GetX();
433 Double_t y1 = hit->GetY();
434 Double_t z1 = hit->GetZ();
435 Double_t slopeXZ = (x1 - x0) / (z1 - z0);
436 if (slopeXZ > fCellSlopeXZCutMax[0] || slopeXZ < fCellSlopeXZCutMin[0])
437 continue;
438 Double_t slopeYZ = (y1 - y0) / (z1 - z0);
439 if (slopeYZ > fCellSlopeYZCutMax[0] || slopeYZ < fCellSlopeYZCutMin[0])
440 continue;
441 BmnCellDuet duetVirt;
442 duetVirt.SetFirstIdx(-1);
443 duetVirt.SetLastIdx(hitsOnStation[0].at(iHit));
444 duetVirt.SetSlopeXZ(slopeXZ);
445 duetVirt.SetSlopeYZ(slopeYZ);
446 duetVirt.SetNewState(0);
447 duetVirt.SetOldState(0);
448 duetVirt.SetStartPlane(-1);
449 duetVirt.SetUsing(kFALSE);
450 cells[0].push_back(duetVirt);
451 }
452
453 for (Int_t iSt = 1; iSt < fNStations; ++iSt)
454 for (size_t iHit0 = 0; iHit0 < hitsOnStation[iSt - 1].size(); ++iHit0) {
455 BmnHit* hit0 = (BmnHit*)fHitsArray->At(hitsOnStation[iSt - 1].at(iHit0));
456 Double_t x0 = hit0->GetX();
457 Double_t y0 = hit0->GetY();
458 Double_t z0 = hit0->GetZ();
459 for (size_t iHit1 = 0; iHit1 < hitsOnStation[iSt].size(); ++iHit1) {
460 BmnHit* hit1 = (BmnHit*)fHitsArray->At(hitsOnStation[iSt].at(iHit1));
461 Double_t x1 = hit1->GetX();
462 Double_t y1 = hit1->GetY();
463 Double_t z1 = hit1->GetZ();
464 Double_t slopeXZ = (x1 - x0) / (z1 - z0);
465 if (slopeXZ > fCellSlopeXZCutMax[iSt] || slopeXZ < fCellSlopeXZCutMin[iSt])
466 continue;
467 Double_t slopeYZ = (y1 - y0) / (z1 - z0);
468 if (slopeYZ > fCellSlopeYZCutMax[iSt] || slopeYZ < fCellSlopeYZCutMin[iSt])
469 continue;
470
471 BmnCellDuet duet;
472 duet.SetFirstIdx(hitsOnStation[iSt - 1].at(iHit0));
473 duet.SetLastIdx(hitsOnStation[iSt].at(iHit1));
474 duet.SetSlopeYZ(slopeYZ);
475 duet.SetSlopeXZ(slopeXZ);
476 duet.SetNewState(0);
477 duet.SetOldState(0);
478 duet.SetStartPlane(iSt - 1);
479 duet.SetUsing(kFALSE);
480 cells[iSt].push_back(duet);
481 }
482 }
483
484 return kBMNSUCCESS;
485}
486
488{
489 for (Int_t iStartCell = 1; iStartCell < fNStations; ++iStartCell) {
490 for (Int_t iCell = iStartCell; iCell < fNStations; ++iCell) {
491 if (cells[iCell].size() > 10000)
492 continue;
493 for (BmnCellDuet& duet : cells[iCell]) {
494 Int_t idx = duet.GetFirstIdx();
495 Int_t state = duet.GetOldState();
496 for (BmnCellDuet leftNeigh : cells[iCell - 1]) {
497 if (state != leftNeigh.GetOldState())
498 continue;
499 if (idx != leftNeigh.GetLastIdx())
500 continue;
501 // FIXME!!!
502 // if (Abs(duet.GetSlopeXZ() - leftNeigh.GetSlopeXZ()) >
503 // fCellDiffSlopeXZCut[iCell - 1]) continue;
504 // if (Abs(duet.GetSlopeYZ() - leftNeigh.GetSlopeYZ()) >
505 // fCellDiffSlopeYZCut[iCell - 1]) continue;
506
507 duet.SetNewState(duet.GetOldState() + 1);
508 break;
509 }
510 }
511 }
512 for (Int_t iCell = iStartCell; iCell < fNStations; ++iCell)
513 for (BmnCellDuet& it : cells[iCell])
514 it.SetOldState(it.GetNewState());
515 }
516 // for (Int_t iCell = 0; iCell < fNStations; ++iCell) {
517 // for (BmnCellDuet &it : cells[iCell]) {
518 // printf("state[%d] = %d\n", iCell, it.GetOldState());
519 // }
520 // }
521
522 return kBMNSUCCESS;
523}
524
525vector<BmnTrack> BmnCellAutoTracking::CellsConnection(vector<BmnCellDuet>* cells)
526{
527 vector<BmnTrack> cands;
528 Int_t nThreads = 1;
529#if defined(_OPENMP)
530 nThreads = 2;
531 // omp_set_dynamic(0);
532 omp_set_num_threads(nThreads);
533#endif
534 vector<vector<BmnTrack>> candsThread(nThreads);
535 for (Int_t maxCell = fNStations - 1; maxCell > 0; maxCell--) {
536 BmnCellDuet curDuet;
537 if (cells[maxCell].size() > kCellsCut)
538 continue;
539
540#pragma omp parallel firstprivate(curDuet)
541 // if(cells[maxCell].size() > 20)
542 {
543#pragma omp for
544 // for (BmnCellDuet& duet : cells[maxCell]) {
545 for (size_t i = 0; i < cells[maxCell].size(); ++i) {
546 BmnCellDuet duet = cells[maxCell].at(i);
547 // if (duet.GetOldState() != maxCell) continue; //FIXME: do we need this condition???
548 BmnTrack trackCand;
549 if (duet.GetFirstIdx() == -1)
550 continue; // skip virtual duet
551 trackCand.AddHit(duet.GetFirstIdx(), (BmnHit*)fHitsArray->At(duet.GetFirstIdx()));
552 trackCand.AddHit(duet.GetLastIdx(), (BmnHit*)fHitsArray->At(duet.GetLastIdx()));
553 trackCand.SortHits();
554 curDuet = duet;
555 for (Int_t iCellLeft = maxCell - 1; iCellLeft >= 0; iCellLeft--) {
556 BmnCellDuet* minLeft = nullptr;
557 Double_t minSlopeDiff = 1e10;
558 for (BmnCellDuet& itLeft : cells[iCellLeft]) {
559 // if (itLeft.GetOldState() != iCellLeft) continue; //FIXME! Maybe it is better not to use this
560 // cut?
561 if (curDuet.GetFirstIdx() != itLeft.GetLastIdx())
562 continue;
563 Double_t slopeDiffYZ = Abs(curDuet.GetSlopeYZ() - itLeft.GetSlopeYZ());
564 Double_t slopeDiffXZ = Abs(curDuet.GetSlopeXZ() - itLeft.GetSlopeXZ());
565 if (slopeDiffYZ < minSlopeDiff && slopeDiffYZ < fCellDiffSlopeYZCut[iCellLeft]
566 && slopeDiffXZ < fCellDiffSlopeXZCut[iCellLeft])
567 { // FIXME!!! which slope to use???
568 minSlopeDiff = slopeDiffYZ;
569 minLeft = &itLeft;
570 }
571 }
572 if (minLeft != nullptr) {
573 if (minLeft->GetFirstIdx() == -1)
574 continue; // skip virtual duet
575 trackCand.AddHit(minLeft->GetFirstIdx(), (BmnHit*)fHitsArray->At(minLeft->GetFirstIdx()));
576 curDuet = *minLeft;
577 trackCand.SortHits();
578 }
579 }
580
581 if (CalculateTrackParams(&trackCand) == kBMNERROR)
582 continue;
583 if (IsParCorrect(trackCand.GetParamFirst(), fIsField)
584 && IsParCorrect(trackCand.GetParamLast(), fIsField))
585 {
586 Int_t threadNum = 0;
587#if defined(_OPENMP)
588 threadNum = omp_get_thread_num();
589#endif
590 candsThread.at(threadNum).push_back(trackCand);
591 }
592 }
593 }
594 }
595 for (Int_t i = 0; i < nThreads; ++i)
596 for (size_t j = 0; j < candsThread[i].size(); ++j)
597 cands.push_back(candsThread[i][j]);
598
599 return cands;
600}
601
603{
604 for (BmnTrack& cand : cands) {
605 Double_t Tx = LineFit((BmnTrack*)&cand, fHitsArray, "ZX").X();
606 Double_t chiX = LineFit((BmnTrack*)&cand, fHitsArray, "ZX").Z();
607 Double_t Ty = LineFit((BmnTrack*)&cand, fHitsArray, "ZY").X();
608 Double_t chiY = LineFit((BmnTrack*)&cand, fHitsArray, "ZY").Z();
609
610 cand.SetChi2((chiX - chiY) > 0. ? chiX : chiY);
611
612 cand.GetParamFirst()->SetTx(Tx);
613 cand.GetParamFirst()->SetTy(Ty);
614
615 cand.GetParamLast()->SetTx(Tx);
616 cand.GetParamLast()->SetTy(Ty);
617 }
618
619 return kBMNSUCCESS;
620}
621
623{
624 for (BmnTrack& cand : cands) {
625 FairTrackParam par = *(cand.GetParamFirst());
626 // par.SetQp(1.0/8.0);
627 Double_t chiTot = 0.0;
628 for (Int_t iHit = 0; iHit < cand.GetNHits(); ++iHit) {
629 BmnHit* hit = (BmnHit*)fHitsArray->At(cand.GetHitIndex(iHit));
630 Double_t chi = 0.0;
631 fKalman->TGeoTrackPropagate(&par, hit->GetZ(), 2212, nullptr, nullptr, fIsField);
632 fKalman->Update(&par, hit, chi);
633 }
634 cand.SetParamLast(par);
635 for (Int_t iHit = cand.GetNHits() - 1; iHit >= 0; iHit--) {
636 BmnHit* hit = (BmnHit*)fHitsArray->At(cand.GetHitIndex(iHit));
637 Double_t chi = 0.0;
638 fKalman->TGeoTrackPropagate(&par, hit->GetZ(), 2212, nullptr, nullptr, fIsField);
639 fKalman->Update(&par, hit, chi);
640 chiTot += chi;
641 }
642 cand.SetParamFirst(par);
643 cand.SetChi2(chiTot);
644 }
645
646 return kBMNSUCCESS;
647}
648
649// BmnStatus BmnCellAutoTracking::TrackUpdateByKalman(vector<BmnTrack>& cands) {
650// BmnTrack cand;
651// FairTrackParam par;
652// Double_t chiTot;
653// Double_t chi;
654// BmnHit* hit = nullptr;
655// BmnKalmanFilter* kf = nullptr;
656// omp_set_num_threads(2);
657// #pragma omp parallel private(cand, par, chiTot, hit, chi, kf)
658// {
659// kf = new BmnKalmanFilter();
660// #pragma omp for
661// //cout << omp_get_thread_num() << endl;
662// //if (omp_get_thread_num() == 0) cout << omp_get_num_threads() << endl;
663
664// // for (BmnTrack& cand : cands) {
665
666// for (Int_t iCand = 0; iCand < cands.size(); ++iCand) {
667// cand = cands[iCand];
668// par = *(cand.GetParamFirst());
669// chiTot = 0.0;
670// for (Int_t iHit = 0; iHit < cand.GetNHits(); ++iHit) {
671// //hit = (BmnHit*)fHitsArray->At(cand.GetHitIndex(iHit));
672// //chi = 0.0;
673// kf->TGeoTrackPropagate(&par, 100, 211, nullptr, nullptr, fIsField);
674// //kf->Update(&par, hit, chi);
675// }
676// // cand.SetParamLast(par);
677// // for (Int_t iHit = cand.GetNHits() - 1; iHit >= 0; iHit--) {
678// // hit = (BmnHit*)fHitsArray->At(cand.GetHitIndex(iHit));
679// // chi = 0.0;
680// // //kf->TGeoTrackPropagate(&par, hit->GetZ(), 211, nullptr, nullptr, fIsField);
681// // //kf->Update(&par, hit, chi);
682// // chiTot += chi;
683// // }
684// cand.SetParamFirst(par);
685// cand.SetChi2(chiTot);
686// }
687// }
688// return kBMNSUCCESS;
689// }
690
691BmnStatus BmnCellAutoTracking::TrackSelection(vector<BmnTrack>& sortedTracks)
692{
693 CheckSharedHits(sortedTracks);
694 for (size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
695 BmnTrack tr = sortedTracks[iTr];
696 if (tr.GetFlag() == -1 || !IsParCorrect(tr.GetParamFirst(), fIsField)
698 continue;
699 BmnTrack gemTr;
700 BmnTrack silTr;
701 BmnTrack ssdTr;
702 BmnGlobalTrack globTr;
703 for (Int_t iHit = 0; iHit < tr.GetNHits(); ++iHit) {
704 BmnHit* hit = (BmnHit*)fHitsArray->At(tr.GetHitIndex(iHit));
705 DetectorId detId = hit->GetDetId();
706 if (detId == kSILICON)
707 silTr.AddHit(hit->GetIndex(), hit);
708 else if (detId == kSSD)
709 ssdTr.AddHit(hit->GetIndex(), hit);
710 else if (detId == kGEM)
711 gemTr.AddHit(hit->GetIndex(), hit);
712 else
713 continue;
714 }
715
717 silTr.SortHits();
719 ssdTr.SortHits();
721 gemTr.SortHits();
722
723 if (silTr.GetNHits() > 0) {
724 new ((*fSilTracksArray)[fSilTracksArray->GetEntriesFast()]) BmnTrack(silTr);
725 globTr.SetSilTrackIndex(fSilTracksArray->GetEntriesFast() - 1);
726 }
727 if (ssdTr.GetNHits() > 0) {
728 new ((*fSsdTracksArray)[fSsdTracksArray->GetEntriesFast()]) BmnTrack(ssdTr);
729 globTr.SetSsdTrackIndex(fSsdTracksArray->GetEntriesFast() - 1);
730 }
731 if (gemTr.GetNHits() > 0) {
732 gemTr.SetParamFirst(*(tr.GetParamFirst()));
733 gemTr.SetParamLast(*(tr.GetParamLast()));
734 new ((*fGemTracksArray)[fGemTracksArray->GetEntriesFast()]) BmnTrack(gemTr);
735 globTr.SetGemTrackIndex(fGemTracksArray->GetEntriesFast() - 1);
736 }
737 globTr.SetLength(CalculateLength(&tr));
738 globTr.SetParamFirst(*(tr.GetParamFirst()));
739 globTr.SetParamLast(*(tr.GetParamLast()));
740 globTr.SetNHits(tr.GetNHits());
741 globTr.SetNDF(tr.GetNDF());
742 globTr.SetChi2(tr.GetChi2());
743 new ((*fGlobTracksArray)[fGlobTracksArray->GetEntriesFast()]) BmnGlobalTrack(globTr);
744 SetHitsUsing(&tr, kTRUE);
745 if (!fIsTarget && iTr == 0)
746 break;
747 }
748
749 return kBMNSUCCESS;
750}
751
753{
754 for (Int_t i = 0; i < tr->GetNHits(); ++i) {
755 BmnHit* hit = (BmnHit*)fHitsArray->At(tr->GetHitIndex(i));
756 if (hit)
757 hit->SetUsing(use);
758 }
759}
760
762{
763 const UInt_t nHits = tr->GetNHits();
764 Double_t chi2circ = 0.0;
765 TVector3 CircParZX = CircleFit(tr, fHitsArray, chi2circ);
766
767 Double_t Xc = CircParZX.Y(); // x-coordinate of fit-circle center
768 Double_t Zc = CircParZX.X(); // z-coordinate of fit-circle center
769 fField = FairRunAna::Instance()->GetField();
770 const Double_t B = (LineFit(tr, fHitsArray, "ZY")).X(); // angle coefficient for helicoid
771
772 Double_t Q = (Xc > 0) ? +1 : -1;
773
774 Double_t sumX(0.0), sumY(0.0), sumTx(0.0), sumTy(0.0), sumQP(0.0);
775 Double_t sumXX(0.0), sumXY(0.0), sumXTx(0.0), sumXTy(0.0), sumXQP(0.0);
776 Double_t sumYY(0.0), sumYTx(0.0), sumYTy(0.0), sumYQP(0.0);
777 Double_t sumTxTx(0.0), sumTxTy(0.0), sumTxQP(0.0);
778 Double_t sumTyTy(0.0), sumTyQP(0.0);
779 Double_t sumQPQP(0.0);
780
781 for (UInt_t i = 0; i < nHits; ++i) {
782 BmnHit* hit = (BmnHit*)fHitsArray->At(tr->GetHitIndex(i));
783 if (!hit)
784 continue;
785 Double_t Xi = hit->GetX();
786 Double_t Yi = hit->GetY();
787 Double_t Zi = hit->GetZ();
788
789 Double_t Txi = -1.0 * (Zi - Zc) / (Xi - Xc);
790 Double_t Tyi = B;
791 Double_t Ri = Sqrt(Sq(Xi - Xc) + Sq(Zi - Zc));
792 Double_t QPi = Q / (0.0003 * Abs(fField->GetBy(Xi, Yi, Zi)) * Ri);
793
794 sumX += Xi;
795 sumY += Yi;
796 sumTx += Txi;
797 sumTy += Tyi;
798 sumQP += QPi;
799 sumXX += Xi * Xi;
800 sumXY += Xi * Yi;
801 sumXTx += Xi * Txi;
802 sumXTy += Xi * Tyi;
803 sumXQP += Xi * QPi;
804 sumYY += Yi * Yi;
805 sumYTx += Yi * Txi;
806 sumYTy += Yi * Tyi;
807 sumYQP += Yi * QPi;
808 sumTxTx += Txi * Txi;
809 sumTxTy += Txi * Tyi;
810 sumTxQP += Txi * QPi;
811 sumTyTy += Tyi * Tyi;
812 sumTyQP += Tyi * QPi;
813 sumQPQP += QPi * QPi;
814 }
815
816 Double_t meanX = sumX / nHits;
817 Double_t meanY = sumY / nHits;
818 Double_t meanTx = sumTx / nHits;
819 Double_t meanTy = sumTy / nHits;
820 Double_t meanQP = sumQP / nHits;
821
822 Double_t Cov_X_X = sumXX / nHits - Sq(meanX);
823 Double_t Cov_X_Y = sumXY / nHits - meanX * meanY;
824 Double_t Cov_X_Tx = sumXTx / nHits - meanX * meanTx;
825 Double_t Cov_X_Ty = sumXTy / nHits - meanX * meanTy;
826 Double_t Cov_X_Qp = sumXQP / nHits - meanX * meanQP;
827 Double_t Cov_Y_Y = sumYY / nHits - Sq(meanY);
828 Double_t Cov_Y_Tx = sumYTx / nHits - meanY * meanTx;
829 Double_t Cov_Y_Ty = sumYTy / nHits - meanY * meanTy;
830 Double_t Cov_Y_Qp = sumYQP / nHits - meanY * meanQP;
831 Double_t Cov_Tx_Tx = sumTxTx / nHits - Sq(meanTx);
832 Double_t Cov_Tx_Ty = sumTxTy / nHits - meanTx * meanTy;
833 Double_t Cov_Tx_Qp = sumTxQP / nHits - meanTx * meanQP;
834 Double_t Cov_Ty_Ty = sumTyTy / nHits - Sq(meanTy);
835 Double_t Cov_Ty_Qp = sumTyQP / nHits - meanTy * meanQP;
836 Double_t Cov_Qp_Qp = sumQPQP / nHits - Sq(meanQP);
837
838 FairTrackParam par;
839 par.SetCovariance(0, 0, Cov_X_X);
840 par.SetCovariance(0, 1, Cov_X_Y);
841 par.SetCovariance(0, 2, Cov_X_Tx);
842 par.SetCovariance(0, 3, Cov_X_Ty);
843 par.SetCovariance(0, 4, Cov_X_Qp);
844 par.SetCovariance(1, 1, Cov_Y_Y);
845 par.SetCovariance(1, 2, Cov_Y_Tx);
846 par.SetCovariance(1, 3, Cov_Y_Ty);
847 par.SetCovariance(1, 4, Cov_Y_Qp);
848 par.SetCovariance(2, 2, Cov_Tx_Tx);
849 par.SetCovariance(2, 3, Cov_Tx_Ty);
850 par.SetCovariance(2, 4, Cov_Tx_Qp);
851 par.SetCovariance(3, 3, Cov_Ty_Ty);
852 par.SetCovariance(3, 4, Cov_Ty_Qp);
853 par.SetCovariance(4, 4, Cov_Qp_Qp);
854
855 tr->SetParamFirst(par);
856 tr->SetParamLast(par);
857
858 return kBMNSUCCESS;
859}
860
862{
863 // Estimation of track parameters for events with magnetic field
864 const UInt_t nHits = tr->GetNHits();
865 if ((Int_t)nHits < fNHitsCut)
866 return kBMNERROR;
867 TVector3 lineParZY = LineFit(tr, fHitsArray, "ZY");
868 tr->SetNDF(nHits - (fIsField ? 3 : 2));
869 const Double_t B = lineParZY.X(); // angle coefficient for helicoid
870
871 Double_t Tx_first = CalcTx((BmnHit*)fHitsArray->At(tr->GetHitIndex(0)), (BmnHit*)fHitsArray->At(tr->GetHitIndex(1)),
872 (BmnHit*)fHitsArray->At(tr->GetHitIndex(2)));
873 Double_t Tx_last =
874 CalcTx((BmnHit*)fHitsArray->At(tr->GetHitIndex(nHits - 1)), (BmnHit*)fHitsArray->At(tr->GetHitIndex(nHits - 2)),
875 (BmnHit*)fHitsArray->At(tr->GetHitIndex(nHits - 3)));
876
877 if (fIsField)
878 CalcCovMatrix(tr);
879 TVector3 firstPos;
880 TVector3 lastPos;
881 ((BmnHit*)fHitsArray->At(tr->GetHitIndex(0)))->Position(firstPos);
882 ((BmnHit*)fHitsArray->At(tr->GetHitIndex(nHits - 1)))->Position(lastPos);
883 tr->GetParamFirst()->SetPosition(firstPos);
884 tr->GetParamFirst()->SetTx(Tx_first);
885 tr->GetParamFirst()->SetTy(B);
886 tr->GetParamLast()->SetPosition(lastPos);
887 tr->GetParamLast()->SetTx(Tx_last);
888 tr->GetParamLast()->SetTy(B);
889 Double_t QP = fIsField ? CalcQp(tr) : 0.0;
890 tr->GetParamFirst()->SetQp(QP);
891 tr->GetParamLast()->SetQp(QP);
892
893 return kBMNSUCCESS;
894}
895
897{
898 Double_t QpSum = 0.;
899 for (size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
900 QpSum += QpSegm[iSegm];
901
902 Double_t QpMean = QpSum / QpSegm.size();
903
904 Double_t sqSigmaSum = 0.;
905 for (size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
906 sqSigmaSum += Sq(QpSegm[iSegm] - QpMean);
907
908 return TVector2(QpMean, Sqrt(sqSigmaSum / QpSegm.size()));
909}
910
912{
913 Bool_t fRobustRefit = kTRUE;
914 Bool_t fSimpleRefit = kFALSE;
915 vector<BmnHit*> hits;
916
917 for (Int_t iHit = 0; iHit < track->GetNHits(); iHit++)
918 hits.push_back((BmnHit*)fHitsArray->At(track->GetHitIndex(iHit)));
919
920 Int_t kNSegm = track->GetNHits() - 2;
921
922 Double_t QpRefit = 0.;
923 vector<Double_t> QpSegmBefore;
924
925 // Get q/p info from all track segments
926 for (Int_t iHit = 0; iHit < kNSegm; iHit++) {
927 BmnHit* first = hits[iHit];
928 BmnHit* second = hits[iHit + 1];
929 BmnHit* third = hits[iHit + 2];
930
931 TVector3 CircParZX = CircleBy3Hit(first, second, third);
932 Double_t R = CircParZX.Z();
933 Double_t Xc = CircParZX.Y();
934 Double_t Zc = CircParZX.X();
935
936 Double_t Q = (Xc > 0) ? +1. : -1.;
937 Double_t S = 0.0003
938 * (Abs(fField->GetBy(third->GetX(), third->GetY(), third->GetZ()))
939 + Abs(fField->GetBy(second->GetX(), second->GetY(), second->GetZ()))
940 + Abs(fField->GetBy(first->GetX(), first->GetY(), first->GetZ())))
941 / 3.;
942
943 Double_t Pt = S * R; // actually Pt/Q, but it doesn't matter
944 Double_t fX = first->GetX();
945 Double_t fZ = first->GetZ();
946
947 Double_t h = -1.0;
948
949 Double_t Tx_first = h * (fZ - Zc) / (fX - Xc);
950 TVector3 lineParZY = LineFit(track, fHitsArray, "ZY");
951 const Double_t B = lineParZY.X(); // angle coefficient for helicoid
952 Double_t Ty_first = B; // / (fX - Xc);
953
954 Double_t Pz = Pt / Sqrt(1 + Sq(Tx_first));
955 Double_t Px = Tx_first * Pz;
956 Double_t Py = Ty_first * Pz;
957 Double_t P = Sqrt(Sq(Px) + Sq(Py) + Sq(Pz));
958 Double_t QP = Q / P;
959
960 QpSegmBefore.push_back(QP);
961 }
962
963 // Non-robust (simple) refit when segments with bad q/p are not taken into account
964 if (fSimpleRefit) {
965 vector<Double_t> QpSegmAfter;
966 while (kTRUE) {
967 TVector2 meanSig = CalcMeanSigma(QpSegmBefore);
968 Double_t mean = meanSig.X();
969 Double_t sigma = meanSig.Y();
970 if (std::isnan(sigma) && fVerbose == 3) {
971 cout << "Bad refit convergence for track segment!!" << endl;
972 return kBMNERROR;
973 }
974
975 for (size_t iSegm = 0; iSegm < QpSegmBefore.size(); iSegm++)
976 if (Abs(QpSegmBefore[iSegm] - mean) - sigma <= 0.001) // Топорное сравнение FIXME
977 QpSegmAfter.push_back(QpSegmBefore[iSegm]);
978
979 if (QpSegmAfter.size() == QpSegmBefore.size()) {
980 QpRefit = mean;
981 break;
982 } else {
983 QpSegmBefore.clear();
984 QpSegmBefore.resize(0);
985
986 for (size_t iSegm = 0; iSegm < QpSegmAfter.size(); iSegm++)
987 QpSegmBefore.push_back(QpSegmAfter[iSegm]);
988
989 QpSegmAfter.clear();
990 QpSegmAfter.resize(0);
991 }
992 }
993 }
994
995 // Robust refit with use of Tukey weights calculation algorithm
996 if (fRobustRefit) {
997 for (size_t iEle = 0; iEle < QpSegmBefore.size(); iEle++)
998 QpRefit += QpSegmBefore[iEle];
999
1000 QpRefit /= QpSegmBefore.size();
1001
1002 vector<Double_t> d = dist(QpSegmBefore, QpRefit);
1003
1004 Double_t sigma = 0.;
1005 for (size_t i = 0; i < QpSegmBefore.size(); i++)
1006 sigma += (QpSegmBefore[i] - QpRefit) * (QpSegmBefore[i] - QpRefit);
1007 sigma = Sqrt(sigma / QpSegmBefore.size());
1008
1009 vector<Double_t> w = W(d, sigma);
1010 sigma = Sigma(d, w);
1011
1012 const Int_t kNIter = 20; // FIXME
1013 for (Int_t iIter = 1; iIter < kNIter; iIter++) {
1014 QpRefit = Mu(QpSegmBefore, w);
1015 d = dist(QpSegmBefore, QpRefit);
1016 w = W(d, sigma);
1017 sigma = Sigma(d, w);
1018 }
1019 }
1020
1021 return QpRefit;
1022}
1023
1025{
1026 if (!tr)
1027 return 0.0;
1028
1029 vector<Double_t> X, Y, Z;
1030 for (Int_t iGem = 0; iGem < tr->GetNHits(); iGem++) {
1031 BmnHit* hit = (BmnHit*)fHitsArray->At(tr->GetHitIndex(iGem));
1032 if (!hit)
1033 continue;
1034 X.push_back(hit->GetX());
1035 Y.push_back(hit->GetY());
1036 Z.push_back(hit->GetZ());
1037 }
1038 // Calculate distances between hits
1039 Double_t length = 0.;
1040 for (size_t i = 0; i < X.size() - 1; i++) {
1041 Double_t dX = X[i] - X[i + 1];
1042 Double_t dY = Y[i] - Y[i + 1];
1043 Double_t dZ = Z[i] - Z[i + 1];
1044 length += Sqrt(dX * dX + dY * dY + dZ * dZ);
1045 }
1046 tr->SetLength(length);
1047 return length;
1048}
1049
1051{
1052 set<Int_t> hitsId;
1053
1054 const Int_t kNSharedHits = 0; // fSteering->GetNSharedHits();
1055
1056 for (size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
1057 BmnTrack* tr = &(sortedTracks.at(iTr));
1058 if (tr->GetFlag() == -1)
1059 continue;
1060
1061 Int_t nofSharedHits = 0;
1062 Int_t nofHits = tr->GetNHits();
1063 for (Int_t iHit = 0; iHit < nofHits; iHit++)
1064 if (hitsId.find(tr->GetHitIndex(iHit)) != hitsId.end()) {
1065 nofSharedHits++;
1066 if (nofSharedHits > kNSharedHits) {
1067 tr->SetFlag(-1);
1068 break;
1069 }
1070 }
1071 if (tr->GetFlag() == -1)
1072 continue;
1073
1074 for (Int_t iHit = 0; iHit < nofHits; iHit++)
1075 hitsId.insert(tr->GetHitIndex(iHit));
1076 }
1077 hitsId.clear();
1078
1079 return kBMNSUCCESS;
1080}
1081
1083{
1084 TH2F* h_HitsZX = new TH2F("h_HitsZX", "h_HitsZX", 400, 0.0, 200.0, 400, -100.0, 100.0);
1085 TH2F* h_HitsZY = new TH2F("h_HitsZY", "h_HitsZY", 400, 0.0, 200.0, 400, -10.0, 50.0);
1086 for (Int_t i = 0; i < fHitsArray->GetEntriesFast(); ++i) {
1087 BmnHit* hit = (BmnHit*)fHitsArray->At(i);
1088 h_HitsZX->Fill(hit->GetZ(), hit->GetX());
1089 h_HitsZY->Fill(hit->GetZ(), hit->GetY());
1090 }
1091
1092 TCanvas* c = new TCanvas("c", "c", 1000, 1000);
1093 c->Divide(1, 2);
1094 c->cd(1);
1095 h_HitsZX->SetMarkerStyle(8);
1096 h_HitsZX->SetMarkerSize(0.7);
1097 h_HitsZX->SetMarkerColor(kRed);
1098 h_HitsZX->Draw("P");
1099
1100 c->cd(2);
1101 h_HitsZY->SetMarkerStyle(8);
1102 h_HitsZY->SetMarkerSize(0.7);
1103 h_HitsZY->SetMarkerColor(kRed);
1104 h_HitsZY->Draw("P");
1105
1106 for (Int_t iTr = 0; iTr < fGlobTracksArray->GetEntriesFast(); ++iTr) {
1107 BmnGlobalTrack* glTrack = (BmnGlobalTrack*)fGlobTracksArray->At(iTr);
1108
1109 BmnTrack* gemTr = nullptr;
1110 BmnTrack* silTr = nullptr;
1111 BmnTrack* ssdTr = nullptr;
1112
1113 Double_t xPrev;
1114 Double_t yPrev;
1115 Double_t zPrev;
1116
1117 if (glTrack->GetSilTrackIndex() != -1) {
1118 silTr = (BmnTrack*)fSilTracksArray->UncheckedAt(glTrack->GetSilTrackIndex());
1119
1120 xPrev = ((BmnHit*)fSilHitsArray->At(silTr->GetHitIndex(0)))->GetX();
1121 yPrev = ((BmnHit*)fSilHitsArray->At(silTr->GetHitIndex(0)))->GetY();
1122 zPrev = ((BmnHit*)fSilHitsArray->At(silTr->GetHitIndex(0)))->GetZ();
1123
1124 for (Int_t iHit = 1; iHit < silTr->GetNHits(); iHit++) {
1125 BmnHit* hit = (BmnHit*)fSilHitsArray->UncheckedAt(silTr->GetHitIndex(iHit));
1126 Double_t x = hit->GetX();
1127 Double_t y = hit->GetY();
1128 Double_t z = hit->GetZ();
1129 TLine* lineZX = new TLine(z, x, zPrev, xPrev);
1130 lineZX->SetLineColor(kRed);
1131 lineZX->SetLineWidth(2);
1132 TLine* lineZY = new TLine(z, y, zPrev, yPrev);
1133 lineZY->SetLineColor(kRed);
1134 lineZY->SetLineWidth(2);
1135 c->cd(1);
1136 lineZX->Draw("same");
1137 c->cd(2);
1138 lineZY->Draw("same");
1139 zPrev = z;
1140 yPrev = y;
1141 xPrev = x;
1142 }
1143 }
1144 if (glTrack->GetSsdTrackIndex() != -1) {
1145 ssdTr = (BmnTrack*)fSsdTracksArray->UncheckedAt(glTrack->GetSsdTrackIndex());
1146
1147 xPrev = ((BmnHit*)fSsdHitsArray->At(ssdTr->GetHitIndex(0)))->GetX();
1148 yPrev = ((BmnHit*)fSsdHitsArray->At(ssdTr->GetHitIndex(0)))->GetY();
1149 zPrev = ((BmnHit*)fSsdHitsArray->At(ssdTr->GetHitIndex(0)))->GetZ();
1150
1151 for (Int_t iHit = 1; iHit < ssdTr->GetNHits(); iHit++) {
1152 BmnHit* hit = (BmnHit*)fSsdHitsArray->UncheckedAt(ssdTr->GetHitIndex(iHit));
1153 Double_t x = hit->GetX();
1154 Double_t y = hit->GetY();
1155 Double_t z = hit->GetZ();
1156 TLine* lineZX = new TLine(z, x, zPrev, xPrev);
1157 lineZX->SetLineColor(kRed);
1158 lineZX->SetLineWidth(2);
1159 TLine* lineZY = new TLine(z, y, zPrev, yPrev);
1160 lineZY->SetLineColor(kRed);
1161 lineZY->SetLineWidth(2);
1162 c->cd(1);
1163 lineZX->Draw("same");
1164 c->cd(2);
1165 lineZY->Draw("same");
1166 zPrev = z;
1167 yPrev = y;
1168 xPrev = x;
1169 }
1170 }
1171
1172 if (glTrack->GetGemTrackIndex() != -1) {
1173 gemTr = (BmnTrack*)fGemTracksArray->UncheckedAt(glTrack->GetGemTrackIndex());
1174
1175 Int_t startIdx = 0;
1176
1177 if (glTrack->GetSilTrackIndex() == -1 && glTrack->GetSsdTrackIndex() == -1) {
1178 xPrev = ((BmnHit*)fGemHitsArray->At(gemTr->GetHitIndex(0)))->GetX();
1179 yPrev = ((BmnHit*)fGemHitsArray->At(gemTr->GetHitIndex(0)))->GetY();
1180 zPrev = ((BmnHit*)fGemHitsArray->At(gemTr->GetHitIndex(0)))->GetZ();
1181 startIdx = 1;
1182 }
1183
1184 for (Int_t iHit = startIdx; iHit < gemTr->GetNHits(); iHit++) {
1185 BmnHit* hit = (BmnHit*)fGemHitsArray->UncheckedAt(gemTr->GetHitIndex(iHit));
1186 Double_t x = hit->GetX();
1187 Double_t y = hit->GetY();
1188 Double_t z = hit->GetZ();
1189 TLine* lineZX = new TLine(z, x, zPrev, xPrev);
1190 lineZX->SetLineColor(kRed);
1191 lineZX->SetLineWidth(2);
1192 TLine* lineZY = new TLine(z, y, zPrev, yPrev);
1193 lineZY->SetLineColor(kRed);
1194 lineZY->SetLineWidth(2);
1195 c->cd(1);
1196 lineZX->Draw("same");
1197 c->cd(2);
1198 lineZY->Draw("same");
1199 zPrev = z;
1200 yPrev = y;
1201 xPrev = x;
1202 }
1203 }
1204 }
1205
1206 Int_t nMCtracks = 0;
1207 for (Int_t iTr = 0; iTr < fMCTracksArray->GetEntriesFast(); ++iTr) {
1208 CbmMCTrack* tr = (CbmMCTrack*)fMCTracksArray->At(iTr);
1209 Int_t nPoints = 0; // tr->GetNPoints(kGEM);
1210 vector<TLine*> vLineZX;
1211 vector<TLine*> vLineZY;
1212 Double_t z0 = tr->GetStartZ();
1213 Double_t x0 = tr->GetStartX();
1214 Double_t y0 = tr->GetStartY();
1215 Double_t x1, y1, z1;
1216 set<Int_t> vSt;
1218 for (Int_t i = 0; i < fSilPointsArray->GetEntriesFast(); ++i) {
1220 if (pnt->GetTrackID() == iTr) {
1221 nPoints++;
1222 z1 = pnt->GetZ();
1223 x1 = pnt->GetX();
1224 y1 = pnt->GetY();
1225 vSt.insert(fSilDetector->GetPointStationOwnership(z1));
1226 vLineZX.push_back(new TLine(z0, x0, z1, x1));
1227 vLineZY.push_back(new TLine(z0, y0, z1, y1));
1228 z0 = z1;
1229 x0 = x1;
1230 y0 = y1;
1231 }
1232 }
1233 // if (fInnerTrackerSetup[kSSD])
1234 // for (Int_t i = 0; i < fSsdPointsArray->GetEntriesFast(); ++i) {
1235 // FairMCPoint* pnt = (FairMCPoint*) fSsdPointsArray->At(i);
1236 // if (pnt->GetTrackID() == iTr) {
1237 // nPoints++;
1238 // z1 = pnt->GetZ();
1239 // x1 = pnt->GetX();
1240 // y1 = pnt->GetY();
1241 // BmnSSDHitProducer hp;
1242 // vSt.insert(hp.DefineStationByZ(z1, 2));
1243 // vLineZX.push_back(new TLine(z0, x0, z1, x1));
1244 // vLineZY.push_back(new TLine(z0, y0, z1, y1));
1245 // z0 = z1;
1246 // x0 = x1;
1247 // y0 = y1;
1248 // }
1249 // }
1251 for (Int_t i = 0; i < fGemPointsArray->GetEntriesFast(); ++i) {
1253 if (pnt->GetTrackID() == iTr) {
1254 nPoints++;
1255 z1 = pnt->GetZ();
1256 x1 = pnt->GetX();
1257 y1 = pnt->GetY();
1258 vSt.insert(fGemDetector->GetPointStationOwnership(z1) + fNSiliconStations);
1259 vLineZX.push_back(new TLine(z0, x0, z1, x1));
1260 vLineZY.push_back(new TLine(z0, y0, z1, y1));
1261 z0 = z1;
1262 x0 = x1;
1263 y0 = y1;
1264 }
1265 }
1266 if (nPoints > 3 && vSt.size() > 3) {
1267 nMCtracks++;
1268 c->cd(1);
1269 for (TLine* it : vLineZX) {
1270 it->SetLineColor(kBlue);
1271 it->SetLineStyle(9);
1272 it->Draw("same");
1273 }
1274 c->cd(2);
1275 for (TLine* it : vLineZY) {
1276 it->SetLineColor(kBlue);
1277 it->SetLineStyle(9);
1278 it->Draw("same");
1279 }
1280 }
1281 }
1282
1283 printf("NMCTracks = %d GlobTracks = %d\n", nMCtracks, fGlobTracksArray->GetEntriesFast());
1284
1285 // arc->Draw("same");
1286 c->SaveAs("hits.png");
1287 getchar();
1288 delete h_HitsZX;
1289 delete h_HitsZY;
1290 delete c;
1291
1292 return kBMNSUCCESS;
1293}
static Double_t sortTime
static Double_t selectTime
static Double_t createTime
static Double_t connectTime
static Double_t stateTime
TVector3 LineFit(BmnTrack *track, const TClonesArray *arr, TString type)
Definition BmnMath.cxx:113
TVector3 CircleBy3Hit(BmnTrack *track, const TClonesArray *arr)
Definition BmnMath.cxx:470
Double_t Mu(vector< Double_t > qp, vector< Double_t > w)
Definition BmnMath.cxx:906
TVector3 CircleFit(BmnTrack *track, const TClonesArray *arr, Double_t &chi2)
Definition BmnMath.cxx:312
Double_t CalcTx(const BmnHit *h0, const BmnHit *h1, const BmnHit *h2)
Definition BmnMath.cxx:422
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
vector< Double_t > W(vector< Double_t > dist, Double_t sig)
Definition BmnMath.cxx:878
static Double_t workTime
int i
Definition P4_F32vec4.h:22
bool Bool_t
int Int_t
short Short_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
const char Option_t
kRed
kBlue
void Fatal(const char *location, const char *msgfmt,...)
R__EXTERN TSystem * gSystem
@ kSILICON
@ kGEM
@ kSSD
BmnStatus
Define status code.
Definition BmnEnums.h:93
@ kBMNERROR
Error.
Definition BmnEnums.h:95
@ kBMNSUCCESS
Success.
Definition BmnEnums.h:94
TClonesArray * fMCTracksArray
map< DetectorId, Bool_t > fInnerTrackerSetup
BmnStatus SortTracks(vector< BmnTrack > &inTracks, vector< BmnTrack > &sortedTracks)
BmnStatus CheckSharedHits(vector< BmnTrack > &sortedTracks)
vector< BmnTrack > CellsConnection(vector< BmnCellDuet > *cells)
BmnKalmanFilter * fKalman
virtual void Exec(Option_t *opt)
TClonesArray * fSsdPointsArray
BmnSiliconStationSet * fSilDetector
Double_t CalculateLength(BmnTrack *tr)
BmnGemStripStationSet * fGemDetector
TClonesArray * fGemTracksArray
TClonesArray * fGemPointsArray
BmnStatus TrackSelection(vector< BmnTrack > &cands)
TClonesArray * fGemHitsArray
void SetHitsUsing(BmnTrack *tr, Bool_t use)
TVector2 CalcMeanSigma(vector< Double_t >)
TClonesArray * fSilHitsArray
TClonesArray * fSsdHitsArray
TClonesArray * fSilTracksArray
TClonesArray * fSsdTracksArray
TClonesArray * fGlobTracksArray
Double_t CalcQp(BmnTrack *track)
virtual InitStatus Init()
BmnStatus TrackUpdateByKalman(vector< BmnTrack > &cands)
TClonesArray * fSilPointsArray
BmnStatus CalculateTrackParams(BmnTrack *tr)
BmnStatus StateCalculation(vector< BmnCellDuet > *cells)
BmnStatus TrackUpdateByLine(vector< BmnTrack > &cands)
BmnStatus CalcCovMatrix(BmnTrack *tr)
BmnStatus CellsCreation(vector< BmnCellDuet > *cells)
Double_t GetSlopeYZ()
Definition BmnCellDuet.h:55
void SetUsing(Bool_t u)
Definition BmnCellDuet.h:63
void SetLastIdx(Int_t idx)
Definition BmnCellDuet.h:41
void SetSlopeXZ(Double_t s)
Definition BmnCellDuet.h:43
void SetOldState(Short_t st)
Definition BmnCellDuet.h:37
void SetFirstIdx(Int_t idx)
Definition BmnCellDuet.h:39
void SetStartPlane(Short_t p)
Definition BmnCellDuet.h:47
void SetNewState(Short_t st)
Definition BmnCellDuet.h:35
Double_t GetSlopeXZ()
Definition BmnCellDuet.h:53
Int_t GetLastIdx()
Definition BmnCellDuet.h:51
void SetSlopeYZ(Double_t s)
Definition BmnCellDuet.h:45
Int_t GetFirstIdx()
Definition BmnCellDuet.h:49
BmnGlobalTrack.h.
void SetGemTrackIndex(Int_t iGem)
Modifiers.
Int_t GetGemTrackIndex() const
Accessors.
Int_t GetIndex() const
Definition BmnHit.h:32
DetectorId GetDetId() const
Definition BmnHit.h:34
void SetUsing(Bool_t use)
Definition BmnHit.h:47
void SetDetId(DetectorId det)
Definition BmnHit.h:51
void SetIndex(Int_t id)
Definition BmnHit.h:49
Bool_t IsUsed() const
Definition BmnHit.h:30
void SetStation(Short_t st)
Definition BmnHit.h:52
Short_t GetStation() const
Definition BmnHit.h:35
Int_t GetNDF() const
Definition BmnTrack.h:57
void SetChi2(Double_t chi2)
Definition BmnTrack.h:76
void SetParamLast(FairTrackParam &par)
Definition BmnTrack.h:72
void SetFlag(Int_t flag)
Definition BmnTrack.h:74
FairTrackParam * GetParamFirst()
Definition BmnTrack.h:63
Float_t GetChi2() const
Definition BmnTrack.h:55
Int_t GetNHits() const
Accessors.
Definition BmnTrack.h:49
Int_t GetHitIndex(Int_t iHit) const
Definition BmnTrack.h:51
void AddHit(Int_t hitIndex, FairHit *Hit)
Associate a FairHit to the track.
Definition BmnTrack.cxx:28
void SetNHits(Int_t n)
Definition BmnTrack.h:80
void SetParamFirst(FairTrackParam &par)
Modifiers.
Definition BmnTrack.h:70
FairTrackParam * GetParamLast()
Definition BmnTrack.h:65
void SetLength(Double_t length)
Definition BmnTrack.h:84
Int_t GetFlag() const
Definition BmnTrack.h:53
void SortHits()
Public method SortHits Sorts the hits in downstream direction and writes the hit indices into the mem...
Definition BmnTrack.cxx:45
void SetNDF(Int_t ndf)
Definition BmnTrack.h:78
CbmMCTrack.h.
Definition CbmMCTrack.h:26
Double_t GetStartZ() const
Definition CbmMCTrack.h:63
Double_t GetStartY() const
Definition CbmMCTrack.h:62
Double_t GetStartX() const
Definition CbmMCTrack.h:61
virtual void SetLineWidth(Width_t lwidth)
virtual void SetLineColor(Color_t lcolor)
virtual void SetMarkerColor(Color_t mcolor=1)
virtual void SetMarkerStyle(Style_t mstyle=1)
virtual void SetMarkerSize(Size_t msize=1)
TVirtualPad * cd(Int_t subpadnumber=0) override
void Draw(Option_t *option="") override
virtual Int_t Fill(const char *namex, const char *namey, Double_t w)
virtual void Draw(Option_t *option="")
void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) override
void SaveAs(const char *filename="", Option_t *option="") const override
Double_t Y() const
Double_t X() const
Double_t Z() const
Double_t Y() const
Double_t X() const
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:20362
constexpr Double_t Sigma()
Double_t Sq(Double_t x)
Double_t Sqrt(Double_t x)
constexpr Double_t R()
Double_t Abs(Double_t d)
Definition json.hpp:4446