CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
HelixArbitraryPlaneCrossing2Order Class Referencefinal

#include <HelixArbitraryPlaneCrossing2Order.h>

Inheritance diagram for HelixArbitraryPlaneCrossing2Order:
HelixPlaneCrossing

Public Types

typedef Basic3DVector< double > DirectionTypeDouble
 
typedef Basic3DVector< double > PositionTypeDouble
 
- Public Types inherited from HelixPlaneCrossing
typedef Basic3DVector< float > DirectionType
 
typedef Basic3DVector< float > PositionType
 the helix is passed to the constructor and does not appear in the interface More...
 

Public Member Functions

DirectionType direction (double s) const override
 
DirectionTypeDouble directionInDouble (double s) const
 
 HelixArbitraryPlaneCrossing2Order (const PositionType &point, const DirectionType &direction, const float curvature, const PropagationDirection propDir=alongMomentum)
 
 HelixArbitraryPlaneCrossing2Order (const double &x0, const double &y0, const double &z0, const double &cosPhi0, const double &sinPhi0, const double &cosTheta, const double &sinTheta, const double &rho, const PropagationDirection propDir=alongMomentum)
 
std::pair< bool, double > pathLength (const Plane &) override
 
PositionType position (double s) const override
 
PositionTypeDouble positionInDouble (double s) const
 
double smallestPathLength (const double firstPathLength, const double secondPathLength) const
 
 ~HelixArbitraryPlaneCrossing2Order () override
 
- Public Member Functions inherited from HelixPlaneCrossing
virtual ~HelixPlaneCrossing ()=default
 

Private Member Functions

std::pair< bool, double > solutionByDirection (const double dS1, const double dS2) const
 

Private Attributes

double theCosPhi0
 
double theCosTheta
 
const PropagationDirection thePropDir
 
const double theRho
 
double theSinPhi0
 
double theSinThetaI
 
const double theX0
 
const double theY0
 
const double theZ0
 

Detailed Description

Calculates intersections of a helix with planes of any orientation using a parabolic approximation.

Definition at line 10 of file HelixArbitraryPlaneCrossing2Order.h.

Member Typedef Documentation

Definition at line 53 of file HelixArbitraryPlaneCrossing2Order.h.

Definition at line 52 of file HelixArbitraryPlaneCrossing2Order.h.

Constructor & Destructor Documentation

HelixArbitraryPlaneCrossing2Order::HelixArbitraryPlaneCrossing2Order ( const PositionType point,
const DirectionType direction,
const float  curvature,
const PropagationDirection  propDir = alongMomentum 
)

Constructor using point, direction and (transverse!) curvature.

Definition at line 11 of file HelixArbitraryPlaneCrossing2Order.cc.

References p2, hiDetachedQuadStep_cff::pt2, mathSSE::sqrt(), theCosPhi0, theCosTheta, theSinPhi0, theSinThetaI, Basic3DVector< T >::x(), Basic3DVector< T >::y(), and Basic3DVector< T >::z().

14  :
15  theX0(point.x()),
16  theY0(point.y()),
17  theZ0(point.z()),
19  thePropDir(propDir)
20 {
21  //
22  // Components of direction vector (with correct normalisation)
23  //
24  double px = direction.x();
25  double py = direction.y();
26  double pz = direction.z();
27  double pt2 = px*px+py*py;
28  double p2 = pt2+pz*pz;
29  double pI = 1./sqrt(p2);
30  double ptI = 1./sqrt(pt2);
31  theCosPhi0 = px*ptI;
32  theSinPhi0 = py*ptI;
33  theCosTheta = pz*pI;
34  theSinThetaI = p2*pI*ptI; // (1/(pt/p)) = p/pt = p*ptI and p = p2/p = p2*pI
35 }
T y() const
Cartesian y coordinate.
T x() const
Cartesian x coordinate.
DirectionType direction(double s) const override
T curvature(T InversePt, const edm::EventSetup &iSetup)
T z() const
Cartesian z coordinate.
T sqrt(T t)
Definition: SSEVec.h:18
double p2[4]
Definition: TauolaWrapper.h:90
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
HelixArbitraryPlaneCrossing2Order::HelixArbitraryPlaneCrossing2Order ( const double &  x0,
const double &  y0,
const double &  z0,
const double &  cosPhi0,
const double &  sinPhi0,
const double &  cosTheta,
const double &  sinTheta,
const double &  rho,
const PropagationDirection  propDir = alongMomentum 
)
inline
HelixArbitraryPlaneCrossing2Order::~HelixArbitraryPlaneCrossing2Order ( )
inlineoverride

Definition at line 34 of file HelixArbitraryPlaneCrossing2Order.h.

References direction(), pathLength(), position(), and alignCSCRings::s.

34 {}

Member Function Documentation

HelixPlaneCrossing::DirectionType HelixArbitraryPlaneCrossing2Order::direction ( double  s) const
overridevirtual

Direction at pathlength s from the starting point.

Implements HelixPlaneCrossing.

Definition at line 123 of file HelixArbitraryPlaneCrossing2Order.cc.

References dir, directionInDouble(), Basic3DVector< T >::x(), Basic3DVector< T >::y(), and Basic3DVector< T >::z().

Referenced by ~HelixArbitraryPlaneCrossing2Order().

123  {
124  // use double precision result
126  return DirectionType(dir.x(),dir.y(),dir.z());
127 }
DirectionTypeDouble directionInDouble(double s) const
Basic3DVector< float > DirectionType
dbl *** dir
Definition: mlp_gen.cc:35
HelixArbitraryPlaneCrossing2Order::DirectionTypeDouble HelixArbitraryPlaneCrossing2Order::directionInDouble ( double  s) const
std::pair< bool, double > HelixArbitraryPlaneCrossing2Order::pathLength ( const Plane plane)
overridevirtual

Propagation status (true if valid) and (signed) path length along the helix from the starting point to the plane. The starting point is given in the constructor.

Implements HelixPlaneCrossing.

Definition at line 41 of file HelixArbitraryPlaneCrossing2Order.cc.

References funct::abs(), MillePedeFileConverter_cfg::e, likely, Plane::localZ(), Plane::normalVector(), solutionByDirection(), mathSSE::sqrt(), theCosPhi0, theCosTheta, theRho, theSinPhi0, theSinThetaI, theX0, theY0, theZ0, unlikely, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by PixelForwardLayer::computeCrossings(), PixelForwardLayerPhase1::computeCrossings(), HelixArbitraryPlaneCrossing::pathLength(), and ~HelixArbitraryPlaneCrossing2Order().

41  {
42  //
43  // get local z-vector in global co-ordinates and
44  // distance to starting point
45  //
46  GlobalVector normalToPlane = plane.normalVector();
47  double nPx = normalToPlane.x();
48  double nPy = normalToPlane.y();
49  double nPz = normalToPlane.z();
50  double cP = plane.localZ(GlobalPoint(theX0,theY0,theZ0));
51  //
52  // coefficients of 2nd order equation to obtain intersection point
53  // in approximation (without curvature-related factors).
54  //
55  double ceq1 = theRho*(nPx*theSinPhi0-nPy*theCosPhi0);
56  double ceq2 = nPx*theCosPhi0 + nPy*theSinPhi0 + nPz*theCosTheta*theSinThetaI;
57  double ceq3 = cP;
58  //
59  // Check for degeneration to linear equation (zero
60  // curvature, forward plane or direction perp. to plane)
61  //
62  double dS1,dS2;
63  if likely( std::abs(ceq1)>FLT_MIN ) {
64  double deq1 = ceq2*ceq2;
65  double deq2 = ceq1*ceq3;
66  if ( std::abs(deq1)<FLT_MIN || std::abs(deq2/deq1)>1.e-6 ) {
67  //
68  // Standard solution for quadratic equations
69  //
70  double deq = deq1+2*deq2;
71  if unlikely( deq<0. ) return std::pair<bool,double>(false,0);
72  double ceq = ceq2+std::copysign(std::sqrt(deq),ceq2);
73  dS1 = (ceq/ceq1)*theSinThetaI;
74  dS2 = -2.*(ceq3/ceq)*theSinThetaI;
75  }
76  else {
77  //
78  // Solution by expansion of sqrt(1+deq)
79  //
80  double ceq = (ceq2/ceq1)*theSinThetaI;
81  double deq = deq2/deq1;
82  deq *= (1-0.5*deq);
83  dS1 = -ceq*deq;
84  dS2 = ceq*(2+deq);
85  }
86  }
87  else {
88  //
89  // Special case: linear equation
90  //
91  dS1 = dS2 = -(ceq3/ceq2)*theSinThetaI;
92  }
93  //
94  // Choose and return solution
95  //
96  return solutionByDirection(dS1,dS2);
97 }
GlobalVector normalVector() const
Definition: Plane.h:41
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
float localZ(const GlobalPoint &gp) const
Definition: Plane.h:45
#define unlikely(x)
#define likely(x)
T sqrt(T t)
Definition: SSEVec.h:18
T z() const
Definition: PV3DBase.h:64
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::pair< bool, double > solutionByDirection(const double dS1, const double dS2) const
return(e1-e2)*(e1-e2)+dp *dp
T x() const
Definition: PV3DBase.h:62
HelixPlaneCrossing::PositionType HelixArbitraryPlaneCrossing2Order::position ( double  s) const
overridevirtual

Position at pathlength s from the starting point.

Implements HelixPlaneCrossing.

Definition at line 103 of file HelixArbitraryPlaneCrossing2Order.cc.

References positionInDouble(), Basic3DVector< T >::x(), Basic3DVector< T >::y(), and Basic3DVector< T >::z().

Referenced by PixelForwardLayer::computeCrossings(), PixelForwardLayerPhase1::computeCrossings(), and ~HelixArbitraryPlaneCrossing2Order().

103  {
104  // use double precision result
106  return PositionType(pos.x(),pos.y(),pos.z());
107 }
PositionTypeDouble positionInDouble(double s) const
Basic3DVector< float > PositionType
the helix is passed to the constructor and does not appear in the interface
HelixArbitraryPlaneCrossing2Order::PositionTypeDouble HelixArbitraryPlaneCrossing2Order::positionInDouble ( double  s) const

Position at pathlength s from the starting point in double precision.

Definition at line 112 of file HelixArbitraryPlaneCrossing2Order.cc.

References theCosPhi0, theCosTheta, theRho, theSinPhi0, theSinThetaI, theX0, theY0, and theZ0.

Referenced by position(), and HelixArbitraryPlaneCrossing::positionInDouble().

double HelixArbitraryPlaneCrossing2Order::smallestPathLength ( const double  firstPathLength,
const double  secondPathLength 
) const
inline

Pathlength to closest solution.

Definition at line 65 of file HelixArbitraryPlaneCrossing2Order.h.

References dso_internal, and solutionByDirection().

Referenced by solutionByDirection().

66  {
67  return fabs(firstPathLength)<fabs(secondPathLength) ? firstPathLength : secondPathLength;
68  }
std::pair< bool, double > HelixArbitraryPlaneCrossing2Order::solutionByDirection ( const double  dS1,
const double  dS2 
) const
private

Choice of one of two solutions according to the propagation direction.

Definition at line 143 of file HelixArbitraryPlaneCrossing2Order.cc.

References alongMomentum, anyDirection, edm::isNotFinite(), callgraph::path, indexGen::s2, smallestPathLength(), std::swap(), and thePropDir.

Referenced by pathLength(), and smallestPathLength().

144  {
145  bool valid = false;
146  double path = 0;
147  if ( thePropDir == anyDirection ) {
148  valid = true;
149  path = smallestPathLength(dS1,dS2);
150  }
151  else {
152  // use same logic for both directions (invert if necessary)
153  double propSign = thePropDir==alongMomentum ? 1 : -1;
154  double s1(propSign*dS1);
155  double s2(propSign*dS2);
156  // sort
157  if ( s1 > s2 ) std::swap(s1,s2);
158  // choose solution (if any with positive sign)
159  if ( (s1<0) & (s2>=0) ) {
160  // First solution in backward direction: choose second one.
161  valid = true;
162  path = propSign*s2;
163  }
164  else if ( s1>=0 ) {
165  // First solution in forward direction: choose it (s2 is further away!).
166  valid = true;
167  path = propSign*s1;
168  }
169  }
170  if (edm::isNotFinite(path)) valid = false;
171  return std::pair<bool,double>(valid,path);
172 }
double smallestPathLength(const double firstPathLength, const double secondPathLength) const
bool isNotFinite(T x)
Definition: isFinite.h:10
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)

Member Data Documentation

double HelixArbitraryPlaneCrossing2Order::theCosPhi0
private
double HelixArbitraryPlaneCrossing2Order::theCosTheta
private
const PropagationDirection HelixArbitraryPlaneCrossing2Order::thePropDir
private

Definition at line 81 of file HelixArbitraryPlaneCrossing2Order.h.

Referenced by solutionByDirection().

const double HelixArbitraryPlaneCrossing2Order::theRho
private
double HelixArbitraryPlaneCrossing2Order::theSinPhi0
private
double HelixArbitraryPlaneCrossing2Order::theSinThetaI
private
const double HelixArbitraryPlaneCrossing2Order::theX0
private

Definition at line 77 of file HelixArbitraryPlaneCrossing2Order.h.

Referenced by pathLength(), and positionInDouble().

const double HelixArbitraryPlaneCrossing2Order::theY0
private

Definition at line 77 of file HelixArbitraryPlaneCrossing2Order.h.

Referenced by pathLength(), and positionInDouble().

const double HelixArbitraryPlaneCrossing2Order::theZ0
private

Definition at line 77 of file HelixArbitraryPlaneCrossing2Order.h.

Referenced by pathLength(), and positionInDouble().