FairRoot/PandaRoot
PndTrkTrack.cxx
Go to the documentation of this file.
1 //
2 // PndTrkTrack.cxx
3 //
4 //
5 //
6 //
7 // authors: Lia Lavezzi - INFN Pavia (2012)
8 //
9 
10 #include "PndTrkTrack.h"
11 #include "TArc.h"
12 #include <iostream>
13 
14 
15 using namespace std;
16 
17 PndTrkTrack::PndTrkTrack() : fCluster(PndTrkCluster()), fRefHit(NULL), fCenterX(0), fCenterY(0), fRadius(0), fTanL(0), fZ0(0), fCharge(0), fPhiMin(0), fPhiMax(360) {}
18 
19 PndTrkTrack::PndTrkTrack(PndTrkCluster *cluster) : fCluster(*cluster), fRefHit(NULL), fCenterX(0), fCenterY(0), fRadius(0), fTanL(0), fZ0(0), fCharge(0), fPhiMin(0), fPhiMax(360){}
20 
21 PndTrkTrack::PndTrkTrack(PndTrkCluster *cluster, double x, double y, double radius) : fCluster(*cluster), fRefHit(NULL), fCenterX(x), fCenterY(y), fRadius(radius), fTanL(0), fZ0(0), fCharge(0) , fPhiMin(0), fPhiMax(360){}
22 
23 PndTrkTrack::PndTrkTrack(PndTrkHit *hit, PndTrkCluster *cluster, double x, double y, double radius) : fCluster(*cluster), fRefHit(hit), fCenterX(x), fCenterY(y), fRadius(radius), fTanL(0), fZ0(0), fCharge(0), fPhiMin(0), fPhiMax(360) {}
24 
25 PndTrkTrack::PndTrkTrack(double x, double y, double radius) : fCluster(PndTrkCluster()), fRefHit(NULL), fCenterX(x), fCenterY(y), fRadius(radius), fTanL(0), fZ0(0), fCharge(0), fPhiMin(0), fPhiMax(360) {}
26 
27 
28 PndTrkTrack::PndTrkTrack(PndTrack *trk) : fCluster(PndTrkCluster()), fRefHit(NULL), fCenterX(0), fCenterY(0), fRadius(0), fTanL(0), fZ0(0), fCharge(0), fPhiMin(0), fPhiMax(360){
29 
30  TVector3 momentum = trk->GetParamFirst().GetMomentum();
31  TVector3 position = trk->GetParamFirst().GetPosition();
32 
33  fCharge = TMath::Sign(1., trk->GetParamFirst().GetQp());
34 
35  Double_t pl = trk->GetParamFirst().GetMomentum().Z();
36  Double_t pt = trk->GetParamFirst().GetMomentum().Perp();
37  fRadius = pt/0.006;
38  fTanL = pl/pt;
39 
40  TVector2 radius = momentum.XYvector();
41  radius = radius.Unit();
42  double rotx = radius.X();
43  double roty = radius.Y();
44  TVector2 myrad(fCharge * roty, - fCharge * rotx);
45  myrad *= fRadius;
46 
47  TVector2 center = myrad + position.XYvector();
48  fCenterX = center.X();
49  fCenterY = center.Y();
50 
51  fZ0 = 0; // CHECK
52 
53  // ----------------------------------------------
54  // cluster? // CHECK
55 
56 
57 
58 
59  fPhiMin = ComputePhi(trk->GetParamFirst().GetPosition());
60  if(fPhiMin > 180) fPhiMin -= 360;
61 
62  fPhiMax = ComputePhi(trk->GetParamLast().GetPosition());
63  if(fPhiMax > 180) fPhiMax -= 360;
64 
65  if(fCharge > 0 && fPhiMin < fPhiMax) fPhiMin += 360;
66  else if(fCharge < 0 && fPhiMin > fPhiMax) fPhiMax += 360;
67 
68 
69 }
70 
71 PndTrkTrack::PndTrkTrack(const PndTrkTrack &track) : TObject(track), fCluster(PndTrkCluster()), fRefHit(NULL), fCenterX(0), fCenterY(0), fRadius(0), fTanL(0), fZ0(0), fCharge(0), fPhiMin(0), fPhiMax(360) {
72  *this = track;
73 }
74 
75 
77  delete fRefHit;
78 
79 }
80 
81 
82 // operator equals
84  fRefHit = track.fRefHit;
85  fCluster = track.fCluster;
86  fCenterX = track.fCenterX;
87  fCenterY = track.fCenterY;
88  fRadius = track.fRadius;
89  fTanL = track.fTanL;
90  fZ0 = track.fZ0;
91  fCharge = track.fCharge;
92  fPhiMin = track.fPhiMin;
93  fPhiMax = track.fPhiMax;
94  return *this;
95 }
96 
98  int nofhits = GetCluster().GetNofHits();
99  return nofhits == track.GetCluster().GetNofHits() && fRadius == track.GetRadius() && fCenterX == track.GetCenter().X() && fCenterY == track.GetCenter().Y(); // CHECK
100 }
101 
102 void PndTrkTrack::Clear(Option_t* opt) {
103  delete fRefHit;
104  fCluster.Clear(opt);
105 }
106 
107 
109  PndTrackCand trkcand;
110  for(int ihit = 0; ihit < fCluster.GetNofHits(); ihit++) {
111  PndTrkHit *hit = fCluster.GetHit(ihit);
112  int detid = hit->GetDetectorID();
113  int hitid = hit->GetHitID();
114  trkcand.AddHit(detid, hitid, ihit);
115  }
116  return trkcand;
117 }
118 
120 
121  ComputeCharge();
122 
123  // first
124  TVector3 pos1, mom1;
125  PndTrkHit *hit1 = fCluster.GetHit(0);
126  mom1 = ComputeMomentumAtPosition(hit1->GetPosition(), pos1);
127 
128  // last
129  TVector3 pos2, mom2;
131  mom2 = ComputeMomentumAtPosition(hit2->GetPosition(), pos2);
132 
133  TVector3 dj(1, 0, 0), dk(0, 0, 1); // CHECK
134  TVector3 dpos1(2., 2., 10.); // CHECK
135  TVector3 dpos2(2., 2., 10.); // CHECK
136  TVector3 dmom1(0.2, 0.2, 0.5); // CHECK
137  TVector3 dmom2(0.2, 0.2, 0.5); // CHECK
138 
139  FairTrackParP firstpar(pos1, mom1,
140  dpos1, dmom1, fCharge,
141  pos1, dj, dk);
142 
143  FairTrackParP lastpar(pos2, mom2,
144  dpos2, dmom2, fCharge,
145  pos2, dj, dk);
146 
148  PndTrack track(firstpar, lastpar, trkcand);
149  if(mom1.Z() == -999) track.SetFlag(-1);
150  return track;
151 }
152 
153 
154 
155 // void OrderFrom(TVector3 point) {
156 
157 // TVector3 tmpposition = point;
158 // double tmpdistance = 1000.;
159 // for(int ihit = 0; ihit < fCluster.GetNofHits(); ihit++) {
160 // PndTrkHit *hit = fCluster.GetHit(ihit);
161 // TVector3 position = hit->GetPosition();
162 // double distance = (position - point).Mag();
163 // if(distance < tmpdistance) {
164 // tmpposition = position;
165 // tmpdistance = distance;
166 // }
167 // }
168 
169 
170 
171 void PndTrkTrack::ComputeCharge() { // CHECK!!!
172 
202  // consider the poca on track
203  Int_t nmore = 0, nless = 0;
204 
205  // first
206  PndTrkHit *hit1 = (PndTrkHit*) fCluster.GetHit(0);
207  PndTrkTools tools;
208  TVector3 position1 = tools.ComputePocaToPointOnCircle3(hit1->GetPosition().X(), hit1->GetPosition().Y(), fCenterX, fCenterY, fRadius);
209 
210  // phi of first hit with respect to center of curvature
211  TVector3 direction1 = position1 - TVector3(fCenterX, fCenterY, 0);
212  double tmpphi = direction1.Phi();
213  //
214  if(direction1.Y()) tmpphi += 2 * TMath::Pi(); // CHECK
215 
216  for(int ihit = 1; ihit < fCluster.GetNofHits(); ihit++) {
217  PndTrkHit *hit = fCluster.GetHit(ihit);
218  TVector3 position = tools.ComputePocaToPointOnCircle3(hit->GetPosition().X(), hit->GetPosition().Y(), fCenterX, fCenterY, fRadius);
219 
220  // vector from 1st to this hit
221  TVector3 direction = position - TVector3(fCenterX, fCenterY, 0);
222  double phi = direction.Phi();
223  if(ihit > 1) phi >= tmpphi ? nmore++ : nless++;
224  tmpphi = phi;
225  // cout << "phi " << phi * TMath::RadToDeg() << " " << hit->GetHitID() << " " << hit->GetDetectorID() << endl;
226  }
227 
228  if(nmore > nless) fCharge = -1;
229  else fCharge = 1;
230 
231  // cout << "fCharge " << fCharge << " " << nmore << " " << nless << endl;
232 
290 }
291 
292 
293 TVector3 PndTrkTrack::ComputeMomentumAtPosition(TVector3 position, TVector3 &newposition) {
294  TVector3 momentum(-999, -999, -999);
295  newposition = position;
296  if(fCharge == 0) {
297  // cout << "ComputeMomentumAtPos: CHARGE = 0!" << endl;
298  return momentum;
299  }
300 
301  TVector2 center(fCenterX, fCenterY);
302  TVector2 pos = TVector2(position.X(), position.Y());
303  TVector2 myrad = center - pos;
304  double distance = TMath::Abs(myrad.Mod() - fRadius);
305  if(distance > 0.5) {
306  // cout << "ComputeMomentumAtPosition: POINT NOT ON THE TRACK " << distance << endl;
307  // return momentum; // CHECK
308  // alternative
309  // CHECK
310  PndTrkTools tools;
311  newposition = tools.ComputePocaToPointOnCircle3(pos.X(), pos.Y(), fCenterX, fCenterY, fRadius);
312  myrad = center - pos;
313  distance = TMath::Abs(myrad.Mod() - fRadius);
314  // if(distance > 0.5) {
315  // cout << "ComputeMomentumAtPosition: AGAIN POINT NOT ON THE TRACK " << distance << endl;
316  // return momentum;
317  // }
318  }
319 
320 
321  Double_t rotx, roty;
322  rotx = - fCharge * myrad.Y();
323  roty = fCharge * myrad.X();
324 
325 
326 // cout << "COMPUTE MOMENTUM " << fRadius << endl;
327  Double_t pt = 0.006 * fRadius;
328 
329 // cout << "pt " << pt << endl;
330  Double_t pl = -999;
331  if(fTanL != -999) pl = pt * fTanL;
332 // cout << "pl " << pl << " tanl " << fTanL << endl;
333 
334  //Double_t ptot = TMath::Sqrt(pt * pt + pl * pl); //[R.K. 01/2017] unused variable
335 
336 
337 // cout << rotx << " " << roty << endl;
338  momentum.SetX(rotx); // CHECK magnitude?
339  momentum.SetY(roty); // CHECK magnitude?
340  momentum.SetZ(0.); // CHECK magnitude?
341  // momentum.Print();
342  momentum.SetMag(pt);
343  // momentum.Print();
344  momentum.SetZ(pl);
345  // momentum.Print();
346  return momentum;
347 }
348 
350 {
372  // x0 y0
374  Double_t phi = TMath::ATan2(fCenterY, fCenterX);
375 
376  Double_t x0 = d * TMath::Cos(phi);
377  Double_t y0 = d * TMath::Sin(phi);
378 
379  Double_t Phi0 = TMath::ATan2((y0 - fCenterY),(x0 - fCenterX));
380 
381  // CHECK :-)GOOD! ...
382  TVector2 v(x0 - fCenterX, y0 - fCenterY);
383  double alpha = TMath::ATan2(hit.Y() - y0 + fRadius * TMath::Sin(Phi0), hit.X() - x0 + fRadius * TMath::Cos(Phi0));
384  TVector2 p(hit.X() - fCenterX, hit.Y() - fCenterY);
385 
386  Double_t Fi = - fCharge * TMath::ACos(v * p / (v.Mod() * p.Mod()));
387  double pi = TMath::Pi();
388  double pi2 = 2 * pi;
389 
390  // Fi = h * (pi2 - h * Fi) // should be correct
391  if((fCharge > 0 && ((Phi0 > 0 && ((alpha > 0 && alpha > Phi0) ||
392  (alpha < 0 && alpha < Phi0 - pi)))
393  ||
394  ((Phi0 < 0 && ((alpha > 0 && alpha < pi + Phi0) ||
395  (alpha < 0 && alpha > Phi0)))) ))) Fi = - (pi2 + Fi) ;
396  else if((fCharge < 0 && ((Phi0 > 0 && ((alpha > 0 && alpha < Phi0) ||
397  (alpha < 0 && alpha > Phi0 - pi)))
398  ||
399  ((Phi0 < 0 && ((alpha > 0 && alpha > pi + Phi0) ||
400  (alpha < 0 && alpha < Phi0)))) ))) Fi = pi2 - Fi ;
401 
402  // cout << "PHI ----------------- " << Fi * TMath::RadToDeg() << endl;
403 
404  return (Phi0 + Fi) * TMath::RadToDeg();
405 
406 }
407 
408 Double_t PndTrkTrack::ComputePhiFrom(TVector3 hit, TVector3 from)
409 {
410  // cout << "phi " << hit.X() << " " << hit.Y() << endl;
411 
412  TVector3 center(fCenterX, fCenterY, 0.);
413  TVector3 fromcentertofrom = from - center;
414  double phi0 = fromcentertofrom.Phi();
415 
416  double xtr = hit.X() - fCenterX;
417  double ytr = hit.Y() - fCenterY;
418  double xp = TMath::Cos(phi0) * xtr + TMath::Sin(phi0) * ytr;
419  double yp = -TMath::Sin(phi0) * xtr + TMath::Cos(phi0) * ytr;
420 
421  TVector3 trarothit = TVector3(xp, yp, 0.);
422 
423  // I want the positive phi angle from x axis
424  // in range [0, 360[.
425  // I use TVector3::Phi() [fromcentertohit.Phi()]:
426  // x y Phi use!
427  // -------------------------
428  // + + 0/90 phi
429  // - + 90/180 phi
430  // - - -180/-90 phi + 360
431  // + - -90/0 phi + 360
432 
433 
434  double phi = trarothit.Phi();
435  // if(trarothit.Y() < 0) phi += (2 * TMath::Pi());
436 
437  // cout << "final phi in rad " << phi << endl;
438  // return phi * TMath::RadToDeg();
439 
440  Double_t Phi0 = phi0;
441 
442  Double_t x0 = from.X();
443  Double_t y0 = from.Y();
444 
445 // Double_t Phi0 = TMath::ATan2((y0 - fCenterY),(x0 - fCenterX));
446 
447 // // CHECK :-)GOOD! ...
448 // TVector2 v(x0 - fCenterX, y0 - fCenterY);
449  double alpha = TMath::ATan2(hit.Y() - y0 + fRadius * TMath::Sin(Phi0), hit.X() - x0 + fRadius * TMath::Cos(Phi0));
450 // TVector2 p(hit.X() - fCenterX, hit.Y() - fCenterY);
451 
452 // Double_t Fi = - fCharge * TMath::ACos(v * p / (v.Mod() * p.Mod()));
453  double pi = TMath::Pi();
454  double pi2 = 2 * pi;
455 
456 // // Fi = h * (pi2 - h * Fi) // should be correct
457 
458  Double_t Fi = phi;
459  if((fCharge > 0 && ((Phi0 > 0 && ((alpha > 0 && alpha > Phi0) ||
460  (alpha < 0 && alpha < Phi0 - pi)))
461  ||
462  ((Phi0 < 0 && ((alpha > 0 && alpha < pi + Phi0) ||
463  (alpha < 0 && alpha > Phi0)))) ))) Fi = - (pi2 + Fi) ;
464  else if((fCharge < 0 && ((Phi0 > 0 && ((alpha > 0 && alpha < Phi0) ||
465  (alpha < 0 && alpha > Phi0 - pi)))
466  ||
467  ((Phi0 < 0 && ((alpha > 0 && alpha > pi + Phi0) ||
468  (alpha < 0 && alpha < Phi0)))) ))) Fi = pi2 - Fi ;
469 
470  // cout << "PHI ----------------- " << Fi * TMath::RadToDeg() << endl;
471 
472  return Fi * TMath::RadToDeg();
473 
474 
475 }
476 // =======================================================================================
477 void PndTrkTrack::Draw(Color_t color) {
478  cout << "draw" << endl;
479 
480  if(fCluster.GetNofHits() > 0) {
481  PndTrkHit *hit0 = fCluster.GetHit(0);
482  fPhiMin = ComputePhi(hit0->GetPosition());
483  // if(fPhiMin > 180) fPhiMin -= 360;
484  hit0->GetPosition().Print();
485 
487  fPhiMax = ComputePhi(hitN->GetPosition());
488  // if(fPhiMax > 180) fPhiMax -= 360;
489  hitN->GetPosition().Print();
490 
491 
492  // if(fCharge > 0 && fPhiMin < fPhiMax) fPhiMin += 360;
493 // else if(fCharge < 0 && fPhiMin > fPhiMax) fPhiMax += 360;
494 
495  }
496  TArc *track = new TArc(fCenterX, fCenterY, fRadius, fPhiMin, fPhiMax);
497 
498 
499 
500 
501  cout << fCharge << " " << fCenterX << " " << fCenterY << " " << fRadius << " " << fPhiMin << " " << fPhiMax << endl;
502  track->SetFillStyle(0);
503  track->SetLineColor(color);
504  track->Draw("only SAME");
505 }
506 
508  Draw(kYellow);
509  fCluster.LightUp();
510 }
511 
513 
double fPhiMax
Definition: PndTrkTrack.h:71
TVector3 pos
Double_t x0
Definition: checkhelixhit.C:70
Double_t p
Definition: anasim.C:58
Double_t GetRadius()
Definition: PndTrkTrack.h:43
TObjArray * d
void Clear(Option_t *opt="")
PndTrack ConvertToPndTrack()
Bool_t operator==(PndTrkTrack track)
Definition: PndTrkTrack.cxx:97
PndTrackCand ConvertToPndTrackCand()
double fRadius
Definition: PndTrkTrack.h:68
static T Sqrt(const T &x)
Definition: PndCAMath.h:37
PndTrkCluster GetCluster()
Definition: PndTrkTrack.h:48
static T Sin(const T &x)
Definition: PndCAMath.h:42
#define pi
Definition: createSTT.C:60
static T Cos(const T &x)
Definition: PndCAMath.h:43
__m128 v
Definition: P4_F32vec4.h:4
TVector2 GetCenter()
Definition: PndTrkTrack.h:44
double fPhiMin
Definition: PndTrkTrack.h:70
double fZ0
Definition: PndTrkTrack.h:68
PndTrkHit * GetHit(int index)
Int_t GetHitID()
Definition: PndTrkHit.h:56
TString pt(TString pts, TString exts="px py pz")
Definition: invexp.C:133
Double_t ComputePhi(TVector3 hit)
static T Abs(const T &x)
Definition: PndCAMath.h:39
void ComputeCharge()
TVector3 ComputeMomentumAtPosition(TVector3 position, TVector3 &newposition)
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
Int_t GetDetectorID()
Definition: PndTrkHit.h:57
double fCenterY
Definition: PndTrkTrack.h:68
void Clear(Option_t *="")
Double_t
PndTrkTrack & operator=(const PndTrkTrack &track)
Definition: PndTrkTrack.cxx:83
Double_t phi0
Definition: checkhelixhit.C:60
Double_t y0
Definition: checkhelixhit.C:71
static T ATan2(const T &y, const T &x)
TVector3 GetPosition()
Definition: PndTrkHit.h:62
PndMCTrack * track
Definition: anaLmdCluster.C:89
FairTrackParP GetParamLast()
Definition: PndTrack.h:50
void Draw(Color_t color=kBlack)
TVector3 ComputePocaToPointOnCircle3(double x, double y, double xc, double yc, double R)
Definition: PndTrkTools.cxx:52
GFTrack * trk
Definition: checkgenfit.C:13
PndTrkHit * fRefHit
Definition: PndTrkTrack.h:67
Double_t x
void LightUp()
void SetFlag(Int_t i)
Definition: PndTrack.h:38
ClassImp(PndAnaContFact)
PndSdsMCPoint * hit
Definition: anasim.C:70
Double_t y
double alpha
Definition: f_Init.h:9
double fTanL
Definition: PndTrkTrack.h:68
Int_t GetNofHits()
Definition: PndTrkCluster.h:52
double fCenterX
Definition: PndTrkTrack.h:68
Double_t Pi
FairTrackParP GetParamFirst()
Definition: PndTrack.h:49
PndTrkCluster fCluster
Definition: PndTrkTrack.h:66
Double_t ComputePhiFrom(TVector3 hit, TVector3 from)