Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MyTrajectory.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <vector>
3 
4 using namespace std;
5 
6 #include "MyTrajectory.h"
7 
8 MyTrajectory::MyTrajectory(int level) : nparams(4), delta(4, 0.001),
9  debug_level(level) {
10  // explicit default constructor, set number of params for straight line
11  // cout << "MyTrajectory constructor called\n";
12  // cout << "nparams = " << nparams << endl;
13  return;
14 }
15 
17  clear();
18  return;
19 }
20 
22  return nparams;
23 }
24 
26  if (traj.size() != 0) {
27  for (vector<HepLorentzVector*>::iterator iVector = traj.begin();
28  iVector != traj.end();
29  iVector++) {
30  delete *iVector;
31  }
32  }
33  traj.clear();
34  return;
35 }
36 
37 void MyTrajectory::swim(HepVector startingPoint, double theta,
38  double phi)
39 // default swim, straight line
40 {
41  checkClear();
42  double stepLength = 1.0;
43  double t0 = 0.0;
44  HepLorentzVector step;
45  step.setX(stepLength*sin(theta)*cos(phi));
46  step.setY(stepLength*sin(theta)*sin(phi));
47  step.setZ(stepLength*cos(theta));
48  step.setT(stepLength);
49  HepLorentzVector* thisVector;
50  thisVector = new HepLorentzVector(startingPoint(1), startingPoint(2),
51  startingPoint(3), t0);
52  traj.push_back(thisVector);
53  HepLorentzVector lastVector(*thisVector);
54  for (int i = 0; i < 600; i++) {
55  thisVector = new HepLorentzVector();
56  *thisVector = lastVector + step;
57  traj.push_back(thisVector);
58  lastVector = *thisVector;
59  }
60  return;
61 }
62 
63 void MyTrajectory::swim(const HepVector& startingVector) {
64  HepVector startingPoint(3);
65  startingPoint(1) = startingVector(1);
66  startingPoint(2) = startingVector(2);
67  startingPoint(3) = 0.0; // start at z = 0 every time
68  double theta = startingVector(3);
69  double phi = startingVector(4);
70  swim(startingPoint, theta, phi);
71  return;
72 }
73 
74 void MyTrajectory::swim(const vector<double> &params) {
75  int size = params.size();
76  HepVector hepParams(size);
77  for (int i = 0; i < size; i++) {
78  hepParams(i + 1) = params[i];
79  }
80  swim(hepParams);
81  return;
82 }
83 
84 void MyTrajectory::swimMC(vector<const DMCTrackHit*> &mctrackhits) {
85  checkClear();
86  const DMCTrackHit* mchit;
87  HepLorentzVector *point;
88  for (vector<const DMCTrackHit*>::iterator imchit = mctrackhits.begin();
89  imchit != mctrackhits.end();
90  imchit++) {
91  mchit = *imchit;
92  if (mchit->system & (SYS_CDC | SYS_FDC) && mchit->primary == 1) {
93  double r = mchit->r, phi = mchit->phi, z = mchit->z;
94  point = new HepLorentzVector(r*cos(phi), r*sin(phi), z);
95  traj.push_back(point);
96  }
97  }
98 }
99 
101 {
102  cout << "### MyTrajectory print out begin ###" << endl;
103  for (vector<HepLorentzVector*>::iterator iVector = traj.begin();
104  iVector != traj.end();
105  iVector++) {
106  cout << (**iVector).x() << " " << (**iVector).y() << " " << (**iVector).z() << " " << (**iVector).t()
107  << endl;
108  }
109  cout << "### MyTrajectory print out end ###" << endl;
110 }
111 
112 vector<HepLorentzVector*>* MyTrajectory::getTrajectory() {
113  return &traj;
114 }
115 
116 double MyTrajectory::dist(HepVector& point, int trajIndex) const {
117  Hep3Vector delta, point3(point(1), point(2), point(3)), trajPoint;
118  trajPoint = traj[trajIndex]->getV();
119  delta = point3 - trajPoint;
120  if (debug_level >= 4) cout << "point3 = " << point3
121  << "traj point = " << trajPoint
122  << "delta = " << delta
123  << "delta.mag = " << delta.mag() << endl;
124  return delta.mag();
125 }
126 
127 double MyTrajectory::dist(DLine& line, int trajIndex) const {
128  return line.doca(*traj[trajIndex]);
129 }
130 
131 int MyTrajectory::getXYT(double z, double &x, double &y, double &t) const {
132  int iBefore = 0, iAfter = traj.size() - 1, iTry;
133  double zBefore = traj[iBefore]->z();
134  double zAfter = traj[iAfter]->z();
135  double zTry;
136  if (z < zBefore || z > zAfter) {
137  return 1;
138  }
139  while (iAfter - iBefore > 1) {
140  iTry = iBefore
141  + (int)((double)(iAfter - iBefore)*(z - zBefore)/(zAfter - zBefore)
142  + 0.5);
143  if (debug_level > 3) cout << iBefore << ' ' << iTry
144  << ' ' << iAfter << endl;
145  if (iBefore == iTry) iTry++;
146  if (iAfter == iTry) iTry--;
147  if (debug_level > 3) cout << iBefore << ' ' << iTry
148  << ' ' << iAfter << endl;
149  zTry = traj[iTry]->z();
150  if (debug_level > 3) cout << "zTry = " << zTry << endl;
151  if (z < zTry) {
152  iAfter = iTry;
153  zAfter = traj[iAfter]->z();
154  } else if (z > zTry) {
155  iBefore = iTry;
156  zBefore = traj[iBefore]->z();
157  } else {
158  iBefore = iTry;
159  zBefore = traj[iBefore]->z();
160  iAfter = iTry + 1;
161  zAfter = traj[iAfter]->z();
162  }
163  if (debug_level > 3) cout << z << ' ' << zBefore << ' ' << zTry
164  << ' ' << zAfter << endl;
165  }
166  double frac, otherfrac;
167  frac = (z - zBefore)/(zAfter - zBefore);
168  otherfrac = 1.0 - frac;
169  if (debug_level > 3) cout << frac << ' ' << otherfrac << endl;
170  if (debug_level > 3) cout << "x before, after " << traj[iBefore]->x()
171  << ' '<< traj[iAfter]->x() << endl;
172  if (debug_level > 3) cout << "y before, after " << traj[iBefore]->y()
173  << ' '<< traj[iAfter]->y() << endl;
174  x = frac*traj[iAfter]->x() + otherfrac*traj[iBefore]->x();
175  y = frac*traj[iAfter]->y() + otherfrac*traj[iBefore]->y();
176  t = frac*traj[iAfter]->t() + otherfrac*traj[iBefore]->t();
177  if (debug_level > 3) cout << "MyTrajectory::getXYT, x, y, t = " << x << " " << y
178  << " " << t << endl;
179  return 0;
180 }
181 
182 void MyTrajectory::para_min(double yMinus, double yZero, double yPlus,
183  double &xMinFrac, double &yMin) const {
184  double a, b, c;
185  a = 0.5*(yPlus - 2.0*yZero + yMinus);
186  b = 0.5*(yPlus - yMinus);
187  c = yZero;
188  yMin = -b*b/(4.0*a) + c;
189  if (yMin < 0.0) yMin = 0.0;
190  xMinFrac = -b/(2.0*a);
191  return;
192 }
193 
195  if (traj.size() != 0) {
196  int ierror = 2;
197  throw ierror;
198  }
199  return;
200 }
201 
202 void MyTrajectory::dump_ascii(ostream *trajFile, int tag) {
203  HepVector trajPoint(3);
204  for (unsigned int i = 0; i < traj.size(); i++) {
205  trajPoint = *(traj[i]);
206  *trajFile << tag << " " << i + 1 << " " << trajPoint(1) << " "
207  << trajPoint(2) << " " << trajPoint(3) << endl;
208  }
209 }
int getXYT(double z, double &x, double &y, double &ct) const
vector< double > delta
Definition: MyTrajectory.h:44
double doca(HepVector point)
Definition: DLine.cc:23
Double_t x[NCHANNELS]
Definition: st_tw_resols.C:39
#define c
#define y
void swimMC(vector< const DMCTrackHit * > &mctrackhits)
Definition: MyTrajectory.cc:84
Definition: GlueX.h:17
vector< HepLorentzVector * > traj
Definition: MyTrajectory.h:40
DetectorSystem_t system
particle type
Definition: DMCTrackHit.h:25
Definition: DLine.h:8
double dist(HepVector &point, int trajIndex) const
MyTrajectory(int level=1)
Definition: MyTrajectory.cc:8
float z
coordinates of hit in cm and rad
Definition: DMCTrackHit.h:20
Definition: GlueX.h:18
void checkClear()
void para_min(double yMinus, double yZero, double yPlus, double &xMinFrac, double &yMin) const
virtual unsigned int getNumberOfParams()
Definition: MyTrajectory.cc:21
void dump_ascii(ostream *trajFile, int tag)
double sin(double)
virtual void swim(HepVector startingPoint, double theta, double phi)
Definition: MyTrajectory.cc:37
int primary
primary track=1 not primary track=0
Definition: DMCTrackHit.h:23
unsigned int nparams
Definition: MyTrajectory.h:43
virtual ~MyTrajectory()
Definition: MyTrajectory.cc:16
vector< HepLorentzVector * > * getTrajectory()