FairRoot/PandaRoot
PndTrackingQA.cxx
Go to the documentation of this file.
1 /*
2  * PndTrackingQA.cxx
3  *
4  * Created on: Aug 23, 2013
5  * Author: stockman
6  */
7 
8 #include <PndTrackingQA.h>
9 #include "PndTrack.h"
10 #include "PndMCTrack.h"
11 #include "FairHit.h"
12 
14 
15 PndTrackingQA::PndTrackingQA (TString trackBranchName, TString idealTrackName, Bool_t pndTrackData):
16  fTrackBranchName(trackBranchName), fIdealTrackName(idealTrackName), fPndTrackOrTrackCand(pndTrackData), fPossibleTrack(0), fCleanFunctor(kFALSE), fNGhosts(0), fUseCorrectedSkewedHits(kFALSE), fVerbose(0)
17 {
18  if(fPossibleTrack == 0){
19  std::cout << "-I- PndTrackingQA::PndTrackingQA no PossibleTrackFunctor given. Taking Standard!" << std::endl;
20  if (trackBranchName == "MVDTrack" ){
22  } else if (trackBranchName == "CombiTrackCand" ) {
24  } else {
26  }
27  fCleanFunctor = kTRUE;
28  }
29 }
30 
31 PndTrackingQA::PndTrackingQA (TString trackBranchName, TString idealTrackName, PndTrackFunctor* posTrack, Bool_t pndTrackData):
32  fTrackBranchName(trackBranchName), fIdealTrackName(idealTrackName), fPndTrackOrTrackCand(pndTrackData), fPossibleTrack(posTrack), fCleanFunctor(kFALSE), fNGhosts(0), fUseCorrectedSkewedHits(kFALSE), fVerbose(0)
33 {
34  if(fPossibleTrack == 0){
35  std::cout << "-I- PndTrackingQA::PndTrackingQA no PossibleTrackFunctor given. Taking Standard!" << std::endl;
36  if (trackBranchName == "MVDTrack" ){
38  } else if (trackBranchName == "CombiTrackCand" ) {
40  } else {
42  }
43  fCleanFunctor = kTRUE;
44  }
45 }
46 
48 {
49  if (fCleanFunctor)
50  delete (fPossibleTrack);
51 }
52 
54 {
55  ioman = FairRootManager::Instance();
56  if (!ioman) {
57  std::cout << "-E- PndTrackingQualityTask::Init: "
58  << "RootManager not instantiated!" << std::endl;
59  return;
60  }
61 
62  fTrack = (TClonesArray*) ioman->GetObject(fTrackBranchName);
63  fMCTrack = (TClonesArray*) ioman->GetObject("MCTrack");
64  fIdealTrack = (TClonesArray*) ioman->GetObject(fIdealTrackName);
65 
66 
67  if (fBranchNames.size() == 0){
68  AddHitsBranchName("MVDHitsPixel");
69  AddHitsBranchName("MVDHitsStrip");
70  AddHitsBranchName("STTHit");
71  AddHitsBranchName("GEMHit");
72  AddHitsBranchName("FTSHit");
73 
74  // if (FairRootManager::Instance()->GetBranchId("CorrectedSkewedHits") > 0){
75  // AddHitsBranchName("CorrectedSkewedHits");
76  // }
77  }
78  if (fVerbose > 0){
79  std::cout << "-I- PndTrackingQA::Init: PossibleTrackFunctor: ";
81  }
82 }
83 
84 void PndTrackingQA::AnalyseEvent(TClonesArray *recoTrackInfo)
85 {
87  if (fVerbose > 2){
88  std::cout << "PndTrackingQA::AnalyseEvent() Track quality map before analysis: " << std::endl << std::endl;
89  PrintTrackQualityMap(kTRUE);
90  }
91 
92  for (Int_t i = 0; i < fTrack->GetEntriesFast(); i++){
93  if (fVerbose > 2){
94  std::cout << "----------------------------------" << std::endl;
95  std::cout << "Analyse Track: " << i << std::endl;
96  }
97  std::map<TString, FairMultiLinkedData> trackInfo;
98 
100  PndTrack* myTrack = (PndTrack*)fTrack->At(i);
101  trackInfo = AnalyseTrackCand(myTrack->GetTrackCandPtr());
102  } else {
103  PndTrackCand* myTrack = (PndTrackCand*)fTrack->At(i);
104  trackInfo = AnalyseTrackCand(myTrack);
105  }
106  Int_t mostProbableTrack = AnalyseTrackInfo(trackInfo, i);
107 
108  if (fVerbose > 1){
109  std::cout << "PndTrackingQA::AnalyseEvent Analyse track: " << i << std::endl;
110  std::cout << "mostProbableTrack " << mostProbableTrack << std::endl;
111  }
112 
113  if (mostProbableTrack == -1) continue;
114 
115  fTrackIdMCId[i] = mostProbableTrack;
116  CalcEfficiencies(mostProbableTrack, trackInfo);
117 
118  if (fMapTrackQualification.count(mostProbableTrack) > 0)
119  fMCTrackFound[mostProbableTrack]++;
120 
121  PndTrackingQualityRecoInfo recoinfo = GetRecoInfoFromRecoTrack(i, mostProbableTrack);
122  int nof_asso_mctracks = trackInfo["AllHits"].GetNLinks();
123  recoinfo.SetNofMCTracks(nof_asso_mctracks);
124  int size = recoTrackInfo->GetEntriesFast();
125  new((*recoTrackInfo)[size]) PndTrackingQualityRecoInfo(recoinfo);
126  }
127 
128  for (std::map<Int_t, Int_t>::iterator iter = fMapTrackQualification.begin(); iter != fMapTrackQualification.end(); iter++) {
129 
130  if (iter->first > -1 && iter->second > 0) {
131  PndMCTrack* mcTrack = (PndMCTrack*) fMCTrack->At(iter->first);
132 
133  if (fPndTrackOrTrackCand) {
134  PndTrack* myTrack = (PndTrack*) fTrack->At(fMCIdTrackId[iter->first]);
135  TVector3 mom(myTrack->GetParamFirst().GetPx(),
136  myTrack->GetParamFirst().GetPy(),
137  myTrack->GetParamFirst().GetPz());
138  TVector3 McMom(mcTrack->GetMomentum());
139 
140  fMapPResolution[iter->first] = (mom.Mag() - McMom.Mag());
141  fMapP[iter->first] = mom;
142  fMapPtResolution[iter->first] = (mom.Pt() - McMom.Pt());
143  fMapPt[iter->first] = mom.Pt();
144  fMapPlResolution[iter->first] = (mom.Pz() - McMom.Pz());
145  fMapPl[iter->first] = mom.Pz();
146  fMapPResolutionRel[iter->first] = (mom.Mag() - McMom.Mag())
147  / McMom.Mag();
148  fMapPtResolutionRel[iter->first] = (mom.Pt() - McMom.Pt())
149  / McMom.Pt();
150  fMapPlResolutionRel[iter->first] = (mom.Pz() - McMom.Pz())
151  / McMom.Pz();
152  }
153  }
154 
155  }
156  if (fVerbose > 2)
157  std::cout << "AnalyseEvent End" << std::endl;
158 }
159 
160 FairMultiLinkedData PndTrackingQA::GetMCInfoForBranch(TString branchName, PndTrackCand* trackCand)
161 {
162  FairMultiLinkedData result;
163  result.SetInsertHistory(kFALSE);
164  //std::cout << "GetMCInforForBranch: " << branchName << std::endl;
165  FairMultiLinkedData linksOfType = trackCand->GetLinksWithType(ioman->GetBranchId(branchName));
166 // std::cout << "GetMCInforForBranch: LinksOfType " << branchName << " : " << linksOfType << std::endl;
167 
168  for (int j = 0; j < linksOfType.GetNLinks(); j++){
169  FairMultiLinkedData_Interface* linkData = (FairMultiLinkedData_Interface*)FairRootManager::Instance()->GetCloneOfLinkData(linksOfType.GetLink(j));
170  //std::cout << "CloneOfLinkData: " << *linkData << std::endl;
171  if (linkData != 0){
172  FairMultiLinkedData linkDataType = linkData->GetLinksWithType(FairRootManager::Instance()->GetBranchId("MCTrack"));
173  linkDataType.SetAllWeights(1.);
174  result.AddLinks(linkDataType);
175  linkData->Delete();
176  }
177  }
178  return result;
179 }
180 
181 std::map<TString, FairMultiLinkedData> PndTrackingQA::AnalyseTrackCand(PndTrackCand* trackCand)
182 {
183  std::map<TString, FairMultiLinkedData> trackInfo;
184 
185  if (fVerbose > 2) {
186  std::cout << "PndTrackingQualityData::AnalyseTrackCand: TrackInfo" << std::endl;
187  std::cout << *trackCand << std::endl;
188  }
189  for (size_t branchIndex = 0; branchIndex < fBranchNames.size(); branchIndex++){
190 // std::cout << "BranchName: " << fBranchNames[branchIndex] << std::endl;
191  trackInfo[fBranchNames[branchIndex]] = GetMCInfoForBranch(fBranchNames[branchIndex], trackCand);
192  trackInfo["AllHits"].AddLinks(trackInfo[fBranchNames[branchIndex]]);
193  }
194  if (fVerbose > 2)
195  PrintTrackInfo(trackInfo);
196  return trackInfo;
197 }
198 
199 Int_t PndTrackingQA::AnalyseTrackInfo(std::map<TString, FairMultiLinkedData>& trackInfo, Int_t trackId)
200 {
201 
202  Int_t mostProbableTrack = -1; //the MCTrack most FairLinks of a TrackCand are pointing to
203  if (fVerbose > 2){
204  std::cout << "PndTrackingQA::AnalyseTrackInfo: NMCLinks: " << trackInfo["AllHits"].GetNLinks() << std::endl;
205  PrintTrackDataSummary(trackInfo["AllHits"]);
206  std::cout << "PndTrackingQA::AnalyseTrackInfo " << trackInfo["AllHits"] << std::endl;
207  }
208 
209  std::vector<FairLink> sortedMCTracks = trackInfo["AllHits"].GetSortedMCTracks();
210 
211  if (sortedMCTracks.size() == 0) return mostProbableTrack; //returns -1; no MCTracks
212 
213  if (sortedMCTracks.size() == 1){
214  mostProbableTrack = sortedMCTracks[0].GetIndex();
215  if (fMCIdIdealTrackId.count(mostProbableTrack) == 0){
216  std::cout << "-W- PndTrackingQA::AnalyseTrackInfo fMCIdIdealTrackId does not contain mostProbableTrack" << mostProbableTrack << std::endl;
217  return -1;
218  }
219  if (!(fMCIdIdealTrackId[mostProbableTrack] < fIdealTrack->GetEntriesFast())){
220  std::cout << "-W- PndTrackingQA::AnalyseTrackInfo fMCIdIdealTrackId the ideal track is not in fIdealTrack. mostProbableTrack:" << mostProbableTrack << " idealTrack " << fMCIdIdealTrackId[mostProbableTrack] << std::endl;
221  return -1;
222  }
223  PndTrackCand* myIdealTrack = ((PndTrack*)fIdealTrack->At(fMCIdIdealTrackId[mostProbableTrack]))->GetTrackCandPtr();
224  Int_t nMCHits = GetSumOfAllValidMCHits(myIdealTrack->GetPointerToLinks()); //get the number of hits which should be found
225 
226  if (nMCHits == sortedMCTracks[0].GetWeight()){
227  fMapTrackQualification[sortedMCTracks[0].GetIndex()] = qualityNumbers::kFullyFound;
228  fMCIdTrackId[mostProbableTrack] = trackId;
229  } else {
230  if (fMapTrackQualification[sortedMCTracks[0].GetIndex()] != qualityNumbers::kFullyFound){
231  fMapTrackQualification[sortedMCTracks[0].GetIndex()] = qualityNumbers::kPartiallyFound;
232  fMCIdTrackId[mostProbableTrack] = trackId;
233  }
234  }
235  } else {
236  Int_t highestCount = sortedMCTracks[0].GetWeight();
237  mostProbableTrack = sortedMCTracks[0].GetIndex();
238  Int_t allCounts = 0;
239  for (size_t i = 0; i < sortedMCTracks.size(); i++){
240  allCounts += sortedMCTracks[i].GetWeight();
241 // if (trackInfo["AllHits"].GetLink(i).GetWeight() > highestCount){
242 // highestCount = trackInfo["AllHits"].GetLink(i).GetWeight();
243 // mostProbableTrack = trackInfo["AllHits"].GetLink(i).GetIndex();
244 // }
245  }
246 
247 
248  if ((Double_t)highestCount/(Double_t)allCounts > 0.7){
249  if (fMapTrackQualification[mostProbableTrack] != qualityNumbers::kFullyFound
252  fMCIdTrackId[mostProbableTrack] = trackId;
253  }
254  }
255  else {
256  fNGhosts++;
257  }
258  }
259  if (fVerbose > 0){
260  for (size_t j = 0; j < sortedMCTracks.size(); j++){
261  FairLink myLink = sortedMCTracks[j];
262  if (fMCIdIdealTrackId.count(myLink.GetIndex()) > 0){
263  PndTrackCand* myIdealTrack = ((PndTrack*)fIdealTrack->At(fMCIdIdealTrackId[myLink.GetIndex()]))->GetTrackCandPtr();
264  if (fVerbose > 1) std::cout << "Ideal Tracking: Track " << myLink.GetIndex() << ": ";
265  if (fVerbose > 1) PrintTrackDataSummary(*myIdealTrack->GetPointerToLinks());
266  } else {
267  std::cout << "Ideal Tracking: Track " << myLink.GetIndex() << " not available" << std::endl;
268  }
269 
270  }
271 // std::cout << "MostProbableTrack: " << mostProbableTrack << " Quality: " << fMapTrackQualification[mostProbableTrack] << std::endl;
272 // std::cout << std::endl;
273  }
274 
275  return mostProbableTrack;
276 }
277 
279 {
280  fMapTrackQualification.clear();
281  fMapTrackMCStatus.clear();
282  fMCIdIdealTrackId.clear();
283 // std::cout << " fIdealTrack.size() " << fIdealTrack->GetEntriesFast() << std::endl;
284  for (int i = 0; i < fIdealTrack->GetEntriesFast(); i++){
285  PndTrackCand* idealTrackCand = ((PndTrack*)fIdealTrack->At(i))->GetTrackCandPtr();
286 // std::cout << i << " : PndTrackingQA::FillMapTrackQualifikation: " << *idealTrackCand << std::endl;
287 
288  PndMCTrack* mcTrack = (PndMCTrack*)fMCTrack->At(idealTrackCand->getMcTrackId());
289 
290 
291  fMCIdIdealTrackId[idealTrackCand->getMcTrackId()] = i;
292  Bool_t primaryTrack = (mcTrack->GetMotherID() < 0);
293  Bool_t atLeastThreeHits = kFALSE;
294  Int_t nHits = 0;
295 // for (int branchIndex = 0; branchIndex < fBranchNames.size(); branchIndex++){
296 // TString branchName = fBranchNames[branchIndex];
297 // nHits += GetNIdealHits(i, branchName);
298 // }
299  nHits += GetNIdealHits(*(idealTrackCand->GetPointerToLinks()), "MVDHitsPixel");
300  nHits += GetNIdealHits(*(idealTrackCand->GetPointerToLinks()), "MVDHitsStrip");
301  nHits += GetNIdealHits(*(idealTrackCand->GetPointerToLinks()), "STTHit");
302  nHits += GetNIdealHits(*(idealTrackCand->GetPointerToLinks()), "GEMHit");
303  nHits += GetNIdealHits(*(idealTrackCand->GetPointerToLinks()), "FTSHit");
304  //std::cout << "FillMapTrackQualifikation: NHits: " << nHits << std::endl;
305 
306  if (nHits > 2) atLeastThreeHits = kTRUE;
307 
308  if (atLeastThreeHits) {
309  if (primaryTrack) {
311  } else {
313  }
314  // std::cout << "AtLeastThreeHits: Track "<< i << " status: " << fMapTrackQualification[i] << std::endl;
315  }
316 
317  else if (primaryTrack){ //No hits for primary track in tracking detectors
319  }
320 
321  PndTrackCand* entry = ((PndTrack*)fIdealTrack->At(i))->GetTrackCandPtr();
322  if ((*fPossibleTrack)((FairMultiLinkedData*)entry->GetPointerToLinks(), primaryTrack))
323  {
324  if (primaryTrack) {
326  } else {
328  }
329  }
330  }
331  if (fVerbose > 1){
332  std::cout << "-I- PndMCTestPatternRecoQuality::FillMapTrackQualifikation:" << std::endl;
333 // PrintTrackQualityMap();
334  }
336 }
337 
338 //Bool_t PndTrackingQA::PossibleTrack(FairMultiLinkedData& mcForward)
339 //{
340 // Bool_t possibleTrack = kFALSE;
341 //
342 // for (int i = 0; i < fBranchNames.size(); i++){
343 // if (fBranchNames[i] == "MVDHitsPixel"){
344 // possibleTrack = possibleTrack | (mcForward.GetLinksWithType(ioman->GetBranchId("MVDHitsPixel")).GetNLinks() +
345 // mcForward.GetLinksWithType(ioman->GetBranchId("MVDHitsStrip")).GetNLinks() > 3);
346 //
347 // }
348 // if (fBranchNames[i] == "STTHit"){
349 // possibleTrack = possibleTrack | mcForward.GetLinksWithType(ioman->GetBranchId("STTHit")).GetNLinks() > 5;
350 // }
351 // }
352 //
353 // return possibleTrack;
354 //}
355 
356 Int_t PndTrackingQA::GetSumOfAllValidMCHits(FairMultiLinkedData* trackData)
357 {
358  Int_t result = 0;
359  for (size_t branchIndex = 0; branchIndex < fBranchNames.size(); branchIndex++){
360  if (fBranchNames[branchIndex] == "GEMHit"){
361  FairMultiLinkedData gemHits = trackData->GetLinksWithType(ioman->GetBranchId("GEMPoint"));
362  result += gemHits.GetNLinks();
363  } else {
364  result += trackData->GetLinksWithType(ioman->GetBranchId(fBranchNames[branchIndex])).GetNLinks();
365  }
366  }
367  return result;
368 }
369 
370 
371 void PndTrackingQA::CalcEfficiencies(Int_t mostProbableTrack, std::map<TString, FairMultiLinkedData>& trackInfo)
372 {
373  if (mostProbableTrack < 0) return;
374  if (fVerbose > 2)
375  std::cout << "PndTrackingQA::CalcEfficiencies() for mostProbableTrack " << mostProbableTrack
376  << " count " << fMCIdIdealTrackId.count(mostProbableTrack) << std::endl;
377  for (size_t branchIndex = 0; branchIndex < fBranchNames.size(); branchIndex++){
378  if (fMCIdIdealTrackId.count(mostProbableTrack) > 0){
379  PndTrackCand* trackCand = ((PndTrack*)fIdealTrack->At(fMCIdIdealTrackId[mostProbableTrack]))->GetTrackCandPtr();
380  if (trackCand == 0) return;
381  Int_t nMcHits = GetNIdealHits(*trackCand->GetPointerToLinks(), fBranchNames[branchIndex]);
382  FairMultiLinkedData foundHits = trackInfo[fBranchNames[branchIndex]];
383  for (int i = 0; i < foundHits.GetNLinks(); i++){
384  if (foundHits.GetLink(i).GetIndex() == mostProbableTrack){
385  Double_t nFoundHits = foundHits.GetLink(i).GetWeight();
386  if ((nFoundHits/nMcHits) > fMapEfficiencies[mostProbableTrack][fBranchNames[branchIndex]].first){
387  std::pair<Double_t, Int_t> result(nFoundHits/nMcHits, nMcHits);
388  fMapEfficiencies[mostProbableTrack][fBranchNames[branchIndex]]=result;
389  }
390  }
391  }
392  }
393  }
394 }
395 
396 //Int_t PndTrackingQA::GetNIdealHits(Int_t trackId, TString branchName)
397 //{
398 // PndMCEntry idealTrack = fIdealTrackCand.GetEntry(trackId);
399 // return GetNIdealHits(idealTrack, branchName);
400 //
401 //}
402 
403 
404 Int_t PndTrackingQA::GetNIdealHits(FairMultiLinkedData& track, TString branchName)
405 {
406  Int_t numberGemHits = 0;
407  if (branchName == "GEMHit"){
408  numberGemHits = track.GetLinksWithType(ioman->GetBranchId("GEMPoint")).GetNLinks();
409  return numberGemHits;
410  }
411  return track.GetLinksWithType(ioman->GetBranchId(branchName)).GetNLinks();
412 }
413 
414 void PndTrackingQA::PrintTrackDataSummary(FairMultiLinkedData& trackData, Bool_t detailedInfo)
415 {
416  if (detailedInfo == kTRUE) std::cout << std::endl;
417  for (size_t branchIndex = 0; branchIndex < fBranchNames.size(); branchIndex++){
418  TString branchName = fBranchNames[branchIndex];
419  if (GetNIdealHits(trackData, branchName) > 0){
420  std::cout << branchName << " " << GetNIdealHits(trackData, branchName);
421  if (detailedInfo == kTRUE){
422  std::cout << " : ";
423  if (trackData.GetLinksWithType(ioman->GetBranchId(branchName)).GetNLinks() > 0)
424  std::cout << trackData.GetLinksWithType(ioman->GetBranchId(branchName));
425  std::cout << std::endl;
426  } else {
427  std::cout << " | ";
428  }
429  }
430  }
431  std::cout << std::endl;
432 }
433 
434 void PndTrackingQA::PrintTrackDataSummaryCompare(FairMultiLinkedData& recoTrackData, FairMultiLinkedData& idealTrackData)
435 {
436  for (size_t branchIndex = 0; branchIndex < fBranchNames.size(); branchIndex++){
437  TString branchName = fBranchNames[branchIndex];
438  std::cout << branchName << " " << GetNIdealHits(recoTrackData, branchName);
439  std::cout << "/" << GetNIdealHits(idealTrackData, branchName);
440  std::cout << " | ";
441  }
442  std::cout << std::endl;
443 }
444 
445 
447 {
448  for (std::map<Int_t, Int_t>::iterator iter = fMapTrackQualification.begin(); iter != fMapTrackQualification.end(); iter++){
449  std::cout << "TrackID: " << iter->first << " MCQuality: " << qualityNumbers::QualityNumberToString(fMapTrackMCStatus[iter->first]) << " Quality: ";
450  if (iter->second < 0)
451  std::cout << " NOT FOUND ";
452  else
453  std::cout << qualityNumbers::QualityNumberToString(iter->second);
454  std::cout << " NFound: " << fMCTrackFound[iter->first];
455  std::cout << " MCData: ";
456  if (fMCIdIdealTrackId.count(iter->first) > 0){
457  PndTrackCand* idealTrackCand = ((PndTrack*)fIdealTrack->At(fMCIdIdealTrackId[iter->first]))->GetTrackCandPtr();
458  if (iter->second < 0)
459  PrintTrackDataSummary(*idealTrackCand->GetPointerToLinks(), detailedInfo);
460  else {
461  PndTrackCand* recoTrackCand = ((PndTrack*)fTrack->At(fMCIdTrackId[iter->first]))->GetTrackCandPtr();
462  if (recoTrackCand != 0 && idealTrackCand != 0)
463  PrintTrackDataSummaryCompare(*recoTrackCand->GetPointerToLinks(), *idealTrackCand->GetPointerToLinks());
464  }
465  }
466  }
467  std::cout << std::endl;
468 }
469 
471 {
472  std::cout << "PrintTrackMCStatusMap: " << std::endl;
473  for (std::map<Int_t, Int_t>::iterator iter = fMapTrackMCStatus.begin(); iter != fMapTrackMCStatus.end(); iter++){
474  std::cout << "TrackID: " << iter->first << " Quality: " << qualityNumbers::QualityNumberToString(iter->second) << " Found: " << fMCTrackFound[iter->first];
475  std::cout << std::endl;
476  }
477  std::cout << std::endl;
478 }
479 
480 
481 void PndTrackingQA::PrintTrackInfo(std::map<TString, FairMultiLinkedData> info)
482 {
483  std::cout << "TrackInfo: (MC-ID/NHits) : ";
484  for (std::map<TString, FairMultiLinkedData>::iterator iter = info.begin(); iter != info.end(); iter++){
485  std::cout << iter->first;
486  for (int i = 0; i < iter->second.GetNLinks(); i++){
487  std::cout << " : (" << iter->second.GetLink(i).GetIndex() << "/" << iter->second.GetLink(i).GetWeight() << ")";
488  }
489  std::cout << " || ";
490  }
491  std::cout << std::endl;
492 }
493 
494 
495 Bool_t PndTrackingQA::IsBetterTrackExisting(Int_t& mcIndex, int quality)
496 {
497  if (fMapTrackQualification.count(mcIndex) == 1){
498  if (fMapTrackQualification[mcIndex] > 0 && fMapTrackQualification[mcIndex] > quality) return true;
499  }
500  return false;
501 }
502 
504 {
505  PndTrackingQualityRecoInfo recoinfo(trackId);
506 
507  // CHECK this can be modified in the future, for now it is ok
508  // mvd pix / mvd str / stt paral / stt skew / gem
509 
510  if (fVerbose > 2)
511  std::cout << "PndTrackingQA::GetRecoInfoFromRecoTrack()" << std::endl;
512 
513  std::map<int, int> noftruehits;
514  std::map<int, int> noffakehits;
515  std::map<int, int> nofmissinghits;
516 
517  for (size_t branchIndex = 0; branchIndex < fBranchNames.size();
518  branchIndex++) {
519  noftruehits.clear();
520  noffakehits.clear();
521  nofmissinghits.clear();
522 
523  // get the reco track...
524  PndTrack *track = (PndTrack*) fTrack->At(trackId);
525  // .. and the track cand
526  PndTrackCand* trackcand = track->GetTrackCandPtr();
527 
528  recoinfo.SetPositionFirst(track->GetParamFirst().GetPosition());
529  recoinfo.SetMomentumFirst(track->GetParamFirst().GetMomentum());
530 
531  recoinfo.SetPositionLast(track->GetParamLast().GetPosition());
532  recoinfo.SetMomentumLast(track->GetParamLast().GetMomentum());
533 
534  recoinfo.SetCharge(track->GetParamFirst().GetQ());
535  recoinfo.SetFlag(track->GetFlag());
536 
537  // get links associated to the reco track
538  FairMultiLinkedData ptrlink = *trackcand->GetPointerToLinks();
539  // get links corresponding to the hits of the specific detector
540  FairMultiLinkedData links = ptrlink.GetLinksWithType(
541  ioman->GetBranchId(fBranchNames[branchIndex]));
542  // get their number
543  Int_t nHits = links.GetNLinks();
544  if (fVerbose > 2){
545  if (nHits > 0)
546  std::cout << "----- reco track " << trackId << " (mc track " << mctrackId<< ") has " << nHits << " from " << fBranchNames[branchIndex] << std::endl;
547  }
548  // get mc track info from each hit
549  for (int ihit = 0; ihit < nHits; ihit++) {
550  FairLink link = links.GetLink(ihit);
551  int assomctrack = -1;
552  // std::cout << "ihit " << ihit << " " << link.GetIndex() << " " << link.GetType() << " " << link.GetWeight() << std::endl;
553  FairHit * hit = (FairHit*) links.GetData(link);
554  if (!hit) {
555  std::cout << "ihit " << ihit << " " << link
556  << " is FAKE" << std::endl;
557  // std::cout << "No Obj Hit" << std::endl;
558 
559  //
560  if (noffakehits.count(branchIndex) > 0)
561  noffakehits[branchIndex]++;
562  else
563  noffakehits[branchIndex] = 1; // if not there
564  continue;
565  }
566 
567  // get links of the hit
568  FairMultiLinkedData hitlink = *hit->GetPointerToLinks();
569  // get the links corresponding to the mc track associated to the hit
570  FairMultiLinkedData mclinks = hitlink.GetLinksWithType(
571  ioman->GetBranchId("MCTrack"));
572  // std::cout << "hit " << ihit << " belongs to " << mclinks.GetNLinks() << " mc tracks" << std::endl;
573  Bool_t isgood = kFALSE;
574  FairMultiLinkedData mvdstrhits = links.GetLinksWithType(
575  FairRootManager::Instance()->GetBranchId("MVDHitsStrip"));
576  FairMultiLinkedData gemhits = links.GetLinksWithType(
577  FairRootManager::Instance()->GetBranchId("GEMHit"));
578  if ((gemhits.GetNLinks() > 0 || mvdstrhits.GetNLinks() > 0) && mclinks.GetNLinks() > 1) {
579  isgood = kFALSE;
580  } else {
581  for (int imctrk = 0; imctrk < mclinks.GetNLinks(); imctrk++) {
582  FairLink mclink = mclinks.GetLink(imctrk);
583  assomctrack = mclink.GetIndex();
584  // std::cout << "imctrk " << imctrk << " " << mclink.GetIndex() << " " << mclink.GetType() << " " << mclink.GetWeight() << std::endl;
585 // std::cout << "ihit " << ihit << " (hitid " << link.GetIndex() << ") belongs to MC track " << assomctrack << std::endl;
586  if (assomctrack == mctrackId)
587  isgood = kTRUE;
588  }
589  }
590 
591  // if true
592  if (isgood == kTRUE) {
593  // if true and already there
594  if (noftruehits.count(branchIndex) > 0)
595  noftruehits[branchIndex]++;
596  else
597  noftruehits[branchIndex] = 1; // if not there
598  } else { // if not
599  if (noffakehits.count(branchIndex) > 0)
600  noffakehits[branchIndex]++;
601  else
602  noffakehits[branchIndex] = 1; // if not there
603  }
604 
605  }
606 
607  // retrieve the ideal track cand associated
608  if (fMCIdIdealTrackId.count(mctrackId) > 0) {
609  int idealtrackid = fMCIdIdealTrackId[mctrackId];
610  PndTrack *idealtrack = (PndTrack*) fIdealTrack->At(idealtrackid);
611  PndTrackCand* idealtrackcand = idealtrack->GetTrackCandPtr();
612 
613  Int_t nMcHits = GetNIdealHits(*idealtrackcand->GetPointerToLinks(),
614  fBranchNames[branchIndex]);
615 
616  nofmissinghits[branchIndex] = nMcHits - noftruehits[branchIndex];
617 
618 // std::cout << "**** ideal track " << idealtrackid << " has " << nMcHits << " from " << fBranchNames[branchIndex] << std::endl;
619 
620  }
621 
622 // std::cout << "===> BRANCH " << fBranchNames[branchIndex] << " of track " << trackId << " (mc track " << mctrackId << ") has " << noftruehits[branchIndex] << " true, " << noffakehits[branchIndex] << " fake and " << nofmissinghits[branchIndex] << " missing hits" << std::endl;
623 
624  if (fBranchNames[branchIndex] == "MVDHitsPixel") {
625  recoinfo.SetNofMvdPixelTrueHits(noftruehits[branchIndex]);
626  recoinfo.SetNofMvdPixelFakeHits(noffakehits[branchIndex]);
627  recoinfo.SetNofMvdPixelMissingHits(nofmissinghits[branchIndex]);
628  } else if (fBranchNames[branchIndex] == "MVDHitsStrip") {
629  recoinfo.SetNofMvdStripTrueHits(noftruehits[branchIndex]);
630  recoinfo.SetNofMvdStripFakeHits(noffakehits[branchIndex]);
631  recoinfo.SetNofMvdStripMissingHits(nofmissinghits[branchIndex]);
632  } else if (fBranchNames[branchIndex] == "STTHit") {
633  recoinfo.SetNofSttTrueHits(noftruehits[branchIndex]);
634  recoinfo.SetNofSttFakeHits(noffakehits[branchIndex]);
635  recoinfo.SetNofSttMissingHits(nofmissinghits[branchIndex]);
636  } else if (fBranchNames[branchIndex] == "GEMHit") {
637  recoinfo.SetNofGemTrueHits(noftruehits[branchIndex]);
638  recoinfo.SetNofGemFakeHits(noffakehits[branchIndex]);
639  recoinfo.SetNofGemMissingHits(nofmissinghits[branchIndex]);
640  } else if (fBranchNames[branchIndex] == "FTSHit") {
641  recoinfo.SetNofFtsTrueHits(noftruehits[branchIndex]);
642  recoinfo.SetNofFtsFakeHits(noffakehits[branchIndex]);
643  recoinfo.SetNofFtsMissingHits(nofmissinghits[branchIndex]);
644  }
645 
646  }
647 
648  recoinfo.SetMCTrackID(mctrackId);
649  return recoinfo;
650 }
651 
void PrintTrackDataSummary(FairMultiLinkedData &trackData, Bool_t detailedInfo=kFALSE)
std::map< Int_t, Int_t > fMapTrackQualification
! TrackId vs TrackStatus after analysis of track finding
virtual void Print()=0
std::map< Int_t, Double_t > fMapPt
int fVerbose
Definition: poormantracks.C:24
virtual Int_t AnalyseTrackInfo(std::map< TString, FairMultiLinkedData > &trackInfo, Int_t trackId)
Bool_t IsBetterTrackExisting(Int_t &mcIndex, int quality)
int getMcTrackId() const
Definition: PndTrackCand.h:60
Bool_t fPndTrackOrTrackCand
Int_t i
Definition: run_full.C:25
std::map< Int_t, Double_t > fMapPlResolution
void AnalyseEvent(TClonesArray *recoTrackInfo)
PndRiemannTrack track
Definition: RiemannTest.C:33
virtual void Init()
static const int kLessThanThreePrim
Definition: PndTrackingQA.h:47
static const int kPossiblePrim
Definition: PndTrackingQA.h:44
static const int kAtLeastThreeSec
Definition: PndTrackingQA.h:45
Int_t GetFlag() const
Definition: PndTrack.h:33
TVector3 GetMomentum() const
Definition: PndMCTrack.h:78
std::map< Int_t, Int_t > fMCIdIdealTrackId
! map between MC id and ideal track id
FairMultiLinkedData GetMCInfoForBranch(TString branchName, PndTrackCand *trackCand)
returns which MCTracks and how often (marked by a FairLink) they were seen by the hits of a PndTrackC...
PndTrackFunctor * fPossibleTrack
static const int kPartiallyFound
Definition: PndTrackingQA.h:60
Double_t mom
Definition: plot_dirc.C:14
void SetNofMCTracks(Int_t nofmctracks)
std::vector< TString > fBranchNames
! branch names of hits taken into account in the analysis (e.g. MVDHitsPixel, STTHit, ...)
std::map< Int_t, TVector3 > fMapP
std::map< Int_t, Double_t > fMapPl
void AddHitsBranchName(TString name)
Adds branch names of detector data which should be taken into account in the analysis.
TClonesArray * fIdealTrack
std::map< Int_t, Double_t > fMapPlResolutionRel
void PrintTrackMCStatusMap()
Int_t GetSumOfAllValidMCHits(FairMultiLinkedData *trackData)
ClassImp(PndTrackingQA)
virtual void CalcEfficiencies(Int_t mostProbableTrack, std::map< TString, FairMultiLinkedData > &trackInfo)
FairRootManager * ioman
static std::string QualityNumberToString(int qNumber)
Definition: PndTrackingQA.h:68
static const int kPossibleSec
Definition: PndTrackingQA.h:43
Bool_t fCleanFunctor
std::map< TString, FairMultiLinkedData > AnalyseTrackCand(PndTrackCand *trackCand)
returns a map which returns the FairLinks to MCTracks grouped by hit ...
TClonesArray * fMCTrack
int nHits
Definition: RiemannTest.C:16
std::map< Int_t, Int_t > fMCTrackFound
! How often was a MC Track (key) found
Double_t
void PrintTrackDataSummaryCompare(FairMultiLinkedData &recoTrackData, FairMultiLinkedData &idealTrackData)
void PrintTrackInfo(std::map< TString, FairMultiLinkedData > info)
static const int kAtLeastThreePrim
Definition: PndTrackingQA.h:46
FairTrackParP GetParamLast()
Definition: PndTrack.h:50
virtual void FillMapTrackQualifikation()
std::map< Int_t, Double_t > fMapPResolution
std::map< Int_t, Double_t > fMapPResolutionRel
PndTrackingQA(TString trackBranchName, TString idealTrackName, Bool_t pndTrackData=kTRUE)
PndTrackingQualityRecoInfo GetRecoInfoFromRecoTrack(Int_t trackId, Int_t mctrackId)
TString fIdealTrackName
std::map< Int_t, Int_t > fMapTrackMCStatus
! TrackId vs TrackStatus from MC
int hit(Int_t nEvents=0, TString inFile="sim.root", TString parFile="par.root", TString inDigi="digi.root", TString outFile="hit.root", Int_t timeBased=0)
Definition: hit.C:1
static const int kFullyFound
Definition: PndTrackingQA.h:61
std::map< Int_t, Double_t > fMapPtResolutionRel
std::map< Int_t, Int_t > fTrackIdMCId
! map between track id and most probable MC track id
std::map< Int_t, Int_t > fMCIdTrackId
! map between MC id and track id
virtual ~PndTrackingQA()
std::map< Int_t, std::map< TString, std::pair< Double_t, Int_t > > > fMapEfficiencies
! MostProbable TrackId, BranchName, Efficiency (#FoundHits / #MCHits), #MCHits
Int_t GetNIdealHits(FairMultiLinkedData &track, TString branchName)
PndTrackCand * GetTrackCandPtr()
Definition: PndTrack.h:48
Int_t GetMotherID() const
Definition: PndMCTrack.h:74
TClonesArray * fTrack
void PrintTrackQualityMap(Bool_t detailedInfo=kFALSE)
std::map< Int_t, Double_t > fMapPtResolution
TString fTrackBranchName
FairTrackParP GetParamFirst()
Definition: PndTrack.h:49
static const int kSpuriousFound
Definition: PndTrackingQA.h:59