TrkDifPieceTraj Class Reference

#include <TrkDifPieceTraj.h>

Inheritance diagram for TrkDifPieceTraj:

TrkDifTraj TrkKalDeriv Trajectory List of all members.

Public Member Functions

 TrkDifPieceTraj (const TrkSimpTraj &, const double lowlim, const double hilim)
 TrkDifPieceTraj (TrkSimpTraj *, const double lowlim, const double hilim)
 TrkDifPieceTraj (const TrkDifPieceTraj &)
 TrkDifPieceTraj (const std::vector< TrkSimpTraj * > &trajs)
virtual ~TrkDifPieceTraj ()
TrkDifPieceTrajoperator= (const TrkDifPieceTraj &)
bool operator== (const TrkDifPieceTraj &other) const
TrkDifPieceTrajinvert ()
TrkDifPieceTrajclone () const
void getDFInfo (double fltLen, DifPoint &pos, DifVector &direction, DifVector &delDirect) const
void getDFInfo2 (double fltlen, DifPoint &pos, DifVector &direction) const
HepPoint3D position (double) const
Hep3Vector direction (double) const
double curvature (double f=0.) const
Hep3Vector delDirect (double) const
void getInfo (double fltLen, HepPoint3D &, Hep3Vector &direction) const
void getInfo (double fltLen, HepPoint3D &, Hep3Vector &direction, Hep3Vector &delDirect) const
double distTo1stError (double s, double tol, int pathDir) const
double distTo2ndError (double s, double tol, int pathDir) const
const TrkSimpTrajlocalTrajectory (double, double &) const
bool locallyValid (double glen, double tol=0.0) const
void setFlightRange (double newrange[2])
void print (std::ostream &os) const
void printAll (std::ostream &os) const
const TrkErrCodeappend (double gfltlen, const TrkSimpTraj &, double &gap)
const TrkErrCodeprepend (double gfltlen, const TrkSimpTraj &, double &gap)
const TrkErrCodeappend (double gfltlen, TrkSimpTraj *, double &gap)
const TrkErrCodeprepend (double gfltlen, TrkSimpTraj *, double &gap)
const TrkErrCodeappend (double, const TrkDifPieceTraj &, double &gap)
const TrkErrCodeprepend (double, const TrkDifPieceTraj &, double &gap)
const TrkErrCodeappend (TrkSimpTraj *traj, double &gap)
const TrkErrCodeprepend (TrkSimpTraj *traj, double &gap)
HepMatrix derivDeflect (double fltlen, deflectDirection) const
HepMatrix derivDisplace (double fltlen, deflectDirection idir) const
HepMatrix derivPFract (double fltlen) const
double distTo0thError (double s, double tol, int pathDir) const
bool validFlightDistance (double f, double tolerance=0.0) const
double lowRange () const
double hiRange () const
double range () const

Protected Member Functions

int resize (double len, trkDirection)
int trajIndex (const double &global, double &local) const
double localDist (int index, double globdist) const
double globalDist (int index, double locdist) const

Protected Attributes

std::deque< TrkSimpTraj * > _localtraj
std::deque< double > _globalrange
int _lastIndex
double flightrange [2]

Detailed Description

Definition at line 28 of file TrkDifPieceTraj.h.


Constructor & Destructor Documentation

TrkDifPieceTraj::TrkDifPieceTraj ( const TrkSimpTraj ,
const double  lowlim,
const double  hilim 
)

Definition at line 30 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, TrkSimpTraj::clone(), and Trajectory::lowRange().

Referenced by clone().

00030                                                                                                :
00031   TrkDifTraj(lowlim,hilim), _lastIndex(-1)
00032 {
00033   // _localtraj.reserve(16); _globalrange.reserve(16);
00034   _localtraj.push_back((TrkSimpTraj*)seed.clone());
00035   assert(lowlim < hilim);
00036   _globalrange.push_back(lowlim);
00037   _globalrange.push_back(hilim);
00038 // don't assume the local trajectory has the same range, but do respect it's starting point
00039   double locrange[2];
00040   locrange[0] = seed.lowRange();
00041   locrange[1] = hilim-lowlim+locrange[0];
00042   _localtraj.front()->setFlightRange(locrange);
00043 }

TrkDifPieceTraj::TrkDifPieceTraj ( TrkSimpTraj ,
const double  lowlim,
const double  hilim 
)

Definition at line 45 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, Trajectory::lowRange(), and Trajectory::setFlightRange().

00045                                                                                          :
00046   TrkDifTraj(lowlim,hilim), _lastIndex(-1)
00047 {
00048   // _localtraj.reserve(16); _globalrange.reserve(16);
00049   assert(lowlim < hilim);
00050   _globalrange.push_back(lowlim);
00051   _globalrange.push_back(hilim);
00052 // don't assume the local trajectory has the same range, but do respect it's starting point
00053   double locrange[2];
00054   locrange[0] = seed->lowRange();
00055   locrange[1] = hilim-lowlim+locrange[0];
00056   seed->setFlightRange(locrange);
00057   _localtraj.push_back(seed);
00058 }

TrkDifPieceTraj::TrkDifPieceTraj ( const TrkDifPieceTraj  ) 

Definition at line 61 of file TrkDifPieceTraj.cxx.

References _localtraj, deljobs::end, genRecEmupikp::i, and EvtCyclic3::other().

00061                                                              :
00062   TrkDifTraj(other.lowRange(),other.hiRange()),
00063   _globalrange(other._globalrange),
00064   _lastIndex(other._lastIndex)
00065 {
00066 //
00067 // deep-copy all the trajectory pieces
00068 //
00069   // _localtraj.reserve(other._localtraj.size());
00070   typedef std::deque<TrkSimpTraj *>::const_iterator iter_t;
00071   iter_t end = other._localtraj.end();
00072   for(iter_t i=other._localtraj.begin();i!=end; ++i)
00073     _localtraj.push_back( (TrkSimpTraj*) (*i)->clone());
00074 }

TrkDifPieceTraj::TrkDifPieceTraj ( const std::vector< TrkSimpTraj * > &  trajs  ) 

Definition at line 76 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, append(), TrkErrCode::failure(), Trajectory::flightrange, Trajectory::lowRange(), and prepend().

00077 {
00078   // _localtraj.reserve(trajs.size());_globalrange.reserve(trajs.size()+1);
00079 // intialize
00080   TrkSimpTraj* prevtraj(0);
00081   for(std::vector<TrkSimpTraj*>::const_iterator itraj=trajs.begin();itraj!=trajs.end();++itraj){
00082     TrkSimpTraj* newtraj = (*itraj)->clone();
00083     assert(newtraj != 0);
00084     if(prevtraj != 0){
00085 // Hopefully the trajs are in order
00086       TrkErrCode add;
00087       double gap;
00088       if(newtraj->lowRange() > prevtraj->lowRange())
00089         add = append(newtraj,gap);
00090       else
00091         add = prepend(newtraj,gap);
00092       if(add.failure()){
00093 #ifdef MDCPATREC_WARNING
00094         std::cout<<"ErrMsg(warning) "
00095                 << "construction from vector of trajs failed"
00096                 << add << std::endl;
00097 #endif
00098         delete newtraj;
00099         break;
00100       }
00101     } else {
00102 // Initial global flightlength is defined by the first trajectory
00103       _localtraj.push_back(newtraj);
00104       _globalrange.push_back(newtraj->lowRange());
00105       _globalrange.push_back(newtraj->hiRange());
00106 // set the global range
00107       flightrange[0] = _globalrange.front();
00108       flightrange[1] = _globalrange.back();
00109     }
00110     prevtraj = _localtraj[itraj-trajs.begin()];
00111   }
00112 }

TrkDifPieceTraj::~TrkDifPieceTraj (  )  [virtual]

Definition at line 114 of file TrkDifPieceTraj.cxx.

References _localtraj.

00115 {
00116   std::for_each(_localtraj.begin(),
00117                 _localtraj.end(),
00118                 bes::Collection::DeleteObject());
00119 }


Member Function Documentation

const TrkErrCode & TrkDifPieceTraj::append ( TrkSimpTraj traj,
double &  gap 
)

Definition at line 711 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, _TOL, TrkSimpTraj::clone(), TrkErrCode::fail, Trajectory::flightrange, TrkPocaBase::flt1(), globalDist(), Trajectory::hiRange(), Trajectory::lowRange(), position(), Trajectory::position(), Trajectory::range(), TrkPocaBase::status(), TrkErrCode::succeed, TrkErrCode::success(), and trajIndex().

00712 {
00713   static TrkErrCode retval;
00714   retval = TrkErrCode(TrkErrCode::succeed);
00715 // find out where this piece is relative to the existing pieces.
00716   HepPoint3D end = newtraj->position(newtraj->lowRange());
00717   TrkPoca poca(*this,newtraj->lowRange(),end,_TOL);
00718   if(poca.status().success()){
00719 // find the local trajectory pieces at either end
00720     double local;
00721     int index = trajIndex(poca.flt1(),local);
00722     TrkSimpTraj* oldtraj = _localtraj[index];
00723 // Make sure we're beyond the end of the existing trajectory
00724     if( index == _localtraj.size()-1 &&
00725         poca.flt1() > hiRange()){
00726 // we want to split the gap between the traj pieces evenly,
00727       double gapstart = globalDist(index,oldtraj->hiRange());
00728       double gapend = poca.flt1();
00729       double gapmid = (gapend+gapstart)/2.0;
00730       HepPoint3D mid = position(gapmid);
00731 // approximate initial (local) fltlen for poca
00732       double locmid = newtraj->lowRange() - gapend + gapmid;
00733       TrkPoca midpoca(*newtraj,locmid,mid,_TOL);
00734       if(midpoca.status().success()){
00735 // create a 0-length copy of the new traj to associate with the midpoint.
00736 // This insures correct coverage of the global flight range
00737         TrkSimpTraj* gaptraj = (TrkSimpTraj*)(newtraj->clone());
00738         assert(gaptraj != 0);
00739         double range[2];
00740         range[0] = midpoca.flt1();
00741         range[1] = range[0];
00742         gaptraj->setFlightRange(range);
00743 // insert the trajectories
00744         _localtraj.push_back(gaptraj);
00745         _localtraj.push_back(newtraj);
00746 // append the new global range
00747         _globalrange.back() = gapmid;
00748         _globalrange.push_back(gapend);
00749         _globalrange.push_back(gapend+newtraj->range());
00750 // extend the piece-trajs own range
00751         flightrange[1] = _globalrange.back();
00752 // measure the gap at the midpoint
00753         gap = mid.distance(newtraj->position(midpoca.flt1()));
00754       } else
00755         retval = TrkErrCode(TrkErrCode::fail,7,"poca failure");
00756     } else
00757       retval = TrkErrCode(TrkErrCode::fail,8,"invalid range");
00758   } else
00759     retval = TrkErrCode(TrkErrCode::fail,7,"poca failure");
00760   return retval;
00761 }

const TrkErrCode & TrkDifPieceTraj::append ( double  ,
const TrkDifPieceTraj ,
double &  gap 
)

Definition at line 272 of file TrkDifPieceTraj.cxx.

References _TOL, append(), TrkErrCode::fail, TrkErrCode::failure(), Trajectory::hiRange(), EvtCyclic3::other(), position(), and TrkErrCode::succeed.

00273 {
00274   static TrkErrCode retval;
00275   retval = TrkErrCode(TrkErrCode::succeed);
00276 // find POCA between the trajectories.
00277   double mylen = glen;
00278   HepPoint3D myend = position(mylen);
00279   double otherlen = other.lowRange();
00280   HepPoint3D otherstart = other.position(otherlen);
00281   gap = otherstart.distance(myend);
00282   if(gap > _TOL){ // Don't invoke POCA if the point is too close
00283     TrkPoca endpoca(other,other.lowRange(),myend,_TOL);
00284     if(endpoca.status().failure()){
00285       retval = TrkErrCode(TrkErrCode::fail,7,"poca failure");
00286       return retval;
00287     }
00288     gap = endpoca.doca();
00289     otherlen = endpoca.flt1();
00290   }
00291 // get the local trajectory piece at this fltlen
00292   double loclen(0);
00293   double piecegap;
00294 // loop over segments in the other trajectory
00295   for(int itraj = other.trajIndex(otherlen,loclen);
00296       itraj < other._localtraj.size();itraj++){
00297 // append the piece from the other trajectory
00298     retval = append(mylen,*(other._localtraj[itraj]),piecegap);
00299     if(retval.failure())
00300       break;
00301 // move forward
00302     mylen = hiRange();
00303   }
00304   return retval;
00305 }

const TrkErrCode & TrkDifPieceTraj::append ( double  gfltlen,
TrkSimpTraj ,
double &  gap 
)

Definition at line 167 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, _TOL, TrkErrCode::fail, Trajectory::flightrange, Trajectory::hiRange(), Trajectory::lowRange(), max, Trajectory::position(), position(), Trajectory::range(), resize(), Trajectory::setFlightRange(), TrkErrCode::succeed, and trkOut.

00168 {
00169   static TrkErrCode retval;
00170   retval = TrkErrCode(TrkErrCode::succeed);
00171 // simple range checks
00172   if(glen >= lowRange()){
00173 // resize the end if necessary
00174     int nremoved = resize(glen,trkOut);
00175     if(nremoved > 0) {
00176 #ifdef MDCPATREC_WARNING
00177       std::cout<<"ErrMsg(warning)" << "append removed "
00178               << nremoved << " old trajectories" << std::endl;
00179 #endif
00180     }
00181 //  Compute POCA for this trajectory to the point at the end of the existing trajectory
00182     HepPoint3D endpoint = position(glen);
00183     HepPoint3D newend = nexttraj->position(nexttraj->lowRange());
00184     gap = newend.distance(endpoint);
00185     double range[2];
00186     range[0] = nexttraj->lowRange();
00187     range[1] = nexttraj->hiRange();
00188     double delta = max(hiRange() - glen,range[1]-range[0]);
00189     if(gap > _TOL){ // Don't invoke POCA if the point is too close
00190       TrkPoca endpoca(*nexttraj,nexttraj->lowRange(),endpoint,_TOL);
00191       if(endpoca.status().failure()){
00192         retval = TrkErrCode(TrkErrCode::fail,7,"poca failure");
00193         return retval;
00194       }
00195       range[0] = endpoca.flt1();
00196       gap = endpoca.doca();
00197     }
00198 // make sure the global range stays at least as long as before
00199     range[1] = range[0] + delta;
00200 // resize it
00201     nexttraj->setFlightRange(range);
00202 // append the trajectory
00203     _localtraj.push_back(nexttraj);
00204 // append the new global range
00205     _globalrange.push_back(glen+delta);
00206     flightrange[1] = glen+delta;
00207   } else
00208     retval = TrkErrCode(TrkErrCode::fail,6," cannot append before minimum flight range");
00209   return retval;
00210 }

const TrkErrCode & TrkDifPieceTraj::append ( double  gfltlen,
const TrkSimpTraj ,
double &  gap 
)

Definition at line 259 of file TrkDifPieceTraj.cxx.

References TrkSimpTraj::clone().

Referenced by append(), and TrkDifPieceTraj().

00260 {
00261   return append(glen,nexttraj.clone(),gap);
00262 }

TrkDifPieceTraj* TrkDifPieceTraj::clone ( void   )  const [inline, virtual]

Implements Trajectory.

Definition at line 48 of file TrkDifPieceTraj.h.

References TrkDifPieceTraj().

00048 {return new TrkDifPieceTraj(*this); }

double TrkDifPieceTraj::curvature ( double  f = 0.  )  const [virtual]

Implements Trajectory.

Definition at line 437 of file TrkDifPieceTraj.cxx.

References Trajectory::curvature(), and localTrajectory().

00438 {
00439 //
00440 //  First, find the right trajectory piece, then give the local curvature
00441 //
00442   double localflight(0.0);
00443   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00444   return loctraj->curvature(localflight);
00445 }

Hep3Vector TrkDifPieceTraj::delDirect ( double   )  const [virtual]

Implements Trajectory.

Definition at line 448 of file TrkDifPieceTraj.cxx.

References Trajectory::delDirect(), and localTrajectory().

Referenced by getDFInfo().

00449 {
00450 //
00451 //  First, find the right trajectory piece, then give the local value
00452 //
00453   double localflight(0.0);
00454   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00455   return loctraj->delDirect(localflight);
00456 }

HepMatrix TrkDifPieceTraj::derivDeflect ( double  fltlen,
deflectDirection   
) const [virtual]

Implements TrkKalDeriv.

Definition at line 687 of file TrkDifPieceTraj.cxx.

References TrkKalDeriv::derivDeflect(), and localTrajectory().

00688 {
00689   double localflight(0.0);
00690   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00691   return loctraj->derivDeflect(localflight,idir);
00692 }

HepMatrix TrkDifPieceTraj::derivDisplace ( double  fltlen,
deflectDirection  idir 
) const [virtual]

Implements TrkKalDeriv.

Definition at line 695 of file TrkDifPieceTraj.cxx.

References TrkKalDeriv::derivDisplace(), and localTrajectory().

00696 {
00697   double localflight(0.0);
00698   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00699   return loctraj->derivDisplace(localflight,idir);
00700 }

HepMatrix TrkDifPieceTraj::derivPFract ( double  fltlen  )  const [virtual]

Implements TrkKalDeriv.

Definition at line 703 of file TrkDifPieceTraj.cxx.

References TrkKalDeriv::derivPFract(), and localTrajectory().

00704 {
00705   double localflight(0.0);
00706   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00707   return loctraj->derivPFract(localflight);
00708 }

Hep3Vector TrkDifPieceTraj::direction ( double   )  const [virtual]

Implements Trajectory.

Definition at line 426 of file TrkDifPieceTraj.cxx.

References Trajectory::direction(), and localTrajectory().

Referenced by getDFInfo(), and getDFInfo2().

00427 {
00428 //
00429 //  First, find the right trajectory piece, then give the local direction
00430 //
00431   double localflight(0.0);
00432   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00433   return loctraj->direction(localflight);
00434 }

double Trajectory::distTo0thError ( double  s,
double  tol,
int  pathDir 
) const [inherited]

Definition at line 51 of file Trajectory.cxx.

00052 {
00053   return fabs(tolerance);
00054 }

double TrkDifPieceTraj::distTo1stError ( double  s,
double  tol,
int  pathDir 
) const [virtual]

Implements Trajectory.

Definition at line 486 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, check_raw_filter::dist, Trajectory::distTo1stError(), min, STEPEPSILON, and trajIndex().

00487 {
00488 //
00489 //  First, find the right trajectory piece
00490 //
00491   double localflight(0.0);
00492   int index = trajIndex(flightdist,localflight);
00493   const TrkSimpTraj* loctraj = _localtraj[index];
00494 //
00495 //  Ask the local piece for it's dist, and take the minimum of this or the
00496 //  distance to the next trajectory piece
00497 //
00498   double localdist = loctraj->distTo1stError(localflight,tol,dir);
00499 //
00500 //  Take the minimum of this distance and the distance to the next trajectory
00501   double dist = localdist;
00502   if (dir > 0){
00503     if(index < _localtraj.size()-1)
00504       dist = min(localdist,_globalrange[index+1]-flightdist) + STEPEPSILON;
00505   } else {
00506     if(index > 0)
00507       dist = min(localdist,flightdist - _globalrange[index]) + STEPEPSILON;
00508   }
00509   return dist;
00510 }

double TrkDifPieceTraj::distTo2ndError ( double  s,
double  tol,
int  pathDir 
) const [virtual]

Implements Trajectory.

Definition at line 513 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, check_raw_filter::dist, Trajectory::distTo2ndError(), min, STEPEPSILON, and trajIndex().

00514 {
00515 //
00516 //  First, find the right trajectory piece
00517 //
00518   double localflight(0.0);
00519   int index = trajIndex(flightdist,localflight);
00520   const TrkSimpTraj* loctraj = _localtraj[index];
00521 //
00522 //  Ask the local piece for it's dist, and take the minimum of this or the
00523 //  distance to the next trajectory piece
00524 //
00525   double localdist = loctraj->distTo2ndError(localflight,tol,dir);
00526 //
00527 //  Take the minimum of this distance and the distance to the next trajectory
00528   double dist = localdist;
00529   if (dir > 0){
00530     if(index < _localtraj.size()-1)
00531       dist = min(localdist,_globalrange[index+1]-flightdist) + STEPEPSILON;
00532   } else {
00533     if(index > 0)
00534       dist = min(localdist,flightdist - _globalrange[index]) + STEPEPSILON;
00535   }
00536   return dist;
00537 }

void TrkDifPieceTraj::getDFInfo ( double  fltLen,
DifPoint pos,
DifVector direction,
DifVector delDirect 
) const [virtual]

Implements TrkDifTraj.

Definition at line 122 of file TrkDifPieceTraj.cxx.

References delDirect(), direction(), TrkDifTraj::getDFInfo(), localTrajectory(), and boss::pos.

00124 {
00125 //
00126 //  First, find the right trajectory piece, then give the local position
00127 //
00128   double localflight(0.0);
00129   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00130   loctraj->getDFInfo(localflight,pos,direction,delDirect);
00131 }

void TrkDifPieceTraj::getDFInfo2 ( double  fltlen,
DifPoint pos,
DifVector direction 
) const [virtual]

Reimplemented from TrkDifTraj.

Definition at line 134 of file TrkDifPieceTraj.cxx.

References direction(), TrkDifTraj::getDFInfo2(), localTrajectory(), and boss::pos.

00136 {
00137 //
00138 //  First, find the right trajectory piece, then give the local position
00139 //
00140   double localflight(0.0);
00141   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00142   loctraj->getDFInfo2(localflight,pos,direction);
00143 }

void TrkDifPieceTraj::getInfo ( double  fltLen,
HepPoint3D ,
Hep3Vector &  direction,
Hep3Vector &  delDirect 
) const [virtual]

Implements Trajectory.

Definition at line 472 of file TrkDifPieceTraj.cxx.

References Trajectory::getInfo(), and localTrajectory().

00476 {
00477 //
00478 //  First, find the right trajectory piece, then call the local function
00479 //
00480   double localflight(0.0);
00481   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00482   loctraj->getInfo(localflight,point,dir,deldirect);
00483 }

void TrkDifPieceTraj::getInfo ( double  fltLen,
HepPoint3D ,
Hep3Vector &  direction 
) const [virtual]

Implements Trajectory.

Definition at line 459 of file TrkDifPieceTraj.cxx.

References Trajectory::getInfo(), and localTrajectory().

00462 {
00463 //
00464 //  First, find the right trajectory piece, then call the local function
00465 //
00466   double localflight(0.0);
00467   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00468   loctraj->getInfo(localflight,point,dir);
00469 }

double TrkDifPieceTraj::globalDist ( int  index,
double  locdist 
) const [inline, protected]

Definition at line 132 of file TrkDifPieceTraj.h.

References _globalrange, and _localtraj.

Referenced by append(), and prepend().

00132                                                     {
00133     return _globalrange[index] + locdist -  _localtraj[index]->lowRange();
00134   }

double Trajectory::hiRange (  )  const [inline, inherited]

Definition at line 92 of file Trajectory.h.

References Trajectory::flightrange.

Referenced by append(), TrkSimpTraj::changePoint(), MdcUtilitySvc::docaPatPar(), TrkRep::endValidRange(), TrkCompTrk::endValidRange(), TrkSimpTraj::invert(), invert(), locallyValid(), MdcHitOnTrack::MdcHitOnTrack(), TrkSimpTraj::operator==(), prepend(), and Trajectory::range().

00092 {return flightrange[1];}

TrkDifPieceTraj & TrkDifPieceTraj::invert (  ) 

Definition at line 345 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, Trajectory::hiRange(), Trajectory::lowRange(), Trajectory::range(), and Trajectory::setFlightRange().

00346 {
00347 // make local copies & clear data members
00348   std::deque<TrkSimpTraj*> trajcopy; trajcopy.swap(_localtraj);
00349   std::deque<double> rangecopy;      rangecopy.swap(_globalrange);
00350   assert(_localtraj.size()==0);
00351   assert(_globalrange.size()==0);
00352 // global range starts at the end of the old range
00353   _globalrange.push_back(-rangecopy.back());
00354 // loop over the trajectory pieces in backwards order
00355   for(int itraj=trajcopy.size()-1;itraj>=0;itraj--){
00356 // invert the simptraj and re-append it
00357     _localtraj.push_back(&(trajcopy[itraj]->invert()));
00358 // set the global range
00359     _globalrange.push_back(-rangecopy[itraj]);
00360   }
00361 // reset this traj's range
00362   double range[2];
00363   range[0] = -hiRange();
00364   range[1] = -lowRange();
00365   Trajectory::setFlightRange(range);
00366   return *this;
00367 }

double TrkDifPieceTraj::localDist ( int  index,
double  globdist 
) const [inline, protected]

Definition at line 128 of file TrkDifPieceTraj.h.

References _globalrange, and _localtraj.

Referenced by setFlightRange(), and trajIndex().

00128                                                     {
00129     return _localtraj[index]->lowRange() + globdist - _globalrange[index];
00130   }

bool TrkDifPieceTraj::locallyValid ( double  glen,
double  tol = 0.0 
) const

Definition at line 816 of file TrkDifPieceTraj.cxx.

References Trajectory::hiRange(), localTrajectory(), and Trajectory::lowRange().

00817 {
00818   double localflight(0.0);
00819   const TrkSimpTraj* loctraj = localTrajectory(glen,localflight);
00820   return loctraj != 0 &&
00821     localflight-tol <= loctraj->hiRange()  &
00822     localflight+tol >= loctraj->lowRange();
00823 }

const TrkSimpTraj * TrkDifPieceTraj::localTrajectory ( double  ,
double &   
) const [virtual]

Implements TrkDifTraj.

Definition at line 541 of file TrkDifPieceTraj.cxx.

References _localtraj, and trajIndex().

Referenced by curvature(), delDirect(), derivDeflect(), derivDisplace(), derivPFract(), direction(), getDFInfo(), getDFInfo2(), getInfo(), locallyValid(), and position().

00542 {
00543 //
00544 //  Find and return the right trajectory piece
00545 //
00546   int index = trajIndex(flightdist,localflight);
00547   return _localtraj[index];
00548 }

double Trajectory::lowRange (  )  const [inline, inherited]

Definition at line 91 of file Trajectory.h.

References Trajectory::flightrange.

Referenced by append(), TrkSimpTraj::changePoint(), MdcUtilitySvc::docaPatPar(), TrkSimpTraj::invert(), invert(), locallyValid(), MdcHitOnTrack::MdcHitOnTrack(), TrkSimpTraj::operator==(), prepend(), Trajectory::range(), TrkRep::startValidRange(), TrkCompTrk::startValidRange(), trajIndex(), and TrkDifPieceTraj().

00091 {return flightrange[0];}

TrkDifPieceTraj & TrkDifPieceTraj::operator= ( const TrkDifPieceTraj  ) 

Definition at line 146 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, Trajectory::flightrange, genRecEmupikp::i, and EvtCyclic3::other().

00147 {
00148   if (&other == this) return *this;
00149   flightrange[0] = other.flightrange[0];
00150   flightrange[1] = other.flightrange[1];
00151   _globalrange = other._globalrange;
00152 //
00153 // deep-copy all the trajectory pieces
00154 //
00155   std::for_each(_localtraj.begin(),_localtraj.end(),bes::Collection::DeleteObject());
00156   _localtraj.clear(); // _localtraj.reserve(other._localtraj.size());
00157   typedef std::deque<TrkSimpTraj*>::const_iterator iter_t;
00158   for(iter_t i=other._localtraj.begin();i!=other._localtraj.end();++i)
00159     _localtraj.push_back((*i)->clone());
00160   return *this;
00161 }

bool TrkDifPieceTraj::operator== ( const TrkDifPieceTraj other  )  const

Definition at line 826 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, and EvtCyclic3::other().

00826                                                                 {
00827   bool retval(true);
00828   if(retval) retval = _globalrange == other._globalrange;
00829   if(retval) retval = _localtraj.size() == other._localtraj.size();
00830 // loop over component trajs
00831   std::deque<TrkSimpTraj*>::const_iterator miter = _localtraj.begin();
00832   std::deque<TrkSimpTraj*>::const_iterator oiter = other._localtraj.begin();
00833   while(retval && miter != _localtraj.end() && oiter != other._localtraj.end()){
00834     retval = (*oiter)->parameters()->parameter() == (*miter)->parameters()->parameter() &&
00835       (*oiter)->parameters()->covariance() == (*miter)->parameters()->covariance();
00836     miter++;oiter++;
00837   }
00838   return retval;
00839 }

HepPoint3D TrkDifPieceTraj::position ( double   )  const [virtual]

Implements Trajectory.

Definition at line 415 of file TrkDifPieceTraj.cxx.

References localTrajectory(), and Trajectory::position().

Referenced by append(), and prepend().

00416 {
00417 //
00418 //  First, find the right trajectory piece, then give the local position
00419 //
00420   double localflight(0.0);
00421   const TrkSimpTraj* loctraj = localTrajectory(flightdist,localflight);
00422   return loctraj->position(localflight);
00423 }

const TrkErrCode & TrkDifPieceTraj::prepend ( TrkSimpTraj traj,
double &  gap 
)

Definition at line 765 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, _TOL, TrkSimpTraj::clone(), TrkErrCode::fail, Trajectory::flightrange, TrkPocaBase::flt1(), globalDist(), Trajectory::hiRange(), Trajectory::lowRange(), position(), Trajectory::position(), Trajectory::range(), TrkPocaBase::status(), TrkErrCode::succeed, TrkErrCode::success(), and trajIndex().

00766 {
00767   static TrkErrCode retval;
00768   retval = TrkErrCode(TrkErrCode::succeed);
00769 // find out where this piece is relative to the existing pieces.
00770   HepPoint3D end = newtraj->position(newtraj->hiRange());
00771   TrkPoca poca(*this,newtraj->hiRange(),end,_TOL);
00772   if(poca.status().success()){
00773 // find the local trajectory pieces at either end
00774     double local;
00775     int index = trajIndex(poca.flt1(),local);
00776     TrkSimpTraj* oldtraj = _localtraj[index];
00777 // Make sure we're beyond the end of the existing trajectory
00778     if( index == 0 && poca.flt1() < lowRange()){
00779 // we want to split the gap between the traj pieces evenly,
00780       double gapstart = poca.flt1();
00781       double gapend = globalDist(index,oldtraj->hiRange());
00782       double gapmid = (gapend+gapstart)/2.0;
00783       HepPoint3D mid = position(gapmid);
00784 // approximate initial (local) fltlen for poca
00785       double locmid = newtraj->hiRange() - gapstart + gapmid;
00786       TrkPoca midpoca(*newtraj,locmid,mid,_TOL);
00787       if(midpoca.status().success()){
00788 // create a 0-length copy of the new traj to associate with the midpoint.
00789 // This insures correct coverage of the global flight range
00790         TrkSimpTraj* gaptraj = (TrkSimpTraj*)(newtraj->clone());
00791         assert(gaptraj != 0);
00792         double range[2];
00793         range[0] = midpoca.flt1();
00794         range[1] = range[0];
00795         gaptraj->setFlightRange(range);
00796 // insert the trajectories
00797         _localtraj.push_front(gaptraj);
00798         _localtraj.push_front(newtraj);
00799 // append the new global range
00800         _globalrange.push_front(gapmid);
00801         _globalrange.push_front(gapstart-newtraj->range());
00802 // extend the piece-trajs own range
00803         flightrange[0] = _globalrange.front();
00804 // measure the gap at the midpoint
00805         gap = mid.distance(newtraj->position(midpoca.flt1()));
00806       } else
00807         retval = TrkErrCode(TrkErrCode::fail,7,"poca failure");
00808     } else
00809       retval = TrkErrCode(TrkErrCode::fail,8,"invalid range");
00810   } else
00811     retval = TrkErrCode(TrkErrCode::fail,7,"poca failure");
00812   return retval;
00813 }

const TrkErrCode & TrkDifPieceTraj::prepend ( double  ,
const TrkDifPieceTraj ,
double &  gap 
)

Definition at line 308 of file TrkDifPieceTraj.cxx.

References _TOL, TrkErrCode::fail, TrkErrCode::failure(), Trajectory::lowRange(), EvtCyclic3::other(), position(), prepend(), and TrkErrCode::succeed.

00309 {
00310   static TrkErrCode retval;
00311   retval = TrkErrCode(TrkErrCode::succeed);
00312 // find POCA between the trajectories.
00313   double mylen = glen;
00314   HepPoint3D mystart = position(mylen);
00315   double otherlen = other.hiRange();
00316   HepPoint3D otherend = other.position(otherlen);
00317   gap = otherend.distance(mystart);
00318   if(gap > _TOL){ // Don't invoke POCA if the point is too close
00319     TrkPoca endpoca(other,other.hiRange(),mystart,_TOL);
00320     if(endpoca.status().failure()){
00321       retval = TrkErrCode(TrkErrCode::fail,7,"poca failure");
00322       return retval;
00323     }
00324     gap = endpoca.doca();
00325     otherlen = endpoca.flt1();
00326   }
00327 // get the local trajectory piece at this fltlen
00328   double loclen(0);
00329   double piecegap;
00330 // loop over segments in the other trajectory
00331   for(int itraj = other.trajIndex(otherlen,loclen);
00332       itraj >= 0;itraj--) {
00333 // prepend the piece from the other trajectory
00334     retval = prepend(mylen,*(other._localtraj[itraj]),piecegap);
00335     if(retval.failure())
00336       break;
00337 // move backwards
00338     mylen = lowRange();
00339   }
00340   return retval;
00341 }

const TrkErrCode & TrkDifPieceTraj::prepend ( double  gfltlen,
TrkSimpTraj ,
double &  gap 
)

Definition at line 213 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, _TOL, TrkErrCode::fail, Trajectory::flightrange, Trajectory::hiRange(), Trajectory::lowRange(), max, Trajectory::position(), position(), Trajectory::range(), resize(), Trajectory::setFlightRange(), TrkErrCode::succeed, and trkIn.

00214 {
00215   static TrkErrCode retval;
00216   retval = TrkErrCode(TrkErrCode::succeed);
00217 // simple range checks
00218   if(glen <= hiRange()){
00219 // resize
00220     int nremoved = resize(glen,trkIn);
00221     if(nremoved > 0) {
00222 #ifdef MDCPATREC_WARNING
00223       std::cout<<"ErrMsg(warning) "<<  " prepend removed "
00224               << nremoved << " old trajectories" << std::endl;
00225 #endif
00226     }
00227 //  Compute POCA for this trajectory to the point at the end of the existing trajectory
00228     HepPoint3D endpoint = position(glen);
00229     HepPoint3D newend = nexttraj->position(nexttraj->hiRange());
00230     gap = newend.distance(endpoint);
00231     double range[2];
00232     range[0] = nexttraj->lowRange();
00233     range[1] = nexttraj->hiRange();
00234     double delta = max(glen -lowRange(),range[1]-range[0]);
00235     if(gap > _TOL){ // Don't invoke POCA if the point is too close
00236       TrkPoca endpoca(*nexttraj,nexttraj->hiRange(),endpoint,_TOL);
00237       if(endpoca.status().failure()){
00238         retval = TrkErrCode(TrkErrCode::fail,7,"poca failure");
00239         return retval;
00240       }
00241       range[1] = endpoca.flt1();
00242       gap = endpoca.doca();
00243     }
00244 // make sure the global range stays at least as long as before
00245     range[0] = range[1] - delta;
00246 // resize it
00247     nexttraj->setFlightRange(range);
00248 // prepend the trajectory
00249     _localtraj.push_front(nexttraj);
00250 // prepend the new global range
00251     _globalrange.push_front(glen-delta);
00252     flightrange[0] = glen-delta;
00253   } else
00254     retval = TrkErrCode(TrkErrCode::fail,6," cannot prepend after maximum flight range");
00255   return retval;
00256 }

const TrkErrCode & TrkDifPieceTraj::prepend ( double  gfltlen,
const TrkSimpTraj ,
double &  gap 
)

Definition at line 265 of file TrkDifPieceTraj.cxx.

References TrkSimpTraj::clone().

Referenced by prepend(), and TrkDifPieceTraj().

00266 {
00267   return prepend(glen,nexttraj.clone(),gap);
00268 }

void TrkDifPieceTraj::print ( std::ostream os  )  const [virtual]

Reimplemented from Trajectory.

void TrkDifPieceTraj::printAll ( std::ostream os  )  const [virtual]

Reimplemented from Trajectory.

double Trajectory::range (  )  const [inline, inherited]

Definition at line 93 of file Trajectory.h.

References Trajectory::hiRange(), and Trajectory::lowRange().

Referenced by append(), TrkSimpTraj::invert(), invert(), and prepend().

00093 { return hiRange()-lowRange(); }

int TrkDifPieceTraj::resize ( double  len,
trkDirection   
) [protected]

Definition at line 553 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, Trajectory::flightrange, trajIndex(), trkIn, and trkOut.

Referenced by append(), prepend(), and setFlightRange().

00554 {
00555   int nremoved(0);
00556   TrkSimpTraj* trajpiece;
00557   double oldend,locdist;
00558   double lrange[2];
00559   int ipiece = trajIndex(len,locdist);
00560   switch(tdir) {
00561   case trkIn:
00562 //
00563 //  Reset the range.  Delete trajectory pieces till we're in range.
00564 //  This will leave the trajectory with a starting range different from
00565 //  0, but it'll still be self-consistent
00566 //
00567     while(ipiece > 0){
00568       nremoved++;
00569       trajpiece = _localtraj.front(); _localtraj.pop_front();
00570       delete trajpiece;
00571       oldend = _globalrange.front(); _globalrange.pop_front();
00572       ipiece = trajIndex(len,locdist);
00573     }
00574 //  reset the global range
00575     flightrange[0] = len;
00576     _globalrange[ipiece] = len;
00577 //  reset the local traj piece range
00578     lrange[0] = locdist;
00579     lrange[1] = _localtraj[ipiece]->hiRange();
00580     _localtraj[ipiece]->setFlightRange(lrange);
00581     break;
00582   case trkOut:
00583     while(ipiece < _localtraj.size() - 1){
00584       nremoved++;
00585       trajpiece = _localtraj.back(); _localtraj.pop_back();
00586       delete trajpiece;
00587       oldend = _globalrange.back(); _globalrange.pop_back();
00588       ipiece = trajIndex(len,locdist);
00589     }
00590     flightrange[1] = len;
00591     _globalrange[ipiece+1] = len;
00592     lrange[0] = _localtraj[ipiece]->lowRange();
00593     lrange[1] = locdist;
00594     _localtraj[ipiece]->setFlightRange(lrange);
00595     break;
00596   }
00597   return nremoved;
00598 }

void TrkDifPieceTraj::setFlightRange ( double  newrange[2]  )  [virtual]

Reimplemented from Trajectory.

Definition at line 638 of file TrkDifPieceTraj.cxx.

References _globalrange, _localtraj, Trajectory::flightrange, localDist(), resize(), trkIn, and trkOut.

00639 {
00640   double oldend;
00641   double lrange[2];
00642   TrkSimpTraj* trajpiece;
00643 //
00644 //  Check for pathological cases
00645 //
00646   if( newrange[1] > newrange[0] &&
00647       newrange[0] < flightrange[1] &&
00648       newrange[1] > flightrange[0] ) {
00649     resize(newrange[0],trkIn);
00650     resize(newrange[1],trkOut);
00651   } else if(newrange[1] < newrange[0] ){
00652 #ifdef MDCPATREC_ERROR 
00653     std::cout<<"ErrMsg(error) "<< "cannot resize -- invalid range" << std::endl;
00654 #endif
00655   } else {
00656 //
00657 //  Here the new range is completely discontinuous from the
00658 //  old.  We'll just take the first (or last) traj piece,
00659 //  clear out everything else, and reset the ranges.
00660 //
00661     if( newrange[0] > flightrange[1]){
00662       while(_localtraj.size()>1){
00663         trajpiece = _localtraj.front(); _localtraj.pop_front();
00664         delete trajpiece;
00665         oldend = _globalrange.front(); _globalrange.pop_front();
00666       }
00667     } else {
00668       while(_localtraj.size()>1){
00669         trajpiece = _localtraj.back(); _localtraj.pop_back();
00670         delete trajpiece;
00671         oldend = _globalrange.back(); _globalrange.pop_back();
00672       }
00673     }
00674     lrange[0] = localDist(0,newrange[0]);
00675     lrange[1] = localDist(0,newrange[1]);
00676     flightrange[0] = newrange[0];
00677     flightrange[1] = newrange[1];
00678     _globalrange[0] = newrange[0];
00679     _globalrange[1] = newrange[1];
00680     _localtraj[0]->setFlightRange(lrange);
00681   }
00682 }

int TrkDifPieceTraj::trajIndex ( const double &  global,
double &  local 
) const [protected]

Definition at line 371 of file TrkDifPieceTraj.cxx.

References _globalrange, _lastIndex, _localtraj, localDist(), Trajectory::lowRange(), max, and Trajectory::validFlightDistance().

Referenced by append(), distTo1stError(), distTo2ndError(), localTrajectory(), prepend(), and resize().

00372 {
00373   int index(0); // true when there's only 1 entry
00374   if (_localtraj.size() > 1) {
00375     if(validFlightDistance(flightdist)){
00376 //   explicitly check cached value from last call
00377       if ( _lastIndex >= 0 && _lastIndex <  _localtraj.size()-1 &&
00378            flightdist > _globalrange[_lastIndex] && flightdist <
00379            _globalrange[_lastIndex+1] ) {
00380         index = _lastIndex;
00381       } else {
00382 //
00383 //  simple binary search algorithm
00384 //
00385         int hirange = _localtraj.size() - 1;
00386         int lorange = 0;
00387         index = hirange/2;
00388         int oldindex = -1;
00389         while(index != oldindex){
00390           oldindex = index;
00391           if(flightdist < _globalrange[index]){
00392             hirange = index;
00393             index -= max(1,(index-lorange)/2);
00394           } else if(flightdist > _globalrange[index+1]){
00395             lorange = index;
00396             index += max(1,(hirange-index)/2);
00397           }
00398         }
00399       }
00400     } else {
00401 //
00402 //  Return the appropriate end if the requested flightdistance is outside the
00403 //  global range
00404 //
00405       index = (flightdist < lowRange()?0:(_localtraj.size()-1));
00406     }
00407   }
00408   localflight =  localDist(index,flightdist);
00409 // cache value for next time
00410   _lastIndex = index;
00411   return index;
00412 }

bool Trajectory::validFlightDistance ( double  f,
double  tolerance = 0.0 
) const [inline, inherited]

Definition at line 88 of file Trajectory.h.

References Trajectory::flightrange.

Referenced by trajIndex().

00088                                                                      {
00089   return f >= flightrange[0]-tol && f <= flightrange[1]+tol; 
00090 }


Member Data Documentation

std::deque<double> TrkDifPieceTraj::_globalrange [protected]

Definition at line 137 of file TrkDifPieceTraj.h.

Referenced by append(), distTo1stError(), distTo2ndError(), globalDist(), invert(), localDist(), operator=(), operator==(), prepend(), resize(), setFlightRange(), trajIndex(), and TrkDifPieceTraj().

int TrkDifPieceTraj::_lastIndex [mutable, protected]

Definition at line 138 of file TrkDifPieceTraj.h.

Referenced by trajIndex().

std::deque<TrkSimpTraj*> TrkDifPieceTraj::_localtraj [protected]

Definition at line 136 of file TrkDifPieceTraj.h.

Referenced by append(), distTo1stError(), distTo2ndError(), globalDist(), invert(), localDist(), localTrajectory(), operator=(), operator==(), prepend(), resize(), setFlightRange(), trajIndex(), TrkDifPieceTraj(), and ~TrkDifPieceTraj().

double Trajectory::flightrange[2] [protected, inherited]

Definition at line 83 of file Trajectory.h.

Referenced by append(), Trajectory::hiRange(), Trajectory::lowRange(), operator=(), NeutTraj::operator=(), Trajectory::operator=(), MdcSagTraj::operator=(), prepend(), resize(), setFlightRange(), Trajectory::setFlightRange(), Trajectory::Trajectory(), TrkDifPieceTraj(), and Trajectory::validFlightDistance().


Generated on Tue Nov 29 23:36:13 2016 for BOSS_7.0.2 by  doxygen 1.4.7