BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
Dedx_Helix.cxx
Go to the documentation of this file.
1//
2// $Id: Dedx_Helix.cxx,v 1.3 2011/02/23 00:36:21 maqm Exp $
3//
4// $Log: Dedx_Helix.cxx,v $
5// Revision 1.3 2011/02/23 00:36:21 maqm
6// slc5-x64-gcc43
7//
8// Revision 1.2 2011/02/17 11:09:39 maqm
9// x64-slc5-gcc43
10//
11// Revision 1.1 2008/06/30 01:43:15 xcao
12// change Helix into Dedx_Helix
13//
14// Revision 1.2 2008/04/18 03:36:05 max
15// *** empty log message ***
16//
17// Revision 1.1.1.1 2006/01/06 08:25:05 wangdy
18// first import of this package
19//
20// Revision 1.2 2005/04/20 13:56:14 wangdy
21// codes updated for Bes detector ,see recent changeLog
22//
23// Revision 1.1.1.1 2005/03/17 13:31:56 wangdy
24// first import this package
25//
26// Revision 1.19 2002/01/03 11:05:06 katayama
27// Point3D and other header files are cleaned
28//
29// Revision 1.18 2001/05/07 21:06:37 yiwasaki
30// <float.h> included for linux
31//
32// Revision 1.17 2001/04/25 02:55:39 yiwasaki
33// cache m_ac[5] added
34//
35// Revision 1.16 2001/04/18 12:09:19 katayama
36// optimized
37//
38// Revision 1.15 2000/01/26 10:22:53 yiwasaki
39// copy operator bug fix(reported by M.Yokoyama)
40//
41// Revision 1.14 1999/11/23 10:29:22 yiwasaki
42// static cosnt double Helix::ConstantAlpha added
43//
44// Revision 1.13 1999/06/15 01:49:41 yiwasaki
45// constructor bug fix
46//
47// Revision 1.12 1999/06/15 01:44:53 yiwasaki
48// minor change
49//
50// Revision 1.11 1999/06/06 07:34:27 yiwasaki
51// i/o functions to set/get mag. field added
52//
53// Revision 1.10 1999/05/11 23:26:59 yiwasaki
54// option to ignore error calculations added
55//
56// Revision 1.9 1998/11/06 08:51:19 katayama
57// protect 0div
58//
59// Revision 1.8 1998/07/08 04:35:50 jtanaka
60// add some members to the constructor by Iwasaki-san and Ozaki-san
61//
62// Revision 1.7 1998/06/18 10:27:20 katayama
63// Added several new functions from Tanaka san
64//
65// Revision 1.6 1998/02/24 01:07:59 yiwasaki
66// minor fix
67//
68// Revision 1.5 1998/02/24 00:31:52 yiwasaki
69// bug fix
70//
71// Revision 1.4 1998/02/20 02:22:23 yiwasaki
72// for new helix class
73//
74// Revision 1.3 1998/01/22 08:38:07 hitoshi
75// Fixed a bug in fid cal. (found at Osaka).
76//
77// Revision 1.2 1997/09/19 00:35:52 katayama
78// Added Id and Log
79//
80//
81//
82// Class Helix
83//
84// Author Date comments
85// Y.Ohnishi 03/01/1997 original version
86// Y.Ohnishi 06/03/1997 updated
87// Y.Iwasaki 17/02/1998 BFILED removed, func. name changed, func. added
88// J.Tanaka 06/12/1998 add some utilities.
89// Y.Iwasaki 07/07/1998 cache added to speed up
90//
91
92#include "DedxCorrecSvc/Dedx_Helix.h"
93#include "CLHEP/Matrix/Matrix.h"
94#include "GaudiKernel/Bootstrap.h"
95#include "GaudiKernel/IDataProviderSvc.h"
96#include "GaudiKernel/IInterface.h"
97#include "GaudiKernel/IMessageSvc.h"
98#include "GaudiKernel/IPartPropSvc.h"
99#include "GaudiKernel/ISvcLocator.h"
100#include "GaudiKernel/Kernel.h"
101#include "GaudiKernel/MsgStream.h"
102#include "GaudiKernel/Service.h"
103#include "GaudiKernel/SmartDataPtr.h"
104#include "GaudiKernel/StatusCode.h"
105#include <float.h>
106#include <iostream>
107#include <math.h>
108
109#include "GaudiKernel/SmartDataPtr.h"
110
111const double M_PI2 = 2. * M_PI;
112
113const double M_PI4 = 4. * M_PI;
114
115const double M_PI8 = 8. * M_PI;
116
117const double Dedx_Helix::ConstantAlpha = -333.564095;
118
119Dedx_Helix::Dedx_Helix( const HepPoint3D& pivot, const HepVector& a,
120 const HepSymMatrix& Ea )
121 : // m_bField(10.0),
122 // m_alpha(333.564095),
123 m_pivot( pivot )
124 , m_a( a )
125 , m_matrixValid( true )
126 , m_Ea( Ea ) {
127 // ISvcLocator * SvcLocator = Gaudi::SvcLocator();
128 StatusCode scmgn = Gaudi::svcLocator()->service( "MagneticFieldSvc", m_pmgnIMF );
129 if ( scmgn != StatusCode::SUCCESS )
130 {
131 // log << MSG::ERROR << "Unable to open Magnetic field service"<<endmsg;
132 std::cout << "Unable to open Magnetic field service" << std::endl;
133 }
134 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
135 m_alpha = 10000. / 2.99792458 / m_bField;
136 // m_alpha = 222.376063;
137 updateCache();
138}
139
141 const HepVector& a )
142 : // m_bField(10.0),
143 // m_alpha(333.564095),
144 m_pivot( pivot )
145 , m_a( a )
146 , m_matrixValid( false )
147 , m_Ea( HepSymMatrix( 5, 0 ) ) {
148 StatusCode scmgn = Gaudi::svcLocator()->service( "MagneticFieldSvc", m_pmgnIMF );
149 if ( scmgn != StatusCode::SUCCESS )
150 {
151 // log << MSG::ERROR << "Unable to open Magnetic field service"<<endmsg;
152 std::cout << "Unable to open Magnetic field service" << std::endl;
153 }
154 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
155 m_alpha = 10000. / 2.99792458 / m_bField;
156 // cout<<"m_bField is = "<<m_bField<<" m_alpha is = "<<m_alpha<<endl;
157 // m_alpha = 222.376063;
158 updateCache();
159}
160
161Dedx_Helix::Dedx_Helix( const HepPoint3D& position, const Hep3Vector& momentum,
162 double charge )
163 : // m_bField(10.0),
164 // m_alpha(333.564095),
165 m_pivot( position )
166 , m_a( HepVector( 5, 0 ) )
167 , m_matrixValid( false )
168 , m_Ea( HepSymMatrix( 5, 0 ) ) {
169 StatusCode scmgn = Gaudi::svcLocator()->service( "MagneticFieldSvc", m_pmgnIMF );
170 if ( scmgn != StatusCode::SUCCESS )
171 {
172 // log << MSG::ERROR << "Unable to open Magnetic field service"<<endmsg;
173 std::cout << "Unable to open Magnetic field service" << std::endl;
174 }
175 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
176 m_alpha = 10000. / 2.99792458 / m_bField;
177
178 m_a[0] = 0.;
179 m_a[1] = fmod( atan2( -momentum.x(), momentum.y() ) + M_PI4, M_PI2 );
180 m_a[3] = 0.;
181 double perp( momentum.perp() );
182 if ( perp != 0.0 )
183 {
184 m_a[2] = charge / perp;
185 m_a[4] = momentum.z() / perp;
186 }
187 else
188 {
189 m_a[2] = charge * ( DBL_MAX );
190 if ( momentum.z() >= 0 ) { m_a[4] = ( DBL_MAX ); }
191 else { m_a[4] = -( DBL_MAX ); }
192 }
193 // m_alpha = 222.376063;
194 updateCache();
195}
196
198
199HepPoint3D Dedx_Helix::x( double phi ) const {
200 //
201 // Calculate position (x,y,z) along helix.
202 //
203 // x = x0 + dr * cos(phi0) + (alpha / kappa) * (cos(phi0) - cos(phi0+phi))
204 // y = y0 + dr * sin(phi0) + (alpha / kappa) * (sin(phi0) - sin(phi0+phi))
205 // z = z0 + dz - (alpha / kappa) * tan(lambda) * phi
206 //
207 // m_ac[0] = m_ac[0] *(-1);
208 // cout<<"m_bField is = "<<m_bField<<" m_alpha is = "<<m_alpha<<endl;
209 // cout<<"m_pivot is = "<<m_pivot<<" m_ac is = ("<<m_ac[0]<<" , "<<m_ac[1]<<" ,
210 // "<<m_ac[2]<<" , "<<m_ac[3]<<" ,
211 // "<<m_ac[4]<<" )"<<endl;
212 // cout<<"m_cp is = "<<m_cp<<" "<<" m_sp is = "<<m_sp<<" m_r is = "<<m_r<<endl;
213 // cout<<" m_r + m_ac[0] = "<<m_ac[0] +m_r<<endl;
214 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp - cos( m_ac[1] + phi ) );
215 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp - sin( m_ac[1] + phi ) );
216 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
217
218 return HepPoint3D( x, y, z );
219}
220
221double* Dedx_Helix::x( double phi, double p[3] ) const {
222 //
223 // Calculate position (x,y,z) along helix.
224 //
225 // x = x0 + dr * cos(phi0) + (alpha / kappa) * (cos(phi0) - cos(phi0+phi))
226 // y = y0 + dr * sin(phi0) + (alpha / kappa) * (sin(phi0) - sin(phi0+phi))
227 // z = z0 + dz - (alpha / kappa) * tan(lambda) * phi
228 //
229
230 p[0] = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp - cos( m_ac[1] + phi ) );
231 p[1] = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp - sin( m_ac[1] + phi ) );
232 p[2] = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
233
234 return p;
235}
236
237HepPoint3D Dedx_Helix::x( double phi, HepSymMatrix& Ex ) const {
238 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp - cos( m_ac[1] + phi ) );
239 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp - sin( m_ac[1] + phi ) );
240 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
241
242 //
243 // Calculate position error matrix.
244 // Ex(phi) = (@x/@a)(Ea)(@x/@a)^T, phi is deflection angle to specify the
245 // point to be calcualted.
246 //
247 // HepMatrix dXDA(3, 5, 0);
248 // dXDA = delXDelA(phi);
249 // Ex.assign(dXDA * m_Ea * dXDA.T());
250
251 if ( m_matrixValid ) Ex = m_Ea.similarity( delXDelA( phi ) );
252 else Ex = m_Ea;
253
254 return HepPoint3D( x, y, z );
255}
256
257Hep3Vector Dedx_Helix::momentum( double phi ) const {
258 //
259 // Calculate momentum.
260 //
261 // Pt = | 1/kappa | (GeV/c)
262 //
263 // Px = -Pt * sin(phi0 + phi)
264 // Py = Pt * cos(phi0 + phi)
265 // Pz = Pt * tan(lambda)
266 //
267
268 double pt = fabs( m_pt );
269 double px = -pt * sin( m_ac[1] + phi );
270 double py = pt * cos( m_ac[1] + phi );
271 double pz = pt * m_ac[4];
272
273 return Hep3Vector( px, py, pz );
274}
275
276Hep3Vector Dedx_Helix::momentum( double phi, HepSymMatrix& Em ) const {
277 //
278 // Calculate momentum.
279 //
280 // Pt = | 1/kappa | (GeV/c)
281 //
282 // Px = -Pt * sin(phi0 + phi)
283 // Py = Pt * cos(phi0 + phi)
284 // Pz = Pt * tan(lambda)
285 //
286
287 double pt = fabs( m_pt );
288 double px = -pt * sin( m_ac[1] + phi );
289 double py = pt * cos( m_ac[1] + phi );
290 double pz = pt * m_ac[4];
291
292 if ( m_matrixValid ) Em = m_Ea.similarity( delMDelA( phi ) );
293 else Em = m_Ea;
294
295 return Hep3Vector( px, py, pz );
296}
297
298HepLorentzVector Dedx_Helix::momentum( double phi, double mass ) const {
299 //
300 // Calculate momentum.
301 //
302 // Pt = | 1/kappa | (GeV/c)
303 //
304 // Px = -Pt * sin(phi0 + phi)
305 // Py = Pt * cos(phi0 + phi)
306 // Pz = Pt * tan(lambda)
307 //
308 // E = sqrt( 1/kappa/kappa * (1+tan(lambda)*tan(lambda)) + mass*mass )
309
310 double pt = fabs( m_pt );
311 double px = -pt * sin( m_ac[1] + phi );
312 double py = pt * cos( m_ac[1] + phi );
313 double pz = pt * m_ac[4];
314 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) + mass * mass );
315
316 return HepLorentzVector( px, py, pz, E );
317}
318
319HepLorentzVector Dedx_Helix::momentum( double phi, double mass, HepSymMatrix& Em ) const {
320 //
321 // Calculate momentum.
322 //
323 // Pt = | 1/kappa | (GeV/c)
324 //
325 // Px = -Pt * sin(phi0 + phi)
326 // Py = Pt * cos(phi0 + phi)
327 // Pz = Pt * tan(lambda)
328 //
329 // E = sqrt( 1/kappa/kappa * (1+tan(lambda)*tan(lambda)) + mass*mass )
330
331 double pt = fabs( m_pt );
332 double px = -pt * sin( m_ac[1] + phi );
333 double py = pt * cos( m_ac[1] + phi );
334 double pz = pt * m_ac[4];
335 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) + mass * mass );
336
337 if ( m_matrixValid ) Em = m_Ea.similarity( del4MDelA( phi, mass ) );
338 else Em = m_Ea;
339
340 return HepLorentzVector( px, py, pz, E );
341}
342
343HepLorentzVector Dedx_Helix::momentum( double phi, double mass, HepPoint3D& x,
344 HepSymMatrix& Emx ) const {
345 //
346 // Calculate momentum.
347 //
348 // Pt = | 1/kappa | (GeV/c)
349 //
350 // Px = -Pt * sin(phi0 + phi)
351 // Py = Pt * cos(phi0 + phi)
352 // Pz = Pt * tan(lambda)
353 //
354 // E = sqrt( 1/kappa/kappa * (1+tan(lambda)*tan(lambda)) + mass*mass )
355
356 double pt = fabs( m_pt );
357 double px = -pt * sin( m_ac[1] + phi );
358 double py = pt * cos( m_ac[1] + phi );
359 double pz = pt * m_ac[4];
360 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) + mass * mass );
361
362 x.setX( m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp - cos( m_ac[1] + phi ) ) );
363 x.setY( m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp - sin( m_ac[1] + phi ) ) );
364 x.setZ( m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi );
365
366 if ( m_matrixValid ) Emx = m_Ea.similarity( del4MXDelA( phi, mass ) );
367 else Emx = m_Ea;
368
369 return HepLorentzVector( px, py, pz, E );
370}
371
372const HepPoint3D& Dedx_Helix::pivot( const HepPoint3D& newPivot ) {
373 const double& dr = m_ac[0];
374 const double& phi0 = m_ac[1];
375 const double& kappa = m_ac[2];
376 const double& dz = m_ac[3];
377 const double& tanl = m_ac[4];
378
379 double rdr = dr + m_r;
380 double phi = fmod( phi0 + M_PI4, M_PI2 );
381 double csf0 = cos( phi );
382 double snf0 = ( 1. - csf0 ) * ( 1. + csf0 );
383 snf0 = sqrt( ( snf0 > 0. ) ? snf0 : 0. );
384 if ( phi > M_PI ) snf0 = -snf0;
385
386 double xc = m_pivot.x() + rdr * csf0;
387 double yc = m_pivot.y() + rdr * snf0;
388 double csf, snf;
389 if ( m_r != 0.0 )
390 {
391 csf = ( xc - newPivot.x() ) / m_r;
392 snf = ( yc - newPivot.y() ) / m_r;
393 double anrm = sqrt( csf * csf + snf * snf );
394 if ( anrm != 0.0 )
395 {
396 csf /= anrm;
397 snf /= anrm;
398 phi = atan2( snf, csf );
399 }
400 else
401 {
402 csf = 1.0;
403 snf = 0.0;
404 phi = 0.0;
405 }
406 }
407 else
408 {
409 csf = 1.0;
410 snf = 0.0;
411 phi = 0.0;
412 }
413 double phid = fmod( phi - phi0 + M_PI8, M_PI2 );
414 if ( phid > M_PI ) phid = phid - M_PI2;
415 double drp = ( m_pivot.x() + dr * csf0 + m_r * ( csf0 - csf ) - newPivot.x() ) * csf +
416 ( m_pivot.y() + dr * snf0 + m_r * ( snf0 - snf ) - newPivot.y() ) * snf;
417 double dzp = m_pivot.z() + dz - m_r * tanl * phid - newPivot.z();
418
419 HepVector ap( 5 );
420 ap[0] = drp;
421 ap[1] = fmod( phi + M_PI4, M_PI2 );
422 ap[2] = kappa;
423 ap[3] = dzp;
424 ap[4] = tanl;
425
426 // if (m_matrixValid) m_Ea.assign(delApDelA(ap) * m_Ea * delApDelA(ap).T());
427 if ( m_matrixValid ) m_Ea = m_Ea.similarity( delApDelA( ap ) );
428
429 m_a = ap;
430 m_pivot = newPivot;
431
432 //...Are these needed?...iw...
433 updateCache();
434 return m_pivot;
435}
436
437void Dedx_Helix::set( const HepPoint3D& pivot, const HepVector& a, const HepSymMatrix& Ea ) {
438 m_pivot = pivot;
439 m_a = a;
440 m_Ea = Ea;
441 m_matrixValid = true;
442 updateCache();
443}
444
446 if ( this == &i ) return *this;
447
448 m_bField = i.m_bField;
449 m_alpha = i.m_alpha;
450 m_pivot = i.m_pivot;
451 m_a = i.m_a;
452 m_Ea = i.m_Ea;
453 m_matrixValid = i.m_matrixValid;
454
455 m_center = i.m_center;
456 m_cp = i.m_cp;
457 m_sp = i.m_sp;
458 m_pt = i.m_pt;
459 m_r = i.m_r;
460 m_ac[0] = i.m_ac[0];
461 m_ac[1] = i.m_ac[1];
462 m_ac[2] = i.m_ac[2];
463 m_ac[3] = i.m_ac[3];
464 m_ac[4] = i.m_ac[4];
465
466 return *this;
467}
468
469void Dedx_Helix::updateCache( void ) {
470 //
471 // Calculate Helix center( xc, yc ).
472 //
473 // xc = x0 + (dr + (alpha / kappa)) * cos(phi0) (cm)
474 // yc = y0 + (dr + (alpha / kappa)) * sin(phi0) (cm)
475 //
476
477 m_ac[0] = m_a[0];
478 m_ac[1] = m_a[1];
479 m_ac[2] = m_a[2];
480 m_ac[3] = m_a[3];
481 m_ac[4] = m_a[4];
482
483 m_cp = cos( m_ac[1] );
484 m_sp = sin( m_ac[1] );
485 if ( m_ac[2] != 0.0 )
486 {
487 m_pt = 1. / m_ac[2];
488 m_r = m_alpha / m_ac[2];
489 }
490 else
491 {
492 m_pt = ( DBL_MAX );
493 m_r = ( DBL_MAX );
494 }
495
496 double x = m_pivot.x() + ( m_ac[0] + m_r ) * m_cp;
497 double y = m_pivot.y() + ( m_ac[0] + m_r ) * m_sp;
498 m_center.setX( x );
499 m_center.setY( y );
500 m_center.setZ( 0. );
501}
502
503HepMatrix Dedx_Helix::delApDelA( const HepVector& ap ) const {
504 //
505 // Calculate Jacobian (@ap/@a)
506 // Vector ap is new helix parameters and a is old helix parameters.
507 //
508
509 HepMatrix dApDA( 5, 5, 0 );
510
511 const double& dr = m_ac[0];
512 const double& phi0 = m_ac[1];
513 const double& cpa = m_ac[2];
514 const double& dz = m_ac[3];
515 const double& tnl = m_ac[4];
516
517 double drp = ap[0];
518 double phi0p = ap[1];
519 double cpap = ap[2];
520 double dzp = ap[3];
521 double tnlp = ap[4];
522
523 double rdr = m_r + dr;
524 double rdrpr;
525 if ( ( m_r + drp ) != 0.0 ) { rdrpr = 1. / ( m_r + drp ); }
526 else { rdrpr = ( DBL_MAX ); }
527 // double csfd = cos(phi0)*cos(phi0p) + sin(phi0)*sin(phi0p);
528 // double snfd = cos(phi0)*sin(phi0p) - sin(phi0)*cos(phi0p);
529 double csfd = cos( phi0p - phi0 );
530 double snfd = sin( phi0p - phi0 );
531 double phid = fmod( phi0p - phi0 + M_PI8, M_PI2 );
532 if ( phid > M_PI ) phid = phid - M_PI2;
533
534 dApDA[0][0] = csfd;
535 dApDA[0][1] = rdr * snfd;
536 if ( cpa != 0.0 ) { dApDA[0][2] = ( m_r / cpa ) * ( 1.0 - csfd ); }
537 else { dApDA[0][2] = ( DBL_MAX ); }
538
539 dApDA[1][0] = -rdrpr * snfd;
540 dApDA[1][1] = rdr * rdrpr * csfd;
541 if ( cpa != 0.0 ) { dApDA[1][2] = ( m_r / cpa ) * rdrpr * snfd; }
542 else { dApDA[1][2] = ( DBL_MAX ); }
543
544 dApDA[2][2] = 1.0;
545
546 dApDA[3][0] = m_r * rdrpr * tnl * snfd;
547 dApDA[3][1] = m_r * tnl * ( 1.0 - rdr * rdrpr * csfd );
548 if ( cpa != 0.0 ) { dApDA[3][2] = ( m_r / cpa ) * tnl * ( phid - m_r * rdrpr * snfd ); }
549 else { dApDA[3][2] = ( DBL_MAX ); }
550 dApDA[3][3] = 1.0;
551 dApDA[3][4] = -m_r * phid;
552
553 dApDA[4][4] = 1.0;
554
555 return dApDA;
556}
557
558HepMatrix Dedx_Helix::delXDelA( double phi ) const {
559 //
560 // Calculate Jacobian (@x/@a)
561 // Vector a is helix parameters and phi is internal parameter
562 // which specifys the point to be calculated for Ex(phi).
563 //
564
565 HepMatrix dXDA( 3, 5, 0 );
566
567 const double& dr = m_ac[0];
568 const double& phi0 = m_ac[1];
569 const double& cpa = m_ac[2];
570 const double& dz = m_ac[3];
571 const double& tnl = m_ac[4];
572
573 double cosf0phi = cos( phi0 + phi );
574 double sinf0phi = sin( phi0 + phi );
575
576 dXDA[0][0] = m_cp;
577 dXDA[0][1] = -dr * m_sp + m_r * ( -m_sp + sinf0phi );
578 if ( cpa != 0.0 ) { dXDA[0][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
579 else { dXDA[0][2] = ( DBL_MAX ); }
580 // dXDA[0][3] = 0.0;
581 // dXDA[0][4] = 0.0;
582
583 dXDA[1][0] = m_sp;
584 dXDA[1][1] = dr * m_cp + m_r * ( m_cp - cosf0phi );
585 if ( cpa != 0.0 ) { dXDA[1][2] = -( m_r / cpa ) * ( m_sp - sinf0phi ); }
586 else { dXDA[1][2] = ( DBL_MAX ); }
587 // dXDA[1][3] = 0.0;
588 // dXDA[1][4] = 0.0;
589
590 // dXDA[2][0] = 0.0;
591 // dXDA[2][1] = 0.0;
592 if ( cpa != 0.0 ) { dXDA[2][2] = ( m_r / cpa ) * tnl * phi; }
593 else { dXDA[2][2] = ( DBL_MAX ); }
594 dXDA[2][3] = 1.0;
595 dXDA[2][4] = -m_r * phi;
596
597 return dXDA;
598}
599
600HepMatrix Dedx_Helix::delMDelA( double phi ) const {
601 //
602 // Calculate Jacobian (@m/@a)
603 // Vector a is helix parameters and phi is internal parameter.
604 // Vector m is momentum.
605 //
606
607 HepMatrix dMDA( 3, 5, 0 );
608
609 const double& phi0 = m_ac[1];
610 const double& cpa = m_ac[2];
611 const double& tnl = m_ac[4];
612
613 double cosf0phi = cos( phi0 + phi );
614 double sinf0phi = sin( phi0 + phi );
615
616 double rho;
617 if ( cpa != 0. ) rho = 1. / cpa;
618 else rho = ( DBL_MAX );
619
620 double charge = 1.;
621 if ( cpa < 0. ) charge = -1.;
622
623 dMDA[0][1] = -fabs( rho ) * cosf0phi;
624 dMDA[0][2] = charge * rho * rho * sinf0phi;
625
626 dMDA[1][1] = -fabs( rho ) * sinf0phi;
627 dMDA[1][2] = -charge * rho * rho * cosf0phi;
628
629 dMDA[2][2] = -charge * rho * rho * tnl;
630 dMDA[2][4] = fabs( rho );
631
632 return dMDA;
633}
634
635HepMatrix Dedx_Helix::del4MDelA( double phi, double mass ) const {
636 //
637 // Calculate Jacobian (@4m/@a)
638 // Vector a is helix parameters and phi is internal parameter.
639 // Vector 4m is 4 momentum.
640 //
641
642 HepMatrix d4MDA( 4, 5, 0 );
643
644 double phi0 = m_ac[1];
645 double cpa = m_ac[2];
646 double tnl = m_ac[4];
647
648 double cosf0phi = cos( phi0 + phi );
649 double sinf0phi = sin( phi0 + phi );
650
651 double rho;
652 if ( cpa != 0. ) rho = 1. / cpa;
653 else rho = ( DBL_MAX );
654
655 double charge = 1.;
656 if ( cpa < 0. ) charge = -1.;
657
658 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) + mass * mass );
659
660 d4MDA[0][1] = -fabs( rho ) * cosf0phi;
661 d4MDA[0][2] = charge * rho * rho * sinf0phi;
662
663 d4MDA[1][1] = -fabs( rho ) * sinf0phi;
664 d4MDA[1][2] = -charge * rho * rho * cosf0phi;
665
666 d4MDA[2][2] = -charge * rho * rho * tnl;
667 d4MDA[2][4] = fabs( rho );
668
669 if ( cpa != 0.0 && E != 0.0 )
670 {
671 d4MDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
672 d4MDA[3][4] = tnl / ( cpa * cpa * E );
673 }
674 else
675 {
676 d4MDA[3][2] = ( DBL_MAX );
677 d4MDA[3][4] = ( DBL_MAX );
678 }
679 return d4MDA;
680}
681
682HepMatrix Dedx_Helix::del4MXDelA( double phi, double mass ) const {
683 //
684 // Calculate Jacobian (@4mx/@a)
685 // Vector a is helix parameters and phi is internal parameter.
686 // Vector 4xm is 4 momentum and position.
687 //
688
689 HepMatrix d4MXDA( 7, 5, 0 );
690
691 const double& dr = m_ac[0];
692 const double& phi0 = m_ac[1];
693 const double& cpa = m_ac[2];
694 const double& dz = m_ac[3];
695 const double& tnl = m_ac[4];
696
697 double cosf0phi = cos( phi0 + phi );
698 double sinf0phi = sin( phi0 + phi );
699
700 double rho;
701 if ( cpa != 0. ) rho = 1. / cpa;
702 else rho = ( DBL_MAX );
703
704 double charge = 1.;
705 if ( cpa < 0. ) charge = -1.;
706
707 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) + mass * mass );
708
709 d4MXDA[0][1] = -fabs( rho ) * cosf0phi;
710 d4MXDA[0][2] = charge * rho * rho * sinf0phi;
711
712 d4MXDA[1][1] = -fabs( rho ) * sinf0phi;
713 d4MXDA[1][2] = -charge * rho * rho * cosf0phi;
714
715 d4MXDA[2][2] = -charge * rho * rho * tnl;
716 d4MXDA[2][4] = fabs( rho );
717
718 if ( cpa != 0.0 && E != 0.0 )
719 {
720 d4MXDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
721 d4MXDA[3][4] = tnl / ( cpa * cpa * E );
722 }
723 else
724 {
725 d4MXDA[3][2] = ( DBL_MAX );
726 d4MXDA[3][4] = ( DBL_MAX );
727 }
728
729 d4MXDA[4][0] = m_cp;
730 d4MXDA[4][1] = -dr * m_sp + m_r * ( -m_sp + sinf0phi );
731 if ( cpa != 0.0 ) { d4MXDA[4][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
732 else { d4MXDA[4][2] = ( DBL_MAX ); }
733
734 d4MXDA[5][0] = m_sp;
735 d4MXDA[5][1] = dr * m_cp + m_r * ( m_cp - cosf0phi );
736 if ( cpa != 0.0 )
737 {
738 d4MXDA[5][2] = -( m_r / cpa ) * ( m_sp - sinf0phi );
739
740 d4MXDA[6][2] = ( m_r / cpa ) * tnl * phi;
741 }
742 else
743 {
744 d4MXDA[5][2] = ( DBL_MAX );
745
746 d4MXDA[6][2] = ( DBL_MAX );
747 }
748
749 d4MXDA[6][3] = 1.;
750 d4MXDA[6][4] = -m_r * phi;
751
752 return d4MXDA;
753}
754
756 m_matrixValid = false;
757 m_Ea *= 0.;
758}
const double M_PI8
const double M_PI2
const double M_PI4
double mass
NTuple::Item< double > m_pt
HepGeom::Point3D< double > HepPoint3D
#define M_PI
Definition TConstant.h:4
HepMatrix del4MDelA(double phi, double mass) const
const HepVector & a(void) const
returns helix parameters.
HepPoint3D x(double dPhi=0.) const
returns position after rotating angle dPhi in phi direction.
static const double ConstantAlpha
Constant alpha for uniform field.
Dedx_Helix & operator=(const Dedx_Helix &)
Copy operator.
void set(const HepPoint3D &pivot, const HepVector &a, const HepSymMatrix &Ea)
sets helix pivot position, parameters, and error matrix.
HepMatrix del4MXDelA(double phi, double mass) const
virtual ~Dedx_Helix()
Destructor.
HepMatrix delMDelA(double phi) const
const HepSymMatrix & Ea(void) const
returns error matrix.
Dedx_Helix(const HepPoint3D &pivot, const HepVector &a, const HepSymMatrix &Ea)
Constructor with pivot, helix parameter a, and its error matrix.
const HepPoint3D & pivot(void) const
returns pivot position.
double dr(void) const
returns an element of parameters.
void ignoreErrorMatrix(void)
HepMatrix delXDelA(double phi) const
Hep3Vector momentum(double dPhi=0.) const
returns momentum vector after rotating angle dPhi in phi direction.
HepMatrix delApDelA(const HepVector &ap) const