Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MyTrajectoryBfield.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <vector>
3 #include <CLHEP/Matrix/Matrix.h>
4 #include <CLHEP/Matrix/Vector.h>
5 
6 using namespace std;
7 
8 #include "MyTrajectory.h"
9 #include "MyTrajectoryBfield.h"
10 
11 #define TRACKING_RADIUS_MAX 60.0
12 
14  int level)
15  : MyTrajectory(level), nparams(5), params(nparams), BConst(B_in), delta(nparams, 0.0001), bfield(NULL),
16  debug_level(level) {
17  return;
18 }
19 
21  int level)
22  : MyTrajectory(level), nparams(5), params(nparams), delta(nparams, 0.0001), bfield(bfield_in),
23  debug_level(level) {
24  return;
25 }
26 
28  return nparams;
29 }
30 
31 void MyTrajectoryBfield::swim(const HepVector& param) {
32  double xp0, z0, theta0, phi0, ptinv;
33  xp0 = param(1);
34  z0 = param(2);
35  theta0 = param(3);
36  phi0 = param(4);
37  ptinv = param(5);
38  MyTrajectoryBfield::swim(xp0, z0, theta0, phi0, ptinv);
39  return;
40 }
41 
42 void MyTrajectoryBfield::swim(double xp0, double z0, double theta,
43  double phi, double ptinv) {
44  if (debug_level >= 3) cout << "starting B-field swim, xp0 = " << xp0
45  << " z0 = " << z0 << " theta = " << theta
46  << " phi = " << phi << " ptinv = " << ptinv << endl;
47  // store input parameters as member data
48  params(1) = xp0;
49  params(2) = z0;
50  params(3) = theta;
51  params(4) = phi;
52  params(5) = ptinv;
53  checkClear();
54  const double c = 29.9792458; // speed of light, cm/ns
55  double m=0.139, dt=0.01; // gev/c^2, ns
56  double cdt = c*dt;
57  HepVector r_0(3), r_1(3), r_2(3), k(3), v_0(3);
58  HepMatrix A(3,3,0), I(3,3,1), M(3,3), onePlusA(3,3);
59  int ierr;
60  double beta, k_1;
61  if (ptinv != 0.0) {
62  double p = 1.0/ptinv/sin(theta);
63  double E = sqrt(m*m + p*p);
64  double gamma = E/m;
65  beta = sqrt(1.0 - 1.0/(gamma*gamma));
66  double e;
67  if (ptinv > 0.0) {e = 1.0;} else {e = -1.0;} // only allow singly
68  // charged particles
69  k_1 = (e*1.60217653e-19)*(dt*1.0e-9)/(gamma*(m*1.78266181e-27));
70  // cout << "gamma = " << gamma << endl;
71  } else {
72  beta = 1.0;
73  k_1 = 0.0;
74  }
75  // cout << "beta = " << beta << " k_1 = " << k_1 << endl;
76  double v = beta*c; // cm/ns
77  double sinTheta = sin(theta);
78  double cosTheta = cos(theta);
79  double sinPhi = sin(phi);
80  double cosPhi = cos(phi);
81  v_0(1) = v*sinTheta*cosPhi;
82  v_0(2) = v*sinTheta*sinPhi;
83  v_0(3) = v*cosTheta;
84  // cout << "MyTrajectoryBfield::swim initial velocity:" << v_0;
85  HepLorentzVector *thisVector;
86  r_0(1) = xp0*sinPhi; // = xp0*cos(alpha) where alpha = phi - pi/2
87  r_0(2) = -xp0*cosPhi; // = xp0*sin(alpha)
88  r_0(3) = z0;
89  thisVector = new HepLorentzVector(r_0(1), r_0(2), r_0(3), 0.0);
90  traj.push_back(thisVector);
91  r_1 = r_0 + v_0*dt;
92  thisVector = new HepLorentzVector(r_1(1), r_1(2), r_1(3), cdt);
93  traj.push_back(thisVector);
94  double ctime = 2.0*cdt;
95  HepVector B(3);
96  for (int istep = 0; istep < 2000; istep++) {
97  B = getField(r_1);
98  if (debug_level > 2) cout << "MyTrajectoryBfield::swim B vector:" << B;
99  k = 0.5*k_1*B;
100  //cout << "MyTrajectoryBfield::swim k vector:" << k;
101  A(1,2) = -k(3);
102  A(1,3) = k(2);
103  A(2,1) = k(3);
104  A(2,3) = -k(1);
105  A(3,1) = -k(2);
106  A(3,2) = k(1);
107  onePlusA = I + A;
108  M = onePlusA.inverse(ierr)*(I - A); // can we take advantage of anti-sym?
109  r_2 = r_1 + M*(r_1 - r_0);
110  if (debug_level >=3 ) {
111  if (istep%300 == 0) cout << istep << ' ' << r_2(1) << ' '
112  << r_2(2) << ' ' << r_2(3) << endl;
113  }
114  thisVector = new HepLorentzVector(r_2(1), r_2(2), r_2(3), ctime);
115  traj.push_back(thisVector);
116  r_0 = r_1; r_1 = r_2;
117  ctime += cdt;
118  if (sqrt(r_0(1)*r_0(1) + r_0(2)*r_0(2)) > TRACKING_RADIUS_MAX) break;
119  }
120  return;
121 }
122 
124 
125 HepVector MyTrajectoryBfield::getField(HepVector& r) {
126  HepVector BThis(3);
127  if (bfield) {
128  bfield->GetField(r(1), r(2), r(3), BThis(1), BThis(2), BThis(3));
129  } else {
130  BThis = BConst;
131  }
132  return BThis;
133 }
MyTrajectoryBfield(const DMagneticFieldMap *bfield, int level=1)
#define c
HepVector getField(HepVector &r)
void swim(const HepVector &param)
unsigned int getNumberOfParams()
vector< HepLorentzVector * > traj
Definition: MyTrajectory.h:40
TEllipse * e
void checkClear()
double sqrt(double)
double sin(double)
const DMagneticFieldMap * bfield
virtual void GetField(const DVector3 &pos, DVector3 &Bout) const =0
#define TRACKING_RADIUS_MAX
#define I(x, y, z)