// @(#)root/geom:$Id$
// Author: Andrei Gheata  2003/04/10

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TBrowser.h"
#include "TPolyLine3D.h"
#include "TPoint.h"
#include "TVirtualPad.h"
#include "TView.h"

#include "TGeoManager.h"
#include "TVirtualGeoPainter.h"
#include "TGeoTrack.h"

//______________________________________________________________________________
// TGeoTrack - Class for user-defined tracks attached to a geometry.
//             Tracks are 3D objects made of points and they store a
//             pointer to a TParticle. The geometry manager holds a list
//             of all tracks that will be deleted on destruction of
//             gGeoManager.
//
//______________________________________________________________________________

ClassImp(TGeoTrack)

//______________________________________________________________________________
TGeoTrack::TGeoTrack()
{
//*-*-*-*-*-*-*-*-*-*-*Tracks default constructor*-*-*-*-*-*-*-*-*
//*-*                  ==========================
   fPointsSize = 0;
   fNpoints    = 0;
   fPoints     = 0;
}

//______________________________________________________________________________
TGeoTrack::TGeoTrack(Int_t id, Int_t pdgcode, TVirtualGeoTrack *parent, TObject *particle)
          :TVirtualGeoTrack(id,pdgcode,parent,particle)
{
// Constructor.
   fPointsSize = 0;
   fNpoints    = 0;
   fPoints     = 0;
   if (fParent==0) {
      SetMarkerColor(2);
      SetMarkerStyle(8);
      SetMarkerSize(0.6);
      SetLineColor(2);
      SetLineWidth(2);
   } else {
      SetMarkerColor(4);
      SetMarkerStyle(8);
      SetMarkerSize(0.6);
      SetLineColor(4);
      SetLineWidth(2);
   }
}

//_____________________________________________________________________________
TGeoTrack::TGeoTrack(const TGeoTrack& other)
                 :TVirtualGeoTrack(other),
                  fPointsSize(other.fPointsSize),
                  fNpoints(other.fNpoints),
                  fPoints(other.fPoints)
{
// Copy ctor. NOT TO BE CALLED.
}

//_____________________________________________________________________________
TGeoTrack& TGeoTrack::operator=(const TGeoTrack& gv)
{
   // Assignment operator. NOT TO BE CALLED.
   if(this!=&gv) {
      TVirtualGeoTrack::operator=(gv);
      fPointsSize=gv.fPointsSize;
      fNpoints=gv.fNpoints;
      fPoints=gv.fPoints;
   }
   return *this;
}

//______________________________________________________________________________
TGeoTrack::~TGeoTrack()
{
// Destructor.
   if (fPoints) delete [] fPoints;
//   if (gPad) gPad->GetListOfPrimitives()->Remove(this);
}

//______________________________________________________________________________
TVirtualGeoTrack *TGeoTrack::AddDaughter(Int_t id, Int_t pdgcode, TObject *particle)
{
// Add a daughter track to this.
   if (!fTracks) fTracks = new TObjArray(1);
   Int_t index = fTracks->GetEntriesFast();
   TGeoTrack *daughter = new TGeoTrack(id,pdgcode,this,particle);
   fTracks->AddAtAndExpand(daughter,index);
   return daughter;
}

//______________________________________________________________________________
Int_t TGeoTrack::AddDaughter(TVirtualGeoTrack *other)
{
// Add a daughter and return its index.
   if (!fTracks) fTracks = new TObjArray(1);
   Int_t index = fTracks->GetEntriesFast();
   fTracks->AddAtAndExpand(other,index);
   other->SetParent(this);
   return index;
}

//______________________________________________________________________________
void TGeoTrack::AnimateTrack(Double_t tmin, Double_t tmax, Double_t nframes, Option_t *option)
{
// Draw animation of this track
   if (tmin<0 || tmin>=tmax || nframes<1) return;
   gGeoManager->SetAnimateTracks();
   gGeoManager->SetVisLevel(1);
   if (!gPad) {
      gGeoManager->GetMasterVolume()->Draw();
   }
   TList *list = gPad->GetListOfPrimitives();
   TIter next(list);
   TObject *obj;
   while ((obj = next())) {
      if (!strcmp(obj->ClassName(), "TGeoTrack")) list->Remove(obj);
   }
   Double_t dt = (tmax-tmin)/Double_t(nframes);
   Double_t delt = 2E-9;
   Double_t t = tmin;
   Bool_t geomanim = kFALSE;
   Bool_t issave = kFALSE;
   TString fname;

   TString opt(option);
   if (opt.Contains("/G")) geomanim = kTRUE;
   if (opt.Contains("/S")) issave = kTRUE;

   TVirtualGeoPainter *p = gGeoManager->GetGeomPainter();
   Double_t *box = p->GetViewBox();
   box[0] = box[1] = box[2] = 0;
   box[3] = box[4] = box[5] = 100;
   gGeoManager->SetTminTmax(0,0);
   Draw(opt.Data());
   Double_t start[6], end[6];
   Int_t i, j;
   Double_t dlat=0, dlong=0, dpsi=0;
   Double_t dd[6] = {0,0,0,0,0,0};
   if (geomanim) {
      p->EstimateCameraMove(tmin+5*dt, tmin+15*dt, start, end);
      for (i=0; i<3; i++) {
         start[i+3] = 20 + 1.3*start[i+3];
         end[i+3] = 20 + 0.9*end[i+3];
      }
      for (i=0; i<6; i++) {
         dd[i] = (end[i]-start[i])/10.;
      }
      memcpy(box, start, 6*sizeof(Double_t));
      p->GetViewAngles(dlong,dlat,dpsi);
      dlong = (-206-dlong)/Double_t(nframes);
      dlat  = (126-dlat)/Double_t(nframes);
      dpsi  = (75-dpsi)/Double_t(nframes);
      p->GrabFocus();
   }

   for (i=0; i<nframes; i++) {
      if (t-delt<0) gGeoManager->SetTminTmax(0,t);
      else gGeoManager->SetTminTmax(t-delt,t);
      if (geomanim) {
         for (j=0; j<6; j++) box[j]+=dd[j];
         p->GrabFocus(1,dlong,dlat,dpsi);
      } else {
         gPad->Modified();
         gPad->Update();
      }
      if (issave) {
         fname = TString::Format("anim%04d.gif", i);
         gPad->Print(fname);
      }
      t += dt;
   }
   gGeoManager->SetAnimateTracks(kFALSE);
}

//______________________________________________________________________________
void TGeoTrack::AddPoint(Double_t x, Double_t y, Double_t z, Double_t t)
{
// Add a point on the track.
   if (!fPoints) {
      fPointsSize = 16;
      fPoints = new Double_t[fPointsSize];
   } else {
      if (fNpoints>=fPointsSize) {
         Double_t *temp = new Double_t[2*fPointsSize];
         memcpy(temp, fPoints, fNpoints*sizeof(Double_t));
         fPointsSize *= 2;
         delete [] fPoints;
         fPoints = temp;
      }
   }
   fPoints[fNpoints++] = x;
   fPoints[fNpoints++] = y;
   fPoints[fNpoints++] = z;
   fPoints[fNpoints++] = t;
}

//______________________________________________________________________________
void TGeoTrack::Browse(TBrowser *b)
{
// How-to-browse for a track.
   if (!b) return;
   Int_t nd = GetNdaughters();
   if (!nd) {
      b->Add(this);
      return;
   }
   for (Int_t i=0; i<nd; i++)
      b->Add(GetDaughter(i));

}

//______________________________________________________________________________
Int_t TGeoTrack::DistancetoPrimitive(Int_t px, Int_t py)
{
// Returns distance to track primitive for picking.
   const Int_t inaxis = 7;
   const Int_t maxdist = 5;
   Int_t dist = 9999;


   Int_t puxmin = gPad->XtoAbsPixel(gPad->GetUxmin());
   Int_t puymin = gPad->YtoAbsPixel(gPad->GetUymin());
   Int_t puxmax = gPad->XtoAbsPixel(gPad->GetUxmax());
   Int_t puymax = gPad->YtoAbsPixel(gPad->GetUymax());

   // return if point is not in the user area
   if (px < puxmin - inaxis) return dist;
   if (py > puymin + inaxis) return dist;
   if (px > puxmax + inaxis) return dist;
   if (py < puymax - inaxis) return dist;

   TView *view = gPad->GetView();
   if (!view) return dist;
   Int_t imin, imax;
   if (TObject::TestBit(kGeoPDrawn) && Size(imin,imax)>=2) {
      Int_t i, dsegment;
      Double_t x1,y1,x2,y2;
      Double_t xndc[3];
      Int_t np = fNpoints>>2;
      if (imin<0) imin=0;
      if (imax>np-1) imax=np-1;
      for (i=imin;i<imax;i++) {
         view->WCtoNDC(&fPoints[i<<2], xndc);
         x1 = xndc[0];
         y1 = xndc[1];
         view->WCtoNDC(&fPoints[(i+1)<<2], xndc);
         x2 = xndc[0];
         y2 = xndc[1];
         dsegment = DistancetoLine(px,py,x1,y1,x2,y2);
//         printf("%i: dseg=%i\n", i, dsegment);
         if (dsegment < dist) {
            dist = dsegment;
            if (dist<maxdist) {
               gPad->SetSelected(this);
               return 0;
            }
         }
      }
      if (dist<maxdist) {
         gPad->SetSelected(this);
         return 0;
      }
   }
   // check now daughters
   Int_t nd = GetNdaughters();
   if (!nd) return dist;
   TGeoTrack *track;
   for (Int_t id=0; id<nd; id++) {
      track = (TGeoTrack*)GetDaughter(id);
      dist = track->DistancetoPrimitive(px,py);
      if (dist<maxdist) return 0;
   }
   return dist;
}

//______________________________________________________________________________
void TGeoTrack::Draw(Option_t *option)
{
// Draw this track overimposed on a geometry, according to option.
// Options (case sensitive):
//  default : track without daughters
//  /D      : track and first level descendents only
//  /*      : track and all descendents
//  /Ntype
//          : descendents of this track with particle name matching input type.
// Options can appear only once but can be combined : e.g. Draw("/D /Npion-")
// Time range for visible track segments can be set via TGeoManager::SetTminTmax()

   if (!gPad) gGeoManager->GetMasterVolume()->Draw();
   char *opt1 = Compress(option); // we will have to delete this ?
   TString opt(opt1);
   Bool_t is_default = kTRUE;
   Bool_t is_onelevel = kFALSE;
   Bool_t is_all = kFALSE;
   Bool_t is_type = kFALSE;
   if (opt.Contains("/D")) {
      is_onelevel = kTRUE;
      is_default = kFALSE;
   }
   if (opt.Contains("/*")) {
      is_all = kTRUE;
      is_default = kFALSE;
   }
   if (opt.Contains("/N")) {
      is_type = kTRUE;
      Int_t ist = opt.Index("/N")+2;
      Int_t ilast = opt.Index("/",ist);
      if (ilast<0) ilast=opt.Length();
      TString type = opt(ist, ilast-ist);
      gGeoManager->SetParticleName(type.Data());
   }
   SetBits(is_default, is_onelevel, is_all, is_type);
   AppendPad("SAME");
   if (!gGeoManager->IsAnimatingTracks()) {
      gPad->Modified();
      gPad->Update();
   }
   delete [] opt1;
   return;
}

 //______________________________________________________________________________
void TGeoTrack::ExecuteEvent(Int_t /*event*/, Int_t /*px*/, Int_t /*py*/)
{
// Event treatment.
   if (!gPad) return;
   gPad->SetCursor(kHand);
}

//______________________________________________________________________________
char *TGeoTrack::GetObjectInfo(Int_t /*px*/, Int_t /*py*/) const
{
// Get some info about the track.
   static TString info;
   Double_t x=0,y=0,z=0,t=0;
   GetPoint(0,x,y,z,t);
   info = TString::Format("%s (%g, %g, %g) tof=%g", GetName(),x,y,z,t);
   return (char*)info.Data();
}

//______________________________________________________________________________
Int_t TGeoTrack::GetPoint(Int_t i, Double_t &x, Double_t &y, Double_t &z, Double_t &t) const
{
// Get coordinates for point I on the track.
   Int_t np = fNpoints>>2;
   if (i<0 || i>=np) {
      Error("GetPoint", "no point %i, indmax=%d", i, np-1);
      return -1;
   }
   Int_t icrt = 4*i;
   x = fPoints[icrt];
   y = fPoints[icrt+1];
   z = fPoints[icrt+2];
   t = fPoints[icrt+3];
   return i;
}

//______________________________________________________________________________
const Double_t *TGeoTrack::GetPoint(Int_t i) const
{
// Return the pointer to the array of points starting with index I.
   if (!fNpoints) return 0;
   return (&fPoints[i<<2]);
}

//______________________________________________________________________________
Int_t TGeoTrack::GetPoint(Double_t tof, Double_t *point, Int_t istart) const
{
// Return the index of point on track having closest TOF smaller than
// the input value. Output POINT is filled with the interpolated value.
   Int_t np = fNpoints>>2;
   if (istart>(np-2)) return (np-1);
   Int_t ip = SearchPoint(tof, istart);
   if (ip<0 || ip>(np-2)) return ip;
   // point in segment (ip, ip+1) where 0<=ip<fNpoints-1
   Int_t i;
   Int_t j = ip<<2;
   Int_t k = (ip+1)<<2;
   Double_t dt  = tof-fPoints[j+3];
   Double_t ddt = fPoints[k+3]-fPoints[j+3];
   for (i=0; i<3; i++) point[i] = fPoints[j+i] +(fPoints[k+i]-fPoints[j+i])*dt/ddt;
   return ip;
}

//______________________________________________________________________________
void TGeoTrack::Paint(Option_t *option)
{
// Paint this track (and descendents) with current attributes.
   Bool_t is_default  = TObject::TestBit(kGeoPDefault);
   Bool_t is_onelevel = TObject::TestBit(kGeoPOnelevel);
   Bool_t is_all      = TObject::TestBit(kGeoPAllDaughters);
   Bool_t is_type     = TObject::TestBit(kGeoPType);
   Bool_t match_type  = kTRUE;
   TObject::SetBit(kGeoPDrawn, kFALSE);
   if (is_type) {
      const char *type = gGeoManager->GetParticleName();
      if (strlen(type) && strcmp(type, GetName())) match_type=kFALSE;
   }
   if (match_type) {
      if (is_default || is_onelevel || is_all) PaintTrack(option);
   }
   // paint now daughters
   Int_t nd = GetNdaughters();
   if (!nd || is_default) return;
   TGeoTrack *track;
   for (Int_t i=0; i<nd; i++) {
      track = (TGeoTrack*)GetDaughter(i);
      if (track->IsInTimeRange()) {
         track->SetBits(is_default,kFALSE,is_all,is_type);
         track->Paint(option);
      }
   }
}

//______________________________________________________________________________
void TGeoTrack::PaintCollect(Double_t time, Double_t *box)
{
// Paint track and daughters.
   Bool_t is_default  = TObject::TestBit(kGeoPDefault);
   Bool_t is_onelevel = TObject::TestBit(kGeoPOnelevel);
   Bool_t is_all      = TObject::TestBit(kGeoPAllDaughters);
   Bool_t is_type     = TObject::TestBit(kGeoPType);
   Bool_t match_type  = kTRUE;
   if (is_type) {
      const char *type = gGeoManager->GetParticleName();
      if (strlen(type) && strcmp(type, GetName())) match_type=kFALSE;
   }
   if (match_type) {
      if (is_default || is_onelevel || is_all) PaintCollectTrack(time, box);
   }
   // loop now daughters
   Int_t nd = GetNdaughters();
   if (!nd || is_default) return;
   TGeoTrack *track;
   for (Int_t i=0; i<nd; i++) {
      track = (TGeoTrack*)GetDaughter(i);
      if (track) track->PaintCollect(time, box);
   }
}

//______________________________________________________________________________
void TGeoTrack::PaintCollectTrack(Double_t time, Double_t *box)
{
// Paint just this track.
   TVirtualGeoPainter *painter = gGeoManager->GetGeomPainter();
   if (!painter) return;
   Int_t np = fNpoints>>2;
   Double_t point[3], local[3];
   Bool_t convert = (gGeoManager->GetTopVolume() == gGeoManager->GetMasterVolume())?kFALSE:kTRUE;
   Int_t ip = GetPoint(time, point);
   if (ip>=0 && ip<np-1) {
      if (convert) gGeoManager->MasterToTop(point, local);
      else memcpy(local, point, 3*sizeof(Double_t));
      painter->AddTrackPoint(local, box);
   }
}

//______________________________________________________________________________
void TGeoTrack::PaintMarker(Double_t *point, Option_t *)
{
// Paint current point of the track as marker.
   TPoint p;
   Double_t xndc[3];
   TView *view = gPad->GetView();
   if (!view) return;
   view->WCtoNDC(point, xndc);
   if (xndc[0] < gPad->GetX1() || xndc[0] > gPad->GetX2()) return;
   if (xndc[1] < gPad->GetY1() || xndc[1] > gPad->GetY2()) return;
   p.fX = gPad->XtoPixel(xndc[0]);
   p.fY = gPad->YtoPixel(xndc[1]);
   TAttMarker::Modify();
   gVirtualX->DrawPolyMarker(1, &p);
}

//______________________________________________________________________________
void TGeoTrack::PaintTrack(Option_t *option)
{
// Paint this track with its current attributes.

   // Check whether there is some 3D view class for this TPad
//   TPadView3D *view3D = (TPadView3D*)gPad->GetView3D();
//   if (view3D) view3D->PaintGeoTrack(this,option); // to be implemented

   // Check if option is 'x3d'.      NOTE: This is a simple checking
   //                                      but since there is no other
   //                                      options yet, this works fine.
   TString opt(option);
   opt.ToLower();
   TObject::SetBit(kGeoPDrawn, kFALSE);
   if (opt.Contains("x")) return;
   Int_t np = fNpoints>>2;
   Int_t imin=0;
   Int_t imax=np-1;
   Int_t ip;
   Double_t start[3] = {0.,0.,0.};
   Double_t end[3] = {0.,0.,0.};
   Double_t seg[6] = {0.,0.,0.,0.,0.,0.};
   Bool_t convert = (gGeoManager->GetTopVolume() == gGeoManager->GetMasterVolume())?kFALSE:kTRUE;
   Double_t tmin=0.,tmax=0.;
   Bool_t is_time = gGeoManager->GetTminTmax(tmin,tmax);
   if (is_time) {
      imin = GetPoint(tmin, start);
      if (imin>=0 && imin<np-1) {
      // we have a starting point -> find ending point
         imax = GetPoint(tmax, end, imin);
         if (imax<np-1) {
         // we also have an ending point -> check if on the same segment with imin
            if (imax==imin) {
               // paint the virtual segment between the 2 points
               TAttLine::Modify();
               if (convert) {
                  gGeoManager->MasterToTop(start, &seg[0]);
                  gGeoManager->MasterToTop(end, &seg[3]);
                  gPad->PaintLine3D(&seg[0], &seg[3]);
               } else {
                  gPad->PaintLine3D(start, end);
               }
            } else {
               // paint the starting, ending and connecting segments
               TAttLine::Modify();
               if (convert) {
                  gGeoManager->MasterToTop(start, &seg[0]);
                  gGeoManager->MasterToTop(&fPoints[(imin+1)<<2], &seg[3]);
                  gPad->PaintLine3D(&seg[0], &seg[3]);
                  gGeoManager->MasterToTop(&fPoints[imax<<2], &seg[0]);
                  gGeoManager->MasterToTop(end, &seg[3]);
                  gPad->PaintLine3D(&seg[0], &seg[3]);
                  for (ip=imin+1; ip<imax; ip++) {
                     gGeoManager->MasterToTop(&fPoints[ip<<2], &seg[0]);
                     gGeoManager->MasterToTop(&fPoints[(ip+1)<<2], &seg[3]);
                     gPad->PaintLine3D(&seg[0], &seg[3]);
                  }
               } else {
                  gPad->PaintLine3D(start, &fPoints[(imin+1)<<2]);
                  gPad->PaintLine3D(&fPoints[imax<<2], end);
                  for (ip=imin+1; ip<imax; ip++) {
                     gPad->PaintLine3D(&fPoints[ip<<2], &fPoints[(ip+1)<<2]);
                  }
               }
            }
            if (convert) {
               gGeoManager->MasterToTop(end, &seg[0]);
               PaintMarker(&seg[0]);
            } else {
               PaintMarker(end);
            }
         } else {
            TAttLine::Modify();
            if (convert) {
               gGeoManager->MasterToTop(start, &seg[0]);
               gGeoManager->MasterToTop(&fPoints[(imin+1)<<2], &seg[3]);
               gPad->PaintLine3D(&seg[0], &seg[3]);
               for (ip=imin+1; ip<np-2; ip++) {
                  gGeoManager->MasterToTop(&fPoints[ip<<2], &seg[0]);
                  gGeoManager->MasterToTop(&fPoints[(ip+1)<<2], &seg[3]);
                  gPad->PaintLine3D(&seg[0], &seg[3]);
               }
            } else {
               gPad->PaintLine3D(start, &fPoints[(imin+1)<<2]);
               for (ip=imin+1; ip<np-2; ip++) {
                  gPad->PaintLine3D(&fPoints[ip<<2], &fPoints[(ip+1)<<2]);
               }
            }
         }
      } else {
         imax = GetPoint(tmax, end);
         if (imax<0 || imax>=(np-1)) return;
         // we have to draw just the end of the track
         TAttLine::Modify();
         if (convert) {
            for (ip=0; ip<imax-1; ip++) {
               gGeoManager->MasterToTop(&fPoints[ip<<2], &seg[0]);
               gGeoManager->MasterToTop(&fPoints[(ip+1)<<2], &seg[3]);
               gPad->PaintLine3D(&seg[0], &seg[3]);
            }
         } else {
            for (ip=0; ip<imax-1; ip++) {
               gPad->PaintLine3D(&fPoints[ip<<2], &fPoints[(ip+1)<<2]);
            }
         }
         if (convert) {
            gGeoManager->MasterToTop(&fPoints[imax<<2], &seg[0]);
            gGeoManager->MasterToTop(end, &seg[3]);
            gPad->PaintLine3D(&seg[0], &seg[3]);
            PaintMarker(&seg[3]);
         } else {
            gPad->PaintLine3D(&fPoints[imax<<2], end);
            PaintMarker(end);
         }
      }
      TObject::SetBit(kGeoPDrawn);
      return;
   }

   // paint all segments from track
   TObject::SetBit(kGeoPDrawn);
   TAttLine::Modify();  // change attributes if necessary
   for (ip=imin; ip<imax; ip++) {
      gPad->PaintLine3D(&fPoints[ip<<2], &fPoints[(ip+1)<<2]);
   }
}

//______________________________________________________________________________
void TGeoTrack::Print(Option_t * /*option*/) const
{
// Print some info about the track.
   Int_t np = fNpoints>>2;
   printf(" TGeoTrack%6i : %s  ===============================\n", fId,GetName());
   printf("   parent =%6i    nd =%3i\n", (fParent)?fParent->GetId():-1, GetNdaughters());
   Double_t x=0,y=0,z=0,t=0;
   GetPoint(0,x,y,z,t);
   printf("   production vertex : (%g, %g, %g) at tof=%g\n", x,y,z,t);
   GetPoint(np-1,x,y,z,t);
   printf("   Npoints =%6i,  last : (%g, %g, %g) at tof=%g\n\n", np,x,y,z,t);
}

//______________________________________________________________________________
Int_t TGeoTrack::Size(Int_t &imin, Int_t &imax)
{
// Return the number of points within the time interval specified by
// TGeoManager class and the corresponding indices.
   Double_t tmin, tmax;
   Int_t np = fNpoints>>2;
   imin = 0;
   imax = np-1;
   Int_t size = np;
   if (!gGeoManager->GetTminTmax(tmin, tmax)) return size;
   imin = SearchPoint(tmin);
   imax = SearchPoint(tmax, imin);
   return (imax-imin+1);
}

//______________________________________________________________________________
Int_t TGeoTrack::SearchPoint(Double_t time, Int_t istart) const
{
// Search index of track point having the closest time tag smaller than
// TIME. Optional start index can be provided.
   Int_t nabove, nbelow, middle, midloc;
   Int_t np = fNpoints>>2;
   nabove = np+1;
   nbelow = istart;
   while (nabove-nbelow > 1) {
      middle = (nabove+nbelow)/2;
      midloc = ((middle-1)<<2)+3;
      if (time == fPoints[midloc]) return middle-1;
      if (time < fPoints[midloc])  nabove = middle;
      else                         nbelow = middle;
   }
   return (nbelow-1);
}

//______________________________________________________________________________
void TGeoTrack::SetBits(Bool_t is_default, Bool_t is_onelevel,
                        Bool_t is_all, Bool_t is_type)
{
// Set drawing bits for this track
   TObject::SetBit(kGeoPDefault, is_default);
   TObject::SetBit(kGeoPOnelevel, is_onelevel);
   TObject::SetBit(kGeoPAllDaughters, is_all);
   TObject::SetBit(kGeoPType, is_type);
}

//______________________________________________________________________________
void TGeoTrack::Sizeof3D() const
{
// Returns 3D size for the track.
}

//______________________________________________________________________________
void TGeoTrack::ResetTrack()
{
// Reset data for this track.
   fNpoints    = 0;
   fPointsSize = 0;
   if (fTracks) {fTracks->Delete(); delete fTracks;}
   fTracks = 0;
   if (fPoints) delete [] fPoints;
   fPoints = 0;
}

 TGeoTrack.cxx:1
 TGeoTrack.cxx:2
 TGeoTrack.cxx:3
 TGeoTrack.cxx:4
 TGeoTrack.cxx:5
 TGeoTrack.cxx:6
 TGeoTrack.cxx:7
 TGeoTrack.cxx:8
 TGeoTrack.cxx:9
 TGeoTrack.cxx:10
 TGeoTrack.cxx:11
 TGeoTrack.cxx:12
 TGeoTrack.cxx:13
 TGeoTrack.cxx:14
 TGeoTrack.cxx:15
 TGeoTrack.cxx:16
 TGeoTrack.cxx:17
 TGeoTrack.cxx:18
 TGeoTrack.cxx:19
 TGeoTrack.cxx:20
 TGeoTrack.cxx:21
 TGeoTrack.cxx:22
 TGeoTrack.cxx:23
 TGeoTrack.cxx:24
 TGeoTrack.cxx:25
 TGeoTrack.cxx:26
 TGeoTrack.cxx:27
 TGeoTrack.cxx:28
 TGeoTrack.cxx:29
 TGeoTrack.cxx:30
 TGeoTrack.cxx:31
 TGeoTrack.cxx:32
 TGeoTrack.cxx:33
 TGeoTrack.cxx:34
 TGeoTrack.cxx:35
 TGeoTrack.cxx:36
 TGeoTrack.cxx:37
 TGeoTrack.cxx:38
 TGeoTrack.cxx:39
 TGeoTrack.cxx:40
 TGeoTrack.cxx:41
 TGeoTrack.cxx:42
 TGeoTrack.cxx:43
 TGeoTrack.cxx:44
 TGeoTrack.cxx:45
 TGeoTrack.cxx:46
 TGeoTrack.cxx:47
 TGeoTrack.cxx:48
 TGeoTrack.cxx:49
 TGeoTrack.cxx:50
 TGeoTrack.cxx:51
 TGeoTrack.cxx:52
 TGeoTrack.cxx:53
 TGeoTrack.cxx:54
 TGeoTrack.cxx:55
 TGeoTrack.cxx:56
 TGeoTrack.cxx:57
 TGeoTrack.cxx:58
 TGeoTrack.cxx:59
 TGeoTrack.cxx:60
 TGeoTrack.cxx:61
 TGeoTrack.cxx:62
 TGeoTrack.cxx:63
 TGeoTrack.cxx:64
 TGeoTrack.cxx:65
 TGeoTrack.cxx:66
 TGeoTrack.cxx:67
 TGeoTrack.cxx:68
 TGeoTrack.cxx:69
 TGeoTrack.cxx:70
 TGeoTrack.cxx:71
 TGeoTrack.cxx:72
 TGeoTrack.cxx:73
 TGeoTrack.cxx:74
 TGeoTrack.cxx:75
 TGeoTrack.cxx:76
 TGeoTrack.cxx:77
 TGeoTrack.cxx:78
 TGeoTrack.cxx:79
 TGeoTrack.cxx:80
 TGeoTrack.cxx:81
 TGeoTrack.cxx:82
 TGeoTrack.cxx:83
 TGeoTrack.cxx:84
 TGeoTrack.cxx:85
 TGeoTrack.cxx:86
 TGeoTrack.cxx:87
 TGeoTrack.cxx:88
 TGeoTrack.cxx:89
 TGeoTrack.cxx:90
 TGeoTrack.cxx:91
 TGeoTrack.cxx:92
 TGeoTrack.cxx:93
 TGeoTrack.cxx:94
 TGeoTrack.cxx:95
 TGeoTrack.cxx:96
 TGeoTrack.cxx:97
 TGeoTrack.cxx:98
 TGeoTrack.cxx:99
 TGeoTrack.cxx:100
 TGeoTrack.cxx:101
 TGeoTrack.cxx:102
 TGeoTrack.cxx:103
 TGeoTrack.cxx:104
 TGeoTrack.cxx:105
 TGeoTrack.cxx:106
 TGeoTrack.cxx:107
 TGeoTrack.cxx:108
 TGeoTrack.cxx:109
 TGeoTrack.cxx:110
 TGeoTrack.cxx:111
 TGeoTrack.cxx:112
 TGeoTrack.cxx:113
 TGeoTrack.cxx:114
 TGeoTrack.cxx:115
 TGeoTrack.cxx:116
 TGeoTrack.cxx:117
 TGeoTrack.cxx:118
 TGeoTrack.cxx:119
 TGeoTrack.cxx:120
 TGeoTrack.cxx:121
 TGeoTrack.cxx:122
 TGeoTrack.cxx:123
 TGeoTrack.cxx:124
 TGeoTrack.cxx:125
 TGeoTrack.cxx:126
 TGeoTrack.cxx:127
 TGeoTrack.cxx:128
 TGeoTrack.cxx:129
 TGeoTrack.cxx:130
 TGeoTrack.cxx:131
 TGeoTrack.cxx:132
 TGeoTrack.cxx:133
 TGeoTrack.cxx:134
 TGeoTrack.cxx:135
 TGeoTrack.cxx:136
 TGeoTrack.cxx:137
 TGeoTrack.cxx:138
 TGeoTrack.cxx:139
 TGeoTrack.cxx:140
 TGeoTrack.cxx:141
 TGeoTrack.cxx:142
 TGeoTrack.cxx:143
 TGeoTrack.cxx:144
 TGeoTrack.cxx:145
 TGeoTrack.cxx:146
 TGeoTrack.cxx:147
 TGeoTrack.cxx:148
 TGeoTrack.cxx:149
 TGeoTrack.cxx:150
 TGeoTrack.cxx:151
 TGeoTrack.cxx:152
 TGeoTrack.cxx:153
 TGeoTrack.cxx:154
 TGeoTrack.cxx:155
 TGeoTrack.cxx:156
 TGeoTrack.cxx:157
 TGeoTrack.cxx:158
 TGeoTrack.cxx:159
 TGeoTrack.cxx:160
 TGeoTrack.cxx:161
 TGeoTrack.cxx:162
 TGeoTrack.cxx:163
 TGeoTrack.cxx:164
 TGeoTrack.cxx:165
 TGeoTrack.cxx:166
 TGeoTrack.cxx:167
 TGeoTrack.cxx:168
 TGeoTrack.cxx:169
 TGeoTrack.cxx:170
 TGeoTrack.cxx:171
 TGeoTrack.cxx:172
 TGeoTrack.cxx:173
 TGeoTrack.cxx:174
 TGeoTrack.cxx:175
 TGeoTrack.cxx:176
 TGeoTrack.cxx:177
 TGeoTrack.cxx:178
 TGeoTrack.cxx:179
 TGeoTrack.cxx:180
 TGeoTrack.cxx:181
 TGeoTrack.cxx:182
 TGeoTrack.cxx:183
 TGeoTrack.cxx:184
 TGeoTrack.cxx:185
 TGeoTrack.cxx:186
 TGeoTrack.cxx:187
 TGeoTrack.cxx:188
 TGeoTrack.cxx:189
 TGeoTrack.cxx:190
 TGeoTrack.cxx:191
 TGeoTrack.cxx:192
 TGeoTrack.cxx:193
 TGeoTrack.cxx:194
 TGeoTrack.cxx:195
 TGeoTrack.cxx:196
 TGeoTrack.cxx:197
 TGeoTrack.cxx:198
 TGeoTrack.cxx:199
 TGeoTrack.cxx:200
 TGeoTrack.cxx:201
 TGeoTrack.cxx:202
 TGeoTrack.cxx:203
 TGeoTrack.cxx:204
 TGeoTrack.cxx:205
 TGeoTrack.cxx:206
 TGeoTrack.cxx:207
 TGeoTrack.cxx:208
 TGeoTrack.cxx:209
 TGeoTrack.cxx:210
 TGeoTrack.cxx:211
 TGeoTrack.cxx:212
 TGeoTrack.cxx:213
 TGeoTrack.cxx:214
 TGeoTrack.cxx:215
 TGeoTrack.cxx:216
 TGeoTrack.cxx:217
 TGeoTrack.cxx:218
 TGeoTrack.cxx:219
 TGeoTrack.cxx:220
 TGeoTrack.cxx:221
 TGeoTrack.cxx:222
 TGeoTrack.cxx:223
 TGeoTrack.cxx:224
 TGeoTrack.cxx:225
 TGeoTrack.cxx:226
 TGeoTrack.cxx:227
 TGeoTrack.cxx:228
 TGeoTrack.cxx:229
 TGeoTrack.cxx:230
 TGeoTrack.cxx:231
 TGeoTrack.cxx:232
 TGeoTrack.cxx:233
 TGeoTrack.cxx:234
 TGeoTrack.cxx:235
 TGeoTrack.cxx:236
 TGeoTrack.cxx:237
 TGeoTrack.cxx:238
 TGeoTrack.cxx:239
 TGeoTrack.cxx:240
 TGeoTrack.cxx:241
 TGeoTrack.cxx:242
 TGeoTrack.cxx:243
 TGeoTrack.cxx:244
 TGeoTrack.cxx:245
 TGeoTrack.cxx:246
 TGeoTrack.cxx:247
 TGeoTrack.cxx:248
 TGeoTrack.cxx:249
 TGeoTrack.cxx:250
 TGeoTrack.cxx:251
 TGeoTrack.cxx:252
 TGeoTrack.cxx:253
 TGeoTrack.cxx:254
 TGeoTrack.cxx:255
 TGeoTrack.cxx:256
 TGeoTrack.cxx:257
 TGeoTrack.cxx:258
 TGeoTrack.cxx:259
 TGeoTrack.cxx:260
 TGeoTrack.cxx:261
 TGeoTrack.cxx:262
 TGeoTrack.cxx:263
 TGeoTrack.cxx:264
 TGeoTrack.cxx:265
 TGeoTrack.cxx:266
 TGeoTrack.cxx:267
 TGeoTrack.cxx:268
 TGeoTrack.cxx:269
 TGeoTrack.cxx:270
 TGeoTrack.cxx:271
 TGeoTrack.cxx:272
 TGeoTrack.cxx:273
 TGeoTrack.cxx:274
 TGeoTrack.cxx:275
 TGeoTrack.cxx:276
 TGeoTrack.cxx:277
 TGeoTrack.cxx:278
 TGeoTrack.cxx:279
 TGeoTrack.cxx:280
 TGeoTrack.cxx:281
 TGeoTrack.cxx:282
 TGeoTrack.cxx:283
 TGeoTrack.cxx:284
 TGeoTrack.cxx:285
 TGeoTrack.cxx:286
 TGeoTrack.cxx:287
 TGeoTrack.cxx:288
 TGeoTrack.cxx:289
 TGeoTrack.cxx:290
 TGeoTrack.cxx:291
 TGeoTrack.cxx:292
 TGeoTrack.cxx:293
 TGeoTrack.cxx:294
 TGeoTrack.cxx:295
 TGeoTrack.cxx:296
 TGeoTrack.cxx:297
 TGeoTrack.cxx:298
 TGeoTrack.cxx:299
 TGeoTrack.cxx:300
 TGeoTrack.cxx:301
 TGeoTrack.cxx:302
 TGeoTrack.cxx:303
 TGeoTrack.cxx:304
 TGeoTrack.cxx:305
 TGeoTrack.cxx:306
 TGeoTrack.cxx:307
 TGeoTrack.cxx:308
 TGeoTrack.cxx:309
 TGeoTrack.cxx:310
 TGeoTrack.cxx:311
 TGeoTrack.cxx:312
 TGeoTrack.cxx:313
 TGeoTrack.cxx:314
 TGeoTrack.cxx:315
 TGeoTrack.cxx:316
 TGeoTrack.cxx:317
 TGeoTrack.cxx:318
 TGeoTrack.cxx:319
 TGeoTrack.cxx:320
 TGeoTrack.cxx:321
 TGeoTrack.cxx:322
 TGeoTrack.cxx:323
 TGeoTrack.cxx:324
 TGeoTrack.cxx:325
 TGeoTrack.cxx:326
 TGeoTrack.cxx:327
 TGeoTrack.cxx:328
 TGeoTrack.cxx:329
 TGeoTrack.cxx:330
 TGeoTrack.cxx:331
 TGeoTrack.cxx:332
 TGeoTrack.cxx:333
 TGeoTrack.cxx:334
 TGeoTrack.cxx:335
 TGeoTrack.cxx:336
 TGeoTrack.cxx:337
 TGeoTrack.cxx:338
 TGeoTrack.cxx:339
 TGeoTrack.cxx:340
 TGeoTrack.cxx:341
 TGeoTrack.cxx:342
 TGeoTrack.cxx:343
 TGeoTrack.cxx:344
 TGeoTrack.cxx:345
 TGeoTrack.cxx:346
 TGeoTrack.cxx:347
 TGeoTrack.cxx:348
 TGeoTrack.cxx:349
 TGeoTrack.cxx:350
 TGeoTrack.cxx:351
 TGeoTrack.cxx:352
 TGeoTrack.cxx:353
 TGeoTrack.cxx:354
 TGeoTrack.cxx:355
 TGeoTrack.cxx:356
 TGeoTrack.cxx:357
 TGeoTrack.cxx:358
 TGeoTrack.cxx:359
 TGeoTrack.cxx:360
 TGeoTrack.cxx:361
 TGeoTrack.cxx:362
 TGeoTrack.cxx:363
 TGeoTrack.cxx:364
 TGeoTrack.cxx:365
 TGeoTrack.cxx:366
 TGeoTrack.cxx:367
 TGeoTrack.cxx:368
 TGeoTrack.cxx:369
 TGeoTrack.cxx:370
 TGeoTrack.cxx:371
 TGeoTrack.cxx:372
 TGeoTrack.cxx:373
 TGeoTrack.cxx:374
 TGeoTrack.cxx:375
 TGeoTrack.cxx:376
 TGeoTrack.cxx:377
 TGeoTrack.cxx:378
 TGeoTrack.cxx:379
 TGeoTrack.cxx:380
 TGeoTrack.cxx:381
 TGeoTrack.cxx:382
 TGeoTrack.cxx:383
 TGeoTrack.cxx:384
 TGeoTrack.cxx:385
 TGeoTrack.cxx:386
 TGeoTrack.cxx:387
 TGeoTrack.cxx:388
 TGeoTrack.cxx:389
 TGeoTrack.cxx:390
 TGeoTrack.cxx:391
 TGeoTrack.cxx:392
 TGeoTrack.cxx:393
 TGeoTrack.cxx:394
 TGeoTrack.cxx:395
 TGeoTrack.cxx:396
 TGeoTrack.cxx:397
 TGeoTrack.cxx:398
 TGeoTrack.cxx:399
 TGeoTrack.cxx:400
 TGeoTrack.cxx:401
 TGeoTrack.cxx:402
 TGeoTrack.cxx:403
 TGeoTrack.cxx:404
 TGeoTrack.cxx:405
 TGeoTrack.cxx:406
 TGeoTrack.cxx:407
 TGeoTrack.cxx:408
 TGeoTrack.cxx:409
 TGeoTrack.cxx:410
 TGeoTrack.cxx:411
 TGeoTrack.cxx:412
 TGeoTrack.cxx:413
 TGeoTrack.cxx:414
 TGeoTrack.cxx:415
 TGeoTrack.cxx:416
 TGeoTrack.cxx:417
 TGeoTrack.cxx:418
 TGeoTrack.cxx:419
 TGeoTrack.cxx:420
 TGeoTrack.cxx:421
 TGeoTrack.cxx:422
 TGeoTrack.cxx:423
 TGeoTrack.cxx:424
 TGeoTrack.cxx:425
 TGeoTrack.cxx:426
 TGeoTrack.cxx:427
 TGeoTrack.cxx:428
 TGeoTrack.cxx:429
 TGeoTrack.cxx:430
 TGeoTrack.cxx:431
 TGeoTrack.cxx:432
 TGeoTrack.cxx:433
 TGeoTrack.cxx:434
 TGeoTrack.cxx:435
 TGeoTrack.cxx:436
 TGeoTrack.cxx:437
 TGeoTrack.cxx:438
 TGeoTrack.cxx:439
 TGeoTrack.cxx:440
 TGeoTrack.cxx:441
 TGeoTrack.cxx:442
 TGeoTrack.cxx:443
 TGeoTrack.cxx:444
 TGeoTrack.cxx:445
 TGeoTrack.cxx:446
 TGeoTrack.cxx:447
 TGeoTrack.cxx:448
 TGeoTrack.cxx:449
 TGeoTrack.cxx:450
 TGeoTrack.cxx:451
 TGeoTrack.cxx:452
 TGeoTrack.cxx:453
 TGeoTrack.cxx:454
 TGeoTrack.cxx:455
 TGeoTrack.cxx:456
 TGeoTrack.cxx:457
 TGeoTrack.cxx:458
 TGeoTrack.cxx:459
 TGeoTrack.cxx:460
 TGeoTrack.cxx:461
 TGeoTrack.cxx:462
 TGeoTrack.cxx:463
 TGeoTrack.cxx:464
 TGeoTrack.cxx:465
 TGeoTrack.cxx:466
 TGeoTrack.cxx:467
 TGeoTrack.cxx:468
 TGeoTrack.cxx:469
 TGeoTrack.cxx:470
 TGeoTrack.cxx:471
 TGeoTrack.cxx:472
 TGeoTrack.cxx:473
 TGeoTrack.cxx:474
 TGeoTrack.cxx:475
 TGeoTrack.cxx:476
 TGeoTrack.cxx:477
 TGeoTrack.cxx:478
 TGeoTrack.cxx:479
 TGeoTrack.cxx:480
 TGeoTrack.cxx:481
 TGeoTrack.cxx:482
 TGeoTrack.cxx:483
 TGeoTrack.cxx:484
 TGeoTrack.cxx:485
 TGeoTrack.cxx:486
 TGeoTrack.cxx:487
 TGeoTrack.cxx:488
 TGeoTrack.cxx:489
 TGeoTrack.cxx:490
 TGeoTrack.cxx:491
 TGeoTrack.cxx:492
 TGeoTrack.cxx:493
 TGeoTrack.cxx:494
 TGeoTrack.cxx:495
 TGeoTrack.cxx:496
 TGeoTrack.cxx:497
 TGeoTrack.cxx:498
 TGeoTrack.cxx:499
 TGeoTrack.cxx:500
 TGeoTrack.cxx:501
 TGeoTrack.cxx:502
 TGeoTrack.cxx:503
 TGeoTrack.cxx:504
 TGeoTrack.cxx:505
 TGeoTrack.cxx:506
 TGeoTrack.cxx:507
 TGeoTrack.cxx:508
 TGeoTrack.cxx:509
 TGeoTrack.cxx:510
 TGeoTrack.cxx:511
 TGeoTrack.cxx:512
 TGeoTrack.cxx:513
 TGeoTrack.cxx:514
 TGeoTrack.cxx:515
 TGeoTrack.cxx:516
 TGeoTrack.cxx:517
 TGeoTrack.cxx:518
 TGeoTrack.cxx:519
 TGeoTrack.cxx:520
 TGeoTrack.cxx:521
 TGeoTrack.cxx:522
 TGeoTrack.cxx:523
 TGeoTrack.cxx:524
 TGeoTrack.cxx:525
 TGeoTrack.cxx:526
 TGeoTrack.cxx:527
 TGeoTrack.cxx:528
 TGeoTrack.cxx:529
 TGeoTrack.cxx:530
 TGeoTrack.cxx:531
 TGeoTrack.cxx:532
 TGeoTrack.cxx:533
 TGeoTrack.cxx:534
 TGeoTrack.cxx:535
 TGeoTrack.cxx:536
 TGeoTrack.cxx:537
 TGeoTrack.cxx:538
 TGeoTrack.cxx:539
 TGeoTrack.cxx:540
 TGeoTrack.cxx:541
 TGeoTrack.cxx:542
 TGeoTrack.cxx:543
 TGeoTrack.cxx:544
 TGeoTrack.cxx:545
 TGeoTrack.cxx:546
 TGeoTrack.cxx:547
 TGeoTrack.cxx:548
 TGeoTrack.cxx:549
 TGeoTrack.cxx:550
 TGeoTrack.cxx:551
 TGeoTrack.cxx:552
 TGeoTrack.cxx:553
 TGeoTrack.cxx:554
 TGeoTrack.cxx:555
 TGeoTrack.cxx:556
 TGeoTrack.cxx:557
 TGeoTrack.cxx:558
 TGeoTrack.cxx:559
 TGeoTrack.cxx:560
 TGeoTrack.cxx:561
 TGeoTrack.cxx:562
 TGeoTrack.cxx:563
 TGeoTrack.cxx:564
 TGeoTrack.cxx:565
 TGeoTrack.cxx:566
 TGeoTrack.cxx:567
 TGeoTrack.cxx:568
 TGeoTrack.cxx:569
 TGeoTrack.cxx:570
 TGeoTrack.cxx:571
 TGeoTrack.cxx:572
 TGeoTrack.cxx:573
 TGeoTrack.cxx:574
 TGeoTrack.cxx:575
 TGeoTrack.cxx:576
 TGeoTrack.cxx:577
 TGeoTrack.cxx:578
 TGeoTrack.cxx:579
 TGeoTrack.cxx:580
 TGeoTrack.cxx:581
 TGeoTrack.cxx:582
 TGeoTrack.cxx:583
 TGeoTrack.cxx:584
 TGeoTrack.cxx:585
 TGeoTrack.cxx:586
 TGeoTrack.cxx:587
 TGeoTrack.cxx:588
 TGeoTrack.cxx:589
 TGeoTrack.cxx:590
 TGeoTrack.cxx:591
 TGeoTrack.cxx:592
 TGeoTrack.cxx:593
 TGeoTrack.cxx:594
 TGeoTrack.cxx:595
 TGeoTrack.cxx:596
 TGeoTrack.cxx:597
 TGeoTrack.cxx:598
 TGeoTrack.cxx:599
 TGeoTrack.cxx:600
 TGeoTrack.cxx:601
 TGeoTrack.cxx:602
 TGeoTrack.cxx:603
 TGeoTrack.cxx:604
 TGeoTrack.cxx:605
 TGeoTrack.cxx:606
 TGeoTrack.cxx:607
 TGeoTrack.cxx:608
 TGeoTrack.cxx:609
 TGeoTrack.cxx:610
 TGeoTrack.cxx:611
 TGeoTrack.cxx:612
 TGeoTrack.cxx:613
 TGeoTrack.cxx:614
 TGeoTrack.cxx:615
 TGeoTrack.cxx:616
 TGeoTrack.cxx:617
 TGeoTrack.cxx:618
 TGeoTrack.cxx:619
 TGeoTrack.cxx:620
 TGeoTrack.cxx:621
 TGeoTrack.cxx:622
 TGeoTrack.cxx:623
 TGeoTrack.cxx:624
 TGeoTrack.cxx:625
 TGeoTrack.cxx:626
 TGeoTrack.cxx:627
 TGeoTrack.cxx:628
 TGeoTrack.cxx:629
 TGeoTrack.cxx:630
 TGeoTrack.cxx:631
 TGeoTrack.cxx:632
 TGeoTrack.cxx:633
 TGeoTrack.cxx:634
 TGeoTrack.cxx:635
 TGeoTrack.cxx:636
 TGeoTrack.cxx:637
 TGeoTrack.cxx:638
 TGeoTrack.cxx:639
 TGeoTrack.cxx:640
 TGeoTrack.cxx:641
 TGeoTrack.cxx:642
 TGeoTrack.cxx:643
 TGeoTrack.cxx:644
 TGeoTrack.cxx:645
 TGeoTrack.cxx:646
 TGeoTrack.cxx:647
 TGeoTrack.cxx:648
 TGeoTrack.cxx:649
 TGeoTrack.cxx:650
 TGeoTrack.cxx:651
 TGeoTrack.cxx:652
 TGeoTrack.cxx:653
 TGeoTrack.cxx:654
 TGeoTrack.cxx:655
 TGeoTrack.cxx:656
 TGeoTrack.cxx:657
 TGeoTrack.cxx:658
 TGeoTrack.cxx:659
 TGeoTrack.cxx:660
 TGeoTrack.cxx:661
 TGeoTrack.cxx:662
 TGeoTrack.cxx:663
 TGeoTrack.cxx:664
 TGeoTrack.cxx:665
 TGeoTrack.cxx:666
 TGeoTrack.cxx:667
 TGeoTrack.cxx:668
 TGeoTrack.cxx:669
 TGeoTrack.cxx:670
 TGeoTrack.cxx:671
 TGeoTrack.cxx:672
 TGeoTrack.cxx:673
 TGeoTrack.cxx:674
 TGeoTrack.cxx:675
 TGeoTrack.cxx:676
 TGeoTrack.cxx:677
 TGeoTrack.cxx:678
 TGeoTrack.cxx:679
 TGeoTrack.cxx:680
 TGeoTrack.cxx:681
 TGeoTrack.cxx:682
 TGeoTrack.cxx:683
 TGeoTrack.cxx:684
 TGeoTrack.cxx:685
 TGeoTrack.cxx:686
 TGeoTrack.cxx:687
 TGeoTrack.cxx:688
 TGeoTrack.cxx:689
 TGeoTrack.cxx:690
 TGeoTrack.cxx:691
 TGeoTrack.cxx:692
 TGeoTrack.cxx:693
 TGeoTrack.cxx:694
 TGeoTrack.cxx:695
 TGeoTrack.cxx:696
 TGeoTrack.cxx:697