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()
virtual InitStatus Init()
static T Max(const T &x, const T &y)
void DrawCombiRiemannPlots(int eventNumber)
void CountMaxHitsFirstStep()
virtual void SetParContainers()