44 int charge(
const std::vector<GlobalPoint> & points) {
46 float dir = (points[1].x()-points[0].x())*(points[2].
y()-points[1].y())
47 - (points[1].
y()-points[0].y())*(points[2].
x()-points[1].x());
57 return (dir>0) ? -1 : 1;
61 float dr = outer.
perp()-inner.
perp();
62 float dz = outer.
z()-inner.
z();
66 inline float phi(
float xC,
float yC,
int charge) {
67 return (charge>0) ? std::atan2(xC,-yC) : std::atan2(-xC,yC);
70 float zip(
float d0,
float phi_p,
float curv,
79 float rho2 = curv*curv;
80 float r1s = (pinner-pca).
perp2();
81 double phi1 =
std::sqrt(r1s)*(curv*0.5f)*(1.
f+r1s*(rho2/24.
f));
82 float r2s = (pouter-pca).
perp2();
83 double phi2 =
std::sqrt(r2s)*(curv*0.5f)*(1.
f+r2s*(rho2/24.
f));
84 double z1 = pinner.
z();
85 double z2 = pouter.
z();
88 return z1 - phi1/(phi1-phi2)*(z1-z2);
98 : theConfig(cfg), theTracker(0), theField(0), theTTRecHitBuilder(0) {}
102 const std::vector<const TrackingRecHit * > & hits,
105 int nhits = hits.size();
106 if (nhits <2)
return 0;
108 vector<GlobalPoint> points(nhits);
109 vector<GlobalError>
errors(nhits);
110 vector<bool> isBarrel(nhits);
120 if (!
theField || watcherIdealMagneticFieldRecord.
check(es)) {
135 for (
int i=0;
i!=nhits; ++
i) {
138 recHit->globalPosition().y()-region.
origin().
y(),
139 recHit->globalPosition().z()-region.
origin().
z()
141 errors[
i] = recHit->globalPositionError();
142 isBarrel[
i] = recHit->detUnit()->type().isBarrel();
149 float valPhi, valTip, valPt;
151 int iCharge =
charge(points);
154 if ((curvature > 1.
e-4)&&
157 valPt = (invPt > 1.e-4
f) ? 1.
f/invPt : 1.e4f;
160 valPhi =
phi(center.
x(), center.
y(), iCharge);
165 valPhi = direction.
phi();
166 valTip = -points[0].x()*
sin(valPhi) + points[0].y()*
cos(valPhi);
169 float valCotTheta = cotTheta(points[0],points[1]);
170 float valEta = asinh(valCotTheta);
171 float valZip = zip(valTip, valPhi, curvature, points[0],points[1]);
174 float errValPt = param.
errPt();
175 float errValCot = param.
errCot();
176 float errValTip = param.
errTip();
177 float errValPhi = param.
errPhi();
178 float errValZip = param.
errZip();
183 RZLine rzLine(points,errors,isBarrel);
184 float cottheta, intercept, covss, covii, covsi;
185 rzLine.
fit(cottheta, intercept, covss, covii, covsi);
186 chi2 = rzLine.
chi2(cottheta, intercept);
196 return builder.
build(pt, phi, cotTheta, tip, zip, chi2, iCharge, hits,
theField, region.
origin() );
T getParameter(std::string const &) const
const MagneticField * theField
virtual GlobalPoint origin() const =0
PixelFitterByHelixProjections(const edm::ParameterSet &cfg)
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
Sin< T >::type sin(const T &t)
Geom::Phi< T > phi() const
Global3DPoint GlobalPoint
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
virtual reco::Track * run(const edm::EventSetup &es, const std::vector< const TrackingRecHit * > &hits, const TrackingRegion ®ion) const
T inversePt(T curvature, const edm::EventSetup &iSetup)
T curvature(T InversePt, const edm::EventSetup &iSetup)
const T & max(const T &a, const T &b)
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
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
const TrackerGeometry * theTracker
T y() const
Cartesian y coordinate.
T const * product() const
T perp2() const
Squared magnitude of transverse component.
edm::ParameterSet theConfig
bool check(const edm::EventSetup &iSetup)
const TransientTrackingRecHitBuilder * theTTRecHitBuilder
void fit(float &cotTheta, float &intercept, float &covss, float &covii, float &covsi) const
float chi2(float cotTheta, float intercept) const
T x() const
Cartesian x coordinate.