CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
ThirdHitPrediction Class Reference

#include <ThirdHitPrediction.h>

Public Types

typedef
TkTrackingRegionsMargin< float > 
Margin
 
typedef PixelRecoRange< float > Range
 

Public Member Functions

void getRanges (const DetLayer *layer, float phi[], float rz[])
 
void getRanges (float rORz, float phi[], float rz[])
 
bool isCompatibleWithMultipleScattering (GlobalPoint g3, const std::vector< const TrackingRecHit * > &h, std::vector< GlobalVector > &localDirs, const edm::EventSetup &es)
 
 ThirdHitPrediction (const TrackingRegion &region, GlobalPoint inner, GlobalPoint outer, const edm::EventSetup &es, double nSigMultipleScattering, double maxAngleRatio, std::string builderName)
 
 ~ThirdHitPrediction ()
 

Private Member Functions

float angleRatio (const Global2DVector &p3, const Global2DVector &c)
 
float areaParallelogram (const Global2DVector &a, const Global2DVector &b)
 
void calculateRanges (float rz3, float phi[2], float rz[2])
 
void calculateRangesBarrel (float r3, float phi[2], float z[2], bool keep)
 
void calculateRangesForward (float z3, float phi[2], float r[2], bool keep)
 
std::pair< float, float > findArcIntersection (std::pair< float, float > a, std::pair< float, float > b, bool &keep)
 
std::pair< float, float > findMinimalCircles (float r)
 
void findRectangle (const float x[3], const float y[3], const float par[3], float phi[2], float z[2])
 
std::pair< float, float > findTouchingCircles (float r)
 
void fitParabola (const float x[3], const float y[3], float par[3])
 
void initLayer (const DetLayer *layer)
 
void invertCircle (Global2DVector &c, float &r)
 
void invertPoint (Global2DVector &p)
 
void printOut (char *text)
 
void spinCloser (float phi[3])
 

Private Attributes

std::pair< float, float > arc_0m
 
float Bz
 
Global2DVector c0
 
Global2DVector dif
 
GlobalPoint g1
 
GlobalPoint g2
 
bool keep
 
double maxRatio
 
double nSigma
 
Global2DVector p1
 
Global2DVector p2
 
float r0
 
float rm
 
bool theBarrel
 
Range theDetRange
 
bool theForward
 
const DetLayertheLayer
 
PixelRecoLineRZ theLine
 
Margin theTolerance
 
const
TransientTrackingRecHitBuilder
theTTRecHitBuilder
 

Detailed Description

Definition at line 33 of file ThirdHitPrediction.h.

Member Typedef Documentation

Definition at line 36 of file ThirdHitPrediction.h.

Definition at line 35 of file ThirdHitPrediction.h.

Constructor & Destructor Documentation

ThirdHitPrediction::ThirdHitPrediction ( const TrackingRegion region,
GlobalPoint  inner,
GlobalPoint  outer,
const edm::EventSetup es,
double  nSigMultipleScattering,
double  maxAngleRatio,
std::string  builderName 
)

Definition at line 24 of file ThirdHitPrediction.cc.

References diffTwoXMLs::g1, diffTwoXMLs::g2, edm::EventSetup::get(), SurfaceOrientation::inner, keep, HLT_ES_cff::magfield, HLT_25ns14e33_v1_cff::maxRatio, HLT_25ns14e33_v1_cff::nSigma, TrackingRegion::origin(), TrackingRegion::originRBound(), SurfaceOrientation::outer, p1, p2, TrackingRegion::ptMin(), submit::rm, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

28 {
29  using namespace edm;
32 
34  es.get<TransientRecHitRecord>().get(builderName,ttrhbESH);
35  theTTRecHitBuilder = ttrhbESH.product();
36 
37  Bz = fabs(magfield->inInverseGeV(GlobalPoint(0,0,0)).z());
38 
39  c0 = Global2DVector(region.origin().x(),
40  region.origin().y());
41 
42  r0 = region.originRBound();
43  rm = region.ptMin() / Bz;
44 
45  g1 = inner;
46  g2 = outer;
47 
48  p1 = Global2DVector(g1.x(), g1.y());
49  p2 = Global2DVector(g2.x(), g2.y());
50 
51  dif = p1 - p2;
52 
53  // Prepare circles of minimal pt (rm) and cylinder of origin (r0)
54  keep = true;
57 
58  nSigma = nSigMultipleScattering;
59  maxRatio = maxAngleRatio;
60 }
float originRBound() const
bounds the particle vertex in the transverse plane
GlobalPoint const & origin() const
tuple magfield
Definition: HLT_ES_cff.py:2311
T y() const
Definition: PV3DBase.h:63
std::pair< float, float > arc_0m
const TransientTrackingRecHitBuilder * theTTRecHitBuilder
std::pair< float, float > findMinimalCircles(float r)
const T & get() const
Definition: EventSetup.h:56
float ptMin() const
minimal pt of interest
std::pair< float, float > findArcIntersection(std::pair< float, float > a, std::pair< float, float > b, bool &keep)
std::pair< float, float > findTouchingCircles(float r)
T x() const
Definition: PV3DBase.h:62
Vector2DBase< float, GlobalTag > Global2DVector
ThirdHitPrediction::~ThirdHitPrediction ( )

Definition at line 63 of file ThirdHitPrediction.cc.

64 {
65 }

Member Function Documentation

float ThirdHitPrediction::angleRatio ( const Global2DVector p3,
const Global2DVector c 
)
private

Definition at line 192 of file ThirdHitPrediction.cc.

References EnergyCorrector::c, mag2(), p1, and p2.

193 {
194  float rad2 = (p1 - c).mag2();
195 
196  float a12 = asin(fabsf(areaParallelogram(p1 - c, p2 - c)) / rad2);
197  float a23 = asin(fabsf(areaParallelogram(p2 - c, p3 - c)) / rad2);
198 
199  return a23/a12;
200 }
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
float areaParallelogram(const Global2DVector &a, const Global2DVector &b)
float ThirdHitPrediction::areaParallelogram ( const Global2DVector a,
const Global2DVector b 
)
private

Definition at line 185 of file ThirdHitPrediction.cc.

References PV2DBase< T, PVType, FrameType >::x(), and PV2DBase< T, PVType, FrameType >::y().

186 {
187  return a.x() * b.y() - a.y() * b.x();
188 }
T y() const
Definition: PV2DBase.h:46
T x() const
Definition: PV2DBase.h:45
void ThirdHitPrediction::calculateRanges ( float  rz3,
float  phi[2],
float  rz[2] 
)
private

Definition at line 323 of file ThirdHitPrediction.cc.

324 {
325  // Clear
326  phi[0] = 0.; rz[0] = 0.;
327  phi[1] = 0.; rz[1] = 0.;
328 
329  // Calculate
330  if(theBarrel) calculateRangesBarrel (rz3, phi,rz, keep);
331  else calculateRangesForward(rz3, phi,rz, keep);
332 }
void calculateRangesForward(float z3, float phi[2], float r[2], bool keep)
void calculateRangesBarrel(float r3, float phi[2], float z[2], bool keep)
void ThirdHitPrediction::calculateRangesBarrel ( float  r3,
float  phi[2],
float  z[2],
bool  keep 
)
private

Definition at line 214 of file ThirdHitPrediction.cc.

References angle(), EnergyCorrector::c, funct::cos(), delta, diffTwoXMLs::g1, diffTwoXMLs::g2, i, mag(), p1, p2, p3, PV2DBase< T, PVType, FrameType >::phi(), funct::sin(), funct::sqr(), and mathSSE::sqrt().

215 {
216  pair<float,float> arc_all =
218 
219  if(arc_all.second != 0.)
220  {
221  Global2DVector c3(0.,0.); // barrel at r3
222  invertCircle(c3,r3); // inverted
223 
224  float angle[3]; // prepare angles
225  angle[0] = arc_all.first - arc_all.second;
226  angle[1] = arc_all.first;
227  angle[2] = arc_all.first + arc_all.second;
228 
229  float phi3[3], z3[3];
230  Global2DVector delta = c3 - p2;
231 
232  for(int i=0; i<3; i++)
233  {
234  Global2DVector vec(cos(angle[i]), sin(angle[i])); // unit vector
235  float lambda = delta*vec - sqrt(sqr(delta*vec) - delta*delta + sqr(r3));
236 
237  Global2DVector p3 = p2 + lambda * vec; // inverted third hit
238  invertPoint(p3); // third hit
239  phi3[i] = p3.phi(); // phi of third hit
240 
241  float ratio;
242 
243  if(keep && i==1)
244  { // Straight line
245  ratio = (p2 - p3).mag() / (p1 - p2).mag();
246  }
247  else
248  { // Circle
249  Global2DVector c = p2 - vec * (vec * (p2 - p1)); // inverted antipodal
250  invertPoint(c); // antipodal
251  c = 0.5*(p1 + c); // center
252 
253  ratio = angleRatio(p3,c);
254  }
255 
256  z3[i] = g2.z() + (g2.z() - g1.z()) * ratio; // z of third hit
257  }
258 
259  spinCloser(phi3);
260 
261  // Parabola on phi - z
262  float par[3];
263  fitParabola (phi3,z3, par);
264  findRectangle(phi3,z3, par, phi,z);
265  }
266 }
dbl * delta
Definition: mlp_gen.cc:36
void findRectangle(const float x[3], const float y[3], const float par[3], float phi[2], float z[2])
int i
Definition: DBlmapReader.cc:9
void invertCircle(Global2DVector &c, float &r)
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
float angleRatio(const Global2DVector &p3, const Global2DVector &c)
Geom::Phi< T > phi() const
Definition: PV2DBase.h:51
T sqrt(T t)
Definition: SSEVec.h:48
std::pair< float, float > arc_0m
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
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)
Definition: Square.h:13
void invertPoint(Global2DVector &p)
void fitParabola(const float x[3], const float y[3], float par[3])
std::pair< float, float > findTouchingCircles(float r)
double p3[4]
Definition: TauolaWrapper.h:91
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11
void ThirdHitPrediction::calculateRangesForward ( float  z3,
float  phi[2],
float  r[2],
bool  keep 
)
private

Definition at line 270 of file ThirdHitPrediction.cc.

References angle(), EnergyCorrector::c, funct::cos(), diffTwoXMLs::g1, diffTwoXMLs::g2, i, PV2DBase< T, PVType, FrameType >::mag(), mag2(), HLT_25ns14e33_v1_cff::maxRatio, p1, p2, p3, PV2DBase< T, PVType, FrameType >::phi(), and funct::sin().

271 {
272  float angle[3]; // prepare angles
273  angle[0] = arc_0m.first - arc_0m.second;
274  angle[1] = arc_0m.first;
275  angle[2] = arc_0m.first + arc_0m.second;
276 
277  float ratio = (z3 - g2.z()) / (g2.z() - g1.z());
278 
279  if(0 < ratio && ratio < maxRatio)
280  {
281  float phi3[3], r3[3];
282 
283  for(int i=0; i<3; i++)
284  {
286 
287  if(keep && i==1)
288  { // Straight line
289  p3 = p2 + ratio * (p2 - p1);
290  }
291  else
292  { // Circle
293  Global2DVector vec(cos(angle[i]), sin(angle[i])); // unit vector
294 
295  Global2DVector c = p2 - vec * (vec * (p2 - p1)); // inverted antipodal
296  invertPoint(c); // antipodal
297  c = 0.5*(p1 + c); // center
298 
299  float rad2 = (p1 - c).mag2();
300 
301  float a12 = asin(areaParallelogram(p1 - c, p2 - c) / rad2);
302  float a23 = ratio * a12;
303 
304  p3 = c + Global2DVector((p2-c).x()*cos(a23) - (p2-c).y()*sin(a23),
305  (p2-c).x()*sin(a23) + (p2-c).y()*cos(a23));
306  }
307 
308  phi3[i] = p3.phi();
309  r3[i] = p3.mag();
310  }
311 
312  spinCloser(phi3);
313 
314  // Parabola on phi - z
315  float par[3];
316  fitParabola (phi3,r3, par);
317  findRectangle(phi3,r3, par, phi,r);
318  }
319 }
void findRectangle(const float x[3], const float y[3], const float par[3], float phi[2], float z[2])
int i
Definition: DBlmapReader.cc:9
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
T mag() const
Definition: PV2DBase.h:49
Geom::Phi< T > phi() const
Definition: PV2DBase.h:51
std::pair< float, float > arc_0m
T z() const
Definition: PV3DBase.h:64
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
float areaParallelogram(const Global2DVector &a, const Global2DVector &b)
void spinCloser(float phi[3])
void invertPoint(Global2DVector &p)
void fitParabola(const float x[3], const float y[3], float par[3])
Vector2DBase< float, GlobalTag > Global2DVector
double p3[4]
Definition: TauolaWrapper.h:91
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11
pair< float, float > ThirdHitPrediction::findArcIntersection ( std::pair< float, float >  a,
std::pair< float, float >  b,
bool &  keep 
)
private

Definition at line 111 of file ThirdHitPrediction.cc.

References EnergyCorrector::c, M_PI, bookConverter::max, and min().

112 {
113  // spin closer
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;
116 
117  float min,max;
118 
119  if(a.first - a.second > b.first - b.second)
120  min = a.first - a.second;
121  else
122  { min = b.first - b.second; keep = false; }
123 
124  if(a.first + a.second < b.first + b.second)
125  max = a.first + a.second;
126  else
127  { max = b.first + b.second; keep = false; }
128 
129  pair<float,float> c(0.,0.);
130 
131  if(min < max)
132  {
133  c.first = 0.5*(max + min);
134  c.second = 0.5*(max - min);
135  }
136 
137  return c;
138 }
T min(T a, T b)
Definition: MathUtil.h:58
#define M_PI
double b
Definition: hdecay.h:120
double a
Definition: hdecay.h:121
pair< float, float > ThirdHitPrediction::findMinimalCircles ( float  r)
private

Definition at line 85 of file ThirdHitPrediction.cc.

References a, and funct::sqr().

86 {
87  pair<float,float> a(0.,0.);
88 
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)) );
92 
93  return a;
94 }
T mag2() const
Definition: PV2DBase.h:47
Geom::Phi< T > phi() const
Definition: PV2DBase.h:51
double a
Definition: hdecay.h:121
Square< F >::type sqr(const F &f)
Definition: Square.h:13
void ThirdHitPrediction::findRectangle ( const float  x[3],
const float  y[3],
const float  par[3],
float  phi[2],
float  z[2] 
)
private

Definition at line 164 of file ThirdHitPrediction.cc.

References bookConverter::max, min(), and funct::sqr().

166 {
167  // Initial guess
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]);
170 
171  // Extremum: position and value
172  float xe = -par[1]/(2*par[2]);
173  float ye = par[0] - sqr(par[1])/(4*par[2]);
174 
175  // Check if extremum is inside the phi range
176  if(phi[0] < xe && xe < phi[1])
177  {
178  if(ye < z[0]) z[0] = ye;
179  if(ye > z[1]) z[1] = ye;
180  }
181 }
T min(T a, T b)
Definition: MathUtil.h:58
Square< F >::type sqr(const F &f)
Definition: Square.h:13
pair< float, float > ThirdHitPrediction::findTouchingCircles ( float  r)
private

Definition at line 97 of file ThirdHitPrediction.cc.

References a, EnergyCorrector::c, mag2(), p2, phi(), and funct::sqr().

98 {
100  invertCircle(c,r);
101 
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()) );
105 
106  return a;
107 }
void invertCircle(Global2DVector &c, float &r)
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
double a
Definition: hdecay.h:121
Square< F >::type sqr(const F &f)
Definition: Square.h:13
void ThirdHitPrediction::fitParabola ( const float  x[3],
const float  y[3],
float  par[3] 
)
private

Definition at line 142 of file ThirdHitPrediction.cc.

References indexGen::s2, and funct::sqr().

143 {
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]);
147 
148  float s1 = x[0] * (y[1] - y[2]) +
149  x[1] * (y[2] - y[0]) +
150  x[2] * (y[0] - y[1]);
151 
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]);
156 
157  par[2] = s1 / s3; // a2
158  par[1] = -s2 / s3; // a1
159  par[0] = -s4 / s3; // a0
160 }
tuple s2
Definition: indexGen.py:106
Square< F >::type sqr(const F &f)
Definition: Square.h:13
void ThirdHitPrediction::getRanges ( const DetLayer layer,
float  phi[],
float  rz[] 
)

Definition at line 336 of file ThirdHitPrediction.cc.

References M_PI, bookConverter::max, and min().

Referenced by PixelTripletLowPtGenerator::hitTriplets().

337 {
338  theLayer = layer;
339 
340  if (layer) initLayer(layer);
341 
342  float phi_inner[2],rz_inner[2];
343  calculateRanges(theDetRange.min(), phi_inner,rz_inner);
344 
345  float phi_outer[2],rz_outer[2];
346  calculateRanges(theDetRange.max(), phi_outer,rz_outer);
347 
348  if( (phi_inner[0] == 0. && phi_inner[1] == 0.) ||
349  (phi_outer[0] == 0. && phi_outer[1] == 0.) )
350  {
351  phi[0] = 0.;
352  phi[1] = 0.;
353 
354  rz[0] = 0.;
355  rz[1] = 0.;
356  }
357  else
358  {
359  while(phi_outer[0] > phi_inner[0] + M_PI)
360  { phi_outer[0] -= 2*M_PI; phi_outer[1] -= 2*M_PI; }
361 
362  while(phi_outer[0] < phi_inner[0] - M_PI)
363  { phi_outer[0] += 2*M_PI; phi_outer[1] += 2*M_PI; }
364 
365  phi[0] = min(phi_inner[0],phi_outer[0]);
366  phi[1] = max(phi_inner[1],phi_outer[1]);
367 
368  rz[0] = min( rz_inner[0], rz_outer[0]);
369  rz[1] = max( rz_inner[1], rz_outer[1]);
370  }
371 }
void initLayer(const DetLayer *layer)
T max() const
T min() const
const DetLayer * theLayer
T min(T a, T b)
Definition: MathUtil.h:58
#define M_PI
void calculateRanges(float rz3, float phi[2], float rz[2])
void ThirdHitPrediction::getRanges ( float  rORz,
float  phi[],
float  rz[] 
)

Definition at line 375 of file ThirdHitPrediction.cc.

376 {
377  calculateRanges(rz3, phi,rz);
378 }
void calculateRanges(float rz3, float phi[2], float rz[2])
void ThirdHitPrediction::initLayer ( const DetLayer layer)
private

Definition at line 470 of file ThirdHitPrediction.cc.

References GeomDetEnumerators::barrel, Surface::bounds(), GeomDetEnumerators::endcap, DetLayer::location(), GeometricSearchDet::position(), CosmicsPD_Skims::radius, BarrelDetLayer::specificSurface(), ForwardDetLayer::surface(), BarrelDetLayer::surface(), Bounds::thickness(), and PV3DBase< T, PVType, FrameType >::z().

471 {
472  if ( layer->location() == GeomDetEnumerators::barrel) {
473  theBarrel = true;
474  theForward = false;
475  const BarrelDetLayer& bl = dynamic_cast<const BarrelDetLayer&>(*layer);
476  float halfThickness = bl.surface().bounds().thickness()/2;
477  float radius = bl.specificSurface().radius();
478  theDetRange = Range(radius-halfThickness, radius+halfThickness);
479  } else if ( layer->location() == GeomDetEnumerators::endcap) {
480  theBarrel= false;
481  theForward = true;
482  const ForwardDetLayer& fl = dynamic_cast<const ForwardDetLayer&>(*layer);
483  float halfThickness = fl.surface().bounds().thickness()/2;
484  float zLayer = fl.position().z() ;
485  theDetRange = Range(zLayer-halfThickness, zLayer+halfThickness);
486  }
487 }
virtual Location location() const =0
Which part of the detector (barrel, endcap)
virtual const BoundSurface & surface() const
The surface of the GeometricSearchDet.
const Bounds & bounds() const
Definition: Surface.h:128
virtual float thickness() const =0
T z() const
Definition: PV3DBase.h:64
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.
void ThirdHitPrediction::invertCircle ( Global2DVector c,
float &  r 
)
private

Definition at line 68 of file ThirdHitPrediction.cc.

References mag2(), p1, alignCSCRings::s, and funct::sqr().

69 {
70  float s = dif.mag2() / ((c - p1).mag2() - sqr(r));
71 
72  c = p1 + (c - p1)*s;
73  r *= fabsf(s);
74 }
T mag2() const
Definition: PV2DBase.h:47
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
Square< F >::type sqr(const F &f)
Definition: Square.h:13
void ThirdHitPrediction::invertPoint ( Global2DVector p)
private

Definition at line 77 of file ThirdHitPrediction.cc.

References mag2(), p1, and alignCSCRings::s.

78 {
79  float s = dif.mag2() / (p - p1).mag2();
80 
81  p = p1 + (p - p1)*s;
82 }
T mag2() const
Definition: PV2DBase.h:47
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
bool ThirdHitPrediction::isCompatibleWithMultipleScattering ( GlobalPoint  g3,
const std::vector< const TrackingRecHit * > &  h,
std::vector< GlobalVector > &  localDirs,
const edm::EventSetup es 
)

Definition at line 382 of file ThirdHitPrediction.cc.

References beta, EnergyCorrector::c, PixelRecoUtilities::curvature(), dir, diffTwoXMLs::g1, diffTwoXMLs::g2, m_pi, mag2(), bookConverter::max, AnalysisDataFormats_SUSYBSMObjects::msp, HLT_25ns14e33_v1_cff::nSigma, AlCaHLTBitMon_ParallelJobs::p, p1, p2, p3, EnergyCorrector::pt, slope, funct::sqr(), mathSSE::sqrt(), findQualityFiles::v, PV2DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::x(), PV2DBase< T, PVType, FrameType >::y(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by PixelTripletLowPtGenerator::hitTriplets().

384 {
385  Global2DVector p1(g1.x(),g1.y());
386  Global2DVector p2(g2.x(),g2.y());
387  Global2DVector p3(g3.x(),g3.y());
388 
389  CircleFromThreePoints circle(g1,g2,g3);
390 
391  if(circle.curvature() != 0.)
392  {
393  Global2DVector c (circle.center().x(), circle.center().y());
394 
395  float rad2 = (p1 - c).mag2();
396  float a12 = asin(fabsf(areaParallelogram(p1 - c, p2 - c)) / rad2);
397  float a23 = asin(fabsf(areaParallelogram(p2 - c, p3 - c)) / rad2);
398 
399  float slope = (g2.z() - g1.z()) / a12;
400 
401  float rz3 = g2.z() + slope * a23;
402  float delta_z = g3.z() - rz3;
403 
404  // Transform to tt
405  vector<TransientTrackingRecHit::RecHitPointer> th;
406  for(vector<const TrackingRecHit*>::const_iterator ih = h.begin(); ih!= h.end(); ih++)
407  th.push_back(theTTRecHitBuilder->build(*ih));
408 
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]);
413 
414  float sigma_z2 = (1 + a23/a12)*(1 + a23/a12) * sigma2_le2 +
415  ( a23/a12)*( a23/a12) * sigma1_le2;
416 
417  float cotTheta = slope * circle.curvature(); // == sinhEta
418  float coshEta = sqrt(1 + sqr(cotTheta)); // == 1/sinTheta
419 
420  float pt = Bz / circle.curvature();
421  float p = pt * coshEta;
422 
423  float m_pi = 0.13957018;
424  float beta = p / sqrt(sqr(p) + sqr(m_pi));
425 
427  PixelRecoPointRZ rz2(g2.perp(), g2.z());
428 
429  float sigma_z = msp(pt, cotTheta, rz2) / beta;
430 
431  // Calculate globalDirs
432  float sinTheta = 1. / coshEta;
433  float cosTheta = cotTheta * sinTheta;
434 
435  int dir;
436  if(areaParallelogram(p1 - c, p2 - c) > 0) dir = 1; else dir = -1;
437 
438  float curvature = circle.curvature();
439 
440  {
441  Global2DVector v = (p1 - c)*curvature*dir;
442  globalDirs.push_back(GlobalVector(-v.y()*sinTheta,v.x()*sinTheta,cosTheta));
443  }
444 
445  {
446  Global2DVector v = (p2 - c)*curvature*dir;
447  globalDirs.push_back(GlobalVector(-v.y()*sinTheta,v.x()*sinTheta,cosTheta));
448  }
449 
450  {
451  Global2DVector v = (p3 - c)*curvature*dir;
452  globalDirs.push_back(GlobalVector(-v.y()*sinTheta,v.x()*sinTheta,cosTheta));
453  }
454 
455  // Multiple scattering
456  float sigma_ms = sigma_z * coshEta;
457 
458  // Local error squared
459  float sigma_le2 = max(th[2]->parametersError()[0][0],
460  th[2]->parametersError()[1][1]);
461 
462  return (delta_z*delta_z / (sigma_ms*sigma_ms + sigma_le2 + sigma_z2)
463  < nSigma * nSigma);
464  }
465 
466  return false;
467 }
const double beta
T y() const
Definition: PV2DBase.h:46
T perp() const
Definition: PV3DBase.h:72
static const double slope[3]
T y() const
Definition: PV3DBase.h:63
T curvature(T InversePt, const edm::EventSetup &iSetup)
const DetLayer * theLayer
susybsm::MuonSegmentRefProd msp
Definition: classes.h:34
T sqrt(T t)
Definition: SSEVec.h:48
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
T z() const
Definition: PV3DBase.h:64
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
const TransientTrackingRecHitBuilder * theTTRecHitBuilder
float areaParallelogram(const Global2DVector &a, const Global2DVector &b)
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
Square< F >::type sqr(const F &f)
Definition: Square.h:13
dbl *** dir
Definition: mlp_gen.cc:35
T x() const
Definition: PV2DBase.h:45
T x() const
Definition: PV3DBase.h:62
Global3DVector GlobalVector
Definition: GlobalVector.h:10
double p3[4]
Definition: TauolaWrapper.h:91
#define m_pi
Definition: RPCConst.cc:8
void ThirdHitPrediction::printOut ( char *  text)
private
void ThirdHitPrediction::spinCloser ( float  phi[3])
private

Definition at line 203 of file ThirdHitPrediction.cc.

References M_PI.

204 {
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;
207 
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;
210 }
#define M_PI

Member Data Documentation

std::pair<float,float> ThirdHitPrediction::arc_0m
private

Definition at line 93 of file ThirdHitPrediction.h.

float ThirdHitPrediction::Bz
private

Definition at line 90 of file ThirdHitPrediction.h.

Global2DVector ThirdHitPrediction::c0
private

Definition at line 92 of file ThirdHitPrediction.h.

Global2DVector ThirdHitPrediction::dif
private

Definition at line 92 of file ThirdHitPrediction.h.

GlobalPoint ThirdHitPrediction::g1
private

Definition at line 91 of file ThirdHitPrediction.h.

GlobalPoint ThirdHitPrediction::g2
private

Definition at line 91 of file ThirdHitPrediction.h.

bool ThirdHitPrediction::keep
private

Definition at line 95 of file ThirdHitPrediction.h.

double ThirdHitPrediction::maxRatio
private

Definition at line 98 of file ThirdHitPrediction.h.

double ThirdHitPrediction::nSigma
private

Definition at line 97 of file ThirdHitPrediction.h.

Global2DVector ThirdHitPrediction::p1
private

Definition at line 92 of file ThirdHitPrediction.h.

Global2DVector ThirdHitPrediction::p2
private

Definition at line 92 of file ThirdHitPrediction.h.

float ThirdHitPrediction::r0
private

Definition at line 90 of file ThirdHitPrediction.h.

float ThirdHitPrediction::rm
private

Definition at line 90 of file ThirdHitPrediction.h.

bool ThirdHitPrediction::theBarrel
private

Definition at line 80 of file ThirdHitPrediction.h.

Range ThirdHitPrediction::theDetRange
private

Definition at line 81 of file ThirdHitPrediction.h.

bool ThirdHitPrediction::theForward
private

Definition at line 80 of file ThirdHitPrediction.h.

const DetLayer* ThirdHitPrediction::theLayer
private

Definition at line 85 of file ThirdHitPrediction.h.

PixelRecoLineRZ ThirdHitPrediction::theLine
private

Definition at line 83 of file ThirdHitPrediction.h.

Margin ThirdHitPrediction::theTolerance
private

Definition at line 82 of file ThirdHitPrediction.h.

const TransientTrackingRecHitBuilder* ThirdHitPrediction::theTTRecHitBuilder
private

Definition at line 87 of file ThirdHitPrediction.h.