CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TkRadialStripTopology.cc
Go to the documentation of this file.
3 
4 #include <iostream>
5 #include <cmath>
6 #include <algorithm>
7 #include <cassert>
8 
9 #include <vdt/vdtMath.h>
10 
11 #ifdef MATH_STS
12 #include<iostream>
13 #endif
14 namespace {
15 
16 #ifdef MATH_STS
17  struct Stat {
18  Stat(const char * in) : name(in){};
19  ~Stat() {
20  std::cout << name << ": atan0 calls tot/large/over1: " << natan << "/" << nlarge <<"/" << over1 << std::endl;
21  }
22 
23  void add(float t) {
24  auto at = std::abs(t);
25  ++natan;
26  if (at>0.40f) ++nlarge;
27  if (at>1.0) ++over1;
28  }
29  const char * name;
30  long long natan=0;
31  long long nlarge=0;
32  long long over1=0;
33  };
34 
35  Stat statM("mpos");
36  Stat statS("span");
37 #endif
38 
39 
40  // valid for |x| < 0.15 (better then 10^-9
41  inline double tan15(double x) {
42  return x * (1 + (x*x) * (0.33331906795501708984375 + (x*x) * 0.135160386562347412109375));
43  }
44 
45  // valid for z < pi/8
46  // x * (1 + x*x * (-0.33322894573211669921875 + x*x * (0.1967026889324188232421875 + x*x * (-0.11053790152072906494140625)))) // .1e-7 by Sollya
47  inline
48  float atan0(float t) {
49  auto z=t;
50  // if( t > 0.4142135623730950f ) // * tan pi/8
51  // z = (t-1.0f)/(t+1.0f);
52  float z2 = z * z;
53  float ret=
54  ((( 8.05374449538e-2f * z2
55  - 1.38776856032E-1f) * z2
56  + 1.99777106478E-1f) * z2
57  - 3.33329491539E-1f) * z2 * z
58  + z;
59  // if( t > 0.4142135623730950f ) ret +=0.7853981633974483096f;
60  return ret;
61  }
62 
63  inline
64  float atanClip(float t) {
65  constexpr float tanPi8 = 0.4142135623730950;
66  constexpr float pio8 = 3.141592653589793238/8;
67  float at = std::abs(t);
68  return std::copysign( (at< tanPi8 ) ? atan0(at) : pio8, t );
69  }
70 
71 }
72 
73 TkRadialStripTopology::TkRadialStripTopology(int ns, float aw, float dh, float r, int yAx, float yMid) :
74  theNumberOfStrips(ns), theAngularWidth(aw), theAWidthInverse(1.f/aw),theTanAW(std::tan(aw)),
75  theDetHeight(dh), theCentreToIntersection(r),
76  theYAxisOrientation(yAx), yCentre( yMid),
77  theRadialSigma(std::pow(dh, 2.f) * (1.f/12.f)) {
78  // Angular offset of extreme edge of detector, so that angle is
79  // zero for a strip lying along local y axis = long symmetry axis of plane of strips
80  thePhiOfOneEdge = -(0.5*theNumberOfStrips) * theAngularWidth; // always negative!
82  assert(std::abs(thePhiOfOneEdge)<0.15); //
83 
84  LogTrace("TkRadialStripTopology") << "TkRadialStripTopology: constructed with"
85  << " strips = " << ns
86  << " width = " << aw << " rad "
87  << " det_height = " << dh
88  << " ctoi = " << r
89  << " phi_edge = " << thePhiOfOneEdge << " rad "
90  << " y_ax_ori = " << theYAxisOrientation
91  << " y_det_centre = " << yCentre
92  << "\n";
93 }
94 
95 int TkRadialStripTopology::channel(const LocalPoint& lp) const { return std::min( int( strip(lp) ), theNumberOfStrips-1 ) ;}
96 
97 int TkRadialStripTopology::nearestStrip(const LocalPoint & lp) const { return std::min( nstrips(), static_cast<int>( std::max(float(0), strip(lp)) ) + 1);}
98 
100 
102  return detHeight() * std::sqrt(1.f + std::pow( lp.x()/yDistanceToIntersection(lp.y()), 2.f) );
103 }
104 
105 float TkRadialStripTopology::xOfStrip(int strip, float y) const {
106  return
107  yAxisOrientation() * yDistanceToIntersection( y ) * std::tan( stripAngle(static_cast<float>(strip) - 0.5f ) );
108 }
109 
110 float TkRadialStripTopology::strip(const LocalPoint& lp) const {
111  // phi is measured from y axis --> sign of angle is sign of x * yAxisOrientation --> use atan2(x,y), not atan2(y,x)
112  const float phi = atanClip(lp.x()/yDistanceToIntersection(lp.y()));
113  const float aStrip = ( phi - phiOfOneEdge() )*theAWidthInverse;
114  return std::max(float(0), std::min( (float)nstrips(), aStrip ));
115 }
116 
117 float TkRadialStripTopology::coveredStrips(const LocalPoint& lp1, const LocalPoint& lp2) const {
118  // http://en.wikipedia.org/wiki/List_of_trigonometric_identities#Angle_sum_and_difference_identities
119  // atan(a)-atan(b) = atan( (a-b)/(1+a*b) )
120  // avoid divisions
121  // float t1 = lp1.x()/yDistanceToIntersection( lp1.y() );
122  // float t2 = lp2.x()/yDistanceToIntersection( lp2.y() );
123  // float t = (t1-t2)/(1.+t1*t2);
124  auto y1 = yDistanceToIntersection( lp1.y() );
125  auto y2 = yDistanceToIntersection( lp2.y() );
126  auto x1 = lp1.x();
127  auto x2 = lp2.x();
128 
129  auto t = (y2*x1 -y1*x2)/(y1*y2 + x1*x2);
130 
131 
132 #ifdef MATH_STS
133  statS.add(t);
134 #endif
135 // std::cout << "atans " << atanClip(t)
136 // <<" "<< std::atan2(lp1.x(),yDistanceToIntersection(lp1.y()) )
137 // -std::atan2(lp2.x(),yDistanceToIntersection(lp2.y()) ) << std::endl;
138  // clip???
139  return atanClip(t)*theAWidthInverse;
140  // return (measurementPosition(lp1)-measurementPosition(lp2)).x();
141 }
142 
144  return LocalPoint( yAxisOrientation() * originToIntersection() * std::tan( stripAngle(strip) ), 0 );
145 }
146 
148  const float // y = (L/cos(phi))*mp.y()*cos(phi)
149  y( mp.y()*detHeight() + yCentreOfStripPlane() ),
151  return LocalPoint( x, y );
152 }
153 
155  // phi is [pi/2 - conventional local phi], use atan2(x,y) rather than atan2(y,x)
156  // clip ( at pi/8 or detedge+tollerance?)
157  float t = lp.x()/yDistanceToIntersection(lp.y());
158 #ifdef MATH_STS
159  statM.add(t);
160 #endif
161  const float phi = atanClip(t);
163  ( lp.y() - yCentreOfStripPlane() ) / detHeight() );
164 }
165 
166 
167 LocalError TkRadialStripTopology::localError(float strip, float stripErr2) const {
168  double phi = stripAngle(strip);
169 
170  const double
171  t1(tan15(phi)), // std::tan(phif)), // (vdt::fast_tanf(phif)),
172  t2(t1*t1),
173  // s1(std::sin(phi)), c1(std::cos(phi)),
174  // cs(s1*c1), s2(s1*s1), c2(1-s2), // rotation matrix
175 
176  tt( stripErr2 * std::pow( centreToIntersection()*angularWidth() ,2.f) ), // tangential sigma^2 *c2
177  rr( theRadialSigma), // radial sigma^2( uniform prob density along strip) *c2
178 
179  xx( tt + t2*rr ),
180  yy( t2*tt + rr ),
181  xy( t1*( rr - tt ) );
182 
183  return LocalError( xx, xy, yy );
184 }
185 
187  const double
188  phi(stripAngle(mp.x())), s1(std::sin(phi)), c1(std::cos(phi)),
189  cs(s1*c1), s2(s1*s1), c2(1-s2), // rotation matrix
190 
191  T( angularWidth() * ( centreToIntersection() + yAxisOrientation()*mp.y()*detHeight()) / c1 ), // tangential measurement unit (local pitch)
192  R( detHeight()/ c1 ), // radial measurement unit (strip length)
193  tt( me.uu() * T*T ), // tangential sigma^2
194  rr( me.vv() * R*R ), // radial sigma^2
195  tr( me.uv() * T*R ),
196 
197  xx( c2*tt + 2*cs*tr + s2*rr ),
198  yy( s2*tt - 2*cs*tr + c2*rr ),
199  xy( cs*( rr - tt ) + tr*( c2 - s2 ) );
200 
201  return LocalError( xx, xy, yy );
202 }
203 
205  const double
206  yHitToInter(yDistanceToIntersection(p.y())),
207  t(yAxisOrientation() * p.x() / yHitToInter), // tan(strip angle)
208  cs(t/(1+t*t)), s2(t*cs), c2(1-s2), // rotation matrix
209 
210  T2( 1./(std::pow(angularWidth(),2.f) * ( std::pow(p.x(),2.f) + std::pow(yHitToInter,2)) )), // 1./tangential measurement unit (local pitch) ^2
211  R2( c2/std::pow(detHeight(),2.f) ), // 1./ radial measurement unit (strip length) ^2
212 
213  uu( ( c2*e.xx() - 2*cs*e.xy() + s2*e.yy() ) * T2 ),
214  vv( ( s2*e.xx() + 2*cs*e.xy() + c2*e.yy() ) * R2 ),
215  uv( ( cs*( e.xx() - e.yy() ) + e.xy()*( c2 - s2 ) ) * std::sqrt (T2*R2) );
216 
217  return MeasurementError(uu, uv, vv);
218 }
219 
220 
221  // The local pitch is the local x width of the strip at the local (x,y)
223  // this should be ~ y*(tan(phi+aw)-tan(phi)) = -x + y*(tan(aw)+tan(phi))/(1.f-tan(aw)*tan(phi)) tan(phi)=x/y
224  float y = yDistanceToIntersection( lp.y() );
225  float x = std::abs(lp.x());
226  return y*(y*theTanAW+x)/(y-theTanAW*x)-x;
227 }
228 
229 /* old version
230 float TkRadialStripTopology::localPitch(const LocalPoint& lp) const {
231  // this should be ~ y*(tan(phi+aw)-tan(phi)) = -tan(phi) + (tan(aw)+tan(phi))/(1.f-tan(aw)*tan(phi))
232  const int istrip = std::min(nstrips(), static_cast<int>(strip(lp)) + 1); // which strip number
233  float fangle = stripAngle(static_cast<float>(istrip) - 0.5); // angle of strip centre
234  float p =
235  yDistanceToIntersection( lp.y() ) * std::sin(angularWidth()) /
236  std::pow( std::cos(fangle-0.5f*angularWidth()), 2.f);
237 
238  float theTanAW = std::tan(theAngularWidth);
239  float y = yDistanceToIntersection( lp.y() );
240  float x = std::abs(lp.x());
241  float myP = y*(y*theTanAW+x)/(y-theTanAW*x)-x; // (y*theTanAW+x)/(1.f-theTanAW*x/y)-x;
242  std::cout << "localPitch " << p << " " << myP << std::endl;
243 
244  return p;
245 
246 }
247 */
float stripAngle(float strip) const
float originToIntersection() const
float centreToIntersection() const
tuple t
Definition: tree.py:139
float xx() const
Definition: LocalError.h:24
float strip(const LocalPoint &) const
float vv() const
auto_ptr< ClusterSequence > cs
float localStripLength(const LocalPoint &) const
T y() const
Definition: PV2DBase.h:46
TkRadialStripTopology(int ns, float aw, float dh, float r, int yAx=1, float yMid=0.)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
assert(m_qm.get())
float yDistanceToIntersection(float y) const
T y() const
Definition: PV3DBase.h:63
void add(const std::vector< const T * > &source, std::vector< const T * > &dest)
#define constexpr
float float float z
tuple s2
Definition: indexGen.py:106
int channel(const LocalPoint &) const
T x() const
Cartesian x coordinate.
tuple c2
Definition: counter.py:145
float xy() const
Definition: LocalError.h:25
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
float yy() const
Definition: LocalError.h:26
T sqrt(T t)
Definition: SSEVec.h:48
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
float uu() const
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
MeasurementPoint measurementPosition(const LocalPoint &) const
float xOfStrip(int strip, float y) const
T min(T a, T b)
Definition: MathUtil.h:58
int nearestStrip(const LocalPoint &) const
#define LogTrace(id)
float localPitch(const LocalPoint &) const
LocalError localError(float strip, float stripErr2) const
LocalPoint localPosition(float strip) const
MeasurementError measurementError(const LocalPoint &, const LocalError &) const
float yCentreOfStripPlane() const
Local3DPoint LocalPoint
Definition: LocalPoint.h:11
tuple cout
Definition: gather_cfg.py:121
T x() const
Definition: PV2DBase.h:45
long double T
T x() const
Definition: PV3DBase.h:62
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
float coveredStrips(const LocalPoint &lp1, const LocalPoint &lp2) const
list at
Definition: asciidump.py:428
tuple dh
Definition: cuy.py:353
float uv() const