9 #include "FairRootManager.h"
10 #include "FairRunAna.h"
11 #include "FairRuntimeDb.h"
12 #include "FairBaseParSet.h"
13 #include "FairTrackParam.h"
14 #include "FairTrackParP.h"
17 #include "FairRootManager.h"
23 #include "TClonesArray.h"
24 #include "TGeoManager.h"
25 #include "TMatrixFSym.h"
26 #include "TStopwatch.h"
63 fNofExpectedTrackSegments(0),
64 fNofFoundTrackSegments(0)
66 for ( Int_t ipar = 0 ; ipar < 3 ; ipar++ ) {
82 FairRootManager* ioman = FairRootManager::Instance();
84 cout <<
"-E- "<< GetName() <<
"::Init: "
85 <<
"RootManager not instantised!" << endl;
90 FairRunAna* ana = FairRunAna::Instance();
92 cout <<
"-E- "<< GetName() <<
"::Init :"
93 <<
" no FairRunAna object!" << endl;
97 FairRuntimeDb*
rtdb = ana->GetRuntimeDb();
99 cout <<
"-E- "<< GetName() <<
"::Init :"
100 <<
" no runtime database!" << endl;
107 cout <<
"-I- "<< GetName() <<
"::Init: No MCTrack array!"
113 fMCPointArray = (TClonesArray*) ioman->GetObject(
"GEMPoint");
115 cout <<
"-I- "<< GetName() <<
"::Init: No MCPoint array!"
121 cout <<
"-I- " <<
"PndGemTrackFinderOnHitsTB" <<
"::Init(). There are " <<
fDigiPar->
GetNStations() <<
" GEM stations." << endl;
122 cout <<
"-I- " <<
"PndGemTrackFinderOnHitsTB" <<
"::Init(). Initialization succesfull." << endl;
133 for ( Int_t in = 0 ; in < 3 ; in++ ) {
138 std::cout <<
"-I- "<< GetName() <<
": Intialization successfull" << std::endl;
145 FairRunAna*
run = FairRunAna::Instance();
146 if ( ! run ) Fatal(
"SetParContainers",
"No analysis run");
148 FairRuntimeDb* db = run->GetRuntimeDb();
149 if ( ! db ) Fatal(
"SetParContainers",
"No runtime database");
160 TClonesArray* trackCandArray) {
172 cout << endl << endl<< endl << endl;
173 cout <<
"=======================================================" << endl;
174 cout <<
"-I- Event No: " <<
fNofEvents << endl;
175 cout <<
"=======================================================" << endl;
178 cout <<
"-I- "<< GetName() <<
"::DoFind "<< endl;
179 cout <<
"-------------------------------------------------------" << endl;
180 cout <<
" ### Start DoFind" << endl;
181 cout <<
"-------------------------------------------------------" << endl;
191 cout <<
"-E- "<< GetName() <<
"::DoFind: "
192 <<
"Hit arrays missing! "<< endl;
211 cout <<
"# MC Tracks: "<<
fMCTrackArray->GetEntriesFast() << endl;
212 cout <<
"# MC Points: "<<
fMCPointArray->GetEntriesFast() << endl;
216 Int_t nGemHits = hitArray->GetEntriesFast();
217 if(fVerbose) cout <<
"# GemHits: "<< nGemHits << endl;
250 cout <<
"************************************************" << endl;
255 cout <<
"************************************************" << endl;
256 cout <<
"finished printing tracks" << endl;
259 nr =
CreateTracks(hitArray,trackArray,trackCandArray,nr);
265 cout <<
"------------------------------------------------" << endl;
266 cout <<
"!!!!!!!!!!!!!!!!!! " << nr <<
" tracks have been found" << endl;
267 cout <<
"------------------------------------------------" << endl;
283 TClonesArray* trackCandArray,
284 Int_t nofRecoTracks) {
286 Int_t nofCreatedTracks = 0;
288 const Int_t kNofRecoTracks = nofRecoTracks;
291 Int_t hitIndices[kNofRecoTracks][kNofStatDbl*10];
292 Int_t nofHits[kNofRecoTracks];
297 Int_t nofTS[kNofRecoTracks];
304 for ( Int_t itr = 0 ; itr < nofRecoTracks ; itr++ ) {
315 for ( Int_t ihit = 0 ; ihit < 2 ; ihit++ ) {
317 for ( Int_t itrh = 0 ; itrh < nofHits[itr] ; itrh++ ) {
318 if ( hitIndices[itr][itrh] == iterTS.
hitIndex[ihit] )
321 if ( hitAdded )
continue;
322 hitIndices[itr][nofHits[itr]] = iterTS.
hitIndex[ihit];
326 if ( meanPhi[itr]/(nofTS[itr]+1) < 5. && iterTS.
trackPhi > 355. ) { iterTS.
trackPhi -= 360.; }
327 if ( meanPhi[itr]/(nofTS[itr]+1) > 355. && iterTS.
trackPhi < 5. ) { iterTS.
trackPhi += 360.; }
334 if ( nofTS[itr] == 0 )
continue;
336 meanMom[itr] = meanMom[itr]/nofTS[itr];
337 meanPhi[itr] = meanPhi[itr]/nofTS[itr];
338 meanThe[itr] = meanThe[itr]/nofTS[itr];
340 gemTrackCand =
new((*trackCandArray)[nofCreatedTracks])
PndTrackCand();
348 for ( Int_t itrh = 0 ; itrh < nofHits[itr] ; itrh++ ) {
349 gemHit = (
PndGemHit*)hitArray->At(hitIndices[itr][itrh]);
352 gemTrackCand->
AddHit(FairRootManager::Instance()->GetBranchId(
"GEMHit"),
353 hitIndices[itr][itrh],gemHit->
GetPosition().Mag());
356 cout <<
"hit " << itrh <<
" @ "
357 << gemHit->GetX() <<
" "
358 << gemHit->GetY() <<
" "
359 << gemHit->GetZ() <<
" was created at " << gemHit->GetTimeStamp() << endl;
360 sumZ += gemHit->GetZ();
361 sumZSq += gemHit->GetZ()*gemHit->GetZ();
362 sumZT += gemHit->GetZ()*gemHit->GetTimeStamp();
363 sumT += gemHit->GetTimeStamp();
366 Double_t time0 = (sumT*sumZSq-sumZ*sumZT)/(nofHits[itr]*sumZSq-sumZ*sumZ);
368 cout <<
"----> time0 = " << time0 << endl;
370 gemTrackCand->
Sort();
372 gemTrackCand->SetTimeStamp(time0);
374 TVector3
pos (0.,0.,0.);
376 mom.SetMagThetaPhi(
TMath::Abs(meanMom[itr]),meanThe[itr]*TMath::DegToRad(),meanPhi[itr]*TMath::DegToRad());
384 if ( meanThe[itr] < 0. ) {
391 FairTrackParP firstPar(pos,mom,
392 TVector3(0.5, 0.5, 0.5),
398 FairTrackParP lastPar (pos,mom,
399 TVector3(0.5,0.5,0.5),
409 new((*trackArray)[nofCreatedTracks])
PndTrack(firstPar, lastPar, *gemTrackCand);
422 return nofCreatedTracks;
428 Bool_t printInfo = kFALSE;
431 cout <<
"Trying to remove clone tracks" << endl;
433 const Int_t kNofRecoTracks = nofRecoTracks;
436 Int_t hitIndices[kNofRecoTracks][kNofStatDbl];
437 Int_t nofHits[kNofRecoTracks];
438 Int_t nofMultiHits[kNofRecoTracks];
446 const Int_t kNofComb = nofComb;
448 Int_t nofTS[kNofRecoTracks];
449 Double_t valMom[kNofRecoTracks][kNofComb];
450 Double_t valPhi[kNofRecoTracks][kNofComb];
451 Double_t valThe[kNofRecoTracks][kNofComb];
454 for ( Int_t itr = 0 ; itr < nofRecoTracks ; itr++ ) {
455 for ( Int_t ih = 0 ; ih < kNofStatDbl ; ih++ ) hitIndices[itr][ih] = -1;
457 nofMultiHits[itr] = 0;
462 for ( Int_t ic = 0 ; ic < kNofComb ; ic++ ) {
463 valMom[itr][ic] = -666.;
464 valPhi[itr][ic] = -666.;
465 valThe[itr][ic] = -666.;
472 for ( Int_t istat = 0 ; istat < 2 ; istat++ ) {
476 if ( meanPhi[itr]/(nofTS[itr]+1) < 5. && iterTS.
trackPhi > 355. ) { iterTS.
trackPhi -= 360.; }
477 if ( meanPhi[itr]/(nofTS[itr]+1) > 355. && iterTS.
trackPhi < 5. ) { iterTS.
trackPhi += 360.; }
479 valMom[itr][nofTS[itr]] = iterTS.
trackMom;
480 valPhi[itr][nofTS[itr]] = iterTS.
trackPhi;
487 for ( Int_t isens = 0 ; isens < kNofStatDbl ; isens++ )
488 if ( hitIndices[itr][isens] > -0.5 )
491 meanMom[itr] = meanMom[itr]/nofTS[itr];
492 meanPhi[itr] = meanPhi[itr]/nofTS[itr];
493 meanThe[itr] = meanThe[itr]/nofTS[itr];
496 cout <<
" MEAN = " << meanMom[itr] <<
" " << meanPhi[itr] <<
" " << meanThe[itr] << endl;
497 for ( Int_t its = 0 ; its < nofTS[itr] ; its++ ) {
499 cout <<
" v" << its <<
" = " << valMom[itr][its] <<
" " << valPhi[itr][its] <<
" " << valThe[itr][its] << endl;
500 trackCons[itr] +=
TMath::Abs((valMom[itr][its]-meanMom[itr])/meanMom[itr]);
501 trackCons[itr] +=
TMath::Abs( valPhi[itr][its]-meanPhi[itr]);
502 trackCons[itr] +=
TMath::Abs( valThe[itr][its]-meanThe[itr]);
504 trackCons[itr] = trackCons[itr]/(3.*nofTS[itr]);
507 for ( Int_t itr = 0 ; itr < nofRecoTracks ; itr++ ) {
508 for ( Int_t ih = 0 ; ih < kNofStatDbl ; ih++ ) {
509 if ( hitIndices[itr][ih] == -1 )
continue;
511 for ( Int_t itr2 = 0 ; itr2 < nofRecoTracks ; itr2++ ) {
512 if ( itr == itr2 )
continue;
513 for ( Int_t ih2 = 0 ; ih2 < kNofStatDbl ; ih2++ ) {
514 if ( hitIndices[itr2][ih2] == -1 )
continue;
515 if ( hitIndices[itr2][ih2] == hitIndices[itr][ih] ) {
521 if ( hitFound )
break;
525 Int_t cloneIndicators = 0;
526 if ( trackCons[itr] > 1 ) cloneIndicators++;
527 if ( nofTS[itr] <= kNofComb*2/3 ) cloneIndicators++;
528 if ( nofMultiHits[itr] >= nofHits[itr]/3 ) cloneIndicators++;
530 if ( cloneIndicators >= 2 ) {
539 cout <<
" consistency = " << trackCons[itr] << ( trackCons[itr] > 1 ?
" YES":
"") <<
" ( > 1 )" << endl;
540 cout <<
" segments = " << nofTS[itr] << ( nofTS[itr] <= kNofComb*2/3 ?
" YES":
"") <<
" ( <= " << kNofComb*2/3 <<
" )" << endl;
541 cout <<
" multihits = " << nofMultiHits[itr] << ( nofMultiHits[itr] >= nofHits[itr]/3 ?
" YES":
"") <<
" ( >= " << nofHits[itr]/3 <<
" )" << endl;
542 cout <<
"TRACK " << itr <<
" HAS " << nofMultiHits[itr] <<
" MULTI HITS AND CONSISTENCY = " << trackCons[itr] << (cloneIndicators>=2?
" >>> REMOVED!!!! ":
"") << endl;
552 Bool_t printInfo = kFALSE;
554 Int_t nofRecoTracks = 0;
560 cout <<
"MATCH TRACK SEGMENTS TO SEGM " << itrc <<
" with params: " << origTS.
trackMom <<
" " << origTS.
trackPhi <<
" " << origTS.
trackTheta << endl;
563 vector<Int_t> trackSegs;
564 trackSegs.push_back(itrc);
567 for (
size_t itrc2 = 0 ; itrc2 <
fTrackSegments.size() ; itrc2++ ) {
568 if ( itrc2 == itrc )
continue;
580 for (
size_t its = 0 ; its < trackSegs.size() ; its++ ) {
588 meanMom += iterTS.
trackMom/(trackSegs.size());
589 meanPhi += iterTS.
trackPhi/(trackSegs.size());
590 meanThe += iterTS.
trackTheta/(trackSegs.size());
592 if ( !matching )
continue;
594 if ( meanPhi < 5. && matchTS.trackPhi > 355. ) matchTS.
trackPhi-=360.;
601 cout <<
" mean > " << meanMom <<
" " << meanPhi <<
" " << meanThe << endl;
609 Bool_t mismatchSolved = kFALSE;
610 for (
size_t its = 0 ; its < trackSegs.size() ; its++ ) {
618 cout <<
"there are already " << trackSegs.size() <<
" segments in this track: " << endl;
622 for (
size_t its2 = 0 ; its2 < trackSegs.size() ; its2++ ) {
623 if ( its == its2 )
continue;
626 cout << its2 <<
" (" << trackSegs[its2] <<
") > " << aveTS.
trackMom <<
" " << aveTS.
trackPhi <<
" " << aveTS.
trackTheta << endl;
627 meanMom += aveTS.
trackMom/(trackSegs.size()-1);
628 meanPhi += aveTS.
trackPhi/(trackSegs.size()-1);
629 meanThe += aveTS.
trackTheta/(trackSegs.size()-1);
632 cout << its <<
" (" << trackSegs[its] <<
") > " << iterTS.
trackMom <<
" " << iterTS.
trackPhi <<
" " << iterTS.
trackTheta << endl;
633 cout <<
" this track conflicts with track " << its <<
" and is: " << endl;
635 cout <<
" should decide on mean of other track segments, which is: " << endl;
636 cout <<
"MEAN > " << meanMom <<
" " << meanPhi <<
" " << meanThe << endl;
638 if ( meanPhi < 5. ) {
642 if ( meanPhi > 355 ) {
646 Bool_t changeSegm = kFALSE;
655 cout <<
"Changing segment " << trackSegs[its] <<
" with segment " << itrc2 << endl;
656 trackSegs[its] = itrc2;
657 mismatchSolved = kTRUE;
667 mismatchSolved = kTRUE;
673 cout <<
" PROBLEM HERE " << endl;
677 if ( mismatchSolved ) {
continue; }
680 trackSegs.push_back(itrc2);
682 if ( overrepr )
continue;
683 if ( trackSegs.size() == 1 )
continue;
686 cout <<
"segments: " << endl;
687 for (
size_t its = 0 ; its < trackSegs.size() ; its++ ) {
692 for ( Int_t ihit = 0 ; ihit < 2 ; ihit++ )
693 cout << setw(4) << iterTS.
hitIndex[ihit] <<
" " << flush;
700 cout <<
" seems to belong to one track" << endl;
705 cout <<
"********* " << nofRecoTracks <<
" track candidates have been found" << endl;
707 return nofRecoTracks;
713 Bool_t printInfo = kFALSE;
717 Double_t gemHit1X = 0., gemHit1Y = 0., gemHit1Z = 0., gemHit1T = 0.;
718 Double_t gemHit2X = 0., gemHit2Y = 0., gemHit2Z = 0., gemHit2T = 0.;
720 Int_t nGemHits = hitArray->GetEntriesFast();
722 for(Int_t iHit1 = 0; iHit1 < nGemHits; iHit1++ ) {
724 gemHit1 = (
PndGemHit*) hitArray->At(iHit1);
725 if ( gemHit1->
GetCharge() < 1. )
continue;
728 cout <<
"LOOKING FOR TRACK SEGMENTS STARTING AT " << gemHit1->GetX() <<
" " << gemHit1->GetY() <<
" " << gemHit1->GetZ() << endl;
730 gemHit1X = gemHit1->GetX();
731 gemHit1Y = gemHit1->GetY();
732 gemHit1Z = gemHit1->GetZ();
733 gemHit1T = gemHit1->GetTimeStamp();
736 cout <<
"possible segment " <<
fTrackSegments.size() <<
" starts here " << gemHit1X <<
" " << gemHit1Y <<
" " << gemHit1Z << endl;
738 Double_t pangle = TMath::ACos(gemHit1X/radius);
743 cout <<
" -> with theta of " << trackTheta <<
" (radius = " << radius <<
" and phi angle = " << pangle*TMath::RadToDeg() <<
")" << endl;
745 for(Int_t iHit2 = 0; iHit2 < nGemHits; iHit2++){
746 gemHit2 = (
PndGemHit*) hitArray->At(iHit2);
747 if ( gemHit2->
GetCharge() < 1. )
continue;
750 gemHit2X = gemHit2->GetX();
751 gemHit2Y = gemHit2->GetY();
752 gemHit2Z = gemHit2->GetZ();
753 gemHit2T = gemHit2->GetTimeStamp();
755 if ( gemHit2T < gemHit1T || gemHit2T > gemHit1T+11. )
continue;
758 Double_t pangle2 = TMath::ACos(gemHit2X/radius2);
765 if (
TMath::Abs(pangle-pangle2)*TMath::RadToDeg() > 40 )
continue;
768 cout <<
" trying to match it with " << gemHit2X <<
" , " << gemHit2Y <<
" , " << gemHit2Z << endl;
769 cout <<
" (radius = " << radius2 <<
" and phi angle = " << pangle2*TMath::RadToDeg() <<
")" << endl;
775 Double_t zDistRatio = gemHit2Z/gemHit1Z;
776 Double_t zDiffRatio = gemHit1Z/(gemHit2Z-gemHit1Z);
777 Double_t zCuDiff = gemHit2Z*gemHit2Z*gemHit2Z-gemHit1Z*gemHit1Z*gemHit1Z;
778 Double_t zSqDiff = gemHit2Z*gemHit2Z-gemHit1Z*gemHit1Z;
783 Double_t expRadUncert = 0.08*radius*zDistRatio;
786 cout <<
" -> while expected radius was " << expectedRad2 <<
" with error of " << expRadUncert << endl;
788 if ( radius2>expectedRad2+expRadUncert || radius2<expectedRad2-expRadUncert )
continue;
791 cout <<
"STRONG CORRELATION FOR THIS HIT!!!" << endl;
794 if ( (pangle-pangle2) != 0 )
795 trackMomentum = (par0_mom+par1_mom/radius)/((pangle-pangle2)*TMath::RadToDeg());;
797 if (
fVerbose > 0 && stat1Id == 0 && stat2Id == 1 ) {
798 cout <<
"CALCULATED MOMENTUM " << trackMomentum <<
" FROM ( " << par0_mom <<
" + " << par1_mom <<
" / " << radius <<
" ) / ( " << pangle <<
" - " << pangle2 <<
" ) * " << TMath::RadToDeg() <<
" = ( " << par0_mom+par1_mom/radius <<
" ) / ( " << pangle-pangle2 <<
" ) * " << TMath::RadToDeg() << endl;
799 cout << pangle-pangle2 <<
" from " << TMath::ACos(gemHit1X/radius) <<
" - " << TMath::ACos(gemHit2X/radius2) <<
" = ACos( " << gemHit1X <<
" / " << radius <<
") - ACos( " << gemHit2X <<
" / " << radius2 <<
" ) " << endl;
800 cout <<
" " << gemHit1X <<
" " << gemHit2X << endl;
801 cout <<
" " << gemHit1Y <<
" " << gemHit2Y << endl;
802 cout <<
" " << gemHit1Z <<
" " << gemHit2Z << endl;
804 Double_t circRad =
TMath::Sqrt( (gemHit2X-gemHit1X)*(gemHit2X-gemHit1X) + (gemHit2Y-gemHit1Y)*(gemHit2Y-gemHit1Y) ) /
TMath::Sin(pangle-pangle2) / 2.;
806 Double_t mom_trans = circRad / 196.;
816 trackMomentum = newMomPar/(TMath::RadToDeg()*
TMath::Abs(pangle2-pangle));
818 trackTheta = TMath::ATan(mom_trans/trackMomentum);
822 Double_t trackPhiAngle = pangle+(pangle-pangle2)*zDiffRatio;
823 if ( trackPhiAngle < 0. ) trackPhiAngle +=
TMath::Pi()*2.;
845 tempTS.
trackPhi = trackPhiAngle*TMath::RadToDeg();
846 tempTS.
trackTheta = trackTheta *TMath::RadToDeg();
852 cout <<
" FOUND SEGMENT (stat. " << stat1Id <<
" & " << stat2Id <<
"), hits "
853 << iHit1 <<
", " << iHit2
854 <<
" >>> " << trackMomentum <<
" GeV, " << trackPhiAngle*TMath::RadToDeg() <<
" deg, " << trackTheta <<
" deg." << endl;
863 cout <<
"===>>> " <<
fTrackSegments.size() <<
" track segments" << endl;
877 for ( Int_t ihit = 0 ; ihit < 2 ; ihit++ ) {
879 cout <<
" <" << gemHit->GetX() <<
"/" << gemHit->GetY() <<
"> " << flush;
880 cout << setw(3) << tempTS.
hitIndex[ihit] << flush;
895 vector<Int_t> nofFiredStations(kNofMCTracks,0);
896 vector<TVector3> mcTrackMomentum(kNofMCTracks);
901 Int_t nofPointsPerStation[kNofMCTracks][kNofGemStations];
902 for ( Int_t imct = 0 ; imct < kNofMCTracks ; imct++ )
903 for ( Int_t
is = 0 ;
is < kNofGemStations ;
is++ )
904 nofPointsPerStation[imct][
is] = 0;
906 for ( Int_t imcp = 0 ; imcp < kNofGemPoints ; imcp++ ) {
911 nofPointsPerStation[mcPoint->GetTrackID()][stationNr-1] += 1;
915 for ( Int_t imct = 0 ; imct < kNofMCTracks ; imct++ ) {
918 for ( Int_t
is = 0 ;
is < kNofGemStations ;
is++ )
919 if ( nofPointsPerStation[imct][
is] > 0 )
921 nofFiredStations[imct] = nofCGM;
926 vector<Int_t> nofTrSegments(kNofMCTracks,0);
927 vector<Int_t> nofTrMCId(kNofMCTracks,0);
931 for ( Int_t itr = 0 ; itr < kNofMCTracks ; itr++ ) nofTrMCId[itr] = 0;
934 for ( Int_t ihit = 0 ; ihit < 2 ; ihit++ ) {
936 cout <<
" <" << gemHit->GetX() <<
"/" << gemHit->GetY() <<
"> " << flush;
937 cout << setw(3) << tempTS.
hitIndex[ihit] << flush;
939 cout << setw(2) << gemHit->GetRefIndex() <<
"/" << mcPoint->GetTrackID() <<
") " << flush;
941 if ( ihit < 2 && nofTrMCId[mcPoint->GetTrackID()] < 1 )
942 nofTrMCId[mcPoint->GetTrackID()] += 1;
943 if ( ihit > 1 && nofTrMCId[mcPoint->GetTrackID()] < 2 )
944 nofTrMCId[mcPoint->GetTrackID()] += 2;
948 for ( Int_t itr = 0 ; itr < kNofMCTracks ; itr++ ) {
949 if ( nofTrMCId[itr] != 3 )
continue;
950 if ( bestMCId > -1 ) { bestMCId = -1;
break; }
953 cout <<
" " << flush;
954 if ( bestMCId == -1 ) cout <<
" -- NO MATCHING MC -----------------" << endl;
956 cout <<
"MC " << setw(3) << bestMCId <<
" TRUTH: "
957 << setw(11) << mcTrackMomentum[bestMCId].Mag() <<
" "
958 << setw(11) << TMath::RadToDeg()*mcTrackMomentum[bestMCId].Phi()+(mcTrackMomentum[bestMCId].Phi()>=0.?0:360.) <<
" "
959 << setw(11) << TMath::RadToDeg()*mcTrackMomentum[bestMCId].Theta() << endl;
960 nofTrSegments[bestMCId] += 1;
962 segmentMCId[itrc] = bestMCId;
967 for ( Int_t imct = 0 ; imct < kNofMCTracks ; imct++ ) {
968 if ( nofTrSegments[imct] == 0 || nofFiredStations[imct] == 0 )
continue;
969 cout <<
" track " << imct <<
" fired " << nofFiredStations[imct] <<
" stations, and " << nofTrSegments[imct] <<
" segments were created:" << endl;
972 if ( segmentMCId[itrc] != imct )
continue;
974 cout <<
" " << itrc <<
" " << setw(11) << tempTS.
trackMom <<
" " << setw(11) << tempTS.
trackPhi <<
" " << setw(11) << tempTS.
trackTheta << endl;
977 if ( mcTrackMomentum[imct].Mag() < 0.5 )
continue;
979 for ( Int_t
is = 0 ;
is < nofFiredStations[imct] ;
is++ )
for ( Int_t is2 =
is+1 ; is2 < nofFiredStations[imct] ; is2++ ) expSegms++;
981 fndNofS += nofTrSegments[imct];
986 cout <<
"********* FOUND " << fndNofS <<
" OUT OF " << expNofS <<
" SEGMENTS IN THIS EVENT" << endl;
998 for ( Int_t itr = 0 ; itr < nofRecoTracks ; itr++ ) {
1006 vector<Int_t> hitIndices(kNofStatDbl,-1);
1007 cout <<
"===================== TRACK " << itr <<
" ======================" << endl;
1023 meanMom = meanMom/nofTS;
1024 meanPhi = meanPhi/nofTS;
1025 meanThe = meanThe/nofTS;
1027 if ( nofTS == 0 ) { cout <<
"THIS TRACK WAS REMOVED " << endl;
continue; }
1029 for ( Int_t ihit = 0 ; ihit < kNofStatDbl ; ihit++ ) {
1030 cout << ihit <<
"/" << hitIndices[ihit] <<
"/" << flush;
1031 if ( hitIndices[ihit] == -1 ) { cout <<
"- - " << flush;
continue; }
1032 gemHit = (
PndGemHit*) hitArray->At(hitIndices[ihit]);
1033 if ( gemHit->GetRefIndex() == -1 ) { cout <<
"- " << flush;
continue;}
1034 cout << setw(2) << gemHit->GetRefIndex() <<
"_ " << flush;
1045 FairMCPoint* mcPoint;
1049 for ( Int_t itr = 0 ; itr < nofRecoTracks ; itr++ ) {
1050 vector<Int_t> nofTrMCId(500,0);
1059 vector<Int_t> hitIndices(kNofStatDbl,-1);
1060 cout <<
"===================== TRACK " << itr <<
" ======================" << endl;
1076 meanMom = meanMom/nofTS;
1077 meanPhi = meanPhi/nofTS;
1078 meanThe = meanThe/nofTS;
1080 if ( nofTS == 0 ) { cout <<
"THIS TRACK WAS REMOVED " << endl;
continue; }
1082 for ( Int_t ihit = 0 ; ihit < kNofStatDbl ; ihit++ ) {
1083 cout << ihit <<
"/" << hitIndices[ihit] <<
"/" << flush;
1084 if ( hitIndices[ihit] == -1 ) { cout <<
"- - " << flush;
continue; }
1085 gemHit = (
PndGemHit*) hitArray->At(hitIndices[ihit]);
1086 if ( gemHit->GetRefIndex() == -1 ) { cout <<
"- - " << flush;
continue;}
1087 mcPoint = (FairMCPoint*)
fMCPointArray->At(gemHit->GetRefIndex());
1088 cout << setw(2) << gemHit->GetRefIndex() <<
" _" << mcPoint->GetTrackID() <<
"_ " << flush;
1089 nofTrMCId[mcPoint->GetTrackID()] += 1;
1092 Int_t bestMCId = -1;
1093 Int_t largestNofTracks = 0;
1094 for ( Int_t itm = 0 ; itm < 500 ; itm++ ) {
1095 if ( nofTrMCId[itm] == largestNofTracks ) { bestMCId = -1; }
1096 if ( nofTrMCId[itm] > largestNofTracks ) { bestMCId = itm; largestNofTracks = nofTrMCId[itm]; }
1098 cout <<
" " << flush;
1099 cout << setw(11) << meanMom <<
" " << setw(11) << meanPhi <<
" " << setw(11) << meanThe << endl;
1100 cout <<
" " << flush;
1101 if ( bestMCId == -1 ) cout <<
" -- NO MATCHING MC -----------------" << endl;
1105 cout <<
"MC " << bestMCId <<
" TRUTH: "
1106 << setw(11) << mcmom.Mag() <<
" "
1107 << setw(11) << TMath::RadToDeg()*mcmom.Phi()+(mcmom.Phi()>=0.?0:360.) <<
" "
1108 << setw(11) << TMath::RadToDeg()*mcmom.Theta() << endl;
1116 cout <<
"---------------------------------------------------------------------" << endl;
1117 cout <<
" >>> TF >>> prep time = " <<
fPrepTime <<
"s (get data from input)" << endl;
1123 cout <<
"---------------------------------------------------------------------" << endl;
void PrintTracks(TClonesArray *hitArray, Int_t nofRecoTracks)
std::vector< TrackSegmentTB > fTrackSegments
Double_t GetTrackFinderOnHits_ParTheta1()
TClonesArray * trackArray
Double_t GetTrackFinderOnHits_ParThetaB()
Double_t GetTrackFinderOnHits_ParTheta3()
static T Sqrt(const T &x)
Abstract base class for concrete Gem track finding algorithm.
TVector3 GetMomentum() const
Double_t GetTrackFinderOnHits_ParMat1(Int_t in)
Digitization Parameter Class for GEM part.
Int_t fNofFoundTrackSegments
void PrintTrackSegments(TClonesArray *hitArray)
void RemoveCloneTracks(Int_t nofRecoTracks)
Int_t GetSensorNr() const
Double_t GetTrackFinderOnHits_ParTheta0()
Double_t GetTrackFinderOnHits_ParMat0(Int_t in)
OnHits track finding algorithm.
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
Int_t fNofExpectedTrackSegments
Int_t GetSensorId() const
virtual ~PndGemTrackFinderOnHitsTB()
Double_t GetCharge() const
Int_t FindTrackSegments(TClonesArray *hitArray, Int_t stat1Id, Int_t stat2Id)
Int_t GetStationNr() const
Int_t MatchTrackSegments()
Int_t GetStationNr(Int_t sensorId)
void PrintMCTracks(TClonesArray *hitArray, Int_t nofRecoTracks)
TVector3 GetPosition() const
TClonesArray * fMCPointArray
Double_t GetTrackFinderOnHits_ParRadPhi2()
Int_t CreateTracks(TClonesArray *hitArray, TClonesArray *trackArray, TClonesArray *trackCandArray, Int_t nofRecoTracks)
TClonesArray * fMCTrackArray
virtual Int_t DoFind(TClonesArray *hitArray, TClonesArray *trackArray, TClonesArray *trackCandArray)
virtual void SetParContainers()
PndGemTrackFinderOnHitsTB()
Double_t GetTrackFinderOnHits_ParThetaA()
Double_t GetTrackFinderOnHits_ParTheta2()
Double_t GetTrackFinderOnHits_ParRadPhi0()
void PrintMCTrackSegments(TClonesArray *hitArray)