TrackingTools
GeomPropagators
src
StraightLineCylinderCrossing.cc
Go to the documentation of this file.
1
#include "
TrackingTools/GeomPropagators/interface/StraightLineCylinderCrossing.h
"
2
3
#include "
DataFormats/GeometrySurface/interface/Cylinder.h
"
4
#include "
TrackingTools/GeomPropagators/src/RealQuadEquation.h
"
5
6
#include <cmath>
7
#include <iostream>
8
using namespace
std
;
9
10
StraightLineCylinderCrossing::StraightLineCylinderCrossing
(
const
LocalPoint
& startingPos,
11
const
LocalVector
& startingDir,
12
const
PropagationDirection
propDir,
13
double
tolerance
)
14
: theX0(startingPos), theP0(startingDir.
unit
()), thePropDir(propDir), theTolerance(
tolerance
) {}
15
16
std::pair<bool, double>
StraightLineCylinderCrossing::pathLength
(
const
Cylinder
& cylinder)
const
{
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
}
48
49
std::pair<bool, double>
StraightLineCylinderCrossing::chooseSolution
(
const
double
s1,
const
double
s2
)
const
{
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
}
StraightLineCylinderCrossing.h
Vector3DBase< float, LocalTag >
StraightLineCylinderCrossing::theTolerance
double theTolerance
Definition:
StraightLineCylinderCrossing.h:54
anyDirection
Definition:
PropagationDirection.h:4
Cylinder.h
Cylinder::radius
Scalar radius() const
Radius of the cylinder.
Definition:
Cylinder.h:64
PV3DBase::x
T x() const
Definition:
PV3DBase.h:59
min
T min(T a, T b)
Definition:
MathUtil.h:58
StraightLineCylinderCrossing::theX0
const PositionType theX0
Definition:
StraightLineCylinderCrossing.h:51
indexGen.s2
s2
Definition:
indexGen.py:107
StraightLineCylinderCrossing::pathLength
std::pair< bool, double > pathLength(const Cylinder &cyl) const
Definition:
StraightLineCylinderCrossing.cc:16
RealQuadEquation
Definition:
RealQuadEquation.h:11
Point3DBase< float, LocalTag >
Basic2DVector< float >
StraightLineCylinderCrossing::theP0
const DirectionType theP0
Definition:
StraightLineCylinderCrossing.h:52
PV3DBase::y
T y() const
Definition:
PV3DBase.h:60
tolerance
const double tolerance
Definition:
HGCalGeomParameters.cc:27
edm::eq
bool eq(const ELstring &s1, const ELstring s2)
Definition:
ELstring.cc:39
unit
Basic3DVector unit() const
Definition:
Basic3DVectorLD.h:162
std
Definition:
JetResolutionObject.h:76
StraightLineCylinderCrossing::thePropDir
const PropagationDirection thePropDir
Definition:
StraightLineCylinderCrossing.h:53
PropagationDirection
PropagationDirection
Definition:
PropagationDirection.h:4
RealQuadEquation.h
Cylinder
Definition:
Cylinder.h:19
dttmaxenums::R
Definition:
DTTMax.h:29
StraightLineCylinderCrossing::chooseSolution
std::pair< bool, double > chooseSolution(const double s1, const double s2) const
Chooses the right solution w.r.t. the propagation direction.
Definition:
StraightLineCylinderCrossing.cc:49
alongMomentum
Definition:
PropagationDirection.h:4
StraightLineCylinderCrossing::StraightLineCylinderCrossing
StraightLineCylinderCrossing(const LocalPoint &startingPos, const LocalVector &startingDir, const PropagationDirection propDir=alongMomentum, double tolerance=0)
Definition:
StraightLineCylinderCrossing.cc:10
Generated for CMSSW Reference Manual by
1.8.16