12 #include "FairRootManager.h" 
   13 #include "FairRunAna.h" 
   14 #include "FairRuntimeDb.h" 
   18 #include "TClonesArray.h" 
   19 #include "TObjArray.h" 
   21 #include "TGeoManager.h" 
   25 #include "FairTrackParam.h" 
   61 using std::setprecision;
 
   68   for ( Int_t idet = 0 ; idet < 4 ; idet++ ) {
 
  112   for ( Int_t idet = 0 ; idet < 4 ; idet++ ) {
 
  153   for ( Int_t idet = 0 ; idet < 4 ; idet++ ) {
 
  215     cout << 
"=============== EVENT " << 
fTNofEvents << 
" =================" << endl;
 
  223   for ( Int_t idet = 0 ; idet < 4 ; idet++ ) {
 
  224     firstDH[idet] = nofHits;
 
  226       nofHits += 
fHitArray[idet]->GetEntriesFast();
 
  228       for ( Int_t ihit = firstDH[idet] ; ihit < nofHits ; ihit++ ) { 
 
  234   std::vector<Bool_t> hitUsed(
fHitDetId.size(),kFALSE);
 
  246     fCanvas->Range(minX,minY,maxX,maxY);
 
  255     TLine* horLft = 
new TLine(-5., 0.,-2., 0.);  horLft->SetLineWidth(2);  horLft->Draw();
 
  256     TLine* horRgt = 
new TLine( 2., 0., 5., 0.);  horRgt->SetLineWidth(2);  horRgt->Draw();
 
  257     TLine* verTop = 
new TLine( 0., 2., 0., 5.);  verTop->SetLineWidth(2);  verTop->Draw();
 
  258     TLine* verBot = 
new TLine( 0.,-5., 0.,-2.);  verBot->SetLineWidth(2);  verBot->Draw();
 
  259     for ( Int_t xline = -100 ; xline <= 100 ; xline+=10 ) {
 
  260       TLine* verGrid = 
new TLine(xline,-100,xline,100);
 
  261       verGrid->SetLineStyle(2);
 
  264     for ( Int_t yline = -100 ; yline <= 100 ; yline+=10 ) {
 
  265       TLine* horGrid = 
new TLine(-100,yline,100,yline);
 
  266       horGrid->SetLineStyle(2);
 
  270     for ( Int_t iell = 0 ; iell < 1000 ; iell++ ) {
 
  279     for ( Int_t ihit = 0 ; ihit < nofHits ; ihit++ ) {
 
  283         TMarker* marker = 
new TMarker(detHit->GetX(),detHit->GetY(),20);
 
  284         marker->SetMarkerColor(3);
 
  289         Int_t iTube = ((
PndSttHit*)detHit)->GetTubeID(); 
 
  300         TEllipse* ellipse = 
new TEllipse(detHit->GetX(),detHit->GetY(),((
PndSttHit*)detHit)->GetIsochrone());
 
  301         ellipse->SetFillStyle(0);
 
  302         ellipse->SetLineWidth(2);
 
  303         ellipse->SetLineColor(2);
 
  308         TMarker* marker = 
new TMarker(detHit->GetX(),detHit->GetY(),20);
 
  309         marker->SetMarkerColor(6);
 
  317     gSystem->Sleep(1000);
 
  323   for ( Int_t ihit = 0 ; ihit < nofHits ; ihit++ ) {
 
  325     hitN = (hitN+gRandom->Integer(nofHits))%nofHits;
 
  327       if ( hitUsed[hitN] == kFALSE ) 
break;
 
  328       hitN = (hitN+1)%nofHits;
 
  330     hitUsed[hitN] = kTRUE;
 
  343       cout << 
"--------------------------------------------------------" << endl;
 
  345            << detHit->GetX() << 
" " << detHit->GetY() << 
" " << detHit->GetZ() 
 
  346            << 
"    error " << detHit->GetDx() << 
" " << detHit->GetDy() << 
" " << detHit->GetDz() << endl;
 
  352     Bool_t skewedSttHit = kFALSE;
 
  355       Int_t iTube = ((
PndSttHit*)detHit)->GetTubeID(); 
 
  362       if (sttTube == 
nullptr)
 
  363           std::cout << 
"-E- PndBarrelTrackFinder::Exec no sttTube " << iTube << std::endl;
 
  365         skewedSttHit = kTRUE;
 
  367           cout << 
"SKEWED HIT" << endl;
 
  371     Bool_t hitBelongsToKnownTrack = kFALSE;
 
  372     for ( 
size_t itr = 0 ; itr < 
fTracksVector.size() ; itr++ ) {
 
  378     if ( hitBelongsToKnownTrack ) 
continue;
 
  380     if ( skewedSttHit ) {
 
  385     Bool_t hitMatchedToHit = kFALSE;
 
  387       cout << 
"TRYING TO MATCH TO PREVIOUS " << 
fHitVector.size() << 
" HITS" << endl;
 
  388     for ( Int_t ihitP = 
fHitVector.size()-1 ; ihitP >= 0 ; ihitP-- ) {
 
  391     if ( hitMatchedToHit ) 
continue;
 
  401     gSystem->Sleep(1000);
 
  411     fStageDesc->SetText(-50.,50.,
"SHORT TRACKS REMOVED");
 
  415     gSystem->Sleep(1000);
 
  419   for ( Int_t iuh = 
fHitVector.size()-1 ; iuh >= 0 ; iuh-- ) {
 
  421       cout << 
"PREVIOUS HIT " << iuh << 
" out of " << 
fHitVector.size() << endl;
 
  423     Bool_t skewedSttHit = kFALSE;
 
  434         skewedSttHit = kTRUE;
 
  438     Bool_t hitBelongsToKnownTrack = kFALSE;
 
  439     for ( 
size_t itr = 0 ; itr < 
fTracksVector.size() ; itr++ ) {
 
  446     if ( hitBelongsToKnownTrack ) {
 
  466     fStageDesc->SetText(-50.,50.,
"TRACKS REORGANIZED");
 
  470     gSystem->Sleep(1000);
 
  479     fStageDesc->SetText(-50.,50.,
"CLONE TRACKS REMOVED");
 
  483     gSystem->Sleep(5000);
 
  504   if ( thisHit ) cout << detId << 
"." << hitNo << 
" to " << trackNo << endl;
 
  511   for ( 
size_t ihitP = 0 ; ihitP < 
fTracksVector[trackNo].trackHitD.size() ; ihitP++ ) {
 
  522   Bool_t printInfo = kFALSE;
 
  527   Int_t iTube = ((
PndSttHit*)thisHit)->GetTubeID(); 
 
  551     cout << 
"matching to track " << trackNo << 
" with " << 
fTracksVector[trackNo].trackHits.size() << 
" hits" << endl;
 
  553   Bool_t trackFits = kFALSE;
 
  563   if ( nofReg==0 ) 
return kFALSE;
 
  566     cout << 
" --> connects to "   << trackNo << 
" with ("  
  568          << meanCirc[2] << 
" " 
  570       for ( Int_t ireg = 0 ; ireg < nofReg ; ireg++ ) 
 
  571         cout << intReg[ireg] << 
"   " << flush;
 
  577     for ( Int_t ireg = 0 ; ireg < nofReg ; ireg++ ) {
 
  582       tp0.
z_p = intReg[ireg];
 
  586         cout << 
"creating another trackPar to track " << trackNo << 
" with z_p -> " << intReg[ireg] << endl;
 
  597     for ( Int_t ireg = 0 ; ireg < nofReg ; ireg++ ) {
 
  603     if ( !trackFits ) 
return kFALSE;
 
  616   Bool_t hitBelongsToTrack = kFALSE;
 
  618   Double_t sH1[3] = {thisHit->GetX(),thisHit->GetY(),0.};
 
  619   sH1[2] = ((
PndSttHit*)thisHit)->GetIsochrone();
 
  636       hitBelongsToTrack = kTRUE;
 
  637     if ( !hitBelongsToTrack ) 
return kFALSE;
 
  645       cout << 
"this stt hit belongs to track " << trackNo << 
" (cause dist = " << 
FindCircDist(circPar,sH1) << 
")" << endl;
 
  649     for ( 
size_t ipar = 0 ; ipar < 
fTracksVector[trackNo].trackPars.size() ; ipar++ ) {
 
  657         cout << 
" ..... to parameter (" << trackNo << 
"." << ipar << 
") " << 
CalcPhi(circPar[0],circPar[1]) << 
" " << circPar[2] << 
": distance is " << 
FindCircDist(sH1,circPar) << flush;
 
  662         hitBelongsToTrack = kTRUE;
 
  667           cout << 
" par: " << 
CalcPhi(circPar[0],circPar[1]) << 
" | " << circPar[2] << 
" of track " << trackNo 
 
  668                << 
" matches to this hit with dist " << 
FindCircDist(sH1,circPar) << endl;
 
  671     if ( !hitBelongsToTrack ) 
return kFALSE;
 
  674     for ( 
size_t ihitP = 0 ; ihitP < 
fTracksVector[trackNo].trackHitD.size() ; ihitP++ ) {
 
  682       if ( sH2[2] < 1.e-5 ) stepCno += 2; 
 
  684       for ( Int_t icirc = 0 ; icirc < 4 ; icirc += stepCno ) {
 
  686           if ( circPar[2] < 10. || circPar[2] > 100000. ) 
continue; 
 
  689           if ( sH2[2] < 1.e-5 ) newParZ_P = 
CalcZ_P(circPar,sH2[0],sH2[1],
fTracksVector[trackNo].trackHits[ihitP]->GetZ());
 
  691           Int_t nofCloseHits = 2;
 
  692           for ( 
size_t ihitF = 0 ; ihitF < 
fTracksVector[trackNo].trackHitD.size() ; ihitF++ ) {
 
  693             if ( ihitF == ihitP ) 
continue;
 
  708             cout << 
"there are " << nofCloseHits << 
" with limit set to " << 0.6*
fTracksVector[trackNo].trackHits.size() << 
" (0.6*" << 
fTracksVector[trackNo].trackHits.size() << 
")" << endl;
 
  709           if ( nofCloseHits < 0.6*
fTracksVector[trackNo].trackHits.size() ) 
continue; 
 
  716           tp0.
n   = nofCloseHits;
 
  730       cout << 
"HIT DOES " << (hitBelongsToTrack?
"":
"NOT ") << 
"BELONG TO TRACK " << trackNo << 
" WITH " 
  731            << 
fTracksVector[trackNo].trackHits.size() << 
" HITS, " << 
fTracksVector[trackNo].trackPars.size() << 
" PARS: phi,rad,z_p,n: " << endl;
 
  732       for ( 
size_t ipar = 0 ; ipar < 
fTracksVector[trackNo].trackPars.size() ; ipar++ ) 
 
  736              << 
fTracksVector[trackNo].trackPars[ipar].n << 
"  |  " << flush;
 
  749   Bool_t hitBelongsToTrack = kFALSE;
 
  751   Double_t sH1[3] = {thisHit->GetX(),thisHit->GetY(),0.};
 
  768       cout << 
"hit " << detId << 
"." << hitNo << 
" distance to track " << trackNo << 
" is " << 
FindCircDist(circPar,sH1) << 
" with errors ( " 
  769            << ((
PndGemHit*)thisHit)->GetDr() << 
" , " << ((
PndGemHit*)thisHit)->GetDp() << 
" ) " << endl;
 
  772       hitBelongsToTrack = kTRUE;
 
  773     if ( !hitBelongsToTrack ) 
return kFALSE;
 
  780       tp0.
z_p = 
CalcZ_P(circPar,sH1[0],sH1[1],thisHit->GetZ());
 
  803       cout << 
" This hit belongs to track " << trackNo << 
" with " << 
CalcZ_P(circPar,sH1[0],sH1[1],thisHit->GetZ()) << endl;
 
  807     for ( 
size_t ipar = 0 ; ipar < 
fTracksVector[trackNo].trackPars.size() ; ipar++ ) {
 
  815         cout << 
" ..... to parameter (" << trackNo << 
"." << ipar << 
") " << 
CalcPhi(circPar[0],circPar[1]) << 
" " << circPar[2] << 
": distance is " << 
FindCircDist(sH1,circPar) << flush;
 
  816         cout << 
"   new z_p is " << 
CalcZ_P(circPar,sH1[0],sH1[1],thisHit->GetZ()) << 
" vs " << 
fTracksVector[trackNo].trackPars[ipar].
z_p << 
" old" << flush;
 
  824         hitBelongsToTrack = kTRUE;
 
  829           cout << 
" par: " << 
CalcPhi(circPar[0],circPar[1]) << 
" | " << circPar[2] << 
" of track " << trackNo 
 
  830                << 
" matches to this hit with dist " << 
FindCircDist(sH1,circPar) << endl;
 
  833     if ( !hitBelongsToTrack ) 
return kFALSE;
 
  836     for ( 
size_t ihitP = 0 ; ihitP < 
fTracksVector[trackNo].trackHitD.size() ; ihitP++ ) {
 
  844       if ( sH2[2] < 1.e-5 ) stepCno += 2; 
 
  846       for ( Int_t icirc = 0 ; icirc < 4 ; icirc += stepCno ) {
 
  848           if ( circPar[2] < 10. || circPar[2] > 100000. ) 
continue; 
 
  852           Int_t nofCloseHits = 2;
 
  853           for ( 
size_t ihitF = 0 ; ihitF < 
fTracksVector[trackNo].trackHitD.size() ; ihitF++ ) {
 
  854             if ( ihitF == ihitP ) 
continue;
 
  873             cout << 
"there are " << nofCloseHits << 
" with limit set to " << 0.6*
fTracksVector[trackNo].trackHits.size() << 
" (0.6*" << 
fTracksVector[trackNo].trackHits.size() << 
")" << endl;
 
  874           if ( nofCloseHits < 0.6*
fTracksVector[trackNo].trackHits.size() ) 
continue; 
 
  881           tp0.
n   = nofCloseHits;
 
  895       cout << 
"HIT DOES " << (hitBelongsToTrack?
"":
"NOT ") << 
"BELONG TO TRACK " << trackNo << 
" WITH " 
  896            << 
fTracksVector[trackNo].trackHits.size() << 
" HITS, " << 
fTracksVector[trackNo].trackPars.size() << 
" PARS: phi,rad,z_p,n: " << endl;
 
  897       for ( 
size_t ipar = 0 ; ipar < 
fTracksVector[trackNo].trackPars.size() ; ipar++ ) 
 
  901              << 
fTracksVector[trackNo].trackPars[ipar].n << 
"  |  " << flush;
 
  914   Double_t sH1[3] = {thisHit->GetX(),thisHit->GetY(),0.};
 
  916     sH1[2] = ((
PndSttHit*)thisHit)->GetIsochrone();
 
  946         cout << 
"matching r z " << thisRad << 
" " << thisHit->GetZ() << 
" (" << sH1[0] << 
" , " << sH1[1] << 
") " << endl;
 
  947         cout << 
"    with r z " << prevRad << 
" " << 
fHitVector[prevHNo]->GetZ() << 
" (" << sH2[0] << 
" , " << sH2[1] << 
") " << endl;
 
  953   Bool_t hitsMatched = kFALSE;
 
  962   if ( sH1[2] < 1.e-5 ) stepCno  = 2;
 
  963   if ( sH2[2] < 1.e-5 ) stepCno += 2; 
 
  967   for ( Int_t icirc = 0 ; icirc < 4 ; icirc += stepCno ) {
 
  971       if ( circPar[2] < 10. || circPar[2] > 100000. ) 
continue;
 
  980       if ( sH1[2] < 1.e-5 && sH2[2] < 1.e-5 ) {
 
  987         if      ( sH1[2] < 1.e-5 ) tp0.
z_p = 
CalcZ_P(circPar,sH1[0],sH1[1],thisHit->GetZ());
 
  988         else if ( sH2[2] < 1.e-5 ) tp0.
z_p = 
CalcZ_P(circPar,sH2[0],sH2[1],
fHitVector[prevHNo]->GetZ());
 
  992         if ( 
fHitVectDI[prevHNo] != 2 && detId != 2 ) {
 
  994                << 
" with hit "      << detId << 
"." << hitNo << 
" --> z_p(1) = " 
  995                << 
CalcZ_P(circPar,sH2[0],sH2[1],
fHitVector[prevHNo]->GetZ()) << 
" --> z_p(2) = " 
  996                << 
CalcZ_P(circPar,sH1[0],sH1[1],thisHit->GetZ()) << endl;
 
 1019         hitsMatched = kTRUE;
 
 1026           cout << 
"   >> with " << 
CalcPhi(tp0.
x,tp0.
y) << 
" (" << tp0.
x << 
"," << tp0.
y << 
") " << tp0.
r << 
" " << tp0.
z_p << endl; 
 
 1041           cout << 
"   >> with " << 
CalcPhi(tp0.
x,tp0.
y) << 
" (" << tp0.
x << 
"," << tp0.
y << 
") " << tp0.
r << 
" " << tp0.
z_p << 
"(" << 
CalcPhi(tp0.
x-sH1[0],tp0.
y-sH1[1]) << 
" on " << thisHit->GetZ() << 
")" << endl;
 
 1055     cout << 
"extracting mean rphi from track " << trackNo << 
" with " << 
fTracksVector[trackNo].trackHits.size() << 
" hits." << endl;
 
 1056   if ( 
fTracksVector[trackNo].trackHits.size() < 4 ) 
return kFALSE;
 
 1062   for ( 
size_t ipar = 0 ; ipar < 
fTracksVector[trackNo].trackPars.size() ; ipar++ ) {
 
 1068   if ( goodPNR < 0.5 ) 
return kFALSE;
 
 1069   meanRad = meanRad/goodPNR;
 
 1070   meanPhi = meanPhi/goodPNR;
 
 1072     cout << 
"mean rad phi is " << meanRad << 
" " << meanPhi << endl;
 
 1079   Int_t nofCloseHits = 0;
 
 1080   for ( 
size_t ihit = 0 ; ihit < 
fTracksVector[trackNo].trackHits.size() ; ihit++ ) {
 
 1093     cout << 
"there are " << nofCloseHits << 
" close hits." << endl;
 
 1094   if ( nofCloseHits < 0.7*
fTracksVector[trackNo].trackHitD.size() ) 
return kFALSE;
 
 1100   for ( 
size_t ipar = 0 ; ipar < 
fTracksVector[trackNo].trackPars.size() ; ipar++ ) {
 
 1115     cout << 
"extracting mean Z_P from track " << trackNo << 
" with " << 
fTracksVector[trackNo].trackHits.size() << 
" hits." << endl;
 
 1125   std::vector<Double_t> trackHitsZ_P;
 
 1127   for ( 
size_t ihit = 0 ; ihit < 
fTracksVector[trackNo].trackHits.size() ; ihit++ ) {
 
 1130       trackHitsZ_P.push_back(
CalcZ_P(circPar,
 
 1165         for ( Int_t ireg = 0 ; ireg < nofReg ; ireg++ ) {
 
 1166           trackHitsZ_P.push_back(intReg[ireg]);
 
 1171   if ( nofZHits < 4 ) 
return kFALSE;
 
 1174     cout << 
"trying to etract mean z_p. There are " << nofZHits << 
" hits with Z information, parameters z_p: " << flush;
 
 1176   Int_t nofClosePars =  0;
 
 1177   Int_t highestNPars =  2;
 
 1178   Int_t highestNPPar = -1;
 
 1184     cout << 
" got " << trackHitsZ_P.size() << 
" z_p parameters: " << flush;
 
 1185   for ( 
size_t ipar = 0 ; ipar < trackHitsZ_P.size() ; ipar++ ) {
 
 1191     for ( 
size_t ipar2 = 0 ; ipar2 < trackHitsZ_P.size() ; ipar2++ ) {
 
 1193       meanZ_P += trackHitsZ_P[ipar2];
 
 1194       sumOfDist += 
TMath::Abs(trackHitsZ_P[ipar]-trackHitsZ_P[ipar2]);
 
 1198     if ( nofClosePars >= highestNPars ) {
 
 1199       if ( nofClosePars > highestNPars ) smallestSOD = 1000.;
 
 1200       if ( sumOfDist < smallestSOD ) {
 
 1201         highestNPars = nofClosePars;
 
 1202         highestNPPar = ipar;
 
 1203         smallestSOD  = sumOfDist;
 
 1204         bestMeanZ_P  = meanZ_P/((
Double_t)(nofClosePars));
 
 1209       cout << trackHitsZ_P[ipar] << 
"(" << ipar << 
"/" << nofClosePars << 
"/" << sumOfDist << 
") " << endl;
 
 1212     cout << 
"best parameter number " << highestNPPar << 
" with " << highestNPars << 
" close parameters, sumOfDist = " << smallestSOD << 
" and meanZ_P = " << bestMeanZ_P << endl;
 
 1215   if ( highestNPars < 3 )
 
 1227     cout << 
"          --------- " << flush;
 
 1228     for ( Int_t idet = 0 ; idet < 4 ; idet++ ) {
 
 1230         cout << 
"\033[" << 91+idet << 
"m"  
 1232              << 
"\033[0m " << flush;
 
 1234           cout << 
"\033[33m(skewed)\033[0m " << flush;
 
 1241     cout << 
"-------------" << endl;
 
 1244   for ( 
size_t itr = 0 ; itr < 
fTracksVector.size() ; itr++ ) {
 
 1245     cout << 
"          |   track " << setw(2) << itr << 
": " << flush;
 
 1248       for ( 
size_t ihit = 0 ; ihit < 
fTracksVector[itr].trackHitD.size() ; ihit++ ) {
 
 1249         Bool_t skewedSttHit = kFALSE;
 
 1259             skewedSttHit = kTRUE;
 
 1263         cout << 
"\033[" << (skewedSttHit?33:91+
fTracksVector[itr].trackHitD[ihit]) << 
"m"  
 1265              << 
"\033[0m" << flush;
 
 1273       if ( TMath::IsNaN(thisZ_P) ) thisZ_P = 2.e6;
 
 1276       Double_t calcPz = thisZ_P*0.0058997;
 
 1278       Double_t calcThe = TMath::ACos(calcPz/calcP);
 
 1282       if ( calcPhi < 0. ) calcPhi += 
TMath::Pi()*2.;
 
 1292       TVector3 trackMomentum;
 
 1293       trackMomentum.SetMagThetaPhi(calcP,calcThe,calcPhi);
 
 1297            << setw(7) << setprecision(6) << thisPhi << 
" "  
 1298            << setw(7) << setprecision(6) << thisRad << 
" "  
 1299            << setw(7) << setprecision(6) << thisZ_P << 
" "  
 1300            << setw(7) << setprecision(6) << calcPt  << 
" "  
 1301            << setw(7) << setprecision(6) << calcPz  << 
" "  
 1302            << setw(7) << setprecision(6) << calcP   << 
" "  
 1303            << setw(7) << setprecision(6) << calcPhi << 
" "  
 1304            << setw(7) << setprecision(6) << calcThe << 
"\033[0m" << endl;
 
 1308       for ( 
size_t ihit = 0 ; ihit < 
fTracksVector[itr].trackHitD.size() ; ihit++ )
 
 1312       for ( 
size_t ipar = 0 ; ipar < 
fTracksVector[itr].trackPars.size() ; ipar++ ) {
 
 1313         cout << 
"          |           /" << setw(2) << ipar << 
" "  
 1315              << setw(6) << setprecision(6) << 
fTracksVector[itr].trackPars[ipar].r << 
" "  
 1316              << setw(6) << setprecision(6) << 
fTracksVector[itr].trackPars[ipar].z_p << 
" " 
 1317              << setw(6) << setprecision(6) << 
fTracksVector[itr].trackPars[ipar].n << endl;
 
 1321     cout << 
"          ------------------------------------------------------------" << endl;
 
 1328   for ( Int_t iell = 0 ; iell < 1000 ; iell++ ) {
 
 1336   for ( 
size_t itr = 0 ; itr < 
fTracksVector.size() ; itr++ ) {
 
 1338       for ( 
size_t ihit = 0 ; ihit < 
fTracksVector[itr].trackHitD.size() ; ihit++ ) {
 
 1364       fEllipse[itr]->SetLineColor(51+2*itr);
 
 1379   for ( Int_t itr = 
fTracksVector.size()-1 ; itr >= 0 ; itr-- ) {
 
 1381     for ( 
size_t ihit = 0 ; ihit < 
fTracksVector[itr].trackHits.size() ; ihit++ ) {
 
 1386     for ( 
size_t intr = itr ; intr < 
fTracksVector.size()-1 ; intr++ ) {
 
 1396   Bool_t printInfo = kFALSE;
 
 1397   for ( Int_t itr1 = 
fTracksVector.size()-1 ; itr1 >= 0 ; itr1-- ) {
 
 1398     for ( Int_t itr2 = 
fTracksVector.size()-1 ; itr2 > itr1 ; itr2-- ) {
 
 1410   for ( Int_t itr1 = 
fTracksVector.size()-1 ; itr1 >= 0 ; itr1-- ) {
 
 1413     for ( Int_t itr2 = 
fTracksVector.size()-1 ; itr2 > itr1 ; itr2-- ) {
 
 1428            TMath::Abs(tr1Phi-tr2Phi) < 0.2*TMath::RadToDeg() ) {
 
 1435         for ( Int_t ith2 = 0 ; ith2 < nofTr2Hits ; ith2++ ) {
 
 1436           Bool_t hitExists = kFALSE;
 
 1437           for ( Int_t ith1 = 0 ; ith1 < nofTr1Hits ; ith1++ ) {
 
 1444           if ( hitExists ) 
continue;
 
 1450         for ( 
size_t intr = itr2 ; intr < 
fTracksVector.size()-1 ; intr++ ) {
 
 1462   Int_t nofCreatedTracks = 0;
 
 1464   for ( 
size_t itr = 0 ; itr < 
fTracksVector.size() ; itr++ ) {
 
 1469     if ( TMath::IsNaN(thisZ_P) ) thisZ_P = 2.e6;
 
 1475     Double_t calcPz = thisZ_P*0.0058997;
 
 1477     Double_t calcThe = TMath::ACos(calcPz/calcP);
 
 1481     if ( calcPhi < 0. ) calcPhi += 
TMath::Pi()*2.;
 
 1495     TVector3 trackPosition(0.,0.,0.);
 
 1496     TVector3 trackMomentum;
 
 1497     trackMomentum.SetMagThetaPhi(calcP,calcThe,calcPhi);
 
 1501     std::vector<Int_t> trackHitsPerDet(4,0);
 
 1502     for ( 
size_t ihit = 0 ; ihit < 
fTracksVector[itr].trackHitD.size() ; ihit++ ) {
 
 1522     FairTrackParP           firstPar(trackPosition,trackMomentum,
 
 1523                                      TVector3(0.5, 0.5, 0.5),
 
 1528                                      TVector3(0.,1.,0.));                                        
 
 1529     TVector3 tempVect1(trackHitsPerDet[0],trackHitsPerDet[1],trackHitsPerDet[2]);
 
 1530     TVector3 tempVect2(trackHitsPerDet[3],-1.,-1.); 
 
 1533     FairTrackParP           lastPar (tempVect1,tempVect2,
 
 1534                                      TVector3(0.5, 0.5, 0.5),
 
 1539                                      TVector3(0.,1.,0.));                                        
 
 1541     new((*fBarrelTrackArray)[nofCreatedTracks]) 
PndTrack(firstPar,lastPar,*trackCand);
 
 1548   return nofCreatedTracks;
 
 1555   for ( 
size_t irh = hitNo ; irh < 
fHitVector.size()-1 ; irh++ ) {
 
 1569     cout << 
"!!! ADDING HIT " << detId << 
"." << hitNo << endl;
 
 1581   if ( cno < 0 || cno > 7 ) 
return kFALSE;
 
 1585   Double_t s1 = -1+2*(cno%2); cno/=2;
 
 1586   Double_t s2 = -1+2*(cno%2); cno/=2;
 
 1591   Double_t e2 = 2.*(s1*c1[2]-s2*c2[2]);
 
 1592   Double_t d2 = (c1[0]*c1[0]+c1[1]*c1[1]-c1[2]*c1[2]) - (c2[0]*c2[0]+c2[1]*c2[1]-c2[2]*c2[2]);
 
 1596   Double_t e3 = 2.*(s1*c1[2]-s3*c3[2]);
 
 1597   Double_t d3 = (c1[0]*c1[0]+c1[1]*c1[1]-c1[2]*c1[2]) - (c3[0]*c3[0]+c3[1]*c3[1]-c3[2]*c3[2]);
 
 1599   if ( 
TMath::Abs(a2*b3-a3*b2) < 0.001 ) 
return kFALSE;
 
 1603   Double_t ay = (a2*d3-a3*d2)/(a2*b3-a3*b2);
 
 1604   Double_t by = (a2*e3-a3*e2)/(a2*b3-a3*b2);
 
 1607   Double_t sb = 2.*bx*(ax-c1[0])+2.*by*(ay-c1[1])+2.*s1*c1[2];
 
 1608   Double_t sc = (ax-c1[0])*(ax-c1[0])+(ay-c1[1])*(ay-c1[1])-c1[2]*c1[2];
 
 1609   if ( sa == 0 ) 
return kFALSE;
 
 1611   if ( dt < 0 ) 
return kFALSE;
 
 1614   cl[0] = ax+bx*cl[2];
 
 1615   cl[1] = ay+by*cl[2];
 
 1617   if ( TMath::IsNaN(cl[2]) ) {
 
 1627                                   (c1[1]-c2[1])*(c1[1]-c2[1]));
 
 1628   if ( circDist >=            c1[2]+c2[2]  ) { 
return circDist-c1[2]-c2[2];}
 
 1630   if ( c1[2] > c2[2] ) { 
return c2[2]-
TMath::Abs(circDist-c1[2]);}
 
 1640   Double_t bx = (tube[0]-ax*tube[2]-circ[0]);
 
 1641   Double_t by = (tube[1]-ay*tube[2]-circ[1]);
 
 1646   delta[0] = b*b-4.*a*(c-(circ[2]+tube[7])*(circ[2]+tube[7]));
 
 1647   delta[1] = b*b-4.*a*(c-(circ[2]-tube[7])*(circ[2]-tube[7]));
 
 1651   for ( Int_t idel = 0 ; idel < 2 ; idel++ ) {
 
 1652     if ( delta[idel] < 0 ) 
continue;
 
 1658     for ( Int_t iz = 0 ; iz < 2 ; iz++ ) {
 
 1660       if ( 
TMath::Abs(z[iz]-tube[2]) > tube[3] ) 
continue;
 
 1662       Double_t x  = tube[0] + ax * ( z[iz] - tube[2] );
 
 1663       Double_t y  = tube[1] + ay * ( z[iz] - tube[2] );
 
 1667       Double_t pointPhi = TMath::ACos(xd/rd);
 
 1672       Double_t phiDiffr = (pointPhi-circ[3]);
 
 1715   FairRunAna* 
run = FairRunAna::Instance();
 
 1716   if ( ! run ) Fatal(
"SetParContainers", 
"No analysis run");
 
 1718   FairRuntimeDb* db = run->GetRuntimeDb();
 
 1719   if ( ! db ) Fatal(
"SetParContainers", 
"No runtime database");
 
 1723   cout << 
"-I- PndBarrelTrackFinder::SetParContainers()." << endl;
 
 1734   FairRootManager* ioman = FairRootManager::Instance();
 
 1736     cout << 
"-E- "<< GetName() <<
"::Init: " 
 1737          << 
"RootManager not instantised!" << endl;
 
 1742   FairRunAna* ana = FairRunAna::Instance();
 
 1744     cout << 
"-E- "<< GetName() <<
"::Init :" 
 1745          <<
" no FairRunAna object!" << endl;
 
 1749   FairRuntimeDb* 
rtdb = ana->GetRuntimeDb();
 
 1751     cout << 
"-E- "<< GetName() <<
"::Init :" 
 1752          <<
" no runtime database!" << endl;
 
 1772   for ( Int_t idet = 0 ; idet < 4 ; idet++ ) {
 
 1777         cout << 
"-E- " << GetName() << 
"::Init: No " << 
fHitArrayName[idet].Data() << 
" array!" << endl;
 
 1780       std::cout << 
"-I- " << GetName() << 
": " << 
fHitArrayName[idet].Data() << 
" array found" << std::endl;
 
 1791   std::cout << 
"-I- " << GetName() << 
": Initialization successfull" << std::endl;
 
 1792   std::cout << 
"-I- " << GetName() << 
": Looking for tracks in " << flush;
 
 1793   for ( Int_t idet = 0 ; idet < 4 ; idet++ ) {
 
 1795     cout << 
fDetName[idet].Data() << 
", ";
 
 1797   cout << 
"\b\b. " << endl;
 
 1798   cout << 
"================================================================================" << endl;
 
 1812     fCanvas = 
new TCanvas(
"AnimatedCanvas",
"AnimatedCanvas",10,10,800,800);
 
 1815     for ( Int_t iell = 0 ; iell < 1000 ; iell++ ) {
 
 1816       fEllipse[iell] = 
new TEllipse(100,100,0);
 
 1821   fClonesXDiff      = 
new TH1F(
"fClonesXDiff"     ,
"fClonesXDiff"     ,20000,-100.,100.);
 
 1822   fClonesYDiff      = 
new TH1F(
"fClonesYDiff"     ,
"fClonesYDiff"     ,20000,-100.,100.);
 
 1823   fClonesRDiff      = 
new TH1F(
"fClonesRDiff"     ,
"fClonesRDiff"     ,20000,-100.,100.);
 
 1824   fClonesZ_PDiff    = 
new TH1F(
"fClonesZ_PDiff"   ,
"fClonesZ_PDiff"   ,20000,-100.,100.);
 
 1825   fClonesXDiffRel   = 
new TH1F(
"fClonesXDiffRel"  ,
"fClonesXDiffRel"  ,20000,-100.,100.);
 
 1826   fClonesYDiffRel   = 
new TH1F(
"fClonesYDiffRel"  ,
"fClonesYDiffRel"  ,20000,-100.,100.);
 
 1827   fClonesRDiffRel   = 
new TH1F(
"fClonesRDiffRel"  ,
"fClonesRDiffRel"  ,20000,-100.,100.);
 
 1828   fClonesZ_PDiffRel = 
new TH1F(
"fClonesZ_PDiffRel",
"fClonesZ_PDiffRel",20000,-100.,100.);
 
 1857     new TCanvas(
"xdiff",
"xdiff",10,10,1000,800);
 
 1859     new TCanvas(
"ydiff",
"ydiff",10,10,1000,800);
 
 1861     new TCanvas(
"rdiff",
"rdiff",10,10,1000,800);
 
 1863     new TCanvas(
"zdiff",
"`diff",10,10,1000,800);
 
 1865     new TCanvas(
"xdiffR",
"xdiffR",10,10,1000,800);
 
 1867     new TCanvas(
"ydiffR",
"ydiffR",10,10,1000,800);
 
 1869     new TCanvas(
"rdiffR",
"rdiffR",10,10,1000,800);
 
 1871     new TCanvas(
"zdiffR",
"zdiffR",10,10,1000,800);
 
 1875   cout << 
"-------------------- " << fName.Data() << 
" : Summary -----------------------" << endl;
 
 1876   cout << 
" Events:        " << setw(10) << 
fTNofEvents << endl;
 
 1878   cout << 
"--------------------------------------------------------------------------------" << endl; 
 
virtual ~PndBarrelTrackFinder()
Int_t FindInterestingRegions(Double_t *circ, Double_t *tube, Double_t *reg)
Bool_t HitBelongsToTrack(Int_t detId, Int_t hitNo, Int_t trackNo)
PndGeoSttPar * fSttParameters
std::vector< Int_t > fHitVectHN
static T Sqrt(const T &x)
void RemoveHitFromPreviousHits(Int_t hitNo)
std::vector< FairHit * > trackHits
Int_t fTNofEvents
event counter 
Bool_t ExtractMeanRPhiFromTrack(Int_t trackNo)
virtual void SetParContainers()
TClonesArray * fBarrelTrackCandArray
void SetPersistency(Bool_t val=kTRUE)
TClonesArray * fHitArray[4]
PndSttTube * GetTube(int tubeId)
std::vector< Int_t > fHitVectDI
Double_t CalcZ_P(Double_t *circ, Double_t hx, Double_t hy, Double_t hz)
std::vector< Int_t > trackHitD
cout<< "blue = Monte Carlo "<< endl;cout<< "red = Helix Hit "<< endl;cout<< "green = Center Of Tubes "<< endl;for(Int_t k=0;k< track->GetEntriesFast();k++){PndSttTrack *stttrack=(PndSttTrack *) track-> At(k)
static PndSttTubeMap * Instance()
std::vector< Int_t > fHitDetNo
std::vector< Int_t > trackHitN
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
TClonesArray * FillTubeArray()
TEllipse * fEllipse[1000]
std::vector< Int_t > fHitDetId
Bool_t MatchHitWithZInfoTT(FairHit *thisHit, Int_t detId, Int_t hitNo, Int_t trackNo)
Bool_t MatchSkewedSttHitTT(FairHit *thisHit, Int_t detId, Int_t hitNo, Int_t trackNo)
std::vector< FairHit * > fHitVector
void UseMvdSttGem(const Bool_t useMvd, const Bool_t useStt, const Bool_t useGem)
Double_t FindCircDist(Double_t *c1, Double_t *c2)
Bool_t MatchHitToTrack(FairHit *thisHit, Int_t detId, Int_t hitNo, Int_t trackNo)
virtual void Exec(Option_t *opt)
std::vector< TrackBasis > fTracksVector
TClonesArray * fTubeArray
Bool_t MatchHitToHit(FairHit *thisHit, Int_t detId, Int_t hitNo, Int_t prevHNo)
TClonesArray * fBarrelTrackArray
Output array of PndTrackCands. 
void AddHitToPreviousHits(FairHit *thisHit, Int_t detId, Int_t hitNo)
std::vector< TrackParameter > trackPars
Double_t CalcPhi(Double_t x, Double_t y)
Bool_t FindCircPar(Double_t *c1, Double_t *c2, Double_t *c3, Int_t cno, Double_t *cl)
Bool_t MatchParallelSttHitTT(FairHit *thisHit, Int_t detId, Int_t hitNo, Int_t trackNo)
Bool_t ExtractMeanZ_PFromTrack(Int_t trackNo)
virtual InitStatus ReInit()
TVector3 GetWireDirection()
virtual InitStatus Init()