CGEM BOSS 6.6.5.h
BESIII Offline Software System
Loading...
Searching...
No Matches
TrkDifLineTraj.cxx
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2// File and Version Information:
3// $Id: TrkDifLineTraj.cxx,v 1.1.1.1 2017/12/15 12:01:44 huangzhen Exp $
4//
5// Description:
6//
7// Environment:
8// Software developed for the BaBar Detector at the SLAC B-Factory.
9//
10// Author(s): Steve Schaffner
11//------------------------------------------------------------------------
13#include <assert.h>
14#include <math.h>
15#include "MdcGeom/BesAngle.h"
18#include "TrkBase/TrkVisitor.h"
22
23using CLHEP::Hep3Vector;
24
25TrkDifLineTraj::TrkDifLineTraj(const HepVector& pvec, const HepSymMatrix& pcov,
26 double lowlim, double hilim, const HepPoint3D& refpoint) :
27 TrkSimpTraj(pvec, pcov, lowlim,hilim,refpoint)
28{
29}
30
32 double lowlim, double hilim, const HepPoint3D& refpoint) :
33 TrkSimpTraj(HepVector(NLINPRM,1),HepSymMatrix(NLINPRM,1), lowlim,hilim,refpoint)
34{
35// the above constructor actually screws up z0 and tandip. I can't fix it in
36// the initializer, so I'll just overwrite the track here. Ugly and inefficient
37 HepVector subvect(NLINPRM,1);
38 HepSymMatrix submat(NLINPRM,1);
39 const HepSymMatrix covar = inpar.covariance();
40 subvect[d0Ind] = inpar.d0();
41 subvect[phi0Ind] = inpar.phi0();
42 subvect[z0Ind] = inpar.z0();
43 subvect[tanDipInd] = inpar.tanDip();
44
45 submat.fast(d0Ind+1,d0Ind+1) = covar.fast(TrkExchangePar::ex_d0+1,TrkExchangePar::ex_d0+1);
46 submat.fast(d0Ind+1,phi0Ind+1) = covar.fast(TrkExchangePar::ex_d0+1,TrkExchangePar::ex_phi0+1);
47 submat.fast(d0Ind+1,z0Ind+1) = covar.fast(TrkExchangePar::ex_d0+1,TrkExchangePar::ex_z0+1);
48 submat.fast(d0Ind+1,tanDipInd+1) = covar.fast(TrkExchangePar::ex_d0+1,TrkExchangePar::ex_tanDip+1);
49 submat.fast(phi0Ind+1,phi0Ind+1) = covar.fast(TrkExchangePar::ex_phi0+1,TrkExchangePar::ex_phi0+1);
50 submat.fast(phi0Ind+1,z0Ind+1) = covar.fast(TrkExchangePar::ex_phi0+1,TrkExchangePar::ex_z0+1);
51 submat.fast(phi0Ind+1,tanDipInd+1) = covar.fast(TrkExchangePar::ex_phi0+1,TrkExchangePar::ex_tanDip+1);
52 submat.fast(z0Ind+1,z0Ind+1) = covar.fast(TrkExchangePar::ex_z0+1,TrkExchangePar::ex_z0+1);
53 submat.fast(z0Ind+1,tanDipInd+1) = covar.fast(TrkExchangePar::ex_z0+1,TrkExchangePar::ex_tanDip+1);
55// reset the track
56 (*parameters()) = TrkParams(subvect,submat);
57}
58
60 : TrkSimpTraj(h.parameters()->parameter(), h.parameters()->covariance(),
61 h.lowRange(),h.hiRange(),h.referencePoint())
62{
63}
64
67{
68 return new TrkDifLineTraj(*this);
69}
70
73{
74 if( &h != this ){
76 _dtparams = *h.parameters();
78 }
79 return *this;
80}
81
85
86double
87TrkDifLineTraj::x( const double& f ) const
88{
89 return -d0() * sin(phi0()) + f * cos(phi0()) * cosDip() +
90 referencePoint().x();
91}
92
93double
94TrkDifLineTraj::y( const double& f ) const
95{
96 return d0() * cos(phi0()) + f * sin(phi0()) * cosDip() +
97 referencePoint().y();
98}
99
100double
101TrkDifLineTraj::z( const double& f ) const
102{
103 return z0() + f * tanDip() * cosDip() + referencePoint().z();
104}
105
108{
109 double cosd = cosDip();
110 double cp = cos(phi0());
111 double sp = sin(phi0());
112 return HepPoint3D(-d0()*sp + f*cp*cosd + referencePoint().x(),
113 d0()*cp + f*sp*cosd + referencePoint().y(),
114 z0() + f*tanDip()*cosd + referencePoint().z());
115}
116
117Hep3Vector
119{
120 double cdip = cosDip();
121 return Hep3Vector ( cos(phi0()) * cdip,
122 sin(phi0()) * cdip,
123 tanDip() * cdip);
124}
125
126Hep3Vector
128{
129 return Hep3Vector(0.0, 0.0, 0.0);
130}
131
132double
133TrkDifLineTraj::distTo1stError(double, double, int) const
134{
135 return 999.e4;
136}
137
138double
139TrkDifLineTraj::distTo2ndError(double, double, int) const
140{
141 return 999.e4;
142}
143
144void
145TrkDifLineTraj::getInfo(double fltLen, HepPoint3D& pos, Hep3Vector& dir,
146 Hep3Vector& delDir) const
147{
148 // This could be made much more efficient!!!!!!
149 pos = position(fltLen);
150 dir = direction(fltLen);
151 delDir = delDirect(fltLen);
152}
153
154void
155TrkDifLineTraj::getInfo( double fltLen, HepPoint3D& pos, Hep3Vector& dir ) const
156{
157 // This could be made much more efficient!!!!!
158 pos = position(fltLen);
159 dir = direction(fltLen);
160}
161
162void
164 DifVector& delDir) const
165{
166 //Provides difNum version of information for calculation of derivatives.
167
168 // Create difNumber versions of parameters
169 //enum index (phi0Index(), etc) is from TrkLineParams.hh
170 DifNumber phi0Df(phi0(), phi0Index()+1, nLinPrm());
171 DifNumber d0Df(d0(), d0Index()+1, nLinPrm());
172 DifNumber z0Df(z0(), z0Index()+1, nLinPrm());
173 DifNumber tanDipDf(tanDip(), tanDipIndex()+1, nLinPrm());
174 DifNumber zero(0.0, nLinPrm());
175 phi0Df.setIndepPar( parameters() );
176 d0Df.setIndepPar( parameters() );
177 z0Df.setIndepPar( parameters() );
178 tanDipDf.setIndepPar( parameters() );
180
181 DifNumber sphi0, cphi0;
182 phi0Df.cosAndSin(cphi0, sphi0);
183
184 DifNumber px(referencePoint().x());
185 DifNumber py(referencePoint().y());
186 DifNumber pz(referencePoint().z());
187
188 DifNumber cdip = 1. / sqrt(1. + tanDipDf*tanDipDf);
189 DifNumber xx = -d0Df * sphi0 + flt * cphi0 * cdip + px;
190 DifNumber yy = d0Df * cphi0 + flt * sphi0 * cdip + py;
191 DifNumber zz = z0Df + flt * tanDipDf * cdip + pz;
192
193 pos = DifPoint(xx, yy, zz);
194 dir = DifVector( cphi0 * cdip,
195 sphi0 * cdip,
196 tanDipDf * cdip);
197
198 delDir = DifVector(zero, zero, zero);
199}
200
201double
203{
204 return 0.;
205}
206
207double
209{
210 return BesAngle(parameters()->parameter()[phi0Index()]).rad();
211}
212
213HepMatrix
215{
216// This function computes the column matrix of derivatives for the change
217// in parameters for a change in the direction of a track at a point along
218// its flight, holding the momentum and position constant. The effects for
219// changes in 2 perpendicular directions (theta1 = dip and
220// theta2 = phi*cos(dip)) are uncorrelated.
221
222 HepMatrix ddflct(nLinPrm(),1);
223// Compute some common things
224 double cosd = cosDip();
225// Go through the parameters
226 switch (idirect) {
227 case theta1:
228 ddflct[tanDipIndex()][0] = 1.0/(cosd*cosd);
229 ddflct[d0Index()][0] = 0.0;
230 ddflct[phi0Index()][0] = 0.0;
231 ddflct[z0Index()][0] = -fltlen/cosd;;
232 break;
233 case theta2:
234 ddflct[tanDipIndex()][0] = 0;
235 ddflct[d0Index()][0] = -fltlen;
236 ddflct[phi0Index()][0] = 1.0/cosd;
237 ddflct[z0Index()][0] = -(tanDip()/cosd)*d0();
238 break;
239 }
240 return ddflct;
241}
242
243HepMatrix
245{
246// This function computes the column matrix of derivatives for the change
247// in parameters for a change in the position of a track at a point along
248// its flight, holding the momentum and direction constant. The effects for
249// changes in 2 perpendicular directions (theta1 = dip and
250// theta2 = phi*cos(dip)) are uncorrelated.
251
252 HepMatrix ddflct(nLinPrm(),1);
253// Compute some common things
254 double cosd = cosDip();
255// Go through the parameters
256 switch (idirect) {
257 case theta1:
258 ddflct[tanDipIndex()][0] = 0.0;
259 ddflct[d0Index()][0] = 0.0;
260 ddflct[phi0Index()][0] = 0.0;
261 ddflct[z0Index()][0] = 1.0/cosd;
262 break;
263 case theta2:
264 ddflct[tanDipIndex()][0] = 0;
265 ddflct[d0Index()][0] = 1.0;
266 ddflct[phi0Index()][0] = 0.0;
267 ddflct[z0Index()][0] = 0.0;
268 break;
269 }
270 return ddflct;
271}
272
273HepMatrix
275{
276// This function computes the column matrix of derrivatives for the change
277// in parameters from a (fractional) change in the track momentum,
278// holding the direction and position constant. The momentum change can
279// come from energy loss or bfield inhomogeneities. Line Trajs have no
280// geometric change from energy loss.
281
282 return HepMatrix(nLinPrm(),1, 0);
283}
284
285void
286TrkDifLineTraj::paramFunc(const HepPoint3D& oldpoint,const HepPoint3D& newpoint,
287 const HepVector& oldvec,const HepSymMatrix& oldcov,
288 HepVector& newvec,HepSymMatrix& newcov,
289 double fltlen)
290{
291// not yet implemented
292 std::cout<<"ErrMsg(fatal)" << "TrkDifLineTraj::paramFunc() is not implemented!" << std::endl;
293}
294
295void
296TrkDifLineTraj::invertParams(TrkParams* params, std::vector<bool>& flags) const
297{
298 // Inverts parameters and returns true if the parameter inversion
299 // requires a change in sign of elements in the covariance matrix
300 for (unsigned iparam = 0; iparam < NLINPRM; iparam++) {
301 switch ( iparam ) {
302 case d0Ind: // changes sign
303 case tanDipInd: // changes sign
304 params->parameter()[iparam] *= -1.0;
305 flags[iparam] = true;
306 break;
307 case phi0Ind: // changes by pi, but covariance matrix shouldn't change
308 params->parameter()[iparam] =
309 BesAngle(params->parameter()[iparam] + Constants::pi);
310 flags[iparam] = false;
311 break;
312 case z0Ind: // no change
313 flags[iparam] = false;
314 }
315 }
316 return;
317}
318
319void
321{
322// Visitor access--just use the TrkVisitor class member function
323 vis->trkVisitLineTraj(this);
324}
double sin(const BesAngle a)
Definition BesAngle.h:210
double cos(const BesAngle a)
Definition BesAngle.h:213
const DifNumber zero
************Class m_ypar INTEGER m_KeyWgt INTEGER m_nphot INTEGER m_KeyGPS INTEGER m_IsBeamPolarized INTEGER m_EvtGenInterface DOUBLE PRECISION m_Emin DOUBLE PRECISION m_sphot DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_q2 DOUBLE PRECISION m_PolBeam2 DOUBLE PRECISION m_xErrPb *COMMON c_KK2f $ !CMS energy average $ !Spin Polarization vector first beam $ !Spin Polarization vector second beam $ !Beam energy spread[GeV] $ !minimum hadronization energy[GeV] $ !input parameters
Definition KK2f.h:46
HepGeom::Point3D< double > HepPoint3D
deflectDirection
Definition TrkKalDeriv.h:24
@ theta2
Definition TrkKalDeriv.h:24
@ theta1
Definition TrkKalDeriv.h:24
double rad() const
Definition BesAngle.h:118
static const double pi
Definition Constants.h:38
HepVector & parameter()
Definition DifIndepPar.h:51
void setIndepPar(const DifIndepPar *par)
Definition DifNumber.h:83
void cosAndSin(DifNumber &c, DifNumber &s) const
Trajectory & operator=(const Trajectory &)
virtual void getInfo(double fltLen, HepPoint3D &pos, Hep3Vector &dir) const
virtual void visitAccept(TrkVisitor *vis) const
virtual Hep3Vector direction(double fltLen) const
double cosDip() const
virtual double distTo1stError(double flt, double tol, int pathDir) const
TrkDifLineTraj(const HepVector &, const HepSymMatrix &, double lowlim=-99999., double hilim=99999., const HepPoint3D &refpoint=_theOrigin)
double d0() const
TrkDifLineTraj * clone() const
virtual Hep3Vector delDirect(double) const
double phi0() const
double tanDip() const
double z0() const
virtual void getDFInfo(double fltLen, DifPoint &, DifVector &dir, DifVector &delDir) const
void invertParams(TrkParams *params, std::vector< bool > &flags) const
virtual double distTo2ndError(double flt, double tol, int pathDir) const
HepMatrix derivDeflect(double fltlen, deflectDirection) const
TrkDifLineTraj & operator=(const TrkDifLineTraj &)
HepMatrix derivDisplace(double fltlen, deflectDirection) const
virtual double curvature(double fltLen) const
virtual HepPoint3D position(double fltLen) const
HepMatrix derivPFract(double fltlen) const
double phi0() const
double z0() const
double d0() const
double tanDip() const
const HepSymMatrix & covariance() const
TrkParams _dtparams
HepPoint3D _refpoint
TrkParams * parameters()
Definition TrkSimpTraj.h:80
const HepPoint3D & referencePoint() const
Definition TrkSimpTraj.h:84
virtual void trkVisitLineTraj(const TrkDifLineTraj *)=0