CMS 3D CMS Logo

List of all members | Public Member Functions | Private Types | Private Member Functions | Private Attributes
StraightLineCylinderCrossing Class Reference

#include <StraightLineCylinderCrossing.h>

Public Member Functions

std::pair< bool, double > pathLength (const Cylinder &cyl) const
 
LocalPoint position (const double s) const
 
 StraightLineCylinderCrossing (const LocalPoint &startingPos, const LocalVector &startingDir, const PropagationDirection propDir=alongMomentum, double tolerance=0)
 

Private Types

typedef LocalVector DirectionType
 
typedef Basic2DVector< float > DirectionType2D
 
typedef LocalPoint PositionType
 
typedef Basic2DVector< float > PositionType2D
 

Private Member Functions

std::pair< bool, double > chooseSolution (const double s1, const double s2) const
 Chooses the right solution w.r.t. the propagation direction. More...
 

Private Attributes

const DirectionType theP0
 
const PropagationDirection thePropDir
 
double theTolerance
 
const PositionType theX0
 

Detailed Description

Calculates the intersection of a straight line with a barrel cylinder.

Definition at line 17 of file StraightLineCylinderCrossing.h.

Member Typedef Documentation

◆ DirectionType

Definition at line 47 of file StraightLineCylinderCrossing.h.

◆ DirectionType2D

Definition at line 49 of file StraightLineCylinderCrossing.h.

◆ PositionType

Definition at line 46 of file StraightLineCylinderCrossing.h.

◆ PositionType2D

Definition at line 48 of file StraightLineCylinderCrossing.h.

Constructor & Destructor Documentation

◆ StraightLineCylinderCrossing()

StraightLineCylinderCrossing::StraightLineCylinderCrossing ( const LocalPoint startingPos,
const LocalVector startingDir,
const PropagationDirection  propDir = alongMomentum,
double  tolerance = 0 
)

Constructor in local frame

Definition at line 10 of file StraightLineCylinderCrossing.cc.

14  : theX0(startingPos), theP0(startingDir.unit()), thePropDir(propDir), theTolerance(tolerance) {}
const PropagationDirection thePropDir
const double tolerance
Vector3DBase unit() const
Definition: Vector3DBase.h:54

Member Function Documentation

◆ chooseSolution()

std::pair< bool, double > StraightLineCylinderCrossing::chooseSolution ( const double  s1,
const double  s2 
) const
private

Chooses the right solution w.r.t. the propagation direction.

Definition at line 49 of file StraightLineCylinderCrossing.cc.

References alongMomentum, anyDirection, SiStripPI::min, thePropDir, and theTolerance.

Referenced by pathLength().

49  {
50  //
51  // follows the logic implemented in HelixBarrelCylinderCrossing
52  //
53  if (thePropDir == anyDirection) {
54  return std::pair<bool, double>(true, (fabs(s1) < fabs(s2) ? s1 : s2));
55  } else {
56  int propSign = thePropDir == alongMomentum ? 1 : -1;
57  if (s1 * s2 < 0) {
58  // if different signs return the positive one
59  return std::pair<bool, double>(true, ((s1 * propSign > 0) ? s1 : s2));
60  } else if (s1 * propSign > 0) {
61  // if both positive, return the shortest
62  return std::pair<bool, double>(true, (fabs(s1) < fabs(s2) ? s1 : s2));
63  } else {
64  // if both negative, check if the smaller (abs value) is smaller then tolerance
65  double shorter = std::min(fabs(s1), fabs(s2));
66  if (shorter < theTolerance)
67  return std::pair<bool, double>(true, 0);
68  else
69  return std::pair<bool, double>(false, 0.);
70  }
71  }
72 }
const PropagationDirection thePropDir

◆ pathLength()

std::pair< bool, double > StraightLineCylinderCrossing::pathLength ( const Cylinder cyl) const

Propagation status (true if valid) and (signed) path length along the line from the starting point to the cylinder.

Definition at line 16 of file StraightLineCylinderCrossing.cc.

References chooseSolution(), dttmaxenums::R, Cylinder::radius(), theP0, theX0, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

Referenced by HelixBarrelCylinderCrossing::HelixBarrelCylinderCrossing(), and RKPropagatorInS::propagateParametersOnCylinder().

16  {
17  //
18  // radius of cylinder and transversal position relative to axis
19  //
20  double R(cylinder.radius());
21  PositionType2D xt2d(theX0.x(), theX0.y());
22  //
23  // transverse direction
24  //
25  DirectionType2D pt2d(theP0.x(), theP0.y());
26  //
27  // solution of quadratic equation for s - assume |theP0|=1
28  //
29  RealQuadEquation eq(pt2d.mag2(), 2. * xt2d.dot(pt2d), xt2d.mag2() - R * R);
30  if (!eq.hasSolution) {
31  /*
32  double A= pt2d.mag2();
33  double B= 2.*xt2d.dot(pt2d);
34  double C= xt2d.mag2()-R*R;
35  cout << "A= " << pt2d.mag2()
36  << " B= " << 2.*xt2d.dot(pt2d)
37  << " C= " << xt2d.mag2()-R*R
38  << " D= " << B*B - 4*A*C
39  << endl;
40  */
41  return std::pair<bool, double>(false, 0.);
42  }
43  //
44  // choice of solution and verification of direction
45  //
46  return chooseSolution(eq.first, eq.second);
47 }
std::pair< bool, double > chooseSolution(const double s1, const double s2) const
Chooses the right solution w.r.t. the propagation direction.
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60

◆ position()

LocalPoint StraightLineCylinderCrossing::position ( const double  s) const
inline

Returns the position along the line that corresponds to path length "s" from the starting point. If s is obtained from the pathLength method the position is the intersection point with the cylinder.

Definition at line 36 of file StraightLineCylinderCrossing.h.

References alignCSCRings::s, theP0, and theX0.

36 { return LocalPoint(theX0 + s * theP0); }
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:30

Member Data Documentation

◆ theP0

const DirectionType StraightLineCylinderCrossing::theP0
private

Definition at line 52 of file StraightLineCylinderCrossing.h.

Referenced by pathLength(), and position().

◆ thePropDir

const PropagationDirection StraightLineCylinderCrossing::thePropDir
private

Definition at line 53 of file StraightLineCylinderCrossing.h.

Referenced by chooseSolution().

◆ theTolerance

double StraightLineCylinderCrossing::theTolerance
private

Definition at line 54 of file StraightLineCylinderCrossing.h.

Referenced by chooseSolution().

◆ theX0

const PositionType StraightLineCylinderCrossing::theX0
private

Definition at line 51 of file StraightLineCylinderCrossing.h.

Referenced by pathLength(), and position().