13 #include "FairMCPoint.h"
14 #include "FairTrackParP.h"
15 #include "FairRootManager.h"
18 #include "TClonesArray.h"
22 #include "TDatabasePDG.h"
75 FairRootManager* ioman = FairRootManager::Instance();
79 cout <<
"-E- PndSttTrackFinderIdeal::Init: "
80 <<
"RootManager not instantised!" << endl;
88 cout <<
"-E- PndSttTrackFinderIdeal::Init: No MCTrack array!"
100 cout <<
"-E- PndSttTrackFinderIdeal::DoFind: "
101 <<
"MCTrack array missing! " << endl;
107 cout <<
"-E- PndSttTrackFinderIdeal::DoFind: "
108 <<
"No hit arrays present, call AddHitCollection() first (at least once)! " << endl;
114 cout <<
"-E- PndSttTrackFinderIdeal::DoFind: "
115 <<
"No point arrays present, call AddHitCollection() first (at least once)! " << endl;
119 if ( !trackCandArray )
121 cout <<
"-E- PndSttTrackFinderIdeal::DoFind: "
122 <<
"Track cand array missing! " << endl;
128 cout <<
"-E- PndSttTrackFinderIdeal::DoFind: "
129 <<
"Track array missing! " << endl;
139 myRange(
"range",
"range", 100, -50., 50., 100, -50., 50);
141 finderCanvas =
new TCanvas(
"findercanvas",
"findercanvas", 800, 600);
148 Int_t nNoMCTrack = 0;
150 Int_t nNoSttPoint = 0;
155 FairMCPoint* pMCpt = NULL;
164 for (Int_t hitListCounter = 0; hitListCounter <
fHitCollectionList.GetEntries(); hitListCounter++)
171 Int_t mcTrackIndex = 0;
172 Int_t trackIndex = 0;
175 map<Int_t, map<Double_t, Int_t> >
179 for (Int_t iHit = 0; iHit <
nHits; iHit++)
190 ptIndex = pMhit->GetRefIndex();
197 myArc.SetFillStyle(0);
198 myArc.SetLineColor(1);
214 mcTrackIndex = pMCpt->GetTrackID();
219 (hitMap[mcTrackIndex])[wireX * wireX + wireY * wireY]++;
232 for (Int_t iMCTrack = 0; iMCTrack < nMCTracks; iMCTrack++)
238 if (hitMap[iMCTrack].size() < 3)
242 if (TDatabasePDG::Instance()->GetParticle(pMCtr->
GetPdgCode()) == NULL)
245 if (!(
fabs(TDatabasePDG::Instance()->GetParticle(pMCtr->
GetPdgCode())->Charge() / 3.0) > 0.))
251 if (
fVerbose >= 2) cout <<
"-I- PndSttTrackFinderIdeal: STTTrack "
252 << nTracks <<
" created from MCTrack "
254 <<
" STTPoints)" << endl;
256 correlationMap[nTracks] = iMCTrack;
257 trackMap[iMCTrack] = nTracks++;
264 for (Int_t iHit = 0; iHit <
nHits; iHit++)
269 cout <<
"-E- PndSttTrackFinderIdeal::DoFind: Empty slot "
270 <<
"in HitArray at position " << iHit << endl;
284 ptIndex = pMhit->GetRefIndex();
296 mcTrackIndex = pMCpt->GetTrackID();
298 if (mcTrackIndex < 0 || mcTrackIndex > nMCTracks)
300 cout <<
"-E- PndSttTrackFinderIdeal::DoFind: "
301 <<
"MCTrack index out of range. " << mcTrackIndex <<
" "
302 << nMCTracks << endl;
307 if (trackMap.find(mcTrackIndex) == trackMap.end())
310 trackIndex = trackMap[mcTrackIndex];
311 pTrckCand = (
PndTrackCand*) trackCandArray->At(trackIndex);
314 cout <<
"-E- PndSttTrackFinderIdeal::DoFind: "
315 <<
"No SttTrack pointer. " << iHit <<
" " << ptIndex
316 <<
" " << mcTrackIndex <<
" " << trackIndex << endl;
325 pMCpt->Momentum(MCmom);
333 if(MCmom.Mag() < 0.3) {
337 if(pTrckCand->
GetNHits() > 25)
continue;
340 pTrckCand->
AddHit(FairRootManager::Instance()->GetBranchId(
"STTHit"), iHit, iHit);
347 pTrckCand->
AddHit(FairRootManager::Instance()->GetBranchId(
"STTHit"), iHit, wireRad);
355 TClonesArray& clref = *helixHitArray;
356 Int_t size = clref.GetEntriesFast();
360 pMCpt->Position(pos);
361 TVector3 posErr(0, 0, 0);
369 memset(InOut, 0,
sizeof(InOut));
373 InOut[3] = ((
PndSttPoint *) pMCpt)->GetXOutLocal();
374 InOut[4] = ((
PndSttPoint *) pMCpt)->GetYOutLocal();
375 InOut[5] = ((
PndSttPoint *) pMCpt)->GetZOutLocal();
376 TVector3 diff3(InOut[0] - InOut[3], InOut[1] - InOut[4], InOut[2] - InOut[5]);
377 double distance = diff3.Mag();
380 if (distance != 0) dedx = eloss/(distance);
391 myArc.SetFillStyle(0);
392 myArc.SetLineColor(trackIndex + 2);
395 myArc.DrawArc(pMhit->GetX(), pMhit->GetY(), 1.0);
397 myArc.DrawArc(pMhit->GetX(), pMhit->GetY(), pMhit->
GetIsochrone());
400 if (
fVerbose > 2) cout <<
"Hit " << iHit <<
" from STTPoint "
401 << ptIndex <<
" (MCTrack "
402 << mcTrackIndex <<
") added to STTTrack "
403 << trackIndex << endl;
406 for (Int_t trackTeller = 0; trackTeller < nTracks; trackTeller++)
409 pTrckCand = (
PndTrackCand*) trackCandArray->At(trackTeller);
411 if ( pTrckCand != NULL)
422 GetTrack(dSeed, phiSeed, rSeed, zSeed, tanLamSeed, correlationMap[trackTeller]);
425 xSeed = (dSeed + rSeed) *
cos(phiSeed),
426 ySeed = (dSeed + rSeed) *
sin(phiSeed);
435 xSeed = (dSeed + rSeed) *
cos(phiSeed);
436 ySeed = (dSeed + rSeed) *
sin(phiSeed);
443 myArc.SetFillStyle(0);
447 myArc.SetLineColor(trackTeller + 2);
448 myArc.DrawArc(xSeed, ySeed, rSeed);
456 TVector3 posSeed(vxSeed, vySeed, vzSeed);
462 TDatabasePDG *fdbPDG = TDatabasePDG::Instance();
463 TParticlePDG *
fParticle = fdbPDG->GetParticle(pdg);
464 Double_t chargeSeed = fParticle->Charge()/3.;
470 Double_t qop = chargeSeed/dirSeed.Mag();
479 Int_t hitcounter = pTrckCand->
GetNHits();
483 if(!firstpnt) { cout <<
"PndSttTrackFinderIdeal::DoFind ERROR: 1st pnt " << iHit << endl;
continue; }
484 TVector3 MCfirstPos(firstpnt->GetX(), firstpnt->GetY(), firstpnt->GetZ());
485 TVector3 MCfirstMom(firstpnt->GetPx(), firstpnt->GetPy(), firstpnt->GetPz());
487 TVector3 difirst = MCfirstMom; difirst.SetMag(1.);
488 TVector3 djfirst = firsttube->GetWireDirection(); djfirst.SetMag(1.);
489 TVector3 dkfirst = difirst.Cross(djfirst); dkfirst.SetMag(1.);
494 if(!lastpnt) { cout <<
"PndSttTrackFinderIdeal::DoFind ERROR last pnt " << iHit << endl;
continue; }
495 TVector3 MClastPos(lastpnt->GetX(), lastpnt->GetY(), lastpnt->GetZ());
496 TVector3 MClastMom(lastpnt->GetPx(), lastpnt->GetPy(), lastpnt->GetPz());
498 TVector3 dilast = MClastMom; dilast.SetMag(1.);
499 TVector3 djlast = lasttube->GetWireDirection(); djlast.SetMag(1.);
500 TVector3 dklast = dilast.Cross(djlast); dklast.SetMag(1.);
503 FairTrackParP first(MCfirstPos, MCfirstMom,
504 TVector3(0., 0., 0.), TVector3(0., 0., 0.), ((
int) chargeSeed),
505 MCfirstPos, djfirst, dkfirst);
508 FairTrackParP last(MClastPos, MClastMom,
509 TVector3(0., 0., 0.), TVector3(0., 0., 0.), ((
int) chargeSeed),
510 MClastPos, djlast, dklast);
513 pTrck =
new((*trackArray)[trackTeller])
PndTrack(first, last, *pTrckCand);
524 if(
fabs(dSeed - posSeed.Mag()) > 1e-3) {
525 cout <<
"pos" << endl;
526 cout << dSeed <<
" " << posSeed.Mag() << endl;
531 TVector3 dtest(-TMath::Sin(phiSeed) * 0.006 * rSeed, TMath::Cos(phiSeed) * 0.006 * rSeed, mcTrack2->
GetMomentum().Z());
534 cout <<
"dir x " << endl;
540 cout <<
"dir y " << endl;
546 cout <<
"dir z " << endl;
551 if(
fabs(qop - (chargeSeed/((0.006 * rSeed) * (0.006 * rSeed) + mcTrack2->
GetMomentum().Z() * mcTrack2->
GetMomentum().Z()))) > 1e-3)
552 cout <<
"qop " << qop <<
" " << (chargeSeed/((0.006 * rSeed) * (0.006 * rSeed) + mcTrack2->
GetMomentum().Z() * mcTrack2->
GetMomentum().Z())) <<
" " <<
fabs(qop - (chargeSeed/((0.006 * rSeed) * (0.006 * rSeed) + mcTrack2->
GetMomentum().Z() * mcTrack2->
GetMomentum().Z()))) << endl;
564 finderCanvas->Update();
565 finderCanvas->Show();
570 cout <<
"press any key to continue." << endl;
579 cout <<
"-------------------------------------------------------"
581 cout <<
"-I- Ideal STT track finding -I-"
583 cout <<
"Hits: " << nHits << endl;
584 cout <<
"MCTracks: total " << nMCTracks <<
", accepted " << nMCacc
585 <<
", reconstructable: " << nTracks << endl;
587 cout <<
"SttHits not found : "
588 << nNoSttHit << endl;
589 cout <<
"SttPoints not found : "
590 << nNoSttPoint << endl;
591 cout <<
"MCTracks not found : "
592 << nNoMCTrack << endl;
593 cout <<
"SttTracks not found : "
595 cout <<
"-------------------------------------------------------"
598 else if(
fVerbose) cout <<
"-I- PndSttTrackFinderIdeal: all " << nMCTracks
599 <<
", acc. " << nMCacc <<
", rec. " << nTracks << endl;
614 small_limit = 0.0001;
616 for (Int_t sign1 = -1; sign1 < 3; sign1 += 2)
618 for (Int_t sign2 = -1; sign2 < 3; sign2 += 2)
620 for (Int_t sign3 = -1; sign3 < 3; sign3 += 2)
623 if ((firstX - secondX == 0) && (secondX - thirdX == 0))
628 else if (!((
fabs(firstX - secondX) < small_limit) || (
fabs(secondX - thirdX) < small_limit)))
630 if (
fabs((firstY - secondY) / (firstX - secondX) - (secondY - thirdY) / (secondX - thirdX)) < small_limit)
638 a = -2. * (firstX - secondX),
639 b = -2. * (firstY - secondY),
640 c = 2. * (sign1 * firstR - sign2 * secondR),
641 d = ((firstX * firstX + firstY * firstY - firstR * firstR) -
642 (secondX * secondX + secondY * secondY - secondR * secondR)),
643 e = -2. * (firstX - thirdX),
644 f = -2. * (firstY - thirdY),
645 g = 2. * (sign1 * firstR - sign3 * thirdR),
646 h = ((firstX * firstX + firstY * firstY - firstR * firstR) -
647 (thirdX * thirdX + thirdY * thirdY - thirdR * thirdR));
650 A = -1. * (
f *
d -
b *
h) / (a *
f -
b * e),
651 B = -1. * (
f *
c -
b *
g) / (a *
f -
b * e),
652 C = (e *
d - a *
h) / (a *
f - e *
b),
653 D = (e *
c - a *
g) / (a *
f - e * b),
655 I = B * B + D * D - 1.,
656 II = 2. * A * B - 2. * B * firstX + 2. *
C * D - 2. * D * firstY + sign1 * 2. * firstR,
657 III = A * A - 2. * A * firstX + firstX * firstX +
C *
C - 2. *
C * firstY + firstY * firstY - firstR * firstR;
659 if ((
fabs(I) > small_limit) && ((II * II - 4. * I * III) > 0.))
662 r = (-1. * II -
sqrt(II * II - 4. * I * III)) / (2. * I),
667 circleRadii[trackletCounter] =
sqrt(r * r);
668 circleCentersX[trackletCounter] =
x;
669 circleCentersY[trackletCounter] =
y;
674 circleRadii[trackletCounter] = -1.;
675 circleCentersX[trackletCounter] = 0.;
676 circleCentersY[trackletCounter] = 0.;
820 if (TDatabasePDG::Instance()->GetParticle(mcTrack->
GetPdgCode()) != NULL)
822 if (TDatabasePDG::Instance()->GetParticle(mcTrack->
GetPdgCode())->Charge() < 0.)
829 xCircleCenter = xStart + sign * (rSeed *
sin(phiStart)),
830 yCircleCenter = yStart - sign * (rSeed *
cos(phiStart));
832 dSeed =
sqrt(xCircleCenter * xCircleCenter + yCircleCenter * yCircleCenter) - rSeed;
833 phiSeed = atan(yCircleCenter / xCircleCenter);
836 if (xCircleCenter < 0.)
838 if (yCircleCenter < 0.)
859 CoverThickness = 0.1,
863 if ((
sqrt(xpos * xpos + ypos * ypos) < outerRadius - CoverThickness - (
tubeOuterDiam / 2.)) &&
864 (
sqrt(xpos * xpos + ypos * ypos) > innerRadius + CoverThickness + (
tubeOuterDiam / 2.)) &&
870 myArc.SetFillStyle(0);
871 myArc.SetLineColor(17);
872 myArc.DrawArc(xpos, ypos, radius);
905 radius = tubeOuterDiam / 2.;
912 xpos =
sttCenterX + ((ringteller) * 2 * radius),
915 for(Int_t
i = 0;
i < ringteller;
i++)
918 ypos += sqrt3 * radius;
922 for(Int_t
i = 0;
i < ringteller;
i++)
928 for(Int_t
i = 0;
i < ringteller;
i++)
931 ypos -= sqrt3 * radius;
935 for(Int_t
i = 0;
i < ringteller;
i++)
938 ypos -= sqrt3 * radius;
942 for(Int_t
i = 0;
i < ringteller;
i++)
948 for(Int_t
i = 0;
i < ringteller;
i++)
951 ypos += sqrt3 * radius;
963 if ((ringmax > 0) && (ringteller == ringmax))
975 relativeCounter = hitCounter;
977 for (Int_t collectionCounter = 0; collectionCounter <
fHitCollectionList.GetEntries(); collectionCounter++)
982 if (relativeCounter < size)
989 relativeCounter -= size;
1001 relativeCounter = hitCounter;
1003 for (Int_t collectionCounter = 0; collectionCounter <
fHitCollectionList.GetEntries(); collectionCounter++)
1008 if (relativeCounter < size)
1019 relativeCounter -= size;
friend F32vec4 cos(const F32vec4 &a)
void SetRefIndex(TString branch, Int_t i)
TClonesArray * trackArray
TList fPointCollectionList
PndSttHit * GetHitFromCollections(Int_t hitCounter)
friend F32vec4 sqrt(const F32vec4 &a)
Int_t GetNPoints(DetectorId detId) const
friend F32vec4 sin(const F32vec4 &a)
PndTrackCandHit GetSortedHit(UInt_t i)
virtual ~PndSttTrackFinderIdeal()
TVector3 GetMomentum() const
cout<< "POINTs for new FwEndCap == "<< tsim-> GetEntriesFast()
virtual Int_t DoFind(TClonesArray *trackCandArray, TClonesArray *trackArray, TClonesArray *helixHitArray)
Bool_t putStraw(Double_t xpos, Double_t ypos, Double_t radius)
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)
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
TClonesArray * fTubeArray
Double_t GetIsochrone() const
Bool_t fHelixHitProduction
Double_t GetIsochroneError() const
friend F32vec4 fabs(const F32vec4 &a)
TClonesArray * fMCTrackArray
TVector3 GetStartVertex() const
void GetTrackletCircular(Double_t firstX, Double_t firstY, Double_t firstR, Double_t secondX, Double_t secondY, Double_t secondR, Double_t thirdX, Double_t thirdY, Double_t thirdR, Double_t *circleRadii, Double_t *circleCentersX, Double_t *circleCentersY) const
void SetdEdx(Double_t dedx)
void GetTrack(Double_t &dSeed, Double_t &phiSeed, Double_t &rSeed, Double_t &zSeed, Double_t &tanLamSeed, Int_t mcTrackNo)
FairMCPoint * GetPointFromCollections(Int_t hitCounter)