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