00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef TRKDIFPIECETRAJ_HH
00018 #define TRKDIFPIECETRAJ_HH
00019 #include "TrkBase/TrkSimpTraj.h"
00020 #include "TrkBase/TrkKalDeriv.h"
00021 #include "TrkBase/TrkDirection.h"
00022 #include <vector>
00023 #include <deque>
00024
00025 #include <iosfwd>
00026 class TrkErrCode;
00027
00028 class TrkDifPieceTraj : public TrkDifTraj , public TrkKalDeriv {
00029 public:
00030
00031
00032
00033
00034 TrkDifPieceTraj(const TrkSimpTraj&,const double lowlim ,const double hilim );
00035
00036 TrkDifPieceTraj(TrkSimpTraj*,const double lowlim ,const double hilim );
00037 TrkDifPieceTraj(const TrkDifPieceTraj& );
00038
00039
00040 TrkDifPieceTraj(const std::vector<TrkSimpTraj*>& trajs);
00041 virtual ~TrkDifPieceTraj();
00042 TrkDifPieceTraj& operator =(const TrkDifPieceTraj&);
00043
00044 bool operator == (const TrkDifPieceTraj& other) const;
00045
00046
00047 TrkDifPieceTraj& invert();
00048 TrkDifPieceTraj* clone() const {return new TrkDifPieceTraj(*this); }
00049
00050
00051
00052
00053 void getDFInfo(double fltLen, DifPoint& pos, DifVector& direction,
00054 DifVector& delDirect) const;
00055 void getDFInfo2(double fltlen, DifPoint& pos, DifVector& direction) const;
00056
00057
00058
00059
00060 HepPoint3D position( double ) const;
00061 Hep3Vector direction( double ) const;
00062 double curvature( double f = 0. ) const;
00063 Hep3Vector delDirect( double ) const;
00064 void getInfo(double fltLen, HepPoint3D& , Hep3Vector& direction) const;
00065 void getInfo(double fltLen, HepPoint3D& , Hep3Vector& direction,
00066 Hep3Vector& delDirect) const;
00067 double distTo1stError(double s, double tol, int pathDir) const;
00068 double distTo2ndError(double s, double tol, int pathDir) const;
00069
00070
00071
00072
00073 const TrkSimpTraj* localTrajectory(double,double&) const;
00074
00075 bool locallyValid(double glen,double tol=0.0) const;
00076
00077
00078
00079 void setFlightRange(double newrange[2]);
00080
00081
00082
00083
00084
00085 void print(std::ostream& os) const;
00086 void printAll(std::ostream& os) const;
00087
00088
00089
00090
00091
00092
00093
00094 const TrkErrCode& append(double gfltlen,const TrkSimpTraj&,double& gap);
00095 const TrkErrCode& prepend(double gfltlen,const TrkSimpTraj&,double& gap);
00096
00097 const TrkErrCode& append(double gfltlen,TrkSimpTraj*,double& gap);
00098 const TrkErrCode& prepend(double gfltlen,TrkSimpTraj*,double& gap);
00099
00100
00101 const TrkErrCode& append(double,const TrkDifPieceTraj&,double& gap);
00102 const TrkErrCode& prepend(double,const TrkDifPieceTraj&,double& gap);
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 const TrkErrCode& append(TrkSimpTraj* traj,double& gap);
00115 const TrkErrCode& prepend(TrkSimpTraj* traj,double& gap);
00116
00117
00118
00119 HepMatrix derivDeflect(double fltlen,deflectDirection) const;
00120 HepMatrix derivDisplace(double fltlen,deflectDirection idir) const;
00121
00122 HepMatrix derivPFract(double fltlen) const;
00123 protected:
00124 int resize(double len,trkDirection);
00125
00126 int trajIndex(const double& global,double& local) const;
00127
00128 double localDist(int index,double globdist) const {
00129 return _localtraj[index]->lowRange() + globdist - _globalrange[index];
00130 }
00131
00132 double globalDist(int index,double locdist) const {
00133 return _globalrange[index] + locdist - _localtraj[index]->lowRange();
00134 }
00135
00136 std::deque<TrkSimpTraj*> _localtraj;
00137 std::deque<double> _globalrange;
00138 mutable int _lastIndex;
00139
00140 };
00141 #endif