BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcxHel.cxx
Go to the documentation of this file.
1// -------------------------------------------------------------------------
2// File and Version Information:
3// $Id: MdcxHel.cxx,v 1.7 2011/12/08 06:52:29 zhangy Exp $
4//
5// Description:
6// Class Implementation for |MdcxHel|
7//
8// Environment:
9// Software developed for the BaBar Detector at the SLAC B-Factory.
10//
11// Author List:
12// S. Wagner
13//
14// Copyright Information:
15// Copyright (C) 1996 BEPCII
16//
17// History:
18// Migration for BESIII MDC
19//
20//------------------------------------------------------------------------
21#include "MdcxReco/MdcxHel.h"
22#include "MdcGeom/BesAngle.h"
23#include "MdcGeom/Constants.h"
24#include "MdcxReco/MdcxHit.h"
25#include "MdcxReco/MdcxParameters.h"
26#include <math.h>
27using std::cout;
28using std::endl;
29
30// constructors
31
33
34MdcxHel::MdcxHel( double D0, double Phi0, double Omega, double Z0, double Tanl, double T0,
35 int Code, int Mode, double X, double Y )
36 : d0( D0 )
37 , phi0( Phi0 )
38 , omega( Omega )
39 , z0( Z0 )
40 , tanl( Tanl )
41 , t0( T0 )
42 , xref( X )
43 , yref( Y )
44 , code( Code )
45 , mode( Mode )
46 , omin( 0.000005 ) {
47
48 ominfl = ( fabs( omega ) < omin ) ? 0 : 1;
49 double m_2pi = 2.0 * M_PI;
50 if ( phi0 > M_PI ) phi0 -= m_2pi;
51 if ( phi0 < -M_PI ) phi0 += m_2pi;
52 cphi0 = cos( phi0 );
53 sphi0 = sin( phi0 );
54 x0 = X0();
55 y0 = Y0();
56 xc = Xc();
57 yc = Yc();
59 turnflag = 1; /// FIXME
60 // std::cout << "MdcxHel::MdcxHel() -> (x0, y0) (" << x0 << ", " << y0 << ")" << std::endl;
61} // endof MdcxHel
62
64
65// accessors
66
67double MdcxHel::Xc() const {
68 if ( ominfl )
69 {
70 // return (X0() - sphi0/omega);
71 return ( x0 - sphi0 / omega );
72 }
73 else { return 999999999.9; } //(ominfl)
74} // endof Xc
75
76double MdcxHel::Yc() const {
77 if ( ominfl )
78 {
79 // return (Y0()+cphi0/omega);
80 return ( y0 + cphi0 / omega );
81 }
82 else { return 999999999.9; } //(ominfl)
83} // endof Yc
84
85double MdcxHel::X0() const { return ( xref - sphi0 * d0 ); } // endof X0
86
87double MdcxHel::Y0() const { return ( yref + cphi0 * d0 ); } // endof Y0
88
89double MdcxHel::Xh( double l ) const {
90 if ( ominfl )
91 {
92 double phit = phi0 + omega * l;
93 return ( xc + sin( phit ) / omega );
94 }
95 else { return ( x0 + cphi0 * l - 0.5 * l * l * omega * sphi0 ); } // ominfl
96} // endof Xh
97
98double MdcxHel::Yh( double l ) const {
99 if ( ominfl )
100 {
101 double phit = phi0 + omega * l;
102 return ( yc - cos( phit ) / omega );
103 }
104 else { return ( y0 + sphi0 * l + 0.5 * l * l * omega * cphi0 ); } // ominfl
105} // endof Yh
106
107double MdcxHel::Zh( double l ) const { return ( z0 + tanl * l ); } // endof Zh
108
109double MdcxHel::Px( double l ) const {
110 if ( ominfl )
111 {
112 double phit = phi0 + omega * l;
113 return 0.003 * cos( phit ) / fabs( omega ); /// pt=0.003*r (0.003 -> q*B)
114 }
115 else { return 1000.0 * cphi0; } // ominfl
116} // endof Px
117
118double MdcxHel::Py( double l ) const {
119 if ( ominfl )
120 {
121 double phit = phi0 + omega * l;
122 return 0.003 * sin( phit ) / fabs( omega );
123 }
124 else { return 1000.0 * sphi0; } // ominfl
125} // endof Py
126
127double MdcxHel::Pz( double l ) const {
128 if ( ominfl ) { return 0.003 * tanl / fabs( omega ); }
129 else { return 1000.0 * tanl; } // ominfl
130} // endof Pz
131
132double MdcxHel::Ptot( double l ) const {
133 if ( ominfl ) { return 0.003 * sqrt( 1.0 + tanl * tanl ) / fabs( omega ); }
134 else { return 1000.0 * sqrt( 1.0 + tanl * tanl ); } // ominfl
135} // endof Ptot
136
137double MdcxHel::Lmax() const {
138 double lmax = MdcxParameters::maxTrkLength;
139 if ( ominfl )
140 {
141 double rmax = 1.0 / fabs( omega );
142 double dmax = fabs( d0 ) + 2.0 * rmax;
143 if ( dmax > MdcxParameters::maxMdcRadius ) lmax = M_PI * rmax; /// FIXME
144 }
145 return lmax;
146} // endof Lmax
147
148// controls
149// control fitting mode
150void MdcxHel::SetMode( int n ) { mode = n; }
151
152void MdcxHel::SetRef( double x, double y ) {
153 xref = x;
154 yref = y;
155}
156// control free variables
159 code = code + deltaq( qomega, Qomega ) * 100;
160 qomega = Qomega;
161}
163 nfree = nfree + deltaq( qphi0, Qphi0 );
164 code = code + deltaq( qphi0, Qphi0 ) * 10;
165 qphi0 = Qphi0;
166}
167void MdcxHel::SetD0( int Qd0 ) {
168 nfree = nfree + deltaq( qd0, Qd0 );
169 code = code + deltaq( qd0, Qd0 );
170 qd0 = Qd0;
171}
173 nfree = nfree + deltaq( qtanl, Qtanl );
174 code = code + deltaq( qtanl, Qtanl ) * 10000;
175 qtanl = Qtanl;
176}
177void MdcxHel::SetZ0( int Qz0 ) {
178 nfree = nfree + deltaq( qz0, Qz0 );
179 code = code + deltaq( qz0, Qz0 ) * 1000;
180 qz0 = Qz0;
181}
182void MdcxHel::SetT0( int Qt0 ) {
183 nfree = nfree + deltaq( qt0, Qt0 );
184 code = code + deltaq( qt0, Qt0 ) * 100000;
185 qt0 = Qt0;
186}
187
188// operators
190 copy( rhs );
191 return *this;
192}
193
194// decode free parameter code
195void MdcxHel::decode( const int code, int& i1, int& i2, int& i3, int& i4, int& i5, int& i6,
196 int& n ) { /// FIXME use bit code ?
197 int temp = code;
198 temp = temp / 1000000;
199 temp = code - 1000000 * temp;
200 i6 = temp / 100000;
201 temp = temp - 100000 * i6;
202 i5 = temp / 10000;
203 temp = temp - 10000 * i5;
204 i4 = temp / 1000;
205 temp = temp - 1000 * i4;
206 i3 = temp / 100;
207 temp = temp - 100 * i3;
208 i2 = temp / 10;
209 i1 = temp - 10 * i2;
210 n = 0;
211 if ( i6 == 1 ) n++;
212 else i6 = 0;
213 if ( i5 == 1 ) n++;
214 else i5 = 0;
215 if ( i4 == 1 ) n++;
216 else i4 = 0;
217 if ( i3 == 1 ) n++;
218 else i3 = 0;
219 if ( i2 == 1 ) n++;
220 else i2 = 0;
221 if ( i1 == 1 ) n++;
222 else i1 = 0;
223} // endof decode
224
225// copy |MdcxHel| to |MdcxHel|
226void MdcxHel::copy( const MdcxHel& rhs ) {
227 // FIXME
228 omega = rhs.Omega();
229 phi0 = rhs.Phi0();
230 d0 = rhs.D0();
231 t0 = rhs.T0();
232 tanl = rhs.Tanl();
233 z0 = rhs.Z0();
234 cphi0 = rhs.CosPhi0();
235 sphi0 = rhs.SinPhi0();
236 x0 = rhs.X0();
237 y0 = rhs.Y0();
238 xc = rhs.Xc();
239 yc = rhs.Yc();
240 xref = rhs.Xref();
241 yref = rhs.Yref();
242 qomega = rhs.Qomega();
243 qphi0 = rhs.Qphi0();
244 qd0 = rhs.Qd0();
245 qt0 = rhs.Qt0();
246 qtanl = rhs.Qtanl();
247 qz0 = rhs.Qz0();
248 mode = rhs.Mode();
249 nfree = rhs.Nfree();
250 code = rhs.Code();
251 ominfl = rhs.Ominfl();
252 omin = rhs.Omin();
253 turnflag = rhs.GetTurnFlag();
254} // endof copy
255
256double MdcxHel::Doca( const MdcxHit& h ) {
257 // std::cout<< __FILE__ << " " << __LINE__ << " hit("<<h.Layer()<<","<<h.WireNo()<<")";
258 return Doca( h.wx(), h.wy(), h.wz(), h.x(), h.y() );
259}
260
261double MdcxHel::Doca( double wx, double wy, double wz, double xi, double yi, double zi ) {
262 double m_2pi = 2.0 * M_PI;
263 // describe wire
264 // cout << " In Doca, xi = " << xi << " yi = " << yi << " zi = " << zi <<endl;
265 Hep3Vector ivec( xi, yi, zi );
266 wvec = Hep3Vector( wx, wy, wz );
267 // cout << " In Doca, wx = " << wx << " wy = " << wy << " wz = " << wz <<endl;
268 // calculate len to doca
269 double zd, xd = xi, yd = yi;
270 // cout << " In Doca, start xd = " << xd << " yd = " << yd << endl;
271 double lnew, t1, t2, dphi, dlen = 1000.0;
272 len = 0.0;
273 int itry = 2;
274 // int segflg=0; if ((code==111)&&(z0==0.0)&&(tanl==0.0))segflg=1;
275 // int superseg=0; if ((code==11111)&&(xref!=0.0)&&(yref!=0.0))superseg=1;
276 double circut, circum = 10000.;
277 if ( ominfl ) circum = m_2pi / fabs( omega );
278 circut = 0.50 * circum;
279 while ( itry )
280 {
281 if ( ominfl )
282 {
283 /// calc the phi of point(i)
284 t1 = -xc + xd;
285 t2 = yc - yd;
286 phi = atan2( t1, t2 );
287 if ( omega < 0.0 ) phi += M_PI;
288 if ( phi > M_PI ) phi -= m_2pi;
289 dphi = phi - phi0;
290 if ( omega < 0.0 )
291 {
292 if ( dphi > 0.0 ) dphi -= m_2pi;
293 if ( dphi < -m_2pi ) dphi += m_2pi;
294 }
295 else
296 {
297 if ( dphi < 0.0 ) dphi += m_2pi;
298 if ( dphi > m_2pi ) dphi -= m_2pi;
299 }
300 lnew = dphi / omega;
301 // if ((lnew>circut)&&(segflg))lnew-=circum;
302 // if ((lnew>circut)&&(superseg))lnew-=circum;
303 if ( ( lnew > circut ) && ( turnflag ) ) lnew -= circum; // FIXME attention
304
305 zh = Zh( lnew );
306 xd = xi + ( zh - zi ) * wx / wz;
307 yd = yi + ( zh - zi ) * wy / wz;
308 zd = zh;
309 // cout << " In Doca, xd = " << xd << " yd = " << yd << " zh = " << zh;
310 // cout << " lnew = " << lnew << endl;
311 dlen = fabs( lnew - len );
312 len = lnew;
313 // if (segflg)break;
314 // std::cout<< __FILE__ << __LINE__<<" Doca() dlen " << dlen<< " zh "<<zh<<" >?"
315 //<<MdcxParameters::maxMdcZLen<<std::endl;
316 if ( fabs( zh ) > MdcxParameters::maxMdcZLen ) break; // FIXME attention
317 if ( ( 0.0 == wx ) && ( 0.0 == wy ) ) break;
318 if ( dlen < 0.000001 ) break;
319 itry--;
320 }
321 else
322 {
323 len = ( xi - xref ) * cphi0 + ( yi - yref ) * sphi0;
324 zh = z0 + tanl * len;
325 phi = phi0;
326 break;
327 }
328 }
329 // Hep3Vector Dvec(xd,yd,zd);
330 xh = Xh( len );
331 yh = Yh( len );
332 Hep3Vector hvec( xh, yh, zh );
333 // cout << " In Doca, xh = " << xh << " yh = " << yh << " zh = " << zh << " len=" << len <<
334 // " om " << omega << endl;
335 double lamb = atan( tanl );
336 cosl = cos( lamb );
337 sinl = sin( lamb );
338 tx = cosl * cos( phi );
339 ty = cosl * sin( phi );
340 tz = sinl;
341 tvec = Hep3Vector( tx, ty, tz );
342 Hep3Vector vvec = wvec.cross( tvec );
343 vhat = vvec.unit();
344 vx = vhat.x();
345 vy = vhat.y();
346 vz = vhat.z();
347 // cout << " In Doca, vx = " << vx << " vy = " << vy << " vz = " << vz << endl;
348 dvec = ivec - hvec;
349 double doca = dvec * vhat;
350 // cout << " doca = " << doca << endl;
351 double f1 = dvec * tvec;
352 double f2 = wvec * tvec;
353 double f3 = dvec * wvec;
354 f0 = ( f1 - f2 * f3 ) / ( 1.0 - f2 * f2 );
355 samb = ( doca > 0.0 ) ? -1 : +1;
356 double wirephi = atan2( yd, xd );
357 eang = BesAngle( phi - wirephi );
358 wamb = ( fabs( eang ) < Constants::pi / 2 ) ? samb : -samb;
359 // std::cout<< __FILE__ << __LINE__<<" Doca() dlen " << dlen<< " zh "<<zh<<" >?"
360 //<<MdcxParameters::maxMdcZLen<<std::endl;
361 if ( fabs( zh ) > MdcxParameters::maxMdcZLen ) doca = 1000.0; /// FIXME
362 // if(doca == 1000.0) cout << " In Doca, zh = " << zh << " len=" << len << " om " << omega
363 // <<" "<< ominfl<< " z0 " << z0 << "tanl " << tanl <<endl;
364 // cout << " doca = " << doca << endl;
365 return doca;
366} // endof Doca
367
368std::vector<float> MdcxHel::derivatives( const MdcxHit& hit ) {
369 double doca = Doca( hit );
370 std::vector<float> temp( nfree + 1 );
371 temp[0] = doca;
372 double fac = 1.0;
373 if ( ( mode == 0 ) && ( doca < 0.0 ) ) fac = -fac;
374 if ( mode == 0 ) temp[0] = fabs( temp[0] );
375
376 int bump = 0;
377 if ( qd0 ) temp[++bump] = ( -vx * sphi0 + vy * cphi0 ) * fac;
378 if ( qphi0 )
379 {
380 // double dddp0=-(yh-y0)*vx+(xh-x0)*vy;
381 double dddp0 = -( yh - y0 + f0 * ty ) * vx + ( xh - x0 + f0 * tx ) * vy;
382 dddp0 *= ( 1.0 + d0 * omega );
383 temp[++bump] = dddp0 * fac;
384 }
385 if ( qomega )
386 {
387 double dddom;
388 if ( ominfl )
389 {
390 dddom = ( ( len * cos( phi ) - xh + x0 ) * vx + ( len * sin( phi ) - yh + y0 ) * vy ) /
391 omega;
392 dddom += f0 * len * cosl * ( -sin( phi ) * vx + cos( phi ) * vy );
393 }
394 else { dddom = 0.5 * len * len * ( -vx * sphi0 + vy * cphi0 ); }
395 temp[++bump] = dddom * fac;
396 }
397 if ( qz0 ) temp[++bump] = vz * fac;
398 if ( qtanl ) temp[++bump] = ( vz * len ) * fac;
399 if ( qt0 ) temp[++bump] = -hit.v();
400 return temp;
401} // endof derivatives
402
403void MdcxHel::print() const {
404 cout << "MdcxHel(";
405 cout << d0 << ",";
406 cout << phi0 << ",";
407 cout << omega << ",";
408 cout << z0 << ",";
409 cout << tanl << ")" << endl;
410 cout << " t0 = " << t0;
411 cout << " nfree = " << nfree;
412 cout << " (x0,y0) " << x0 << "," << y0;
413 cout << " (xc,yc) " << xc << "," << yc;
414 cout << " (xref,yref) " << xref << "," << yref;
415 cout << " code = " << code;
416 cout << " mode = " << mode;
417 cout << " ominfl = " << ominfl;
418 cout << " " << endl;
419} // endof print
420
422 double m_2pi = 2.0 * M_PI;
423 if ( ominfl )
424 {
425 if ( ( fabs( d0 ) + 2.0 / fabs( omega ) ) > 80.0 ) return;
426 double lturn = m_2pi / fabs( omega );
427 double zturn = Zh( lturn );
428 // cout << "z0 " << z0 << " zturn " << zturn << endl;
429 if ( fabs( zturn ) < fabs( z0 ) )
430 {
431 z0 = zturn;
432 tanl = -tanl;
433 omega = -omega;
434 d0 = -d0;
435 phi0 = phi0 - M_PI;
436 if ( phi0 < -M_PI ) phi0 += m_2pi;
437 cphi0 = cos( phi0 );
438 sphi0 = sin( phi0 );
439 x0 = X0();
440 y0 = Y0();
441 }
442 }
443} // endof flip
const Int_t n
TFile * f1
#define dmax(a, b)
#define M_PI
Definition TConstant.h:4
double X0() const
Definition MdcxHel.cxx:85
void SetZ0(int n)
Definition MdcxHel.cxx:177
double Lmax() const
Definition MdcxHel.cxx:137
double Yc() const
Definition MdcxHel.cxx:76
void SetRef(double x, double y)
Definition MdcxHel.cxx:152
double Xc() const
Definition MdcxHel.cxx:67
void SetD0(int n)
Definition MdcxHel.cxx:167
double Py(double l=0.0) const
Definition MdcxHel.cxx:118
void SetOmega(int n)
Definition MdcxHel.cxx:157
double Px(double l=0.0) const
Definition MdcxHel.cxx:109
double Ptot(double l=0.0) const
Definition MdcxHel.cxx:132
void SetTanl(int n)
Definition MdcxHel.cxx:172
void SetPhi0(int n)
Definition MdcxHel.cxx:162
double Pz(double l=0.0) const
Definition MdcxHel.cxx:127
void decode(const int i, int &i1, int &i2, int &i3, int &i4, int &i5, int &i6, int &n)
Definition MdcxHel.cxx:195
double Doca(double WX, double WY, double WZ, double X, double Y, double Z=0.0)
Definition MdcxHel.cxx:261
void print() const
Definition MdcxHel.cxx:403
void SetMode(int n)
Definition MdcxHel.cxx:150
double Y0() const
Definition MdcxHel.cxx:87
void flip()
Definition MdcxHel.cxx:421
double Yh(double l) const
Definition MdcxHel.cxx:98
double Zh(double l) const
Definition MdcxHel.cxx:107
void copy(const MdcxHel &hel)
Definition MdcxHel.cxx:226
double Xh(double l) const
Definition MdcxHel.cxx:89
void SetT0(int n)
Definition MdcxHel.cxx:182
MdcxHel()
Definition MdcxHel.cxx:32
virtual ~MdcxHel()
Definition MdcxHel.cxx:63
std::vector< float > derivatives(const MdcxHit &h)
Definition MdcxHel.cxx:368
MdcxHel & operator=(const MdcxHel &)
Definition MdcxHel.cxx:189