CMS 3D CMS Logo

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

#include <HelixArbitraryPlaneCrossing.h>

Inheritance diagram for HelixArbitraryPlaneCrossing:
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
 
 HelixArbitraryPlaneCrossing (const PositionType &point, const DirectionType &direction, const float curvature, const PropagationDirection propDir=alongMomentum)
 
std::pair< bool, double > pathLength (const Plane &plane) override
 
PositionType position (double s) const override
 
PositionTypeDouble positionInDouble (double s) const
 
 ~HelixArbitraryPlaneCrossing () override
 
- Public Member Functions inherited from HelixPlaneCrossing
virtual ~HelixPlaneCrossing ()=default
 

Private Member Functions

bool notAtSurface (const Plane &, const PositionTypeDouble &, const float) const
 

Private Attributes

double theCachedCDPhi
 
double theCachedDPhi
 
double theCachedS
 
double theCachedSDPhi
 
double theCosPhi0
 
double theCosTheta
 
const PropagationDirection thePropDir
 
HelixArbitraryPlaneCrossing2Order theQuadraticCrossingFromStart
 
const double theRho
 
double theSinPhi0
 
double theSinTheta
 
const double theX0
 
const double theY0
 
const double theZ0
 

Static Private Attributes

static const float theMaxDistToPlane = 1.e-4f
 
static const float theNumericalPrecision = 5.e-7f
 

Detailed Description

Calculates intersections of a helix with planes of any orientation.

Definition at line 10 of file HelixArbitraryPlaneCrossing.h.

Member Typedef Documentation

◆ DirectionTypeDouble

Definition at line 38 of file HelixArbitraryPlaneCrossing.h.

◆ PositionTypeDouble

Definition at line 37 of file HelixArbitraryPlaneCrossing.h.

Constructor & Destructor Documentation

◆ HelixArbitraryPlaneCrossing()

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

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

Definition at line 32 of file HelixArbitraryPlaneCrossing.cc.

37  theX0(point.x()),
38  theY0(point.y()),
39  theZ0(point.z()),
41  thePropDir(propDir),
42  theCachedS(0),
43  theCachedDPhi(0.),
44  theCachedSDPhi(0.),
45  theCachedCDPhi(1.) {
46  //
47  // Components of direction vector (with correct normalisation)
48  //
49  double px = direction.x();
50  double py = direction.y();
51  double pz = direction.z();
52  double pt2 = px * px + py * py;
53  double p2 = pt2 + pz * pz;
54  double pI = 1. / sqrt(p2);
55  double ptI = 1. / sqrt(pt2);
56  theCosPhi0 = px * ptI;
57  theSinPhi0 = py * ptI;
58  theCosTheta = pz * pI;
59  theSinTheta = pt2 * ptI * pI;
60 }

References direction(), p2, HLT_2018_cff::pt2, multPhiCorr_741_25nsDY_cfi::px, multPhiCorr_741_25nsDY_cfi::py, mathSSE::sqrt(), theCosPhi0, theCosTheta, theSinPhi0, theSinTheta, Basic3DVector< T >::x(), Basic3DVector< T >::y(), and Basic3DVector< T >::z().

◆ ~HelixArbitraryPlaneCrossing()

HelixArbitraryPlaneCrossing::~HelixArbitraryPlaneCrossing ( )
inlineoverride

Definition at line 19 of file HelixArbitraryPlaneCrossing.h.

19 {}

Member Function Documentation

◆ direction()

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

Direction at pathlength s from the starting point.

Implements HelixPlaneCrossing.

Definition at line 195 of file HelixArbitraryPlaneCrossing.cc.

195  {
196  // use result in double precision
198  return DirectionType(dir.x(), dir.y(), dir.z());
199 }

References DeadROC_duringRun::dir, directionInDouble(), and alignCSCRings::s.

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

◆ directionInDouble()

HelixArbitraryPlaneCrossing::DirectionTypeDouble HelixArbitraryPlaneCrossing::directionInDouble ( double  s) const

Direction at pathlength s from the starting point.

Definition at line 203 of file HelixArbitraryPlaneCrossing.cc.

203  {
204  //
205  // Calculate delta phi (if not already available)
206  //
207  if
208  UNLIKELY(s != theCachedS) { // very very unlikely!
209  theCachedS = s;
211  vdt::fast_sincos(theCachedDPhi, theCachedSDPhi, theCachedCDPhi);
212  }
213 
214  if (std::abs(theCachedDPhi) > 1.e-4) {
215  // full helix formula
219  } else {
220  // 2nd order
222  }
223 }

References funct::abs(), HelixArbitraryPlaneCrossing2Order::directionInDouble(), MillePedeFileConverter_cfg::e, alignCSCRings::s, theCachedCDPhi, theCachedDPhi, theCachedS, theCachedSDPhi, theCosPhi0, theCosTheta, theQuadraticCrossingFromStart, theRho, theSinPhi0, theSinTheta, and UNLIKELY.

Referenced by direction(), and pathLength().

◆ notAtSurface()

bool HelixArbitraryPlaneCrossing::notAtSurface ( const Plane plane,
const PositionTypeDouble point,
const float  maxDist 
) const
inlineprivate

Iteration control: check for significant distance to plane.

Definition at line 226 of file HelixArbitraryPlaneCrossing.cc.

228  {
229  float dz = plane.localZ(Surface::GlobalPoint(point.x(), point.y(), point.z()));
230  return std::abs(dz) > maxDist;
231 }

References funct::abs(), PVValHelper::dz, Plane::localZ(), TtFullHadJetPartonMatch_cfi::maxDist, and point.

Referenced by pathLength().

◆ pathLength()

std::pair< bool, double > HelixArbitraryPlaneCrossing::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 64 of file HelixArbitraryPlaneCrossing.cc.

64  {
65  //
66  // Constants used for control of convergence
67  //
68  constexpr int maxIterations = 20;
69  //
70  // maximum distance to plane (taking into account numerical precision)
71  //
72  float maxNumDz = theNumericalPrecision * plane.position().mag();
73  float safeMaxDist = (theMaxDistToPlane > maxNumDz ? theMaxDistToPlane : maxNumDz);
74  //
75  // Prepare internal value of the propagation direction and position / direction vectors for iteration
76  //
77 
78  float dz = plane.localZ(Surface::GlobalPoint(theX0, theY0, theZ0));
79  if (std::abs(dz) < safeMaxDist)
80  return std::make_pair(true, 0.);
81 
82  bool notFail;
83  double dSTotal;
84  // Use existing 2nd order object at first pass
85  std::tie(notFail, dSTotal) = theQuadraticCrossingFromStart.pathLength(plane);
86  if
87  UNLIKELY(!notFail) return std::make_pair(notFail, dSTotal);
88  auto xnew = positionInDouble(dSTotal);
89 
90  auto propDir = thePropDir;
91  auto newDir = dSTotal >= 0 ? alongMomentum : oppositeToMomentum;
92  if (propDir == anyDirection) {
93  propDir = newDir;
94  } else {
95  if
96  UNLIKELY(newDir != propDir) return std::pair<bool, double>(false, 0);
97  }
98 
99  //
100  // Prepare iterations: count and total pathlength
101  //
102  auto iteration = maxIterations;
103  while (notAtSurface(plane, xnew, safeMaxDist)) {
104  //
105  // return empty solution vector if no convergence after maxIterations iterations
106  //
107  if
108  UNLIKELY(--iteration == 0) {
109  LogDebug("HelixArbitraryPlaneCrossing") << "pathLength : no convergence";
110  return std::pair<bool, double>(false, 0);
111  }
112 
113  //
114  // create temporary object for subsequent passes.
115  auto pnew = directionInDouble(dSTotal);
116  HelixArbitraryPlaneCrossing2Order quadraticCrossing(
117  xnew.x(), xnew.y(), xnew.z(), pnew.x(), pnew.y(), theCosTheta, theSinTheta, theRho, anyDirection);
118 
119  auto deltaS2 = quadraticCrossing.pathLength(plane);
120 
121  if
122  UNLIKELY(!deltaS2.first) return deltaS2;
123  //
124  // Calculate and sort total pathlength (max. 2 solutions)
125  //
126  dSTotal += deltaS2.second;
127  auto newDir = dSTotal >= 0 ? alongMomentum : oppositeToMomentum;
128  if (propDir == anyDirection) {
129  propDir = newDir;
130  } else {
131  if
132  UNLIKELY(newDir != propDir) return std::pair<bool, double>(false, 0);
133  }
134  //
135  // Step forward by dSTotal.
136  //
137  xnew = positionInDouble(dSTotal);
138  }
139  //
140  // Return result
141  //
143 
144  return std::make_pair(true, dSTotal);
145 }

References funct::abs(), alongMomentum, anyDirection, directionInDouble(), PVValHelper::dz, align_cfg::iteration, Plane::localZ(), LogDebug, Basic3DVector< T >::mag(), maxiter, HLT_2018_cff::maxIterations, notAtSurface(), oppositeToMomentum, HelixArbitraryPlaneCrossing2Order::pathLength(), GloballyPositioned< T >::position(), positionInDouble(), theCosTheta, theMaxDistToPlane, theNumericalPrecision, thePropDir, theQuadraticCrossingFromStart, theRho, theSinTheta, theX0, theY0, theZ0, and UNLIKELY.

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

◆ position()

HelixPlaneCrossing::PositionType HelixArbitraryPlaneCrossing::position ( double  s) const
overridevirtual

Position at pathlength s from the starting point.

Implements HelixPlaneCrossing.

Definition at line 149 of file HelixArbitraryPlaneCrossing.cc.

149  {
150  // use result in double precision
152  return PositionType(pos.x(), pos.y(), pos.z());
153 }

References positionInDouble(), and alignCSCRings::s.

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

◆ positionInDouble()

HelixArbitraryPlaneCrossing::PositionTypeDouble HelixArbitraryPlaneCrossing::positionInDouble ( double  s) const

Position at pathlength s from the starting point.

Definition at line 157 of file HelixArbitraryPlaneCrossing.cc.

157  {
158  //
159  // Calculate delta phi (if not already available)
160  //
161  if
162  UNLIKELY(s != theCachedS) {
163  theCachedS = s;
165  vdt::fast_sincos(theCachedDPhi, theCachedSDPhi, theCachedCDPhi);
166  }
167  //
168  // Calculate with appropriate formulation of full helix formula or with
169  // 2nd order approximation.
170  //
171  // if ( fabs(theCachedDPhi)>1.e-1 ) {
172  if (std::abs(theCachedDPhi) > 1.e-4) {
173  // "standard" helix formula
174  double o = 1. / theRho;
178  }
179  // else if ( fabs(theCachedDPhi)>theNumericalPrecision ) {
180  // // full helix formula, but avoiding (1-cos(deltaPhi)) for small angles
181  // return PositionTypeDouble(theX0+(-theSinPhi0*theCachedSDPhi*theCachedSDPhi/(1.+theCachedCDPhi)+
182  // theCosPhi0*theCachedSDPhi)/theRho,
183  // theY0+(theCosPhi0*theCachedSDPhi*theCachedSDPhi/(1.+theCachedCDPhi)+
184  // theSinPhi0*theCachedSDPhi)/theRho,
185  // theZ0+theCachedS*theCosTheta);
186  // }
187  else {
188  // Use 2nd order.
190  }
191 }

References funct::abs(), MillePedeFileConverter_cfg::e, EcalTangentSkim_cfg::o, HelixArbitraryPlaneCrossing2Order::positionInDouble(), alignCSCRings::s, theCachedCDPhi, theCachedDPhi, theCachedS, theCachedSDPhi, theCosPhi0, theCosTheta, theQuadraticCrossingFromStart, theRho, theSinPhi0, theSinTheta, theX0, theY0, theZ0, and UNLIKELY.

Referenced by pathLength(), and position().

Member Data Documentation

◆ theCachedCDPhi

double HelixArbitraryPlaneCrossing::theCachedCDPhi
mutableprivate

Definition at line 66 of file HelixArbitraryPlaneCrossing.h.

Referenced by directionInDouble(), and positionInDouble().

◆ theCachedDPhi

double HelixArbitraryPlaneCrossing::theCachedDPhi
mutableprivate

Definition at line 64 of file HelixArbitraryPlaneCrossing.h.

Referenced by directionInDouble(), and positionInDouble().

◆ theCachedS

double HelixArbitraryPlaneCrossing::theCachedS
mutableprivate

Definition at line 63 of file HelixArbitraryPlaneCrossing.h.

Referenced by directionInDouble(), and positionInDouble().

◆ theCachedSDPhi

double HelixArbitraryPlaneCrossing::theCachedSDPhi
mutableprivate

Definition at line 65 of file HelixArbitraryPlaneCrossing.h.

Referenced by directionInDouble(), and positionInDouble().

◆ theCosPhi0

double HelixArbitraryPlaneCrossing::theCosPhi0
private

◆ theCosTheta

double HelixArbitraryPlaneCrossing::theCosTheta
private

◆ theMaxDistToPlane

const float HelixArbitraryPlaneCrossing::theMaxDistToPlane = 1.e-4f
staticprivate

Definition at line 69 of file HelixArbitraryPlaneCrossing.h.

Referenced by pathLength().

◆ theNumericalPrecision

const float HelixArbitraryPlaneCrossing::theNumericalPrecision = 5.e-7f
staticprivate

Definition at line 68 of file HelixArbitraryPlaneCrossing.h.

Referenced by pathLength().

◆ thePropDir

const PropagationDirection HelixArbitraryPlaneCrossing::thePropDir
private

Definition at line 61 of file HelixArbitraryPlaneCrossing.h.

Referenced by pathLength().

◆ theQuadraticCrossingFromStart

HelixArbitraryPlaneCrossing2Order HelixArbitraryPlaneCrossing::theQuadraticCrossingFromStart
private

Definition at line 54 of file HelixArbitraryPlaneCrossing.h.

Referenced by directionInDouble(), pathLength(), and positionInDouble().

◆ theRho

const double HelixArbitraryPlaneCrossing::theRho
private

Definition at line 59 of file HelixArbitraryPlaneCrossing.h.

Referenced by directionInDouble(), pathLength(), and positionInDouble().

◆ theSinPhi0

double HelixArbitraryPlaneCrossing::theSinPhi0
private

◆ theSinTheta

double HelixArbitraryPlaneCrossing::theSinTheta
private

◆ theX0

const double HelixArbitraryPlaneCrossing::theX0
private

Definition at line 56 of file HelixArbitraryPlaneCrossing.h.

Referenced by pathLength(), and positionInDouble().

◆ theY0

const double HelixArbitraryPlaneCrossing::theY0
private

Definition at line 56 of file HelixArbitraryPlaneCrossing.h.

Referenced by pathLength(), and positionInDouble().

◆ theZ0

const double HelixArbitraryPlaneCrossing::theZ0
private

Definition at line 56 of file HelixArbitraryPlaneCrossing.h.

Referenced by pathLength(), and positionInDouble().

anyDirection
Definition: PropagationDirection.h:4
HLT_2018_cff.pt2
pt2
Definition: HLT_2018_cff.py:8552
HelixArbitraryPlaneCrossing::PositionTypeDouble
Basic3DVector< double > PositionTypeDouble
Definition: HelixArbitraryPlaneCrossing.h:37
multPhiCorr_741_25nsDY_cfi.py
py
Definition: multPhiCorr_741_25nsDY_cfi.py:12
FrontierCondition_GT_autoExpress_cfi.auto
auto
Definition: FrontierCondition_GT_autoExpress_cfi.py:15
HelixPlaneCrossing::DirectionType
Basic3DVector< float > DirectionType
Definition: HelixPlaneCrossing.h:23
HelixArbitraryPlaneCrossing::theCachedSDPhi
double theCachedSDPhi
Definition: HelixArbitraryPlaneCrossing.h:65
pos
Definition: PixelAliasList.h:18
oppositeToMomentum
Definition: PropagationDirection.h:4
HelixArbitraryPlaneCrossing::directionInDouble
DirectionTypeDouble directionInDouble(double s) const
Definition: HelixArbitraryPlaneCrossing.cc:203
edm::second
U second(std::pair< T, U > const &p)
Definition: ParameterSet.cc:215
mathSSE::return
return((rh ^ lh) &mask)
PixelRecoUtilities::curvature
T curvature(T InversePt, const edm::EventSetup &iSetup)
Definition: PixelRecoUtilities.h:42
Basic3DVector::mag
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Definition: extBasic3DVector.h:116
EcalTangentSkim_cfg.o
o
Definition: EcalTangentSkim_cfg.py:36
HelixArbitraryPlaneCrossing::theNumericalPrecision
static const float theNumericalPrecision
Definition: HelixArbitraryPlaneCrossing.h:68
HelixArbitraryPlaneCrossing::DirectionTypeDouble
Basic3DVector< double > DirectionTypeDouble
Definition: HelixArbitraryPlaneCrossing.h:38
UNLIKELY
#define UNLIKELY(x)
Definition: Likely.h:21
alignCSCRings.s
s
Definition: alignCSCRings.py:92
HelixArbitraryPlaneCrossing2Order::directionInDouble
DirectionTypeDouble directionInDouble(double s) const
Definition: HelixArbitraryPlaneCrossing2Order.cc:124
Basic3DVector::y
T y() const
Cartesian y coordinate.
Definition: extBasic3DVector.h:97
HelixArbitraryPlaneCrossing::theRho
const double theRho
Definition: HelixArbitraryPlaneCrossing.h:59
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
p2
double p2[4]
Definition: TauolaWrapper.h:90
Point3DBase< float, GlobalTag >
HelixArbitraryPlaneCrossing::theY0
const double theY0
Definition: HelixArbitraryPlaneCrossing.h:56
HelixArbitraryPlaneCrossing::theCosTheta
double theCosTheta
Definition: HelixArbitraryPlaneCrossing.h:58
HelixArbitraryPlaneCrossing::theMaxDistToPlane
static const float theMaxDistToPlane
Definition: HelixArbitraryPlaneCrossing.h:69
HelixArbitraryPlaneCrossing::direction
DirectionType direction(double s) const override
Definition: HelixArbitraryPlaneCrossing.cc:195
HelixArbitraryPlaneCrossing::positionInDouble
PositionTypeDouble positionInDouble(double s) const
Definition: HelixArbitraryPlaneCrossing.cc:157
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:670
HelixArbitraryPlaneCrossing::theCachedCDPhi
double theCachedCDPhi
Definition: HelixArbitraryPlaneCrossing.h:66
HelixArbitraryPlaneCrossing::notAtSurface
bool notAtSurface(const Plane &, const PositionTypeDouble &, const float) const
Definition: HelixArbitraryPlaneCrossing.cc:226
Plane::localZ
float localZ(const GlobalPoint &gp) const
Definition: Plane.h:45
HelixArbitraryPlaneCrossing2Order::pathLength
std::pair< bool, double > pathLength(const Plane &) override
Definition: HelixArbitraryPlaneCrossing2Order.cc:35
HelixArbitraryPlaneCrossing::theX0
const double theX0
Definition: HelixArbitraryPlaneCrossing.h:56
maxiter
static const MaxIter maxiter
Definition: HelixArbitraryPlaneCrossing.cc:30
HelixArbitraryPlaneCrossing2Order::positionInDouble
PositionTypeDouble positionInDouble(double s) const
Definition: HelixArbitraryPlaneCrossing2Order.cc:105
HelixArbitraryPlaneCrossing::theCachedDPhi
double theCachedDPhi
Definition: HelixArbitraryPlaneCrossing.h:64
HelixArbitraryPlaneCrossing::theSinPhi0
double theSinPhi0
Definition: HelixArbitraryPlaneCrossing.h:57
TtFullHadJetPartonMatch_cfi.maxDist
maxDist
Definition: TtFullHadJetPartonMatch_cfi.py:35
multPhiCorr_741_25nsDY_cfi.px
px
Definition: multPhiCorr_741_25nsDY_cfi.py:10
GloballyPositioned::position
const PositionType & position() const
Definition: GloballyPositioned.h:36
HelixArbitraryPlaneCrossing::theQuadraticCrossingFromStart
HelixArbitraryPlaneCrossing2Order theQuadraticCrossingFromStart
Definition: HelixArbitraryPlaneCrossing.h:54
PVValHelper::dz
Definition: PVValidationHelpers.h:50
HelixArbitraryPlaneCrossing::theCachedS
double theCachedS
Definition: HelixArbitraryPlaneCrossing.h:63
HLT_2018_cff.maxIterations
maxIterations
Definition: HLT_2018_cff.py:11849
HelixArbitraryPlaneCrossing::theSinTheta
double theSinTheta
Definition: HelixArbitraryPlaneCrossing.h:58
Basic3DVector::x
T x() const
Cartesian x coordinate.
Definition: extBasic3DVector.h:94
HelixArbitraryPlaneCrossing::theCosPhi0
double theCosPhi0
Definition: HelixArbitraryPlaneCrossing.h:57
HelixArbitraryPlaneCrossing::theZ0
const double theZ0
Definition: HelixArbitraryPlaneCrossing.h:56
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HelixArbitraryPlaneCrossing::thePropDir
const PropagationDirection thePropDir
Definition: HelixArbitraryPlaneCrossing.h:61
point
*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
align_cfg.iteration
iteration
Definition: align_cfg.py:5
Basic3DVector::z
T z() const
Cartesian z coordinate.
Definition: extBasic3DVector.h:100
HelixArbitraryPlaneCrossing2Order
Definition: HelixArbitraryPlaneCrossing2Order.h:10
alongMomentum
Definition: PropagationDirection.h:4
DeadROC_duringRun.dir
dir
Definition: DeadROC_duringRun.py:23
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
HelixPlaneCrossing::PositionType
Basic3DVector< float > PositionType
the helix is passed to the constructor and does not appear in the interface
Definition: HelixPlaneCrossing.h:22