10 #include "TClonesArray.h"
13 #include "FairRunAna.h"
14 #include "FairRootManager.h"
16 #include "FairRuntimeDb.h"
18 #include "FairEventHeader.h"
24 #include "PndMCMatch.h"
25 #include "PndMCEntry.h"
26 #include "PndMCResult.h"
49 FairRuntimeDb*
rtdb = FairRunAna::Instance()->GetRuntimeDb();
50 fSttParameters = (
PndGeoSttPar*) rtdb->getContainer(
"PndGeoSttPar");
55 FairRootManager* ioman = FairRootManager::Instance();
58 cout <<
"-E- PndSttCellTrackFinderAnalysisTask::Init: "
59 <<
"RootManager not instantiated!" << endl;
63 fMCMatch = (PndMCMatch*) ioman->GetObject(
"MCMatch");
67 <<
"-W- PndSttCellTrackFinderAnalysisTask::Init: No MCMatch array! Needed for MC Truth"
72 fEventHeader = (TClonesArray*) ioman->GetObject(
"EventHeader.");
75 <<
"-W- PndSttCellTrackFinderAnalysisTask::Init: No EventHeader array! Needed for EventNumber"
81 fMCTrack = (TClonesArray*) ioman->GetObject(
"MCTrack");
82 fFirstTrackCand = (TClonesArray*) ioman->GetObject(
"FirstTrackCand");
83 fFirstRiemannTrack = (TClonesArray*) ioman->GetObject(
"FirstRiemannTrack");
84 fCombiTrackCand = (TClonesArray*) ioman->GetObject(
"CombiTrackCand");
85 fCombiRiemannTrack = (TClonesArray*) ioman->GetObject(
"CombiRiemannTrack");
86 fSTTHits = (TClonesArray*) ioman->GetObject(
"STTHit");
93 fHistoNumberOfLinks1 =
94 new TH1I(
"fHistoNumberOfLinks1",
95 "Number Of Links Per Track Candidate ; # Links ; # Track Candidates ",
98 fHistoNumberOfTracklets1 =
new TH1I(
"fHistoNumberOfTracklets1",
99 "Number Of Tracklets Per MCTrack; #Tracklets ; # MCTracks ", 20,
102 fHistoNumberOfAssignedHits1 =
new TH1I(
"fHistoNumberOfAssignedHits1",
103 "Ratio Of Assigned And Unassigned STTHits ; ; # Hits ", 2, -0.5,
106 fHistoNumberOfHits1 =
new TH1I(
"fHistoNumberOfHits1",
107 "Number Of Hits Per Tracklet ; # Hits ; # Tracklets ", 40, -0.5,
110 fHistoNumberOfErrors1 =
new TH1I(
"fHistoNumberOfErrors1",
111 "Number Of Errors Per Event ; # Errors ; # Events ", 11, -1.5,
114 fHistoNumberOfLinks2 =
115 new TH1I(
"fHistoNumberOfLinks2",
116 "Number Of Links Per Track Candidate ; # Links ; # Track Candidates ",
119 fHistoNumberOfTracklets2 =
new TH1I(
"fHistoNumberOfTracklets2",
120 "Number Of Tracklets Per MCTrack; # Tracklets ; # MCTracks ", 25,
123 fHistoNumberOfHits2 =
new TH1I(
"fHistoNumberOfHits2",
124 "Number Of Hits Per Tracklet ; # Hits ; # Tracklets ", 40, -0.5,
127 fHistoNumberOfErrors2 =
new TH1I(
"fHistoNumberOfErrors2",
128 "Number Of Errors Per Event ; # Errors ; # Events ", 11, -1.5,
131 fHistoQualityCombi =
new TH1I(
"fHistoQualityCombi",
132 "Quality Of Trackfinding; ; # Tracks", 8, -0.5, 7.5);
134 fHistoQualityFirstStep =
new TH1I(
"fHistoQualityFirstStep",
135 "Quality Of Trackfinding; ; # Tracks", 8, -0.5, 7.5);
137 fHistoMaxHitsOfMCTrack1 =
new TH1I(
"fHistoMaxHitsOfMCTrack1",
138 "Max Number Of Hits At A Stretch Per MCTrack; # Hits; # MCTracks",
141 fHistoMaxHitsOfMCTrack2 =
new TH1I(
"fHistoMaxHitsOfMCTrack2",
142 "Max Number Of Hits At A Stretch Per MCTrack; # Hits; # MCTracks",
145 fHistoNumberOfMissingHits1 =
146 new TH1I(
"fHistoNumberOfMissingHits1",
147 "Amount Of Missing Hits Of Spurious Tracklets; Missing Hits in %; # Tracklets",
150 fHistoNumberOfMissingHits2 =
151 new TH1I(
"fHistoNumberOfMissingHits2",
152 "Amount Of Missing Hits Of Spurious Tracklets; Missing Hits in %; # Tracklets",
156 fHistoQualityFirstStep->GetXaxis()->SetBinLabel(1,
"#MCTracks");
157 fHistoQualityFirstStep->GetXaxis()->SetBinLabel(2,
"#Found in pure");
158 fHistoQualityFirstStep->GetXaxis()->SetBinLabel(3,
"#Found in faulty");
159 fHistoQualityFirstStep->GetXaxis()->SetBinLabel(4,
"#Not Found");
160 fHistoQualityFirstStep->GetXaxis()->SetBinLabel(5,
"#TrackCands");
161 fHistoQualityFirstStep->GetXaxis()->SetBinLabel(6,
"#Spuriuous Cands");
162 fHistoQualityFirstStep->GetXaxis()->SetBinLabel(7,
"#FullyReco Cands");
163 fHistoQualityFirstStep->GetXaxis()->SetBinLabel(8,
"#Ghost Cands");
165 fHistoQualityCombi->GetXaxis()->SetBinLabel(1,
"#MCTracks");
166 fHistoQualityCombi->GetXaxis()->SetBinLabel(2,
"#Found in pure");
167 fHistoQualityCombi->GetXaxis()->SetBinLabel(3,
"#Found in faulty");
168 fHistoQualityCombi->GetXaxis()->SetBinLabel(4,
"#Not Found");
169 fHistoQualityCombi->GetXaxis()->SetBinLabel(5,
"#TrackCands");
170 fHistoQualityCombi->GetXaxis()->SetBinLabel(6,
"#Spuriuous Cands");
171 fHistoQualityCombi->GetXaxis()->SetBinLabel(7,
"#FullyReco Cands");
172 fHistoQualityCombi->GetXaxis()->SetBinLabel(8,
"#Ghost Cands");
174 fHistoNumberOfMissingHits1->GetXaxis()->SetBinLabel(1,
">0");
175 fHistoNumberOfMissingHits1->GetXaxis()->SetBinLabel(2,
">25");
176 fHistoNumberOfMissingHits1->GetXaxis()->SetBinLabel(3,
">50");
177 fHistoNumberOfMissingHits1->GetXaxis()->SetBinLabel(4,
">75");
179 fHistoNumberOfMissingHits2->GetXaxis()->SetBinLabel(1,
">0");
180 fHistoNumberOfMissingHits2->GetXaxis()->SetBinLabel(2,
">25");
181 fHistoNumberOfMissingHits2->GetXaxis()->SetBinLabel(3,
">50");
182 fHistoNumberOfMissingHits2->GetXaxis()->SetBinLabel(4,
">75");
184 fHistoNumberOfHitsMCTrack =
new TH1I(
"fHistoNumberOfHitsMCTrack",
185 "Number Of Hits Per MCTrack; # Hits; # MCTracks", 70, -0.5, 69.5);
187 fCanvas =
new TCanvas();
188 fCanvas->SetName(
"fCanvas");
190 fCanvas->SetCanvasSize(700, 700);
194 <<
"-I- PndSttCellTrackFinderAnalysisTask::Init: Initialization successfull"
205 cout <<
"============= Begin PndSttCellTrackFinderAnalysisTask::Exec"
212 for (
int j = 0; j < fSTTHits->GetEntriesFast(); ++j) {
214 fMapTubeIDToHits[hit->
GetTubeID()].push_back(
215 hit->GetLink(0).GetIndex());
216 fMapHitIndexToTubeID[hit->GetLink(0).GetIndex()] = hit->
GetTubeID();
219 fMCMatch->CreateArtificialStage(
"MCTrack");
221 CheckFirstTracklets();
222 TestRecoQualityFirstStep();
223 CountMaxHitsFirstStep();
225 CheckTrackletCombinations();
226 TestRecoQualityCombi();
234 cout <<
"=== CheckFirstTracklets() ===" << endl;
238 vector<PndTrackCandHit>
hits;
241 FairRootManager* ioman = FairRootManager::Instance();
242 FairEventHeader* myEventHeader = (FairEventHeader*) fEventHeader;
245 PndMCResult myResultCandToMCTrack = fMCMatch->GetMCInfo(
"FirstTrackCand",
247 PndMCResult myResultHitsToMCTrack = fMCMatch->GetMCInfo(
"STTHit",
249 PndMCResult myResultHitToPoint = fMCMatch->GetMCInfo(
"STTHit",
"STTPoint");
251 eventNumber = myEventHeader->GetMCEntryNumber();
254 cout <<
"EventNumber: " << eventNumber << endl;
255 cout <<
"# TrackCand: " << myResultCandToMCTrack.GetNEntries() << endl;
259 map<int, int> trackletsCounter;
260 int assignedHits = 0;
261 int errorCounter = 0;
266 for (
int i = 0;
i < fFirstTrackCand->GetEntriesFast(); ++
i) {
269 for (
int j = 0; j < myResultCandToMCTrack.GetEntry(
i).GetNLinks();
271 trackletsCounter[myResultCandToMCTrack.GetEntry(
i).GetLink(j).GetIndex()] +=
279 FairMultiLinkedData hitLinks = myTrackCand->GetLinksWithType(
280 ioman->GetBranchId(
"STTHit"));
283 assignedHits += hitLinks.GetNLinks();
284 fHistoNumberOfHits1->Fill(hitLinks.GetNLinks());
287 if (myResultCandToMCTrack.GetEntry(
i).GetNLinks() > 1) {
291 numberOfLinks = GetNumLinksOfHits(hitLinks, myResultHitsToMCTrack,
295 fHistoNumberOfLinks1->Fill(numberOfLinks);
297 if (numberOfLinks > 1) {
302 cout <<
"Warning: Found more than one TrackID!" << endl;
304 << myResultCandToMCTrack.GetEntry(
i).GetNLinks()
311 fHistoNumberOfLinks1->Fill(1);
316 map<int, int>::iterator it;
317 for (it = trackletsCounter.begin(); it != trackletsCounter.end(); ++it) {
318 fHistoNumberOfTracklets1->Fill(it->second);
322 for (
int i = 0;
i < assignedHits; ++
i) {
323 fHistoNumberOfAssignedHits1->Fill(
"Assigned", 1);
325 for (
int i = 0;
i < fSTTHits->GetEntriesFast() - assignedHits; ++
i) {
326 fHistoNumberOfAssignedHits1->Fill(
"Unassigned", 1);
330 fHistoNumberOfErrors1->Fill(errorCounter);
341 cout <<
"=== CheckTrackletCombinations() ===" << endl;
344 vector<PndTrackCandHit>
hits;
347 FairRootManager* ioman = FairRootManager::Instance();
348 FairEventHeader* myEventHeader = (FairEventHeader*) fEventHeader;
351 PndMCResult myResultCandToMCTrack = fMCMatch->GetMCInfo(
"CombiTrackCand",
353 PndMCResult myResultHitsToMCTrack = fMCMatch->GetMCInfo(
"STTHit",
355 PndMCResult myResultHitToPoint = fMCMatch->GetMCInfo(
"STTHit",
"STTPoint");
357 eventNumber = myEventHeader->GetMCEntryNumber();
360 cout <<
"EventNumber: " << eventNumber << endl;
361 cout <<
"# TrackCand: " << myResultCandToMCTrack.GetNEntries() << endl;
365 map<int, int> trackletsCounter;
366 int errorCounter = 0;
371 for (
int i = 0;
i < fCombiTrackCand->GetEntriesFast(); ++
i) {
374 for (
int j = 0; j < myResultCandToMCTrack.GetEntry(
i).GetNLinks();
376 trackletsCounter[myResultCandToMCTrack.GetEntry(
i).GetLink(j).GetIndex()] +=
384 FairMultiLinkedData hitLinks = myTrackCand->GetLinksWithType(
385 ioman->GetBranchId(
"STTHit"));
388 fHistoNumberOfHits2->Fill(hitLinks.GetNLinks());
391 if (myResultCandToMCTrack.GetEntry(
i).GetNLinks() > 1) {
394 numberOfLinks = GetNumLinksOfHits(hitLinks, myResultHitsToMCTrack,
398 fHistoNumberOfLinks2->Fill(numberOfLinks);
400 if (numberOfLinks > 1) {
405 cout <<
"Warning: Found more than one TrackID!" << endl;
407 << myResultCandToMCTrack.GetEntry(
i).GetNLinks()
414 fHistoNumberOfLinks2->Fill(1);
419 map<int, int>::iterator it;
420 for (it = trackletsCounter.begin(); it != trackletsCounter.end(); ++it) {
421 fHistoNumberOfTracklets2->Fill(it->second);
425 fHistoNumberOfErrors2->Fill(errorCounter);
434 FairMultiLinkedData& hitLinks, PndMCResult& sttHitsToMCTrack,
435 PndMCResult& sttHitToPoint) {
438 cout <<
"GetNumLinksOfHits()" << endl;
446 set<int> trackIndices;
459 priorHitIndex = hitLinks.GetLink(0).GetIndex();
461 sttHitsToMCTrack.GetEntry(priorHitIndex).GetLink(0).GetIndex();
464 if (hitLinks.GetNLinks() < 2) {
465 return sttHitsToMCTrack.GetEntry(priorHitIndex).GetNLinks();
469 cout <<
"TubeID: " << fMapHitIndexToTubeID[priorHitIndex]
470 <<
", TrackID: " << priorTrackIndex << endl;
473 for (
int j = 1; j < hitLinks.GetNLinks(); ++j) {
476 curLink = hitLinks.GetLink(j);
479 sttHitToPoint.GetEntry(curLink.GetIndex()).GetLink(0).GetIndex();
481 sttHitsToMCTrack.GetEntry(curHitIndex).GetLink(0).GetIndex();
484 cout <<
"TubeID: " << fMapHitIndexToTubeID[curHitIndex]
485 <<
", TrackID: " << curTrackIndex << endl;
488 if (priorTrackIndex != curTrackIndex) {
491 if (fMapTubeIDToHits[fMapHitIndexToTubeID[curHitIndex]].size()
495 tubeID = fMapHitIndexToTubeID[curHitIndex];
498 if (curHitIndex == fMapTubeIDToHits[tubeID].at(0)) {
499 tmpHitIndex = fMapTubeIDToHits[tubeID].at(1);
501 tmpHitIndex = fMapTubeIDToHits[tubeID].at(0);
506 sttHitsToMCTrack.GetEntry(tmpHitIndex).GetLink(0).GetIndex());
508 }
else if (fMapTubeIDToHits[fMapHitIndexToTubeID[priorHitIndex]].size()
512 tubeID = fMapHitIndexToTubeID[priorHitIndex];
515 if (priorHitIndex == fMapTubeIDToHits[tubeID].at(0)) {
516 tmpHitIndex = fMapTubeIDToHits[tubeID].at(1);
518 tmpHitIndex = fMapTubeIDToHits[tubeID].at(0);
523 sttHitsToMCTrack.GetEntry(tmpHitIndex).GetLink(0).GetIndex());
525 trackIndices.insert(curTrackIndex);
529 trackIndices.insert(curTrackIndex);
532 cout <<
"---------> TubeID of faulty hit: "
533 << fMapHitIndexToTubeID[curHitIndex] << endl;
538 trackIndices.insert(curTrackIndex);
542 priorTrackIndex = curTrackIndex;
543 priorHitIndex = curHitIndex;
546 return trackIndices.size();
551 PndMCResult myResultHitToPoint = fMCMatch->GetMCInfo(
"STTHit",
"STTPoint");
557 "STTHits and circle fits for event #"
558 + TString::Itoa(eventNumber, 10));
560 TGraph* graph =
new TGraph();
565 for (
int i = 0;
i < fFirstTrackCand->GetEntriesFast(); ++
i) {
570 FairMultiLinkedData hitLinks = myTrackCand->GetLinksWithType(
571 FairRootManager::Instance()->GetBranchId(
"STTHit"));
574 for (
int j = 0; j < hitLinks.GetNLinks(); ++j) {
577 curHitIndex = hitLinks.GetLink(j).GetIndex();
579 fMapHitIndexToTubeID[curHitIndex]);
584 graph->SetPoint(hitCounter, pos[0], pos[1]);
593 graph->Draw(
"SAMEA*");
594 graph->GetXaxis()->SetLimits(-50, 50);
595 graph->GetYaxis()->SetRangeUser(-50, 50);
603 for (
int i = 0;
i < fFirstRiemannTrack->GetEntriesFast(); ++
i) {
607 r = myRiemannTrack->
r();
608 x = myRiemannTrack->
orig()[0];
609 y = myRiemannTrack->
orig()[1];
612 TArc* circle =
new TArc(x, y, r);
613 circle->SetFillStyle(0);
614 circle->Draw(
"SAME");
618 TLine* xLine =
new TLine(-50, 0, 50, 0);
619 TLine* yLine =
new TLine(0, 50, 0, -50);
625 "Plots/FirstTracklets/Event" + TString::Itoa(eventNumber, 10)
631 PndMCResult myResultHitToPoint = fMCMatch->GetMCInfo(
"STTHit",
"STTPoint");
637 "STTHits and circle fits for event #"
638 + TString::Itoa(eventNumber, 10));
640 TGraph* graph =
new TGraph();
645 for (
int i = 0;
i < fCombiTrackCand->GetEntriesFast(); ++
i) {
650 FairMultiLinkedData hitLinks = myTrackCand->GetLinksWithType(
651 FairRootManager::Instance()->GetBranchId(
"STTHit"));
654 for (
int j = 0; j < hitLinks.GetNLinks(); ++j) {
657 curHitIndex = hitLinks.GetLink(j).GetIndex();
659 fMapHitIndexToTubeID[curHitIndex]);
664 graph->SetPoint(hitCounter, pos[0], pos[1]);
673 graph->Draw(
"SAMEA*");
674 graph->GetXaxis()->SetLimits(-50, 50);
675 graph->GetYaxis()->SetRangeUser(-50, 50);
682 for (
int i = 0;
i < fCombiRiemannTrack->GetEntriesFast(); ++
i) {
686 r = myRiemannTrack->
r();
687 x = myRiemannTrack->
orig()[0];
688 y = myRiemannTrack->
orig()[1];
691 TArc* circle =
new TArc(x, y, r);
692 circle->SetFillStyle(0);
693 circle->Draw(
"SAME");
697 TLine* xLine =
new TLine(-50, 0, 50, 0);
698 TLine* yLine =
new TLine(0, 50, 0, -50);
704 "Plots/Combinations/EventCombi" + TString::Itoa(eventNumber, 10)
710 TCanvas* test =
new TCanvas(
"test",
"Circle");
712 TGraph* circlePoints =
new TGraph();
713 TGraph* linePoints =
new TGraph();
714 int pointCounter = 0;
716 double strawHits[6][2] = { { -1, 2 }, { 0, 3 }, { 1, 2 }, { 2, 3 },
717 { 3, 2 }, { 4, 3 } };
718 double mappedHits[6][2];
721 double refHitX = strawHits[0][0];
722 double refHitY = strawHits[0][1];
724 for (
int i = 0;
i < 6; ++
i) {
726 div = (strawHits[
i][0] - refHitX) * (strawHits[
i][0] - refHitX)
727 + (strawHits[
i][1] - refHitY) * (strawHits[
i][1] - refHitY);
728 mappedHits[
i][0] = (strawHits[
i][0] - refHitX) / div;
729 mappedHits[
i][1] = -(strawHits[
i][1] - refHitY) / div;
730 circlePoints->SetPoint(
i, strawHits[
i][0], strawHits[i][1]);
731 linePoints->SetPoint(i, mappedHits[i][0], mappedHits[i][1]);
734 circlePoints->Draw(
"SAMEA*");
735 circlePoints->GetXaxis()->SetLimits(-2, 5);
736 circlePoints->GetYaxis()->SetRangeUser(-2, 5);
737 linePoints->Draw(
"*");
738 linePoints->SetMarkerColor(2);
740 test->SetCanvasSize(700, 700);
741 test->Print(
"Plots/CircleLine1.pdf",
"pdf");
746 TGraph* pointsOnCircle =
new TGraph();
747 TGraph* pointsOnLine =
new TGraph();
753 double oldPoints[9][2];
754 double mappedPoints[9][2];
759 for (
double y = -1;
y <= 3;
y += 0.5) {
762 radius * radius - ((
y - centerY) * (
y - centerY))) + centerX;
763 oldPoints[pointCounter][1] =
y;
764 pointsOnCircle->SetPoint(pointCounter, oldPoints[pointCounter][0],
765 oldPoints[pointCounter][1]);
770 double errPoint[2] = { -0.5, 3 };
771 pointsOnCircle->SetPoint(pointCounter, errPoint[0], errPoint[1]);
774 double refX = oldPoints[0][0];
775 double refY = oldPoints[0][1];
778 for (
int i = 0;
i < 9; ++
i) {
779 div = (oldPoints[pointCounter][0] - refX)
780 * (oldPoints[pointCounter][0] - refX)
781 + (oldPoints[pointCounter][1] - refY)
782 * (oldPoints[pointCounter][1] - refY);
783 mappedPoints[pointCounter][0] = (oldPoints[pointCounter][0] - refX)
785 mappedPoints[pointCounter][1] = -(oldPoints[pointCounter][1] - refY)
787 pointsOnLine->SetPoint(pointCounter, mappedPoints[pointCounter][0],
788 mappedPoints[pointCounter][1]);
792 double mappedErrPoint[2];
793 mappedErrPoint[0] = (errPoint[0] - refX)
794 / ((errPoint[0] - refX) * (errPoint[0] - refX)
795 + (errPoint[1] - refY) * (errPoint[1] - refY));
796 mappedErrPoint[1] = -(errPoint[1] - refY)
797 / ((errPoint[0] - refX) * (errPoint[0] - refX)
798 + (errPoint[1] - refY) * (errPoint[1] - refY));
799 pointsOnLine->SetPoint(pointCounter, mappedErrPoint[0], mappedErrPoint[1]);
801 pointsOnCircle->Draw(
"A*");
802 pointsOnCircle->GetXaxis()->SetLimits(-2, 4);
803 pointsOnCircle->GetYaxis()->SetRangeUser(-2, 4);
805 TArc* circle2 =
new TArc(centerX, centerY, radius);
806 circle2->SetFillStyle(0);
807 circle2->Draw(
"SAME");
809 pointsOnLine->Draw(
"SAME*");
811 test->Print(
"Plots/CircleLine2.pdf",
"pdf");
817 cout <<
"===TestRecoQualityFirstStep===" << endl;
819 FairRootManager* ioman = FairRootManager::Instance();
821 PndMCResult trackCandToMCTrack = fMCMatch->GetMCInfo(
"FirstTrackCand",
823 PndMCResult MCTrackToSttHits = fMCMatch->GetMCInfo(
"MCTrack",
"STTHit");
826 PndMCResult myResultHitsToMCTrack = fMCMatch->GetMCInfo(
"STTHit",
828 PndMCResult myResultHitToPoint = fMCMatch->GetMCInfo(
"STTHit",
"STTPoint");
833 i < fMCTrack->GetEntries() &&
i < MCTrackToSttHits.GetNEntries();
836 FairMultiLinkedData STTHitsOfMCTrack =
837 MCTrackToSttHits.GetEntry(
i).GetLinksWithType(
838 ioman->GetBranchId(
"STTHit"));
841 if (STTHitsOfMCTrack.GetNLinks() > 1) {
844 fHistoQualityFirstStep->Fill(0);
848 for (
int j = 0; j < trackCandToMCTrack.GetNEntries(); j++) {
852 FairMultiLinkedData STTHitsOfTrackCand =
853 myTrackCand->GetLinksWithType(
854 ioman->GetBranchId(
"STTHit"));
856 if (trackCandToMCTrack.GetEntry(j).GetNLinks() == 1
857 || GetNumLinksOfHits(STTHitsOfTrackCand,
858 myResultHitsToMCTrack, myResultHitToPoint)
862 if (trackCandToMCTrack.GetEntry(j).GetLink(0).GetIndex()
865 fHistoQualityFirstStep->Fill(1);
874 for (
int j = 0; j < trackCandToMCTrack.GetNEntries(); j++) {
878 FairMultiLinkedData STTHitsOfTrackCand =
879 myTrackCand->GetLinksWithType(
880 ioman->GetBranchId(
"STTHit"));
882 if (STTHitsOfTrackCand.GetNLinks() > 1) {
887 k < trackCandToMCTrack.GetEntry(j).GetNLinks();
889 if (trackCandToMCTrack.GetEntry(j).GetLink(k).GetIndex()
892 fHistoQualityFirstStep->Fill(2);
902 fHistoQualityFirstStep->Fill(3);
905 index = STTHitsOfMCTrack.GetLink(0).GetIndex();
906 cout <<
"!!! MCTrack not found, tube: "
907 << fMapHitIndexToTubeID[index] << endl;
916 int candTrackIndex, numMCHits, numTrackHits,
917 numSkewedTubesMC, numSkewedTubesCand, hitIndex;
920 for (
int i = 0;
i < trackCandToMCTrack.GetNEntries();
i++) {
922 fHistoQualityFirstStep->Fill(4);
925 FairMultiLinkedData hitLinks = myTrackCand->GetLinksWithType(
926 ioman->GetBranchId(
"STTHit"));
928 numTrackHits = hitLinks.GetNLinks();
930 if (trackCandToMCTrack.GetEntry(
i).GetNLinks() == 1
931 || GetNumLinksOfHits(hitLinks, myResultHitsToMCTrack,
932 myResultHitToPoint) == 1) {
937 trackCandToMCTrack.GetEntry(
i).GetLink(0).GetIndex();
941 FairMultiLinkedData STTHitsOfMCTrack = MCTrackToSttHits.GetEntry(
942 candTrackIndex).GetLinksWithType(
943 ioman->GetBranchId(
"STTHit"));
945 numMCHits = STTHitsOfMCTrack.GetNLinks();
946 numSkewedTubesMC = 0;
947 numSkewedTubesCand = 0;
950 for (
int j = 0; j < STTHitsOfMCTrack.GetNLinks(); ++j) {
953 hitIndex = STTHitsOfMCTrack.GetLink(j).GetIndex();
956 fMapHitIndexToTubeID[hitIndex]);
964 for (
int j = 0; j < hitLinks.GetNLinks(); ++j) {
967 hitIndex = hitLinks.GetLink(j).GetIndex();
970 fMapHitIndexToTubeID[hitIndex]);
973 ++numSkewedTubesCand;
978 if ((numMCHits - numSkewedTubesMC)
979 == (numTrackHits - numSkewedTubesCand)) {
981 fHistoQualityFirstStep->Fill(6);
983 index = hitLinks.GetLink(0).GetIndex();
984 cout <<
"FULLY RECO: " << fMapHitIndexToTubeID[index]
989 fHistoQualityFirstStep->Fill(5);
992 - (double) (numTrackHits - numSkewedTubesCand)
993 / (numMCHits - numSkewedTubesMC);
996 fHistoNumberOfMissingHits1->Fill(0);
997 }
else if (amount < 0.5) {
998 fHistoNumberOfMissingHits1->Fill(1);
999 }
else if (amount < 0.75) {
1000 fHistoNumberOfMissingHits1->Fill(2);
1002 fHistoNumberOfMissingHits1->Fill(3);
1008 fHistoQualityFirstStep->Fill(7);
1017 cout <<
"=== TestRecoQualityCombi===" << endl;
1019 FairRootManager* ioman = FairRootManager::Instance();
1021 PndMCResult trackCandToMCTrack = fMCMatch->GetMCInfo(
"CombiTrackCand",
1023 PndMCResult MCTrackToSttHits = fMCMatch->GetMCInfo(
"MCTrack",
"STTHit");
1026 PndMCResult myResultHitsToMCTrack = fMCMatch->GetMCInfo(
"STTHit",
1028 PndMCResult myResultHitToPoint = fMCMatch->GetMCInfo(
"STTHit",
"STTPoint");
1033 i < fMCTrack->GetEntries() &&
i < MCTrackToSttHits.GetNEntries();
1037 FairMultiLinkedData STTHitsOfMCTrack =
1038 MCTrackToSttHits.GetEntry(
i).GetLinksWithType(
1039 ioman->GetBranchId(
"STTHit"));
1042 if (STTHitsOfMCTrack.GetNLinks() > 1) {
1045 fHistoQualityCombi->Fill(0);
1046 index = STTHitsOfMCTrack.GetLink(0).GetIndex();
1049 fHistoNumberOfHitsMCTrack->Fill(STTHitsOfMCTrack.GetNLinks());
1052 for (
int j = 0; j < trackCandToMCTrack.GetNEntries(); j++) {
1058 FairMultiLinkedData STTHitsOfTrackCand =
1059 myTrackCand->GetLinksWithType(
1060 ioman->GetBranchId(
"STTHit"));
1063 if (trackCandToMCTrack.GetEntry(j).GetNLinks() == 1
1064 || GetNumLinksOfHits(STTHitsOfTrackCand,
1065 myResultHitsToMCTrack, myResultHitToPoint)
1069 if (trackCandToMCTrack.GetEntry(j).GetLink(0).GetIndex()
1072 fHistoQualityCombi->Fill(1);
1075 if (fFoundMC[
i] !=
true)
1076 cout <<
"FOUND MORE: tube "
1077 << fMapHitIndexToTubeID[index] << endl;
1086 for (
int j = 0; j < trackCandToMCTrack.GetNEntries(); j++) {
1090 FairMultiLinkedData STTHitsOfTrackCand =
1091 myTrackCand->GetLinksWithType(
1092 ioman->GetBranchId(
"STTHit"));
1094 if (STTHitsOfTrackCand.GetNLinks() > 1) {
1099 k < trackCandToMCTrack.GetEntry(j).GetNLinks();
1101 if (trackCandToMCTrack.GetEntry(j).GetLink(k).GetIndex()
1105 fHistoQualityCombi->Fill(2);
1108 if (fFoundMC[
i] !=
true)
1109 cout <<
"FOUND MORE: tube "
1110 << fMapHitIndexToTubeID[index]
1122 fHistoQualityCombi->Fill(3);
1125 cout <<
"!!! MCTrack not found, tube: "
1126 << fMapHitIndexToTubeID[index] << endl;
1128 if (fFoundMC[
i] ==
true)
1129 cout <<
"FOUND LESS: tube " << fMapHitIndexToTubeID[index]
1138 int candTrackIndex, numMCHits, numTrackHits,
1139 numSkewedTubesMC, numSkewedTubesCand, hitIndex;
1142 for (
int i = 0;
i < trackCandToMCTrack.GetNEntries();
i++) {
1144 fHistoQualityCombi->Fill(4);
1147 FairMultiLinkedData hitLinks = myTrackCand->GetLinksWithType(
1148 ioman->GetBranchId(
"STTHit"));
1150 numTrackHits = hitLinks.GetNLinks();
1152 if (trackCandToMCTrack.GetEntry(
i).GetNLinks() == 1
1153 || GetNumLinksOfHits(hitLinks, myResultHitsToMCTrack,
1154 myResultHitToPoint) == 1) {
1159 trackCandToMCTrack.GetEntry(
i).GetLink(0).GetIndex();
1163 FairMultiLinkedData STTHitsOfMCTrack = MCTrackToSttHits.GetEntry(
1164 candTrackIndex).GetLinksWithType(
1165 ioman->GetBranchId(
"STTHit"));
1167 numMCHits = STTHitsOfMCTrack.GetNLinks();
1168 numSkewedTubesMC = 0;
1169 numSkewedTubesCand = 0;
1172 for (
int j = 0; j < STTHitsOfMCTrack.GetNLinks(); ++j) {
1175 hitIndex = STTHitsOfMCTrack.GetLink(j).GetIndex();
1178 fMapHitIndexToTubeID[hitIndex]);
1186 for (
int j = 0; j < hitLinks.GetNLinks(); ++j) {
1189 hitIndex = hitLinks.GetLink(j).GetIndex();
1192 fMapHitIndexToTubeID[hitIndex]);
1195 ++numSkewedTubesCand;
1200 if ((numMCHits - numSkewedTubesMC)
1201 == (numTrackHits - numSkewedTubesCand)) {
1202 fHistoQualityCombi->Fill(6);
1205 index = hitLinks.GetLink(0).GetIndex();
1206 cout <<
"FULLY RECO: " << fMapHitIndexToTubeID[index]
1211 fHistoQualityCombi->Fill(5);
1214 - (double) (numTrackHits - numSkewedTubesCand)
1215 / (numMCHits - numSkewedTubesMC);
1217 if (amount < 0.25) {
1218 fHistoNumberOfMissingHits2->Fill(0);
1219 }
else if (amount < 0.5) {
1220 fHistoNumberOfMissingHits2->Fill(1);
1221 }
else if (amount < 0.75) {
1222 fHistoNumberOfMissingHits2->Fill(2);
1224 fHistoNumberOfMissingHits2->Fill(3);
1230 fHistoQualityCombi->Fill(7);
1239 cout <<
"=== CountMaxHitsFirstStep===" << endl;
1241 FairRootManager* ioman = FairRootManager::Instance();
1243 PndMCResult trackCandToMCTrack = fMCMatch->GetMCInfo(
"FirstTrackCand",
1245 PndMCResult MCTrackToSttHits = fMCMatch->GetMCInfo(
"MCTrack",
"STTHit");
1248 PndMCResult myResultHitsToMCTrack = fMCMatch->GetMCInfo(
"STTHit",
1250 PndMCResult myResultHitToPoint = fMCMatch->GetMCInfo(
"STTHit",
"STTPoint");
1255 i < fMCTrack->GetEntries() &&
i < MCTrackToSttHits.GetNEntries();
1258 FairMultiLinkedData STTHitsOfMCTrack =
1259 MCTrackToSttHits.GetEntry(
i).GetLinksWithType(
1260 ioman->GetBranchId(
"STTHit"));
1263 if (STTHitsOfMCTrack.GetNLinks() > 0) {
1268 for (
int j = 0; j < trackCandToMCTrack.GetNEntries(); j++) {
1273 FairMultiLinkedData STTHitsOfTrackCand =
1274 myTrackCand->GetLinksWithType(
1275 ioman->GetBranchId(
"STTHit"));
1278 if (trackCandToMCTrack.GetEntry(j).GetNLinks() == 1
1279 || GetNumLinksOfHits(STTHitsOfTrackCand,
1280 myResultHitsToMCTrack, myResultHitToPoint)
1284 if (trackCandToMCTrack.GetEntry(j).GetLink(0).GetIndex()
1289 STTHitsOfTrackCand.GetNLinks());
1296 fHistoMaxHitsOfMCTrack1->Fill(maxHits);
1304 cout <<
"=== CountMaxHitsCombi===" << endl;
1306 FairRootManager* ioman = FairRootManager::Instance();
1308 PndMCResult trackCandToMCTrack = fMCMatch->GetMCInfo(
"CombiTrackCand",
1310 PndMCResult MCTrackToSttHits = fMCMatch->GetMCInfo(
"MCTrack",
"STTHit");
1313 PndMCResult myResultHitsToMCTrack = fMCMatch->GetMCInfo(
"STTHit",
1315 PndMCResult myResultHitToPoint = fMCMatch->GetMCInfo(
"STTHit",
"STTPoint");
1320 i < fMCTrack->GetEntries() &&
i < MCTrackToSttHits.GetNEntries();
1323 FairMultiLinkedData STTHitsOfMCTrack =
1324 MCTrackToSttHits.GetEntry(
i).GetLinksWithType(
1325 ioman->GetBranchId(
"STTHit"));
1328 if (STTHitsOfMCTrack.GetNLinks() > 0) {
1333 for (
int j = 0; j < trackCandToMCTrack.GetNEntries(); j++) {
1338 FairMultiLinkedData STTHitsOfTrackCand =
1339 myTrackCand->GetLinksWithType(
1340 ioman->GetBranchId(
"STTHit"));
1343 if (trackCandToMCTrack.GetEntry(j).GetNLinks() == 1
1344 || GetNumLinksOfHits(STTHitsOfTrackCand,
1345 myResultHitsToMCTrack, myResultHitToPoint)
1349 if (trackCandToMCTrack.GetEntry(j).GetLink(0).GetIndex()
1354 STTHitsOfTrackCand.GetNLinks());
1361 fHistoMaxHitsOfMCTrack2->Fill(maxHits);
1368 fMapTubeIDToHits.clear();
1369 fMapHitIndexToTubeID.clear();
1375 fHistoNumberOfLinks1->Write();
1376 fHistoNumberOfTracklets1->Write();
1378 fHistoNumberOfAssignedHits1->Write();
1379 fHistoNumberOfHits1->Write();
1381 fHistoNumberOfHits2->Write();
1382 fHistoNumberOfLinks2->Write();
1383 fHistoNumberOfTracklets2->Write();
1385 fHistoNumberOfErrors1->Write();
1386 fHistoNumberOfErrors2->Write();
1388 fHistoNumberOfHitsMCTrack->Write();
1389 fHistoMaxHitsOfMCTrack1->Write();
1390 fHistoMaxHitsOfMCTrack2->Write();
1392 fHistoQualityFirstStep->Write();
1393 fHistoQualityCombi->Write();
1395 fHistoNumberOfMissingHits1->Write();
1396 fHistoNumberOfMissingHits2->Write();
1400 std::cout <<
"fHistoQualityFirstStep: #Possible Tracks "
1401 << fHistoQualityFirstStep->GetBinContent(1)
1402 <<
" #Found in clean: "
1403 << fHistoQualityFirstStep->GetBinContent(2)
1404 <<
" #Found in faulty: "
1405 << fHistoQualityFirstStep->GetBinContent(3) <<
" #Not Found: "
1406 << fHistoQualityFirstStep->GetBinContent(4) <<
" #TrackCands: "
1407 << fHistoQualityFirstStep->GetBinContent(5) <<
" #Spurious: "
1408 << fHistoQualityFirstStep->GetBinContent(6) <<
" #FullyReco: "
1409 << fHistoQualityFirstStep->GetBinContent(7) <<
" #Ghosts: "
1410 << fHistoQualityFirstStep->GetBinContent(8) << std::endl;
1412 std::cout <<
"fHistoQualityCombi: #Possible Tracks "
1413 << fHistoQualityCombi->GetBinContent(1) <<
" #Found in clean: "
1414 << fHistoQualityCombi->GetBinContent(2) <<
" #Found in faulty: "
1415 << fHistoQualityCombi->GetBinContent(3) <<
" #Not Found: "
1416 << fHistoQualityCombi->GetBinContent(4) <<
" #TrackCands: "
1417 << fHistoQualityCombi->GetBinContent(5) <<
" #Spurious: "
1418 << fHistoQualityCombi->GetBinContent(6) <<
" #FullyReco: "
1419 << fHistoQualityCombi->GetBinContent(7) <<
" #Ghosts: "
1420 << fHistoQualityCombi->GetBinContent(8) << std::endl;
void DrawFirstRiemannPlots(int eventNumber)
void CheckFirstTracklets()
void TestRecoQualityCombi()
static T Sqrt(const T &x)
virtual void FinishEvent()
void CheckTrackletCombinations()
virtual void Exec(Option_t *opt)
int GetNumLinksOfHits(FairMultiLinkedData &hitLinks, PndMCResult &sttHitsToMCTrack, PndMCResult &sttHitToPoint)
TClonesArray * FillTubeArray()
void TestRecoQualityFirstStep()
ClassImp(PndSttCellTrackFinderAnalysisTask)
virtual InitStatus Init()
static T Max(const T &x, const T &y)
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)
void DrawCombiRiemannPlots(int eventNumber)
void CountMaxHitsFirstStep()
virtual void SetParContainers()