12#include "TrkFitter/TrkCircleTraj.h"
13#include "MdcGeom/BesAngle.h"
14#include "MdcGeom/Constants.h"
15#include "MdcRecoUtil/DifNumber.h"
16#include "MdcRecoUtil/DifPoint.h"
17#include "MdcRecoUtil/DifVector.h"
18#include "TrkBase/TrkExchangePar.h"
19#include "TrkBase/TrkVisitor.h"
26# define M_2PI 2 * M_PI
28using CLHEP::Hep3Vector;
29using CLHEP::HepSymMatrix;
34 :
TrkSimpTraj( pvec, pcov, lowlim, hilim, refpoint )
40 std::cout <<
"ErrMsg(fatal)"
41 <<
"CircleTraj: incorrect constructor vector/matrix dimension" << std::endl;
50 :
TrkSimpTraj( inpar.params(), inpar.covariance(), lowlim, hilim, refpoint ) {
74double TrkCircleTraj::x(
const double&
f )
const {
79double TrkCircleTraj::y(
const double&
f )
const {
87 double ang = angle(
f );
102 double delX = -
omega() *
sin( angle( fltLen ) );
103 double delY =
omega() *
cos( angle( fltLen ) );
104 return Hep3Vector( delX, delY, 0.0 );
108 double arg = 2. * tol / fabs(
omega() );
115 return pow( 6. * tol / (
omega() *
omega() ), 0.33333333 );
119 Hep3Vector& delDir )
const {
122 double ang = angle( flt );
123 double cang =
cos( ang );
124 double sang =
sin( ang );
136 delDir.setX( -
omega() * sang );
137 delDir.setY(
omega() * cang );
144 double ang = angle( fltLen );
145 double cang =
cos( ang );
146 double sang =
sin( ang );
188 x -= ( d0Df * sinPhi0 );
193 y += ( d0Df * cosPhi0 );
248 x -= ( d0Df * sinPhi0 );
253 y += ( d0Df * cosPhi0 );
278 delDir.
x *= sinAlpha;
281 delDir.
y *= cosAlpha;
293 HepMatrix ddflct(
nCirPrm(), 1, 0 );
297 double omeg =
omega();
298 double arcl = arc( fltlen );
299 double dx =
cos( arcl );
300 double dy =
sin( arcl );
301 double darc = omeg *
d0();
309 ddflct[
d0Index()][0] = -dy / ( omeg );
310 ddflct[
phi0Index()][0] = dx / ( 1 + darc );
324 HepMatrix ddflct(
nCirPrm(), 1, 0 );
328 double omeg =
omega();
329 double arcl = arc( fltlen );
330 double dx =
cos( arcl );
331 double dy =
sin( arcl );
332 double darc = omeg *
d0();
355 HepMatrix dmomfrac(
nCirPrm(), 1 );
359 double omeg =
omega();
360 double arcl = arc( fltlen );
361 double dx =
cos( arcl );
362 double dy =
sin( arcl );
363 double darc = omeg *
d0();
369 dmomfrac[
d0Index()][0] = -( 1 - dx ) / omeg;
371 dmomfrac[
phi0Index()][0] = dy / ( 1 + darc );
380 return fabs(
omega() );
388 const HepVector& oldvec,
const HepSymMatrix& oldcov,
389 HepVector& newvec, HepSymMatrix& newcov,
double fltlen ) {
391 HepVector parvec( oldvec );
395 double delx = newpoint.x() - oldpoint.x();
396 double dely = newpoint.y() - oldpoint.y();
403 double perp = delx * sin0 - dely * cos0;
404 double para = delx * cos0 + dely * sin0;
407 double newdelta2 = delta * delta + delx * delx + dely * dely + 2.0 * delta * perp;
409 double newdelta = delta > 0 ? sqrt( newdelta2 ) : -sqrt( newdelta2 );
410 double invdelta = 1.0 / newdelta;
411 double invdelta2 = 1.0 / newdelta2;
415 double newphi = atan2( sin0 + delx / delta, cos0 - dely / delta );
416 while ( fabs( newphi - oldphi ) >
M_PI )
417 if ( newphi > oldphi ) newphi -=
M_2PI;
418 else newphi +=
M_2PI;
436 newcov = oldcov.similarity( covrot );
444 for (
unsigned iparam = 0; iparam < NCIRPAR; iparam++ )
451 flags[iparam] =
true;
455 flags[iparam] =
false;
471double TrkCircleTraj::angle(
const double&
f )
const {
return BesAngle(
phi0() + arc(
f ) ); }
HepGeom::Point3D< double > HepPoint3D
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
double arg(const EvtComplex &c)
double sin(const BesAngle a)
double cos(const BesAngle a)
HepGeom::Point3D< double > HepPoint3D
void setIndepPar(const DifIndepPar *par)
DifNumber & mod(double lo, double hi)
void cosAndSin(DifNumber &c, DifNumber &s) const
Trajectory & operator=(const Trajectory &)
virtual Hep3Vector direction(double fltLen) const
HepMatrix derivDeflect(double fltlen, deflectDirection) const
virtual void getDFInfo2(double fltLen, DifPoint &pos, DifVector &dir) const
virtual double distTo2ndError(double flt, double tol, int pathDir) const
virtual double distTo1stError(double flt, double tol, int pathDir) const
TrkCircleTraj * clone() const
virtual double curvature(double fltLen) const
TrkCircleTraj(const HepVector &, const HepSymMatrix &, double lowlim=-99999., double hilim=99999., const HepPoint3D &refpoint=_theOrigin)
HepMatrix derivDisplace(double fltlen, deflectDirection) const
virtual void visitAccept(TrkVisitor *vis) const
void invertParams(TrkParams *params, std::vector< bool > &flags) const
virtual HepPoint3D position(double fltLen) const
virtual void getDFInfo(double fltLen, DifPoint &, DifVector &dir, DifVector &delDir) const
virtual Hep3Vector delDirect(double) const
HepMatrix derivPFract(double fltlen) const
virtual void getInfo(double fltLen, HepPoint3D &pos, Hep3Vector &dir) const
TrkCircleTraj & operator=(const TrkCircleTraj &)
TrkSimpTraj(const HepVector ¶ms, const HepSymMatrix &cov, const double startRange=-99999., const double endRange=99999., const HepPoint3D &refpoint=_theOrigin)
const HepPoint3D & referencePoint() const
virtual void trkVisitCircleTraj(const TrkCircleTraj *)=0