FairRoot/PandaRoot
PndForwardTrackFinderTask.cxx
Go to the documentation of this file.
2 
4 
6 
7 }
8 
10 
11 }
12 
14  fIoman = FairRootManager::Instance();
15  //load hits
16  fHits = (TClonesArray*) fIoman->GetObject("FTSHit"); //correct hits
17  //planes
18  planes = fIoman->Register("Planes", "PndTrack","FTS", kTRUE);
19  planesHit = fIoman->Register("PlanesHits", "PndFtsHit","FTS", kTRUE);
20  //tracklets
21  fFirstTrackCandArray = fIoman->Register("FirstTrackCand", "PndTrackCand","FTS", kTRUE);
22  //corrected tracklets
23  correctedTracklets = fIoman->Register("CorrectedTracklets", "PndTrack","FTS", kTRUE);
24  correctedHits = fIoman->Register("CorrectedHits", "PndFtsHit","FTS", kTRUE);
25  //layer tracks
26  fLayerTracks = fIoman->Register("LayerTracks", "PndTrack","FTS", kTRUE);
27  fLayerTracksHits = fIoman->Register("LayerTracksHits", "PndFtsHit","FTS", kTRUE);
28  //global tracks befor and after magnet
29  fGlobalTracks = fIoman->Register("GlobalTracks", "PndTrack","FTS", kTRUE);
30  fGlobalTracksHits = fIoman->Register("GlobalTracksHits", "PndFtsHit","FTS", kTRUE);
31  //final Solution
32  fFinalSolution = fIoman->Register("FinalSolution", "PndTrack","FTS", kTRUE);
33  //track collection
34  fTrackCollection = fIoman->Register("TrackCollection", "PndTrack","FTS", kTRUE);
35  fTrackCollectionHits = fIoman->Register("TrackCollectionHits", "PndFtsHit","FTS", kTRUE);
36  //fill the root-branches array
46 
47  for(int i=0;i<20;i++)dists[i]=0;
48  for(int i=0;i<20;i++)angles[i]=0;
49  return kSUCCESS;
50 }
51 
53  std::cout
54  << ">>>>>>>>>>>>>>====================PndForwardTrackFinderTask::Exec====================<<<<<<<<<<<<<<"
55  << std::endl;
56  std::cout << "EventNumber:" << eventNumber++ << std::endl;
57  //reset the TrackletGenerator
59  //get the hits and add to the TrackletGenerator
60  std::vector<PndFtsHit*> hits;
61  for (int i = 0; i < fHits->GetEntries(); i++) {
62  PndFtsHit* hit = (PndFtsHit*) (fHits->At(i));
63  hit->SetEntryNr(FairLink(-1, fIoman->GetEntryNr(), fIoman->GetBranchId("FTSHit"), i));
64  //hit->SetEntryNr(FairLink(-1, fIoman->GetEntryNr(), fIoman->GetBranchId("FTSHitErr"), i));
65  hits.push_back(hit);
66  fOriginalHits[hit->GetTubeID()]=hit;
67  }
69 
71 
72  //create first track cand
73  map<Int_t, vector<PndTrackCand>> result = fPndFtsCellTrackletGenerator->getTracklets();
74  fFirstTrackCand.clear();
75  for (map<Int_t, vector<PndTrackCand>>::iterator it = result.begin();
76  it != result.end(); it++) {
77  for(size_t i=0;i<it->second.size();i++)
78  fFirstTrackCand.push_back(it->second[i]);
79  }
80 // cout << fFirstTrackCand.size() << " Tracks found " << endl;
81  if(fFirstTrackCand.size() > 100){
82  fFirstTrackCand.clear();
83  result.clear();
84  cout << "Too mutch tracks for reconstruction" << endl;
85  }
86 
87  //save data in root-branch
88  for (size_t i = 0; i < fFirstTrackCand.size(); i++) {
89  new ((*fFirstTrackCandArray)[i]) PndTrackCand(fFirstTrackCand[i]); //PndTrackCand* myCand = //[R.K.03/2017] unused variable
90  }
91 
92  //create expanded track cands
93  map<Int_t, vector<PndFtsExpandedTrackCand>> expandedTrackCands;
94  for (map<Int_t, vector<PndTrackCand>>::iterator it = result.begin();
95  it != result.end(); it++) {
96  vector<PndTrackCand> myCands = it->second;
97  for(size_t i=0;i<myCands.size();i++){
98  PndTrackCand myCand = myCands[i];
100  if(c.getLineApproximations().size()!=0)
101  expandedTrackCands[it->first].push_back(c);
102  }
103  }
104  saveCorrectedTracklets(expandedTrackCands);
105 
106  //combine the expanded track cands
107  fPndTrackCombiner->init(expandedTrackCands);
108  // cout << "----------------------combine module 1" << endl;
109  vector<PndLineApproximation> combined1 = fPndTrackCombiner->combine(0);
110  // cout << "-------------------------combine module 2" << endl;
111  vector<PndLineApproximation> combined2 = fPndTrackCombiner->combine(1);
112  // cout << "-----------------------------combine module 5" << endl;
113  vector<PndLineApproximation> combined5 = fPndTrackCombiner->combine(4);
114  // cout << "-------------------------------combine module 6" << endl;
115  vector<PndLineApproximation> combined6 = fPndTrackCombiner->combine(5);
116 
119  // cout << "save layer tracks " << endl;
120  saveCombined(combined1,0,fIoman->GetBranchId("LayerTracksHits"),kFALSE);
121  saveCombined(combined2,0,fIoman->GetBranchId("LayerTracksHits"),kFALSE);
122  saveCombined(combined5,0,fIoman->GetBranchId("LayerTracksHits"),kFALSE);
123  saveCombined(combined6,0,fIoman->GetBranchId("LayerTracksHits"),kFALSE);
124 
125  vector<PndLineApproximation> m12 = fModuleCombiner->combineModules(combined1,combined2);
126  vector<PndLineApproximation> m56 = fModuleCombiner->combineModules(combined5,combined6);
127 
128  //way follower
129  fWayFollower->init(m12,expandedTrackCands);
130  vector<PndTrackCollection> ptc = fWayFollower->followLines(8);
131 
132  //createStatictcs(ptc,m56);
133 
135  fModuleCombiner->addUnusedHits(hits,ptc);
136  saveTrackCollection(ptc,kFALSE);
137 
138  //save
141  // cout << "save global " << endl;
142  saveCombined(m12,2,fIoman->GetBranchId("GlobalTracksHits"),kFALSE);
143  // cout << "save final solution" << endl;
144  saveTrackCollection(ptc,kTRUE);
145 
146 
147 }
149  fFirstTrackCandArray->Delete();
150  fLayerTracks->Delete();
151  correctedHits->Delete();
152  correctedTracklets->Delete();
153  fLayerTracksHits->Delete();
154  fGlobalTracks->Delete();
155  fGlobalTracksHits->Delete();
156  planes->Delete();
157  planesHit->Delete();
158  fTrackCollection->Delete();
159  fTrackCollectionHits->Delete();
160  fFinalSolution->Delete();
161 }
162 
164 // cout << "Dists:" << endl;
165 // for(int i=0;i<20;i++)
166 // cout << dists[i] <<";";
167 // cout << endl <<"Angles:" << endl;
168 // for(int i=0;i<20;i++)
169 // cout << angles[i] <<";";
170 }
171 
172 void PndForwardTrackFinderTask::saveCombined(vector<PndLineApproximation> combined,Int_t branch,Int_t branchID,Bool_t useOrgHits){
173  if (branchID == -1) {
174  std::cout << "PndForwardTrackFinderTask::saveCombined branchID == -1" << std::endl;
175  }
176  TVector3 v(1, 1, 1);
177  for (size_t i = 0; i < combined.size(); i++) {
178  PndLineApproximation l = combined[i];
179  PndLine l2 = l.getLine();
180  PndTrackCand c;
181  FairTrackParP tp1(v, v, v, v, 1, v, v, v);
182  FairTrackParP tp2(l2.getP1(), 3 * l2.getDir().Unit(), v, v, 1, v, v, v);
183  for (size_t j = 0; j < l.getHits().size(); j++) {
184  PndFtsHit* hit = l.getHits()[j];
185  if(!useOrgHits){
186  hit->SetEntryNr(FairLink(-1, fIoman->GetEntryNr(),branchID, combinedTracksHitNum));
187  new ((*(rootBranches[branch+1]))[combinedTracksHitNum++]) PndFtsHit(*hit); //PndFtsHit* myHit = //[R.K.03/2017] unused variable
188  } else {
189  hit = fOriginalHits[hit->GetTubeID()];
190  }
191  c.AddHit(hit->GetEntryNr(), j);
192  }
193  new ((*(rootBranches[branch]))[combinedTracksTrackNum++]) PndTrack(tp1, tp2, c); //PndTrack* myCand = //[R.K.03/2017] unused variable
194  }
195 }
196 
197 void PndForwardTrackFinderTask::saveCorrectedTracklets(map<Int_t, vector<PndFtsExpandedTrackCand>> res){
198  Int_t trackNum = 0;
199  Int_t hitNum= 0;
200  for (map<Int_t, vector<PndFtsExpandedTrackCand>>::iterator it = res.begin();it != res.end(); it++) {
201  vector<PndFtsExpandedTrackCand> etc = it->second;
202  for(size_t i=0;i<etc.size();i++){
203  PndFtsExpandedTrackCand cand = etc[i];
204  vector<PndLineApproximation> approxs = cand.getLineApproximations();
205  for(size_t j=0;j<approxs.size();j++){
206  PndLineApproximation approx = approxs[j];
207  PndTrackCand trackCand;
208  for (size_t k = 0; k < approx.getHits().size(); k++) {
209  PndFtsHit* hit = approx.getHits()[k];
210  hit->SetEntryNr(FairLink(-1, fIoman->GetEntryNr(),fIoman->GetBranchId("CorrectedHits"),hitNum));
211  new ((*correctedHits)[hitNum++]) PndFtsHit(*hit);//PndFtsHit* myHit = //[R.K.03/2017] unused variable
212  trackCand.AddHit(hit->GetEntryNr(), k);
213  }
214  TVector3 v(1, 1, 1);
215  FairTrackParP tp1(approx.getLine().getP1(),
216  3 * approx.getLine().getDir().Unit(), v, v, 1, v, v, v);
217  FairTrackParP tp2(v, 2 * v, v, v, 1, v, v, v);
218  //PndTrack* myCand =
219  new ((*correctedTracklets)[trackNum++]) PndTrack(tp1, tp2, trackCand);
220 // std::cout << "PndForwardTrackFinderTask::saveCorrectedTracklets myCand: " << *myCand << std::endl;
221  }
222  }
223  }
224 }
225 
226 void PndForwardTrackFinderTask::saveTrackCollection(vector<PndTrackCollection> coll,Bool_t withOrgHits){
227  Int_t trackNum = 0;
228  Int_t hitNum = 0;
229  TVector3 v(1, 1, 1);
230  for(size_t k=0;k<coll.size();k++){
231  PndTrackCollection c = coll[k];
232  if(withOrgHits){
233  new ((*fFinalSolution)[trackNum++]) PndTrack(c.getPndTrack(fOriginalHits));//PndTrack* myCand = //[R.K.03/2017] unused variable
234  } else {
235  vector<PndLineApproximation> *approx = c.getLines();
236  for(size_t i=0;i<approx->size();i++){
237  PndLineApproximation a = (*approx)[i];
238  PndTrackCand trackCand;
239  for(size_t j=0;j<a.getHits().size();j++){
240  PndFtsHit* hit = a.getHits()[j];
241  hit->SetEntryNr(FairLink(-1, fIoman->GetEntryNr(),fIoman->GetBranchId("TrackCollectionHits"),hitNum));
242  new ((*fTrackCollectionHits)[hitNum++]) PndFtsHit(*hit);//PndFtsHit* myHit = //[R.K.03/2017] unused variable
243  trackCand.AddHit(hit->GetEntryNr(), j);
244  }
245  FairTrackParP tp1(a.getLine().getP1(),3 * a.getLine().getDir().Unit(), v, v, 1, v, v, v);
246  FairTrackParP tp2(v, 2 * v, v, v, 1, v, v, v);
247  new ((*fTrackCollection)[trackNum++]) PndTrack(tp1, tp2, trackCand);//PndTrack* myCand = //[R.K.03/2017] unused variable
248  }
249  FairTrackParP tp1(c.getCurrLine().getP1(),3 * c.getCurrLine().getDir().Unit(), v, v, 1, v, v, v);
250  FairTrackParP tp2(v, 2 * v, v, v, 1, v, v, v);
251  PndTrackCand trackCand;
252  new ((*fTrackCollection)[trackNum++]) PndTrack(tp1, tp2, trackCand);//PndTrack* myCand = //[R.K.03/2017] unused variable
253  }
254  }
255 }
256 
257 void PndForwardTrackFinderTask::createStatictcs(vector<PndTrackCollection> c,vector<PndLineApproximation> a){
258  PndFtsLineComparator comparator(0,0);
259  for(size_t i=0;i<c.size();i++){
260  PndTrackCollection coll = c[i];
261  PndLineApproximation appr = getBest(coll,a);
262  if(appr.getLine().getRating()==-1) continue;
263  PndLine l1 = coll.getLastLine();
264  PndLine l2 = appr.getLine();
265  comparator.setZValue((l1.getP1()[2]+l2.getP1()[2])/2);
266  Double_t dist = comparator.getDist2D(l1.getP1(),l2.getP1(),l1.getDir(),l2.getDir());
267  Double_t angle = comparator.getAngle2D(l1.getDir(),l2.getDir());
268 // cout << "Dist=" << (Int_t)(dist/5) << endl;
269 // cout << "Angle=" << (Int_t)(angle/5) << endl;;
270  if(dist>=100) dists[19]++;
271  else dists[(Int_t)(dist/5)]++;
272  if(angle>=100) angles[19]++;
273  else angles[(Int_t)(angle/5)]++;
274  }
275 }
276 
278  Int_t mc = getMcId(c.getHits());
279  for(size_t i=0;i<a.size();i++){
280  Int_t mc2 = getMcId(a[i].getHits());
281  if(mc==mc2) return a[i];
282  }
284  appr.getLine().setRating(-1);
285  return appr;
286 }
287 
288 Int_t PndForwardTrackFinderTask::getMcId(vector<PndFtsHit*> hits){
289  Int_t mcTrackBranchId = fIoman->GetBranchId("MCTrack");
290  vector<Int_t> trackIDs;
291  for(size_t i=0;i<hits.size();i++){
292  PndFtsHit* hit = fOriginalHits[hits[i]->GetTubeID()];
293  FairLink link = hit->GetEntryNr();
294  PndFtsPoint* p = (PndFtsPoint*) fIoman->GetCloneOfLinkData(link);
295  FairMultiLinkedData mld = p->GetLinksWithType(mcTrackBranchId);
296  FairLink linksToMc = mld.GetLink(0);
297  int trackID = linksToMc.GetIndex();
298  trackIDs.push_back(trackID);
299  }
300  Int_t maxID = 0;
301  Int_t maxVal = -1;
302  map<Int_t,Int_t> m;
303  for(size_t i=0;i<trackIDs.size();i++){
304  m[trackIDs[i]]++;
305  if(m[trackIDs[i]] > maxVal){
306  maxVal = m[trackIDs[i]];
307  maxID = trackIDs[i];
308  }
309  }
310  return maxID;
311 }
vector< PndFtsHit * > getHits()
void setHits(std::vector< PndFtsHit * > hits)
Double_t p
Definition: anasim.C:58
Double_t getDist2D(TVector3 b1, TVector3 b2, TVector3 d1, TVector3 d2)
Int_t res
Definition: anadigi.C:166
Int_t i
Definition: run_full.C:25
__m128 m
Definition: P4_F32vec4.h:28
PndTransMap * map
Definition: sim_emc_apd.C:99
map< Int_t, vector< PndTrackCand > > getTracklets()
void createStatictcs(vector< PndTrackCollection > c, vector< PndLineApproximation > a)
TVector3 getDir()
Definition: PndLine.h:34
__m128 v
Definition: P4_F32vec4.h:4
Int_t GetTubeID() const
Definition: PndFtsHit.h:70
void init(vector< PndLineApproximation > b, map< Int_t, vector< PndFtsExpandedTrackCand >> c)
void setZValue(Double_t z)
PndFtsExpandedTrackCand createExpandedTrackCand(PndTrackCand &cand)
void addUnusedHits(vector< PndFtsHit * > hits, vector< PndTrackCollection > &c)
Int_t a
Definition: anaLmdDigi.C:126
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
Double_t getAngle2D(TVector3 d1, TVector3 d2)
vector< PndTrackCollection > followLines(Int_t begin)
Double_t
std::vector< PndTrackCand > fFirstTrackCand
void setRating(Int_t r)
Definition: PndLine.h:44
void saveTrackCollection(vector< PndTrackCollection > coll, Bool_t withOrgHits)
PndFtsLineApproximator * fPndFtsLineApproximator
vector< PndLineApproximation > getLineApproximations()
vector< PndLineApproximation > combineModules(vector< PndLineApproximation > m1, vector< PndLineApproximation > m2)
Int_t getMcId(vector< PndFtsHit * > hits)
Int_t getRating()
Definition: PndLine.h:42
void saveCombined(vector< PndLineApproximation > combined, Int_t branch, Int_t branchID, Bool_t useOrgHits)
map< Int_t, PndFtsHit * > fOriginalHits
vector< PndLineApproximation > * getLines()
void init(map< Int_t, vector< PndFtsExpandedTrackCand >> c)
vector< PndLineApproximation > combine(Int_t bigLayer)
PndTrack getPndTrack(map< Int_t, PndFtsHit * > orgHits)
ClassImp(PndAnaContFact)
void saveCorrectedTracklets(map< Int_t, vector< PndFtsExpandedTrackCand >>)
PndSdsMCPoint * hit
Definition: anasim.C:70
CbmHit * hits[nHits]
Definition: RiemannTest.C:19
vector< PndFtsHit * > getHits()
Double_t angle
virtual void Exec(Option_t *opt)
PndFtsCellTrackletGenerator * fPndFtsCellTrackletGenerator
PndLineApproximation getBest(PndTrackCollection &c, vector< PndLineApproximation > a)
TVector3 getP1()
Definition: PndLine.h:32