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