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()