18 inline float sqr(
float x) {
return x*
x; }
26 double nSigMultipleScattering,
double maxAngleRatio,
35 theTTRecHitBuilder = ttrhbESH.product();
55 arc_0m = findArcIntersection(findMinimalCircles (
rm),
56 findTouchingCircles(r0),
keep);
58 nSigma = nSigMultipleScattering;
59 maxRatio = maxAngleRatio;
70 float s = dif.mag2() / ((c -
p1).
mag2() -
sqr(r));
79 float s = dif.mag2() / (p -
p1).
mag2();
87 pair<float,float>
a(0.,0.);
89 if(dif.mag2() < 2 *
sqr(r))
90 a = pair<float,float>( dif.phi(),
91 0.5*acos(1 - 0.5 * dif.mag2()/
sqr(r)) );
102 pair<float,float>
a(0.,0.);
103 a = pair<float,float>( (c -
p2).
phi(),
104 0.5*acos(1 - 2*
sqr(r)/(c -
p2).
mag2()) );
111 (pair<float,float>
a, pair<float,float>
b,
bool&
keep)
114 while(b.first < a.first -
M_PI) b.first += 2*
M_PI;
115 while(b.first > a.first +
M_PI) b.first -= 2*
M_PI;
119 if(a.first - a.second > b.first - b.second)
120 min = a.first - a.second;
122 { min = b.first - b.second; keep =
false; }
124 if(a.first + a.second < b.first + b.second)
125 max = a.first + a.second;
127 { max = b.first + b.second; keep =
false; }
129 pair<float,float>
c(0.,0.);
133 c.first = 0.5*(max +
min);
134 c.second = 0.5*(max -
min);
142 (
const float x[3],
const float y[3],
float par[3])
144 float s2 =
sqr(x[0]) * (y[1] - y[2]) +
145 sqr(x[1]) * (y[2] - y[0]) +
146 sqr(x[2]) * (y[0] - y[1]);
148 float s1 = x[0] * (y[1] - y[2]) +
149 x[1] * (y[2] - y[0]) +
150 x[2] * (y[0] - y[1]);
152 float s3 = (x[0] - x[1]) * (x[1] - x[2]) * (x[2] - x[0]);
153 float s4 = x[0]*x[1]*y[2] * (x[0] - x[1]) +
154 x[0]*y[1]*x[2] * (x[2] - x[0]) +
155 y[0]*x[1]*x[2] * (x[1] - x[2]);
164 (
const float x[3],
const float y[3],
const float par[3],
165 float phi[2],
float z[2])
168 phi[0] =
min(x[0],x[2]); z[0] =
min(y[0],y[2]);
169 phi[1] =
max(x[0],x[2]); z[1] =
max(y[0],y[2]);
172 float xe = -par[1]/(2*par[2]);
173 float ye = par[0] -
sqr(par[1])/(4*par[2]);
176 if(phi[0] < xe && xe < phi[1])
178 if(ye < z[0]) z[0] = ye;
179 if(ye > z[1]) z[1] = ye;
187 return a.
x() * b.
y() - a.
y() * b.
x();
196 float a12 = asin(fabsf(areaParallelogram(
p1 - c,
p2 - c)) / rad2);
197 float a23 = asin(fabsf(areaParallelogram(
p2 - c, p3 - c)) / rad2);
205 while(phi[1] < phi[0] -
M_PI) phi[1] += 2*
M_PI;
206 while(phi[1] > phi[0] +
M_PI) phi[1] -= 2*
M_PI;
208 while(phi[2] < phi[1] -
M_PI) phi[2] += 2*
M_PI;
209 while(phi[2] > phi[1] +
M_PI) phi[2] -= 2*
M_PI;
214 (
float r3,
float phi[2],
float z[2],
bool keep)
216 pair<float,float> arc_all =
217 findArcIntersection(arc_0m, findTouchingCircles(r3), keep);
219 if(arc_all.second != 0.)
225 angle[0] = arc_all.first - arc_all.second;
226 angle[1] = arc_all.first;
227 angle[2] = arc_all.first + arc_all.second;
229 float phi3[3], z3[3];
232 for(
int i=0;
i<3;
i++)
235 float lambda = delta*vec -
sqrt(
sqr(delta*vec) - delta*delta +
sqr(r3));
253 ratio = angleRatio(p3,c);
256 z3[
i] = g2.z() + (g2.z() - g1.z()) * ratio;
263 fitParabola (phi3,z3, par);
264 findRectangle(phi3,z3, par, phi,z);
270 (
float z3,
float phi[2],
float r[2],
bool keep)
273 angle[0] = arc_0m.first - arc_0m.second;
274 angle[1] = arc_0m.first;
275 angle[2] = arc_0m.first + arc_0m.second;
277 float ratio = (z3 - g2.z()) / (g2.z() - g1.z());
279 if(0 < ratio && ratio < maxRatio)
281 float phi3[3], r3[3];
283 for(
int i=0;
i<3;
i++)
289 p3 =
p2 + ratio * (
p2 -
p1);
301 float a12 = asin(areaParallelogram(
p1 - c,
p2 - c) / rad2);
302 float a23 = ratio * a12;
316 fitParabola (phi3,r3, par);
317 findRectangle(phi3,r3, par, phi,r);
323 (
float rz3,
float phi[2],
float rz[2])
326 phi[0] = 0.; rz[0] = 0.;
327 phi[1] = 0.; rz[1] = 0.;
330 if(theBarrel) calculateRangesBarrel (rz3, phi,rz, keep);
331 else calculateRangesForward(rz3, phi,rz, keep);
340 if (layer) initLayer(layer);
342 float phi_inner[2],rz_inner[2];
343 calculateRanges(theDetRange.min(), phi_inner,rz_inner);
345 float phi_outer[2],rz_outer[2];
346 calculateRanges(theDetRange.max(), phi_outer,rz_outer);
348 if( (phi_inner[0] == 0. && phi_inner[1] == 0.) ||
349 (phi_outer[0] == 0. && phi_outer[1] == 0.) )
359 while(phi_outer[0] > phi_inner[0] +
M_PI)
360 { phi_outer[0] -= 2*
M_PI; phi_outer[1] -= 2*
M_PI; }
362 while(phi_outer[0] < phi_inner[0] -
M_PI)
363 { phi_outer[0] += 2*
M_PI; phi_outer[1] += 2*
M_PI; }
365 phi[0] =
min(phi_inner[0],phi_outer[0]);
366 phi[1] =
max(phi_inner[1],phi_outer[1]);
368 rz[0] =
min( rz_inner[0], rz_outer[0]);
369 rz[1] =
max( rz_inner[1], rz_outer[1]);
375 (
float rz3,
float phi[],
float rz[])
377 calculateRanges(rz3, phi,rz);
391 if(circle.curvature() != 0.)
396 float a12 = asin(fabsf(areaParallelogram(
p1 - c,
p2 - c)) / rad2);
397 float a23 = asin(fabsf(areaParallelogram(
p2 - c, p3 - c)) / rad2);
399 float slope = (g2.z() - g1.z()) / a12;
401 float rz3 = g2.z() + slope * a23;
402 float delta_z = g3.
z() - rz3;
405 vector<TransientTrackingRecHit::RecHitPointer> th;
406 for(vector<const TrackingRecHit*>::iterator ih = h.begin(); ih!= h.end(); ih++)
407 th.push_back(theTTRecHitBuilder->build(*ih));
409 float sigma1_le2 =
max(th[0]->parametersError()[0][0],
410 th[0]->parametersError()[1][1]);
411 float sigma2_le2 =
max(th[1]->parametersError()[0][0],
412 th[1]->parametersError()[1][1]);
414 float sigma_z2 = (1 + a23/a12)*(1 + a23/a12) * sigma2_le2 +
415 ( a23/a12)*( a23/a12) * sigma1_le2;
417 float cotTheta = slope * circle.curvature();
418 float coshEta =
sqrt(1 +
sqr(cotTheta));
420 float pt = Bz / circle.curvature();
421 float p = pt * coshEta;
423 float m_pi = 0.13957018;
429 float sigma_z = msp(pt, cotTheta, rz2) /
beta;
432 float sinTheta = 1. / coshEta;
433 float cosTheta = cotTheta * sinTheta;
436 if(areaParallelogram(
p1 - c,
p2 - c) > 0) dir = 1;
else dir = -1;
442 globalDirs.push_back(
GlobalVector(-v.
y()*sinTheta,v.
x()*sinTheta,cosTheta));
447 globalDirs.push_back(
GlobalVector(-v.
y()*sinTheta,v.
x()*sinTheta,cosTheta));
452 globalDirs.push_back(
GlobalVector(-v.
y()*sinTheta,v.
x()*sinTheta,cosTheta));
456 float sigma_ms = sigma_z * coshEta;
459 float sigma_le2 =
max(th[2]->parametersError()[0][0],
460 th[2]->parametersError()[1][1]);
462 return (delta_z*delta_z / (sigma_ms*sigma_ms + sigma_le2 + sigma_z2)
478 theDetRange =
Range(radius-halfThickness, radius+halfThickness);
485 theDetRange =
Range(zLayer-halfThickness, zLayer+halfThickness);
void findRectangle(const float x[3], const float y[3], const float par[3], float phi[2], float z[2])
void invertCircle(Global2DVector &c, float &r)
void initLayer(const DetLayer *layer)
virtual float ptMin() const =0
minimal pt of interest
virtual GlobalPoint origin() const =0
virtual Location location() const =0
Which part of the detector (barrel, endcap)
virtual const BoundSurface & surface() const
The surface of the GeometricSearchDet.
static const double slope[3]
Sin< T >::type sin(const T &t)
void calculateRangesForward(float z3, float phi[2], float r[2], bool keep)
void calculateRangesBarrel(float r3, float phi[2], float z[2], bool keep)
float angleRatio(const Global2DVector &p3, const Global2DVector &c)
Vector2DBase< float, GlobalTag > Global2DVector
virtual float thickness() const =0
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
Geom::Phi< T > phi() const
T curvature(T InversePt, const edm::EventSetup &iSetup)
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Scalar radius() const
Radius of the cylinder.
const T & max(const T &a, const T &b)
Cos< T >::type cos(const T &t)
float areaParallelogram(const Global2DVector &a, const Global2DVector &b)
std::pair< float, float > findMinimalCircles(float r)
bool isCompatibleWithMultipleScattering(GlobalPoint g3, std::vector< const TrackingRecHit * > h, std::vector< GlobalVector > &localDirs, const edm::EventSetup &es)
const Bounds & bounds() const
PixelRecoRange< float > Range
virtual const BoundSurface & surface() const
GeometricSearchDet interface.
virtual const Surface::PositionType & position() const
Returns position of the surface.
virtual const BoundCylinder & specificSurface() const
Extension of the interface.
virtual float originRBound() const =0
bounds the particle vertex in the transverse plane
ThirdHitPrediction(const TrackingRegion ®ion, GlobalPoint inner, GlobalPoint outer, const edm::EventSetup &es, double nSigMultipleScattering, double maxAngleRatio, std::string builderName)
void spinCloser(float phi[3])
std::pair< float, float > findArcIntersection(std::pair< float, float > a, std::pair< float, float > b, bool &keep)
Square< F >::type sqr(const F &f)
void invertPoint(Global2DVector &p)
void fitParabola(const float x[3], const float y[3], float par[3])
void calculateRanges(float rz3, float phi[2], float rz[2])
void getRanges(const DetLayer *layer, float phi[], float rz[])
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
std::pair< float, float > findTouchingCircles(float r)
Global3DVector GlobalVector
const double par[8 *NPar][4]
T angle(T x1, T y1, T z1, T x2, T y2, T z2)