FairRoot/PandaRoot
PndRiemannTrackFinder.cxx
Go to the documentation of this file.
2 #include <iostream>
3 #include <math.h>
4 #include "PndSdsHit.h"
5 
7 
8 PndRiemannTrackFinder::PndRiemannTrackFinder(): fMaxPlaneDist(1), fMaxSZDist(1),fMinPointDist(1), fMaxSZChi2(1),fMinNumberOfHits(4), fCurvDiff(0.05), fDipDiff(0.05), fMagField(2.0), fVerbose(0), fUseZeroPos(false)
9 {
10  if (fUseZeroPos){
11  TVector3 pos(0.0,0.0,0.0);
12  TVector3 dpos(0.1,0.1,0.1);
13  FairHit* ZeroHit = new FairHit(-1, pos, dpos, -1);
14  fHits.push_back(ZeroHit);
15  FairLink myID;
16  fMapHitToID[fHits.size()-1]=myID;
17  fMapIDtoHit[myID] = fHits.size()-1;
18  }
19 }
20 
22 {
23  if (fUseZeroPos)
24  delete(fHits[0]);
25 }
26 
27 void PndRiemannTrackFinder::AddHits(std::vector<FairHit*> hits, Int_t branchId)
28 {
29  Int_t startSize = 0; //= fHits.size();
30  for (size_t i = 0; i < hits.size(); i++){
31  fHits.push_back(hits[i]);
32  FairHit* myHit = fHits[i];
33  FairLink myID;
34  if (myHit->GetEntryNr().GetIndex() < 0){
35  myID = FairLink(branchId, startSize + i);
36  }
37  else
38  myID = myHit->GetEntryNr();
39  fMapHitToID[fHits.size()-1]=myID;
40  fMapIDtoHit[myID] = fHits.size()-1;
41  }
42 }
43 
44 void PndRiemannTrackFinder::AddHits(TClonesArray* hits, Int_t branchId)
45 {
46  Int_t startSize = 0;//= fHits.size();
47  for (int i = 0; i < hits->GetEntries(); i++){
48  FairHit* myHit = (FairHit*)(hits->At(i));
49  fHits.push_back(myHit);
50  FairLink myID;
51  if (myHit->GetEntryNr().GetIndex() < 0){
52  myID = FairLink(-1, -1, branchId, startSize + i, 1);
53  }
54  else
55  myID = myHit->GetEntryNr();
56  fMapHitToID[fHits.size()-1]=myID;
57  fMapIDtoHit[myID] = fHits.size()-1;
58  }
59 }
60 
62 {
63  std::vector<std::set<Int_t> > Tracks = GetStartTracks(); //Get the possible track seeds
64  std::set<int> tooClose;
65  std::set<int>::iterator iter;
66  for (size_t trackId = 0; trackId < Tracks.size(); trackId++){ //Go through all track seeds and search for additional points
67 
68  if (Tracks[trackId].size() != 3)
69  std::cout << "-E- PndRiemannTrackFinder::FindTracks: Start points: " << Tracks[trackId].size()
70  << " in Track: " << trackId << std::endl;
71 
72  std::set<Int_t> StartTrack = Tracks[trackId]; //Take a start track
73 
74  if (fVerbose > 1){
75  iter = StartTrack.begin();
76  std::cout << "------------------------------------" << std::endl;
77  std::cout << "Start Plane from Points: " << *iter << " "
78  << *(++iter) << " " << *(++iter) << std::endl;
79  }
80  if (TrackExists(StartTrack) == true){
81  if (fVerbose > 1) std::cout << "Track exists already!" << std::endl;
82  continue;
83  }
84  PndRiemannTrack actTrack = CreateRiemannTrack(StartTrack);
85  iter = StartTrack.end();
86  int startHit = *(--iter); //StartTrack always has three points, the last is the one with the largest index
87  iter = StartTrack.begin();
88  for (size_t testHit = startHit+1; testHit < fHits.size(); testHit++){
89  if (CheckHitDistance(*iter, testHit)!= true){fHitsTooClose[trackId].insert(testHit); continue;}
90  if (CheckHitDistance(*(++iter), testHit)!= true){fHitsTooClose[trackId].insert(testHit); continue;}
91  if (CheckHitDistance(*(++iter), testHit)!= true){fHitsTooClose[trackId].insert(testHit); continue;}
92 
93  PndRiemannHit actHit(fHits[testHit], testHit); //Create a Riemann Hit from a FairHit
94 
95  if (fVerbose > 1) std::cout << "Point " << testHit ;
96  if (CheckRiemannHit(&actTrack, &actHit) != true) continue;
97 
98  StartTrack.insert(testHit);
99 
100  actTrack.addHit(actHit);
101  actTrack.refit();
102  actTrack.szFit();
103 
104  TVectorD orig = actTrack.orig();
105  if (fVerbose > 1) std::cout << "actHit added: " << testHit << " r: " << actTrack.r()
106  << " orig: " << orig[0] << " " << orig[1] << std::endl;
107  }
108 
109  if ((int)actTrack.getNumHits() > (fMinNumberOfHits-1)) //if you have a track match
110  {
111  std::set<int> hits = fHitsTooClose[trackId];
112  for (iter = hits.begin(); iter != hits.end(); iter++){
113  PndRiemannHit actHit(fHits[*iter]);
114  if (CheckRiemannHit(&actTrack, &actHit)!= true) continue;
115  StartTrack.insert(*iter);
116  actTrack.addHit(actHit);
117  actTrack.refit();
118  actTrack.szFit();
119  }
120 
121  fTracks.push_back(actTrack);
122  fHitsInTracks.push_back(StartTrack);
123  if (fVerbose > 1){
124  TVectorD orig = actTrack.orig();
125  iter = StartTrack.begin();
126  std::cout << "Track added! " << *iter << " " << *(++iter)
127  << " " << *(++iter) << " r: " << actTrack.r()
128  << " orig: " << orig[0] << " " << orig[1]
129  << " sz-m: " << actTrack.getSZm() << " sz-t: " << actTrack.getSZt()
130  << " dip: " << actTrack.dip()
131  << std::endl;
132  }
133 
134  if (fVerbose > 0){
135  std::cout << "Hits in Track: ";
136  for (iter = StartTrack.begin(); iter != StartTrack.end(); iter++)
137  {
138  std::cout << " " << fMapHitToID[*iter];
139  }
140  TVectorD myOrig = actTrack.orig();
141  std::cout << " numHits: " << actTrack.getNumHits() << std::endl;
142  std::cout << " curv: " << 1/actTrack.r() << "+/-" << actTrack.dR()/(actTrack.r() * actTrack.r())
143  << " dip: " << actTrack.dip() << "+/-" << actTrack.dDip()
144  << " orig: " << myOrig[0] << "+/-" << actTrack.dX()
145  << " " << myOrig[1] << "+/-" << actTrack.dY() << std::endl;
146  }
147  }
148  }
149 
150  for (unsigned int n = 0; n < fTracks.size(); n++){
151  PndTrackCand myTrackCand;
152  std::vector<PndRiemannHit> TrackHits = fTracks[n].getHits();
153 
154  for (unsigned int p = 0; p < TrackHits.size(); p++){
155  myTrackCand.AddHit(fMapHitToID[TrackHits[p].hitID()], TrackHits[p].s());
156  }
157  fTrackCand.push_back(myTrackCand);
158 
159  std::pair<double,double> CurvDip(1/fTracks[n].r(),fTracks[n].dip());
160  fCurvAndDipOfCand.push_back(CurvDip);
161  }
162 
163 
164 // MergeTracks();
165 // fTrackCand.clear();
166 // fTrackCand = fMergedTrackCand;
167 // if (fVerbose > 0) {
168 // std::cout << "Tracks after merging:" << std::endl;
169 // for (int p = 0; p < fTrackCand.size(); p++){
170 // fTrackCand[p].Print();
171 // }
172 // }
173 
174 }
175 
176 std::vector< std::set<Int_t> > PndRiemannTrackFinder::GetStartTracks()
177 {
178  std::set<int> actCandidates;
179  std::vector<std::set<int> > Tracks;
180  std::set<int> tooCloseFirst;
181  std::set<int> tooCloseSecond;
182  std::set<int>::iterator iter;
183 
184  if (fHits.size() > 3){
185  for (size_t first = 0; first < fHits.size()-3; first++){ //take three points and create a riemann plane - get first hit
186  tooCloseFirst.clear();
187  for (size_t second = first+1; second < fHits.size()-2; second++){// get second hit
188  tooCloseSecond.clear();
189  if (CheckHitDistance(first, second) != true){ tooCloseFirst.insert(second); continue;}
190  if (CheckHitInSameSensor(first, second) == true) continue;
191  for (size_t third = second+1; third < fHits.size()-1; third++){
192  if (fVerbose > 1) std::cout << "Checking Points: " << first << " " << second << " " << third << std::endl;
193  if (CheckHitDistance(first, third)!= true){tooCloseFirst.insert(third); continue;}
194  if (CheckHitDistance(second, third)!= true){tooCloseSecond.insert(third); continue;}
195 
196  if (CheckHitInSameSensor(first, third)==true)continue;
197  if (CheckHitInSameSensor(second, third)==true)continue;
198 
199  actCandidates.clear();
200  actCandidates.insert(first);
201  actCandidates.insert(second);
202  actCandidates.insert(third);
203 
204  if (!TrackExists(actCandidates)){ //checks if the combination of three points was used before in a track
205  PndRiemannTrack actTrack;// = new PndRiemannTrack();
206  PndRiemannHit hit1(fHits[first]);
207  PndRiemannHit hit2(fHits[second]);
208  PndRiemannHit hit3(fHits[third]);
209  actTrack.addHit(hit1);
210  actTrack.addHit(hit2);
211  actTrack.addHit(hit3);
212  actTrack.refit();
213  if (CheckSZ(actTrack)!= true) continue;
214  TVectorT<double> orig = actTrack.orig();
215  if (fVerbose > 1) std::cout << "Base plane from Points: " << first << " " << second << " " << third << " r: " << actTrack.r() << " orig: " << orig[0] << " " << orig[1] << std::endl;
216  Tracks.push_back(actCandidates);
217  std::set<int> combHits = tooCloseFirst;
218  combHits.insert(tooCloseSecond.begin(), tooCloseSecond.end());
219  fHitsTooClose.push_back(combHits);
220  }
221  }
222  }
223  }
224  }
225  if (fVerbose > 1) {
226  std::cout << "Start Tracks are: " << std::endl;
227  for (size_t i = 0; i < Tracks.size(); i++){
228  std::set<int> aTrack = Tracks[i];
229  for (iter = aTrack.begin(); iter != aTrack.end();iter++){
230  std::cout << *iter << " ";
231  }
232  std::cout << std::endl;
233  }
234  }
235  return Tracks;
236 }
237 
239 {
240  double dist = HitDistance(fHits[hit1], fHits[hit2]);
241  if (dist < fMinPointDist)
242  {
243  if (fVerbose > 1) std::cout << "Hits: " << hit1 << " " << hit2 << " too close " << dist << std::endl;
244  return false;
245  }
246  return true;
247 }
248 
250 {
251  aTrack.szFit();
252  if (aTrack.szChi2() > fMaxSZChi2 || aTrack.szChi2() < 0){
253  if (fVerbose > 1) std::cout << "sz-Fit does not match, Chi2: " << fMaxSZChi2 << std::endl;
254  return false;
255  }
256  return true;
257 }
258 
259 bool PndRiemannTrackFinder::CheckZeroPassing(std::set<int> hitIds, int hit)
260 {
261  FairHit* testHit = fHits[hit];
262  FairHit* myHit;
263  std::set<int>::iterator iter;
264 
265  std::set<int>::iterator zeroPos = hitIds.end();
266  for (iter = hitIds.begin(); iter != hitIds.end(); iter++){
267  if (fMapHitToID[*iter].GetIndex() < 0){
268  zeroPos = iter;
269  }
270  }
271  if (zeroPos != hitIds.end()) {
272  if (zeroPos != --hitIds.end()) {
273  myHit = fHits[*(++zeroPos)];
274  } else {
275  myHit = fHits[*(--zeroPos)];
276  }
277  } else {
278  myHit = fHits[*hitIds.begin()];
279  }
280  TVector3 point1, point2, result;
281  //std::cout << " TestHit: " << *testHit << " BaseHit: " << *myHit << std::endl;
282  myHit->Position(point1);
283  testHit->Position(point2);
284  if ((point1 * point2) < 0){
285  //std::cout << "product " << point1 * point2 << " negative: ZeroPassing" << std::endl;
286  if (fVerbose > 1) std::cout << "ZeroPassing!" << std::endl;
287  return true;
288  }
289  return false;
290 }
291 
293 {
294  PndRiemannTrack result;
295  for (std::set<int>::iterator iter = aHits.begin(); iter != aHits.end(); iter++)
296  {
297  PndRiemannHit hit(fHits[*iter], *iter);
298  result.addHit(hit);
299  }
300  result.refit(false);
301  result.szFit(false);
302  return result;
303 }
304 
306 {
307  FairHit* first = fHits[hit1];
308  FairHit* second = fHits[hit2];
309 
310  if (first->GetDetectorID() != 1 || first->GetDetectorID() != 2)
311  return false;
312 
313  if(((PndSdsHit*)first)->GetSensorID() == ((PndSdsHit*)second)->GetSensorID()){
314  std::cout << hit1 << " " << hit2 <<" in Same Sensor: " << ((PndSdsHit*)first)->GetSensorID() << std::endl;
315  return true;
316  }
317  return false;
318 }
319 
320 bool PndRiemannTrackFinder::CheckHitInTrack(std::set<int> hitIds, int hit)
321 {
322  for (std::set<int>::iterator iter = hitIds.begin(); iter != hitIds.end(); iter++){
323  if (*iter == hit){
324  if (fVerbose > 1) std::cout << "-I- PndRiemannTrackFinder::CheckHitInTrack - Hit: " << hit << " already in track!" << std::endl;
325  return true;
326  }
327  }
328  return false;
329 }
330 
332 {
333  double dist = track->dist(hit);
334  double szDist = track->szDist(hit);
335  double szChi2 = track->calcSZChi2(hit);
336 
337  if (fVerbose > 1) std::cout << ": dist " << dist << " szDist " << szDist << " szChi2 " << szChi2 << std::endl;
338 
339  if (fabs(dist) > fMaxPlaneDist){
340  if (fVerbose > 1) std::cout << "dist larger than " << fMaxPlaneDist << std::endl;
341  return false;
342  }
343  if (szChi2 > fMaxSZChi2){
344  if (fVerbose > 1) std::cout << " SZ Chi2 too big! Cut at: " << fMaxSZChi2<< std::endl;
345  return false;
346  }
347  if (fabs(szDist) > fMaxSZDist){
348  if (fVerbose > 1) std::cout << " SZ Dist too big! Cut at: " << fMaxSZDist << std::endl;
349  return false;
350  }
351  return true;
352 }
353 
355 {
356  std::vector<int> RemainingTracks;
357  std::vector<int> SelectedTracks;
358  std::vector<int> TracksToMerge;
359  if (fVerbose > 1) std::cout << "fTrackCand size: " << fTrackCand.size() << std::endl;
360  for (size_t i = 0; i < fTrackCand.size(); i++){
361  RemainingTracks.push_back(i);
362  }
363  int remainingTracksSize = RemainingTracks.size();
364  if (fVerbose > 1) std::cout << "RemainingTracks: " << RemainingTracks.size() << std::endl;
365  while(remainingTracksSize != 0){
366  SelectedTracks = FindTracksWithSimilarParameters(RemainingTracks[0], RemainingTracks, fCurvDiff, fDipDiff);
367  remainingTracksSize=RemainingTracks.size();
368  if (fVerbose > 1) std::cout << "RemainingTracks: " << RemainingTracks.size() << std::endl;
369  if (SelectedTracks.size() > 1){
370  //int selectedTracksSize = SelectedTracks.size(); //[R.K. 01/2017] unused variable
371  std::vector<PndTrackCand> tempTrCnd;
372  std::vector<int> tempST;
373  std::vector<int> tempKillAfter;
374 
375  for(size_t k=0;k<SelectedTracks.size();k++){
376  tempTrCnd.push_back(fTrackCand[SelectedTracks[k]]);
377  tempST.push_back(k);
378  }
379  //int tempSize0=tempTrCnd.size(); //[R.K. 01/2017] unused variable?
380  int tempSize=tempTrCnd.size();
381  bool checkMerge=true;
382  while (checkMerge){
383  int counter=0;
384  for(int j=0;j<tempSize;j++){
385  TracksToMerge = FindTracksWithSimilarHits(tempST,tempTrCnd,tempKillAfter);
386  //selectedTracksSize = SelectedTracks.size(); //[R.K. 01/2017] unused variable
387  PndTrackCand newCand = CreateOneTrackCand(TracksToMerge,tempTrCnd);
388  tempTrCnd.push_back(newCand);
389  tempST.push_back(tempTrCnd.size()-1);
390  if (TracksToMerge.size()>1) counter++;
391  }
392  if (counter>0)
393  checkMerge=true;
394  else checkMerge=false;
395 
396  for(size_t k=0;k<tempKillAfter.size();k++){
397  for(size_t i=0;i<tempST.size();i++){
398  if (tempST[i]==tempKillAfter[k]){
399  RemoveTrack(tempKillAfter[k], tempST);
400  }
401  }
402  }
403  }
404  for(size_t k=0;k<tempST.size();k++){
405  fMergedTrackCand.push_back(tempTrCnd[tempST[k]]);
406  }
407  }
408  else fMergedTrackCand.push_back(fTrackCand[SelectedTracks[0]]);
409  }
410 }
411 
412 std::vector<int> PndRiemannTrackFinder::FindTracksWithSimilarParameters(int TrackInd, std::vector<int>& TracksToTest, double curvDiff, double dipDiff)
413 {
414  std::vector<int> result;
415  Double_t testCurv=fCurvAndDipOfCand[TrackInd].first;
416  Double_t testDip=fCurvAndDipOfCand[TrackInd].second;
417  result.push_back(TrackInd);
418  RemoveTrack(TrackInd, TracksToTest);
419  int tracksToTestSize = TracksToTest.size();
420  if(fVerbose > 1){
421  std::cout << std::endl;
422  std::cout << "TrackInd: " << TrackInd << " tracksToTest: " << tracksToTestSize << std::endl;
423  }
424 
425  for (int i = 0; i < tracksToTestSize; i++){
426  Double_t checkCurv=fCurvAndDipOfCand[TracksToTest[i]].first;
427  Double_t checkDip=fCurvAndDipOfCand[TracksToTest[i]].second;
428  if ((fabs(2*(testCurv - checkCurv)/(testCurv + checkCurv)) < curvDiff) &&
429  (fabs(2*(testDip - checkDip)/(testDip + checkDip )) < dipDiff))
430  {
431  result.push_back(TracksToTest[i]);
432  RemoveTrack(TracksToTest[i], TracksToTest);
433  tracksToTestSize = TracksToTest.size();
434  i--;
435  }
436  }
437  if (fVerbose > 1 && result.size() > 1){
438  std::cout << "Tracks with similar parameters: curv: " << testCurv <<
439  " dip: " << testDip << std::endl;
440  for(size_t j = 0; j < result.size(); j++){
441  fTrackCand[result[j]].Print();
442 
443  }
444  }
445  return result;
446 }
447 
448 std::vector<int> PndRiemannTrackFinder::FindTracksWithSimilarHits(std::vector<int>& TracksToTest,std::vector<PndTrackCand> tempTrCnd, std::vector<int>& tempKillAfter)
449 {
450  std::vector<int> result;
451  std::map<std::pair<unsigned int,unsigned int>, int > hitCount;
452  int TrackInd = TracksToTest[0];
453 
454  PndTrackCand testTrack = tempTrCnd[TrackInd];
455 
456  result.push_back(TrackInd);
457  RemoveTrack(TrackInd, TracksToTest);
458  unsigned int detId, hitId;
459  for (size_t i = 0; i < testTrack.GetNHits(); i++)
460  {
461  detId=testTrack.GetSortedHit(i).GetDetId();
462  hitId=testTrack.GetSortedHit(i).GetHitId();
463  std::pair<unsigned int, unsigned int> hitPair(detId, hitId);
464  hitCount[hitPair] = 1;
465  }
466  int tracksToTestSize = TracksToTest.size();
467  for (int j = 0; j < tracksToTestSize; j++){
468  PndTrackCand myTrack = tempTrCnd[TracksToTest[j]];
469 
470  int NHits = 0;
471  unsigned int myTrackDetId, myTrackHitId;
472  for (size_t k = 0; k < myTrack.GetNHits(); k++){
473  myTrackDetId=myTrack.GetSortedHit(k).GetDetId();
474  myTrackHitId=myTrack.GetSortedHit(k).GetHitId();
475  std::pair<unsigned int, unsigned int> testPair(myTrackDetId, myTrackHitId);
476  if (hitCount[testPair] > 0){
477  hitCount[testPair]++;
478  NHits++;
479  }
480  }
481  if (NHits > 2){
482  result.push_back(TracksToTest[j]);
483  tempKillAfter.push_back(TracksToTest[j]);
484  }
485  }
486  if (fVerbose > 1){
487  std::cout << "Tracks with similar hits: " << std::endl;
488  for (size_t m = 0; m < result.size(); m++){
489  tempTrCnd[result[m]].Print();
490  }
491  }
492  return result;
493 }
494 
495 void PndRiemannTrackFinder::RemoveTrack(int TrackInd, std::vector<int>& TrackList)
496 {
497  int trackListSize = TrackList.size();
498  for(int i = 0; i < trackListSize; i++){
499  if (TrackList[i] == TrackInd){
500  TrackList.erase(TrackList.begin()+i);
501  trackListSize = TrackList.size();
502  }
503  }
504 }
505 
506 bool PndRiemannTrackFinder::TrackExists(std::set<Int_t> hitsInTrack){
507  bool result = true;
508  bool oneNumberEqual = false;
509 
510  //if (fVerbose > 2) std::cout << "TrackExists: fHitsInTrack.size: " << fHitsInTracks.size() << std::endl;
511  unsigned int i = 0;
512  for (i = 0; (i < fHitsInTracks.size()); i++){ //run through tracks in trackList
513  for (std::set<int>::iterator k = hitsInTrack.begin(); (k != hitsInTrack.end()&&(result == true)); k++){ //run through all hits in test track
514  for (std::set<int>::iterator j = fHitsInTracks[i].begin(); (j != fHitsInTracks[i].end()) && (oneNumberEqual == false); j++){ //run through all hits in selected track
515  //if (fVerbose > 2) std::cout << hitsInTrack[k] << " ?= " << fHitsInTracks[i][j] << std::endl;
516  if (*k == *j)
517  oneNumberEqual = true;
518  else oneNumberEqual = false;
519  }
520  result &= oneNumberEqual;
521  oneNumberEqual = false;
522  }
523  if (result == true) {
524  if (fVerbose > 1){
525  std::cout << "Track exists already!" << std::endl;
526  for (std::set<int>::iterator l = fHitsInTracks[i].begin(); l != fHitsInTracks[i].end(); l++)
527  std::cout << " " << *l;
528  std::cout << std::endl;
529  }
530  return true;
531  }
532  result = true;
533  }
534  return false;
535 }
536 
537 double PndRiemannTrackFinder::HitDistance(FairHit* h1, FairHit* h2)
538 {
539  TVector3 vH1, vH2, result;
540  h1->Position(vH1);
541  h2->Position(vH2);
542 
543  result = vH1 -vH2;
544  return result.Mag();
545 }
546 
547 int PndRiemannTrackFinder::HitTooClose(std::set<Int_t> hitsInUse, FairHit* newHit, double threshold)
548 {
549  int i = 0;
550  for (std::set<int>::iterator iter = hitsInUse.begin(); iter != hitsInUse.end(); iter++){
551  i++;
552  FairHit* h1 = fHits[*iter];
553  if (fVerbose > 2) std::cout << "Point Distance: " << HitDistance(h1, newHit) << std::endl;
554  if (fabs(HitDistance(h1, newHit)) < threshold)
555  return i;
556  }
557  return -1;
558 }
559 
560 PndTrackCand PndRiemannTrackFinder::CreateOneTrackCand(std::vector<int> tracks, std::vector<PndTrackCand> tempTrCnd)
561 
562 {
563  PndTrackCand result;
564 
565  std::map<std::pair<unsigned int, unsigned int>, int > hits;
566  for (size_t i = 0; i < tracks.size(); i++){
567  PndTrackCand myTrackCand = tempTrCnd[tracks[i]];
568 
569  unsigned int detId, hitId;
570  for (size_t j = 0; j < myTrackCand.GetNHits(); j++){
571  detId=myTrackCand.GetSortedHit(j).GetDetId();
572  hitId=myTrackCand.GetSortedHit(j).GetHitId();
573  hits[std::pair<unsigned int, unsigned int>(detId, hitId)]++;
574  }
575  }
576  for (std::map<std::pair<unsigned int, unsigned int>, int >::const_iterator it = hits.begin(); it!= hits.end(); it++){
577  std::pair<unsigned int, unsigned int> dethit = it->first;
578  result.AddHit(dethit.first, dethit.second,0);
579  }
580  return result;
581 }
582 
std::vector< std::set< int > > fHitsTooClose
matrix of TrackNr and hits which are too close to one of the three starting points ...
std::vector< std::pair< double, double > > fCurvAndDipOfCand
Curvature and dip of fPndTrackCand.
TVector3 pos
bool CheckSZ(PndRiemannTrack aTrack)
Tests the results of the sz fit.
unsigned int getNumHits()
int HitTooClose(std::set< Int_t > hitsInUse, FairHit *newHit, double threshold)
returns if and which hit was too close to the hit which is tested
Double_t p
Definition: anasim.C:58
int fVerbose
Definition: poormantracks.C:24
double calcSZChi2(PndRiemannHit *hit)
double r
Definition: RiemannTest.C:14
Int_t i
Definition: run_full.C:25
__m128 m
Definition: P4_F32vec4.h:28
double szChi2() const
double fMaxSZChi2
Maximum allowed Chi2 in an sz fit.
std::vector< PndRiemannTrack > fTracks
Resulting Riemann Tracks.
bool TrackExists(std::set< Int_t > hitsInTrack)
PndTransMap * map
Definition: sim_emc_apd.C:99
void FindTracks()
Main function to start the riemann track finding.
std::map< int, FairLink > fMapHitToID
map to convert the list of hits back into a FairLink
std::vector< int > FindTracksWithSimilarParameters(int TrackInd, std::vector< int > &TracksToTest, double curvDiff, double dipDiff)
TLorentzVector s
Definition: Pnd2DStar.C:50
PndTrackCandHit GetSortedHit(UInt_t i)
Definition: PndTrackCand.h:54
std::map< FairLink, int > fMapIDtoHit
map to convert the list of detID/hitID hits into the list of hits for track finding ...
double szDist(PndRiemannHit *hit)
PndTrackCand CreateOneTrackCand(std::vector< int > tracks, std::vector< PndTrackCand > tempTrCnd)
int n
void RemoveTrack(int TrackInd, std::vector< int > &TrackList)
double dist(PndRiemannHit *hit)
std::vector< FairHit * > fHits
Vector of all FairHits used for track finding (fitting)
int fMinNumberOfHits
Minimum number of hits in track necessary for a match.
std::vector< PndTrackCand > fTrackCand
List of track candidates.
double getSZt() const
void AddHits(std::vector< FairHit * > hits, Int_t branchId)
Replaces the existing array of hits with a new one.
std::vector< PndTrackCand > fMergedTrackCand
PndConstField * fMagField
Definition: runSimHF_ptr.C:154
double fDipDiff
TrackMerger parameter.
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
int counter
Definition: ZeeAnalysis.C:59
std::vector< std::set< Int_t > > GetStartTracks()
Double_t
PndMCTrack * track
Definition: anaLmdCluster.C:89
void refit(bool withErrorCalc=true)
double fMaxPlaneDist
Distance cut between new point and riemann plane.
double HitDistance(FairHit *h1, FairHit *h2)
Calculates the distance between two hits.
bool CheckHitInSameSensor(int hit1, int hit2)
Tests if hits in the same sensor are selected.
bool CheckHitDistance(int hit1, int hit2)
Tests if the distance is larger than fMinPointDistance.
friend F32vec4 fabs(const F32vec4 &a)
Definition: P4_F32vec4.h:47
double getSZm() const
double threshold
double r() const
double fMinPointDist
Minimum distance between two points to use them as point for the base plane.
PndRiemannTrack CreateRiemannTrack(std::set< Int_t > aHits)
Creates a PndRiemannTrack from an array of indices of Hits.
bool CheckZeroPassing(std::set< int > hitIds, int hit)
If the track contains (0,0) all points have to go forward or all have to go backward.
TVectorD orig() const
UInt_t GetNHits() const
Definition: PndTrackCand.h:59
ClassImp(PndAnaContFact)
int TrackHits()
Definition: TrackHits.C:8
void szFit(bool withErrorCalc=true)
void addHit(PndRiemannHit &hit)
PndSdsMCPoint * hit
Definition: anasim.C:70
CbmHit * hits[nHits]
Definition: RiemannTest.C:19
double fCurvDiff
TrackMerger parameter.
Int_t GetHitId() const
std::vector< std::set< Int_t > > fHitsInTracks
Vector of indizes which hits where used in which track.
bool CheckRiemannHit(PndRiemannTrack *track, PndRiemannHit *hit)
Int_t GetDetId() const
std::vector< int > FindTracksWithSimilarHits(std::vector< int > &TracksToTest, std::vector< PndTrackCand > tempTrCnd, std::vector< int > &tempKillAfter)
---------—added by me
double fMaxSZDist
Distance cut between s-z coordinate of a new point and the sz-fit of the hits in the track...
bool CheckHitInTrack(std::set< int > hitIds, int hit)
Check if this HitId is used in the track already.