CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Static Public Member Functions | Private Attributes
ThirdHitPredictionFromCircle::HelixRZ Class Reference

#include <ThirdHitPredictionFromCircle.h>

Public Member Functions

 HelixRZ ()
 
 HelixRZ (const ThirdHitPredictionFromCircle *circle, double z1, double z2, double curvature)
 
double rAtZ (double z) const
 
double zAtR (double r) const
 

Static Public Member Functions

static double maxCurvature (const ThirdHitPredictionFromCircle *circle, double z1, double z2, double z3)
 

Private Attributes

const
ThirdHitPredictionFromCircle
circle
 
double curvature
 
double dzdu
 
double seg
 
double z1
 

Detailed Description

Definition at line 30 of file ThirdHitPredictionFromCircle.h.

Constructor & Destructor Documentation

ThirdHitPredictionFromCircle::HelixRZ::HelixRZ ( )
inline

Definition at line 32 of file ThirdHitPredictionFromCircle.h.

32 : circle(0) {}
const ThirdHitPredictionFromCircle * circle
ThirdHitPredictionFromCircle::HelixRZ::HelixRZ ( const ThirdHitPredictionFromCircle circle,
double  z1,
double  z2,
double  curvature 
)

Definition at line 187 of file ThirdHitPredictionFromCircle.cc.

References abs, ThirdHitPredictionFromCircle::delta, dzdu, alignCSCRings::e, likely, M_PI_2, seg, and z1.

188  :
189  circle(circle), curvature(curv), z1(z1)
190 {
191  double absCurv = std::abs(curv);
192  seg = circle->delta;
193 
194  if (likely(absCurv > 1.0e-5)) {
195  seg *= absCurv;
196  seg = seg < -1.0 ? -M_PI_2 : seg > 1.0 ? M_PI_2 : std::asin(seg);
197  seg /= absCurv;
198  }
199 
200  seg *= 2.;
201  dzdu = likely(std::abs(seg) > 1.0e-5) ? ((z2 - z1) / seg) : 99999.0;
202 }
#define abs(x)
Definition: mlp_lapack.h:159
#define M_PI_2
const ThirdHitPredictionFromCircle * circle
#define likely(expr)

Member Function Documentation

double ThirdHitPredictionFromCircle::HelixRZ::maxCurvature ( const ThirdHitPredictionFromCircle circle,
double  z1,
double  z2,
double  z3 
)
static

Definition at line 204 of file ThirdHitPredictionFromCircle.cc.

References ThirdHitPredictionFromCircle::delta, M_PI, funct::sin(), and unlikely.

Referenced by PixelTripletLargeTipGenerator::hitTriplets().

206 {
207  static const double maxAngle = M_PI;
208  double halfAngle = (0.5 * maxAngle) * (z2 - z1) / (z3 - z1);
209  if (unlikely(halfAngle <= 0.0))
210  return 0.0;
211 
212  return std::sin(halfAngle) / circle->delta;
213 }
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
#define unlikely(expr)
#define M_PI
Definition: BFit3D.cc:3
double ThirdHitPredictionFromCircle::HelixRZ::rAtZ ( double  z) const

Definition at line 246 of file ThirdHitPredictionFromCircle.cc.

References abs, trackerHits::c, ThirdHitPredictionFromCircle::center, funct::cos(), ThirdHitPredictionFromCircle::curvature(), alignCSCRings::e, M_PI, mag(), max(), AlCaHLTBitMon_ParallelJobs::p, ThirdHitPredictionFromCircle::phi(), CosmicsPD_Skims::radius, alignCSCRings::s, FWPFMaths::sgn(), funct::sin(), funct::sqr(), mathSSE::sqrt(), unlikely, Basic2DVector< T >::x(), and Basic2DVector< T >::y().

247 {
248  if (unlikely(std::abs(dzdu) < 1.0e-5))
249  return 99999.0;
250 
251  if (unlikely(std::abs(curvature) < 1.0e-5)) {
252  double tip = circle->axis * circle->p1;
253  double lip = circle->axis.y() * circle->p1.x() -
254  circle->axis.x() * circle->p1.y();
255  return std::sqrt(sqr(tip) + sqr(lip + (z - z1) / dzdu));
256  }
257 
258  // we won't go below that (see comment below)
259  double minR = (2. * circle->center - circle->p1).mag();
260 
261  double phi = curvature * (z - z1) / dzdu;
262 
263  if (unlikely(std::abs(phi) > 2. * M_PI)) {
264  // with a helix we can get problems here - this is used to get the limits
265  // however, if phi gets large, we get into the regions where we loop back
266  // to smaller r's. The question is - do we care about these tracks?
267  // The answer is probably no: Too much pain, and the rest of the
268  // tracking won't handle looping tracks anyway.
269  // So, what we do here is to return nothing smaller than the radius
270  // than any of the two hits, i.e. the second hit, which is presumably
271  // outside of the 1st hit.
272 
273  return minR;
274  }
275 
276  double radius = 1. / curvature;
277  double orthog = sgn(curvature) * clamped_sqrt(sqr(radius) - circle->delta2);
278  Point2D center = circle->center + orthog * circle->axis;
279  Point2D rel = circle->p1 - center;
280 
281  double c = cos(phi);
282  double s = sin(phi);
283 
284  Point2D p(center.x() + c * rel.x() - s * rel.y(),
285  center.y() + s * rel.x() + c * rel.y());
286 
287  return std::max(minR, p.mag());
288 }
double phi(double curvature, double radius) const
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
float sgn(float val)
Definition: FWPFMaths.cc:9
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
#define abs(x)
Definition: mlp_lapack.h:159
#define unlikely(expr)
double double double z
const T & max(const T &a, const T &b)
T sqrt(T t)
Definition: SSEVec.h:46
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
T y() const
Cartesian y coordinate.
#define M_PI
Definition: BFit3D.cc:3
Square< F >::type sqr(const F &f)
Definition: Square.h:13
const ThirdHitPredictionFromCircle * circle
T x() const
Cartesian x coordinate.
double ThirdHitPredictionFromCircle::HelixRZ::zAtR ( double  r) const

Definition at line 215 of file ThirdHitPredictionFromCircle.cc.

References abs, b, ThirdHitPredictionFromCircle::center, ThirdHitPredictionFromCircle::curvature(), alignCSCRings::e, Basic2DVector< T >::mag2(), CosmicsPD_Skims::radius, FWPFMaths::sgn(), funct::sqr(), mathSSE::sqrt(), and unlikely.

216 {
217  if (unlikely(std::abs(curvature) < 1.0e-5)) {
218  double tip = circle->axis * circle->p1;
219  double lip = circle->axis.y() * circle->p1.x() -
220  circle->axis.x() * circle->p1.y();
221  return z1 + (std::sqrt(sqr(r) - sqr(tip)) - lip) * dzdu;
222  }
223 
224  double radius = 1.0 / curvature;
225  double radius2 = sqr(radius);
226  double orthog = sgn(curvature) * clamped_sqrt(radius2 - circle->delta2);
227  Point2D center = circle->center + orthog * circle->axis;
228 
229  double b2 = center.mag2();
230  double b = std::sqrt(b2);
231 
232  double cos1 = 0.5 * (radius2 + b2 - sqr(r)) * curvature / b;
233  double cos2 = 0.5 * (radius2 + b2 - circle->p1.mag2()) * curvature / b;
234 
235  double phi1 = clamped_acos(cos1);
236  double phi2 = clamped_acos(cos2);
237 
238  // more plausbility checks needed...
239  // the two circles can have two possible intersections
240  double u1 = std::abs((phi1 - phi2) * radius);
241  double u2 = std::abs((phi1 + phi2) * radius);
242 
243  return z1 + ((u1 >= seg && u1 < u2)? u1 : u2) * dzdu;
244 }
float sgn(float val)
Definition: FWPFMaths.cc:9
#define abs(x)
Definition: mlp_lapack.h:159
#define unlikely(expr)
T sqrt(T t)
Definition: SSEVec.h:46
T y() const
Cartesian y coordinate.
double b
Definition: hdecay.h:120
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
Square< F >::type sqr(const F &f)
Definition: Square.h:13
const ThirdHitPredictionFromCircle * circle
T x() const
Cartesian x coordinate.

Member Data Documentation

const ThirdHitPredictionFromCircle* ThirdHitPredictionFromCircle::HelixRZ::circle
private

Definition at line 43 of file ThirdHitPredictionFromCircle.h.

double ThirdHitPredictionFromCircle::HelixRZ::curvature
private

Definition at line 44 of file ThirdHitPredictionFromCircle.h.

double ThirdHitPredictionFromCircle::HelixRZ::dzdu
private

Definition at line 44 of file ThirdHitPredictionFromCircle.h.

Referenced by HelixRZ().

double ThirdHitPredictionFromCircle::HelixRZ::seg
private

Definition at line 44 of file ThirdHitPredictionFromCircle.h.

Referenced by HelixRZ().

double ThirdHitPredictionFromCircle::HelixRZ::z1
private

Definition at line 44 of file ThirdHitPredictionFromCircle.h.

Referenced by HelixRZ().