FairRoot/PandaRoot
PndHelixPropagator.cxx
Go to the documentation of this file.
1 /*
2  * PndHelixPropagator.cxx
3  *
4  * Created on: Sep 23, 2013
5  * Author: stockman
6  */
7 
8 #include "PndHelixPropagator.h"
9 #include "TMath.h"
10 
11 #include <iostream>
12 
14 
16  fFieldStrength(0), fOrigin(), fMomentum(), fCharge(0)
17 {
18 }
19 
21  // TODO Auto-generated destructor stub
22 }
23 
25 {
26  TVector3 magField(0,0,fFieldStrength);
27  TVector3 dirRadius = fMomentum.Cross(magField).Unit();
28  TVector3 circleCenter = fOrigin + (fCharge * Radius() * dirRadius);
29 
30  Double_t ratioPtPl = fMomentum.Pt() / fMomentum.z();
31 
32  TVector3 zeroCircle = fOrigin - circleCenter;
33 
34  Double_t zLength = zPos - fOrigin.z();
35  Double_t arcLength = ratioPtPl * zLength;
36  Double_t deltaPhi = arcLength / Radius();
37  Double_t newPhi = deltaPhi + zeroCircle.Phi();
38 
39  TVector3 newOrigin = zeroCircle;
40  newOrigin.SetPhi(newPhi);
41  newOrigin += circleCenter;
42  newOrigin.SetZ(zPos);
43  TVector3 newMomentum = fMomentum;
44 
45  newMomentum.RotateZ(deltaPhi);
46 
47  std::cout << "PndHelixPropagator::PropagateToZ " << zPos << std::endl;
48  std::cout << "Origin: "; fOrigin.Print(); std::cout << std::endl;
49  std::cout << "Momentum: "; fMomentum.Print(); std::cout << " Ratio Pt/Pl: " << ratioPtPl << " Radius: " << Radius() << " "; dirRadius.Print(); std::cout << std::endl;
50  std::cout << "circleCenter: "; circleCenter.Print(); std::cout << std::endl;
51  std::cout << "zeroCircle: "; zeroCircle.Print(); std::cout << std::endl;
52  std::cout << "Phi: " << zeroCircle.Phi() << " deltaPhi: " << deltaPhi << " newPhi: " << newPhi << std::endl;
53  std::cout << "NewOrigin: "; newOrigin.Print(); std::cout << std::endl;
54  std::cout << "NewMomentum: "; newMomentum.Print(); std::cout << std::endl;
55 
56 
57  FairTrackPar result(newOrigin.x(), newOrigin.y(), newOrigin.z(), newMomentum.Px(), newMomentum.Py(), newMomentum.Pz(), fCharge);
58 
59  return result;
60 }
61 
62 FairTrackPar PndHelixPropagator::PropagateToXYPos(TVector2 ) // xyPos //[R.K.03/2017] unused variable(s)
63 { //FIXME The TVector2 is not utilized!
64  TVector3 magField(0,0,fFieldStrength);
65 
66  TVector3 dirRadius = fMomentum.Cross(magField).Unit();
67  TVector3 circleCenter = fOrigin + (fCharge * Radius() * dirRadius);
68  circleCenter.SetZ(0);
69 
70  Double_t ratioPtPl = fMomentum.Pt() / fMomentum.z();
71 
72  TVector3 zeroCircle = fOrigin - circleCenter;
73 
74  TVector3 negCircleCenter = -circleCenter;
75 
76  Double_t deltaPhi = negCircleCenter.DeltaPhi(zeroCircle);
77 
78  TVector3 newOrigin = negCircleCenter.Unit() * Radius() + circleCenter;
79  Double_t zPos = deltaPhi * Radius() / ratioPtPl - fOrigin.Z();
80  newOrigin.SetZ(zPos);
81 
82 
83  TVector3 newMomentum = fMomentum;
84  newMomentum.RotateZ(deltaPhi);
85 
86  std::cout << "PndHelixPropagator::PropagateToXYPos" << std::endl;
87  std::cout << "Origin: "; fOrigin.Print(); std::cout << std::endl;
88  std::cout << "Momentum: "; fMomentum.Print(); std::cout << " Ratio Pt/Pl: " << ratioPtPl << " Radius: " << Radius() << " "; dirRadius.Print(); std::cout << std::endl;
89  std::cout << "circleCenter: "; circleCenter.Print(); std::cout << " " << circleCenter.Pt() << std::endl;
90  std::cout << "zeroCircle: "; zeroCircle.Print(); std::cout << std::endl;
91  std::cout << "Phi: " << zeroCircle.Phi() << " deltaPhi: " << deltaPhi << std::endl;
92  std::cout << "NewOrigin: "; newOrigin.Print(); std::cout << std::endl;
93  std::cout << "NewMomentum: "; newMomentum.Print(); std::cout << std::endl;
94 
95 
96  FairTrackPar result(newOrigin.x(), newOrigin.y(), newOrigin.z(), newMomentum.Px(), newMomentum.Py(), newMomentum.Pz(), fCharge);
97 
98  return result;
99 }
100 
101 FairTrackPar PropagateToS(Double_t ) // arcLength //[R.K.03/2017] unused variable(s)
102 {
103  // Not yet implemented!
104  std::cout << "*** -E- PndHelixPropagator::PropagateToS not yet implemented!" << std::endl;
105  return FairTrackPar();
106 }
107 
108 
110 {
111  TVector3 magField(0,0,fFieldStrength);
112  TVector3 dirRadius = fMomentum.Cross(magField).Unit();
113  TVector3 circleCenter = fOrigin + (fCharge * Radius() * dirRadius);
114  Double_t stepInRad = step / 180 * TMath::Pi();
115 
116  Double_t ratioPtPl = 0;
117  if (fMomentum.Pz() != 0)
118  ratioPtPl = fMomentum.Pt() / fMomentum.Pz();
119 
120  TVector3 zeroCircle = fOrigin - circleCenter;
121 
122  Double_t newPhi = zeroCircle.Phi() + stepInRad;
123  TVector3 newOrigin = zeroCircle;
124  newOrigin.SetPhi(newPhi);
125  newOrigin += circleCenter;
126  if (ratioPtPl != 0)
127  newOrigin.SetZ((stepInRad * Radius() * -1 * fCharge / ratioPtPl) + fOrigin.Z());
128  else
129  newOrigin.SetZ(fOrigin.Z());
130 
131  TVector3 newMomentum = fMomentum;
132 
133  newMomentum.RotateZ(stepInRad);
134 
135  std::cout << "PndHelixPropagator::PropagateByAngle " << step << std::endl;
136  std::cout << "Origin: "; fOrigin.Print(); std::cout << std::endl;
137  std::cout << "Momentum: "; fMomentum.Print(); std::cout << " Ratio Pt/Pl: " << ratioPtPl << " Radius: " << Radius() << " "; dirRadius.Print(); std::cout << std::endl;
138  std::cout << "circleCenter: "; circleCenter.Print(); std::cout << std::endl;
139  std::cout << "zeroCircle: "; zeroCircle.Print(); std::cout << std::endl;
140  std::cout << "Phi: " << zeroCircle.Phi() << " deltaPhi: " << stepInRad << " newPhi: " << newPhi << std::endl;
141  std::cout << "NewOrigin: "; newOrigin.Print(); std::cout << std::endl;
142  std::cout << "NewMomentum: "; newMomentum.Print(); std::cout << std::endl;
143 
144 
145  FairTrackPar result(newOrigin.x(), newOrigin.y(), newOrigin.z(), newMomentum.Px(), newMomentum.Py(), newMomentum.Pz(), fCharge);
146  return result;
147 }
148 
149 
151  return fMomentum.Perp() / (fFieldStrength * 0.3)*100;
152 }
FairTrackPar PropagateByAngle(Double_t step)
Double_t
FairTrackPar PropagateToS(Double_t)
FairTrackPar PropagateToZ(Double_t zPos)
FairTrackPar PropagateToXYPos(TVector2 xyPos)
ClassImp(PndHelixPropagator) PndHelixPropagator
Double_t Pi