41 float dir = (points[1].x()-points[0].x())*(points[2].
y()-points[1].y())
42 - (points[1].
y()-points[0].y())*(points[2].
x()-points[1].x());
52 return (dir>0) ? -1 : 1;
57 float dz = outer.
z()-inner.
z();
61 inline float phi(
float xC,
float yC,
int charge) {
62 return (charge>0) ? std::atan2(xC,-yC) :
std::atan2(-xC,yC);
65 float zip(
float d0,
float phi_p,
float curv,
76 float rho2 = curv*curv;
77 float r1s = (pinner-pca).
perp2();
78 double phi1 =
std::sqrt(r1s)*(curv*0.5f)*(1.
f+r1s*(rho2*o24));
79 float r2s = (pouter-pca).
perp2();
80 double phi2 =
std::sqrt(r2s)*(curv*0.5f)*(1.
f+r2s*(rho2*o24));
81 double z1 = pinner.
z();
82 double z2 = pouter.
z();
85 return z1 - phi1/(phi1-phi2)*(z1-z2);
94 theES(es), theField(field) {}
97 const std::vector<const TrackingRecHit * > &
hits,
100 std::unique_ptr<reco::Track> ret;
102 int nhits = hits.size();
103 if (nhits <2)
return ret;
120 float valPhi, valTip, valPt;
122 int iCharge =
charge(points);
125 if ((curvature > 1.
e-4)&&
128 valPt = (invPt > 1.e-4
f) ? 1.
f/invPt : 1.e4f;
131 valPhi =
phi(center.
x(), center.
y(), iCharge);
137 valTip = -points[0].x()*
sin(valPhi) + points[0].y()*
cos(valPhi);
140 float valCotTheta = cotTheta(points[0],points[1]);
141 float valEta = std::asinh(valCotTheta);
142 float valZip =
zip(valTip, valPhi, curvature, points[0],points[1]);
145 float errValPt = param.
errPt();
146 float errValCot = param.
errCot();
147 float errValTip = param.
errTip();
148 float errValPhi = param.
errPhi();
149 float errValZip = param.
errZip();
155 chi2 = rzLine.
chi2();
165 ret.reset(builder.
build(pt, phi, cotTheta, tip, zip, chi2, iCharge, hits,
theField, region.
origin() ));
const edm::EventSetup * theES
const MagneticField * theField
GlobalPoint const & origin() const
Sin< T >::type sin(const T &t)
Global3DPoint GlobalPoint
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
T inversePt(T curvature, const edm::EventSetup &iSetup)
T x() const
Cartesian x coordinate.
T curvature(T InversePt, const edm::EventSetup &iSetup)
PixelFitterByHelixProjections(const edm::EventSetup *es, const MagneticField *field)
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
Cos< T >::type cos(const T &t)
reco::Track * build(const Measurement1D &pt, const Measurement1D &phi, const Measurement1D &cotTheta, const Measurement1D &tip, const Measurement1D &zip, float chi2, int charge, const std::vector< const TrackingRecHit * > &hits, const MagneticField *mf, const GlobalPoint &reference=GlobalPoint(0, 0, 0)) const
Abs< T >::type abs(const T &t)
T y() const
Cartesian y coordinate.
constexpr float fhalfPi()
T perp2() const
Squared magnitude of transverse component.
#define declareDynArray(T, n, x)
float fieldInInvGev(const edm::EventSetup &iSetup)
const BasicVectorType & basicVector() const
virtual std::unique_ptr< reco::Track > run(const std::vector< const TrackingRecHit * > &hits, const TrackingRegion ®ion) const override
T x() const
Cartesian x coordinate.