LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
SurfXYZPlane.cxx
Go to the documentation of this file.
1 
12 #include "TVector2.h"
13 #include "cetlib_except/exception.h"
14 #include <cmath>
15 
16 namespace trkf {
17 
18  // Static attributes.
19 
20  double SurfXYZPlane::fPhiTolerance = 1.e-10;
21  double SurfXYZPlane::fThetaTolerance = 1.e-10;
22  double SurfXYZPlane::fSepTolerance = 1.e-6;
23 
25  SurfXYZPlane::SurfXYZPlane() : fX0(0.), fY0(0.), fZ0(0.), fPhi(0.), fTheta(0.) {}
26 
35  SurfXYZPlane::SurfXYZPlane(double x0, double y0, double z0, double phi, double theta)
36  : fX0(x0), fY0(y0), fZ0(z0), fPhi(phi), fTheta(theta)
37  {}
38 
46  SurfXYZPlane::SurfXYZPlane(double x0, double y0, double z0, double nx, double ny, double nz)
47  : fX0(x0), fY0(y0), fZ0(z0), fPhi(0.), fTheta(0.)
48  {
49  // Calculate angles.
50 
51  double nyz = std::hypot(ny, nz);
52  fTheta = atan2(nx, nyz);
53  fPhi = 0.;
54  if (nyz != 0.) fPhi = atan2(-ny, nz);
55  }
56 
59 
62  {
63  return new SurfXYZPlane(*this);
64  }
65 
67  bool SurfXYZPlane::isTrackValid(const TrackVector& vec) const
68  {
69  return true;
70  }
71 
79  void SurfXYZPlane::toLocal(const double xyz[3], double uvw[3]) const
80  {
81  double sinth = std::sin(fTheta);
82  double costh = std::cos(fTheta);
83  double sinphi = std::sin(fPhi);
84  double cosphi = std::cos(fPhi);
85 
86  // u = (x-x0)*cos(theta) + (y-y0)*sin(theta)*sin(phi) - (z-z0)*sin(theta)*cos(phi)
87  uvw[0] =
88  (xyz[0] - fX0) * costh + (xyz[1] - fY0) * sinth * sinphi - (xyz[2] - fZ0) * sinth * cosphi;
89 
90  // v = (y-y0)*cos(phi) + (z-z0)*sin(phi)
91  uvw[1] = (xyz[1] - fY0) * cosphi + (xyz[2] - fZ0) * sinphi;
92 
93  // w = (x-x0)*sin(theta) - (y-y0)*cos(theta)*sin(phi) + (z-z0)*cos(theta)*cos(phi)
94  uvw[2] =
95  (xyz[0] - fX0) * sinth - (xyz[1] - fY0) * costh * sinphi + (xyz[2] - fZ0) * costh * cosphi;
96  }
97 
105  void SurfXYZPlane::toGlobal(const double uvw[3], double xyz[3]) const
106  {
107  double sinth = std::sin(fTheta);
108  double costh = std::cos(fTheta);
109  double sinphi = std::sin(fPhi);
110  double cosphi = std::cos(fPhi);
111 
112  // x = x0 + u*cos(theta) + w*sin(theta)
113  xyz[0] = fX0 + uvw[0] * costh + uvw[2] * sinth;
114 
115  // y = y0 + u*sin(theta)*sin(phi) + v*cos(phi) - w*cos(theta)*sin(phi)
116  xyz[1] = fY0 + uvw[0] * sinth * sinphi + uvw[1] * cosphi - uvw[2] * costh * sinphi;
117 
118  // z = z0 - u*sin(theta)*cos(phi) + v*sin(phi) + w*cos(theta)*cos(phi)
119  xyz[2] = fZ0 - uvw[0] * sinth * cosphi + uvw[1] * sinphi + uvw[2] * costh * cosphi;
120  }
121 
129  void SurfXYZPlane::getPosition(const TrackVector& vec, double xyz[3]) const
130  {
131  // Get position in local coordinate system.
132 
133  double uvw[3];
134  uvw[0] = vec(0);
135  uvw[1] = vec(1);
136  uvw[2] = 0.;
137 
138  // Transform to global coordinate system.
139 
140  toGlobal(uvw, xyz);
141  return;
142  }
143 
152  void SurfXYZPlane::getMomentum(const TrackVector& vec, double mom[3], TrackDirection dir) const
153  {
154 
155  // Get momentum.
156 
157  double invp = std::abs(vec(4));
158  double p = 1. / std::max(invp, 1.e-3); // Capped at 1000. GeV/c.
159 
160  // Get track slope parameters.
161 
162  double dudw = vec(2);
163  double dvdw = vec(3);
164 
165  // Calculate dw/ds.
166 
167  double dwds = 1. / std::sqrt(1. + dudw * dudw + dvdw * dvdw);
168  TrackDirection realdir = getDirection(vec, dir); // Should be same as original direction.
169  if (realdir == BACKWARD)
170  dwds = -dwds;
171  else if (realdir != FORWARD)
172  throw cet::exception("SurfXYZPlane") << "Track direction not specified.\n";
173 
174  // Calculate momentum vector in local coordinate system.
175 
176  double pu = p * dudw * dwds;
177  double pv = p * dvdw * dwds;
178  double pw = p * dwds;
179 
180  // Rotate momentum to global coordinte system.
181 
182  double sinth = std::sin(fTheta);
183  double costh = std::cos(fTheta);
184  double sinphi = std::sin(fPhi);
185  double cosphi = std::cos(fPhi);
186 
187  mom[0] = pu * costh + pw * sinth;
188  mom[1] = pu * sinth * sinphi + pv * cosphi - pw * costh * sinphi;
189  mom[2] = -pu * sinth * cosphi + pv * sinphi + pw * costh * cosphi;
190 
191  return;
192  }
193 
204  bool SurfXYZPlane::isParallel(const Surface& surf) const
205  {
206  bool result = false;
207 
208  // Test if the other surface is a SurfXYZPlane.
209 
210  const SurfXYZPlane* psurf = dynamic_cast<const SurfXYZPlane*>(&surf);
211  if (psurf != 0) {
212 
213  // Test whether surface angle parameters are the same
214  // with tolerance.
215 
216  double delta_phi = TVector2::Phi_mpi_pi(fPhi - psurf->phi());
217  double delta_theta = fTheta - psurf->theta();
218  if (std::abs(delta_phi) <= fPhiTolerance && std::abs(delta_theta) <= fThetaTolerance)
219  result = true;
220  }
221  return result;
222  }
223 
237  double SurfXYZPlane::distanceTo(const Surface& surf) const
238  {
239  // Check if the other surface is parallel to this one.
240 
241  bool parallel = isParallel(surf);
242  if (!parallel)
243  throw cet::exception("SurfXYZPlane") << "Attempt to find distance to non-parallel surface.\n";
244 
245  // Find the origin of the other surface in global coordinates,
246  // then convert to our local coordinates.
247 
248  double otheruvw[3] = {0., 0., 0.};
249  double xyz[3];
250  double myuvw[3];
251  surf.toGlobal(otheruvw, xyz);
252  toLocal(xyz, myuvw);
253 
254  // Distance is local w-coordinate of other surface origin.
255 
256  return myuvw[2];
257  }
258 
270  bool SurfXYZPlane::isEqual(const Surface& surf) const
271  {
272  bool result = false;
273 
274  // Test if the other surface is parallel.
275 
276  bool parallel = isParallel(surf);
277  if (parallel) {
278  double dist = distanceTo(surf);
279  if (std::abs(dist) <= fSepTolerance) result = true;
280  }
281 
282  return result;
283  }
284 
286  std::ostream& SurfXYZPlane::Print(std::ostream& out) const
287  {
288  out << "SurfXYZPlane{ x0=" << fX0 << ", y0=" << fY0 << ", z0=" << fZ0 << ", phi=" << fPhi
289  << ", theta=" << fTheta << "}";
290  return out;
291  }
292 
293 } // end namespace trkf
virtual void getPosition(const TrackVector &vec, double xyz[3]) const
Get position of track.
TrackDirection
Track direction enum.
Definition: Surface.h:54
virtual bool isEqual(const Surface &surf) const
Test two surfaces for equality, within tolerance.
General planar surface.
double y0() const
Y origin.
Definition: SurfXYZPlane.h:99
constexpr auto abs(T v)
Returns the absolute value of the argument.
virtual std::ostream & Print(std::ostream &out) const
Printout.
static double fPhiTolerance
Phi tolerance for parallel.
Definition: SurfXYZPlane.h:139
virtual bool isParallel(const Surface &surf) const
Test whether two surfaces are parallel, within tolerance.
static double fSepTolerance
Separation tolerance for equal.
Definition: SurfXYZPlane.h:141
virtual bool isTrackValid(const TrackVector &vec) const
Surface-specific tests of validity of track parameters.
virtual double distanceTo(const Surface &surf) const
Find perpendicular forward distance to a parallel surface.
double fX0
X origin.
Definition: SurfXYZPlane.h:145
double phi() const
Rot. angle about x-axis (wire angle).
Definition: SurfXYZPlane.h:101
double x0() const
X origin.
Definition: SurfXYZPlane.h:98
virtual void toLocal(const double xyz[3], double uvw[3]) const
Transform global to local coordinates.
SurfXYZPlane()
Default constructor.
KVector< 5 >::type TrackVector
Track state vector, dimension 5.
double theta() const
Rot. angle about y&#39;-axis (projected Lorentz angle).
Definition: SurfXYZPlane.h:102
virtual void toGlobal(const double uvw[3], double xyz[3]) const
Transform local to global coordinates.
double fY0
Y origin.
Definition: SurfXYZPlane.h:146
TDirectory * dir
Definition: macro.C:5
constexpr double dist(const TReal *x, const TReal *y, const unsigned int dimension)
double fTheta
Rotation angle about y&#39;-axis (projected Lorentz angle).
Definition: SurfXYZPlane.h:149
static double fThetaTolerance
Theta tolerance for parallel.
Definition: SurfXYZPlane.h:140
virtual TrackDirection getDirection(const TrackVector &, TrackDirection dir=UNKNOWN) const
Get direction of track (default UNKNOWN).
Definition: Surface.h:83
double z0() const
Z origin.
Definition: SurfXYZPlane.h:100
virtual void toGlobal(const double uvw[3], double xyz[3]) const =0
Transform local to global coordinates.
virtual ~SurfXYZPlane()
Destructor.
Float_t e
Definition: plot.C:35
double fPhi
Rotation angle about x-axis (wire angle).
Definition: SurfXYZPlane.h:148
virtual void getMomentum(const TrackVector &vec, double mom[3], TrackDirection dir=UNKNOWN) const
Get momentum vector of track.
virtual Surface * clone() const
Clone method.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
double fZ0
Z origin.
Definition: SurfXYZPlane.h:147