// @(#)root/geom:$Id$
// Author: Andrei Gheata   31/01/02
// TGeoCone::Contains() and DistFromInside() implemented by Mihaela Gheata

/*************************************************************************
 * 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.             *
 *************************************************************************/

//--------------------------------------------------------------------------
// TGeoCone - conical tube  class. It has 5 parameters :
//            dz - half length in z
//            Rmin1, Rmax1 - inside and outside radii at -dz
//            Rmin2, Rmax2 - inside and outside radii at +dz
//
//--------------------------------------------------------------------------
//Begin_Html
/*
<img src="gif/t_cone.gif">
*/
//End_Html
//
//Begin_Html
/*
<img src="gif/t_conedivR.gif">
*/
//End_Html
//
//Begin_Html
/*
<img src="gif/t_conedivPHI.gif">
*/
//End_Html
//Begin_Html
/*
<img src="gif/t_conedivZ.gif">
*/
//End_Html

//--------------------------------------------------------------------------
// TGeoConeSeg - a phi segment of a conical tube. Has 7 parameters :
//            - the same 5 as a cone;
//            - first phi limit (in degrees)
//            - second phi limit
//
//--------------------------------------------------------------------------
//
//Begin_Html
/*
<img src="gif/t_coneseg.gif">
*/
//End_Html
//
//Begin_Html
/*
<img src="gif/t_conesegdivstepZ.gif">
*/
//End_Html

#include "Riostream.h"

#include "TGeoManager.h"
#include "TGeoVolume.h"
#include "TVirtualGeoPainter.h"
#include "TGeoCone.h"
#include "TVirtualPad.h"
#include "TBuffer3D.h"
#include "TBuffer3DTypes.h"
#include "TMath.h"

ClassImp(TGeoCone)

//_____________________________________________________________________________
TGeoCone::TGeoCone()
{
// Default constructor
   SetShapeBit(TGeoShape::kGeoCone);
   fDz    = 0.0;
   fRmin1 = 0.0;
   fRmax1 = 0.0;
   fRmin2 = 0.0;
   fRmax2 = 0.0;
}

//_____________________________________________________________________________
TGeoCone::TGeoCone(Double_t dz, Double_t rmin1, Double_t rmax1,
                   Double_t rmin2, Double_t rmax2)
         :TGeoBBox(0, 0, 0)
{
// Default constructor specifying minimum and maximum radius
   SetShapeBit(TGeoShape::kGeoCone);
   SetConeDimensions(dz, rmin1, rmax1, rmin2, rmax2);
   if ((dz<0) || (rmin1<0) || (rmax1<0) || (rmin2<0) || (rmax2<0)) {
      SetShapeBit(kGeoRunTimeShape);
   }
   else ComputeBBox();
}

//_____________________________________________________________________________
TGeoCone::TGeoCone(const char *name, Double_t dz, Double_t rmin1, Double_t rmax1,
                   Double_t rmin2, Double_t rmax2)
         :TGeoBBox(name, 0, 0, 0)
{
// Default constructor specifying minimum and maximum radius
   SetShapeBit(TGeoShape::kGeoCone);
   SetConeDimensions(dz, rmin1, rmax1, rmin2, rmax2);
   if ((dz<0) || (rmin1<0) || (rmax1<0) || (rmin2<0) || (rmax2<0)) {
      SetShapeBit(kGeoRunTimeShape);
   }
   else ComputeBBox();
}

//_____________________________________________________________________________
TGeoCone::TGeoCone(Double_t *param)
         :TGeoBBox(0, 0, 0)
{
// Default constructor specifying minimum and maximum radius
// param[0] = dz
// param[1] = Rmin1
// param[2] = Rmax1
// param[3] = Rmin2
// param[4] = Rmax2
   SetShapeBit(TGeoShape::kGeoCone);
   SetDimensions(param);
   if ((fDz<0) || (fRmin1<0) || (fRmax1<0) || (fRmin2<0) || (fRmax2<0))
      SetShapeBit(kGeoRunTimeShape);
   else ComputeBBox();
}

//_____________________________________________________________________________
Double_t TGeoCone::Capacity() const
{
// Computes capacity of the shape in [length^3]
   return TGeoCone::Capacity(fDz, fRmin1, fRmax1, fRmin2, fRmax2);
}

//_____________________________________________________________________________
Double_t TGeoCone::Capacity(Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2)
{
// Computes capacity of the shape in [length^3]
   Double_t capacity = (2.*dz*TMath::Pi()/3.)*(rmax1*rmax1+rmax2*rmax2+rmax1*rmax2-
                                               rmin1*rmin1-rmin2*rmin2-rmin1*rmin2);
   return capacity;
}

//_____________________________________________________________________________
TGeoCone::~TGeoCone()
{
// destructor
}

//_____________________________________________________________________________
void TGeoCone::ComputeBBox()
{
// compute bounding box of the sphere
   TGeoBBox *box = (TGeoBBox*)this;
   box->SetBoxDimensions(TMath::Max(fRmax1, fRmax2), TMath::Max(fRmax1, fRmax2), fDz);
   memset(fOrigin, 0, 3*sizeof(Double_t));
}

//_____________________________________________________________________________
void TGeoCone::ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
{
// Compute normal to closest surface from POINT.
   Double_t safr,safe,phi;
   memset(norm,0,3*sizeof(Double_t));
   phi = TMath::ATan2(point[1],point[0]);
   Double_t cphi = TMath::Cos(phi);
   Double_t sphi = TMath::Sin(phi);
   Double_t ro1 = 0.5*(fRmin1+fRmin2);
   Double_t tg1 = 0.5*(fRmin2-fRmin1)/fDz;
   Double_t cr1 = 1./TMath::Sqrt(1.+tg1*tg1);
   Double_t ro2 = 0.5*(fRmax1+fRmax2);
   Double_t tg2 = 0.5*(fRmax2-fRmax1)/fDz;
   Double_t cr2 = 1./TMath::Sqrt(1.+tg2*tg2);

   Double_t r=TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
   Double_t rin = tg1*point[2]+ro1;
   Double_t rout = tg2*point[2]+ro2;
   safe = TMath::Abs(fDz-TMath::Abs(point[2]));
   norm[2] = 1;

   safr = (ro1>0)?(TMath::Abs((r-rin)*cr1)):TGeoShape::Big();
   if (safr<safe) {
      safe = safr;
      norm[0] = cr1*cphi;
      norm[1] = cr1*sphi;
      norm[2] = -tg1*cr1;
   }
   safr = TMath::Abs((rout-r)*cr2);
   if (safr<safe) {
      norm[0] = cr2*cphi;
      norm[1] = cr2*sphi;
      norm[2] = -tg2*cr2;
   }
   if (norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2]<0) {
      norm[0] = -norm[0];
      norm[1] = -norm[1];
      norm[2] = -norm[2];
   }
}

//_____________________________________________________________________________
void TGeoCone::ComputeNormalS(const Double_t *point, const Double_t *dir, Double_t *norm,
                              Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2)
{
// Compute normal to closest surface from POINT.
   Double_t safe,phi;
   memset(norm,0,3*sizeof(Double_t));
   phi = TMath::ATan2(point[1],point[0]);
   Double_t cphi = TMath::Cos(phi);
   Double_t sphi = TMath::Sin(phi);
   Double_t ro1 = 0.5*(rmin1+rmin2);
   Double_t tg1 = 0.5*(rmin2-rmin1)/dz;
   Double_t cr1 = 1./TMath::Sqrt(1.+tg1*tg1);
   Double_t ro2 = 0.5*(rmax1+rmax2);
   Double_t tg2 = 0.5*(rmax2-rmax1)/dz;
   Double_t cr2 = 1./TMath::Sqrt(1.+tg2*tg2);

   Double_t r=TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
   Double_t rin = tg1*point[2]+ro1;
   Double_t rout = tg2*point[2]+ro2;
   safe = (ro1>0)?(TMath::Abs((r-rin)*cr1)):TGeoShape::Big();
   norm[0] = cr1*cphi;
   norm[1] = cr1*sphi;
   norm[2] = -tg1*cr1;
   if (TMath::Abs((rout-r)*cr2)<safe) {
      norm[0] = cr2*cphi;
      norm[1] = cr2*sphi;
      norm[2] = -tg2*cr2;
   }
   if (norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2]<0) {
      norm[0] = -norm[0];
      norm[1] = -norm[1];
      norm[2] = -norm[2];
   }
}

//_____________________________________________________________________________
Bool_t TGeoCone::Contains(const Double_t *point) const
{
// test if point is inside this cone
   if (TMath::Abs(point[2]) > fDz) return kFALSE;
   Double_t r2 = point[0]*point[0]+point[1]*point[1];
   Double_t rl = 0.5*(fRmin2*(point[2]+fDz)+fRmin1*(fDz-point[2]))/fDz;
   Double_t rh = 0.5*(fRmax2*(point[2]+fDz)+fRmax1*(fDz-point[2]))/fDz;
   if ((r2<rl*rl) || (r2>rh*rh)) return kFALSE;
   return kTRUE;
}

//_____________________________________________________________________________
Double_t TGeoCone::DistFromInsideS(const Double_t *point, const Double_t *dir, Double_t dz,
                              Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2)
{
// Compute distance from inside point to surface of the cone (static)
// Boundary safe algorithm.
   if (dz<=0) return TGeoShape::Big();
   // compute distance to surface
   // Do Z
   Double_t sz = TGeoShape::Big();
   if (dir[2]) {
      sz = (TMath::Sign(dz, dir[2])-point[2])/dir[2];
      if (sz<=0) return 0.0;
   }
   Double_t rsq=point[0]*point[0]+point[1]*point[1];
   Double_t zinv = 1./dz;
   Double_t rin = 0.5*(rmin1+rmin2+(rmin2-rmin1)*point[2]*zinv);
   // Do Rmin
   Double_t sr = TGeoShape::Big();
   Double_t b,delta,zi;
   if (rin>0) {
      // Protection in case point is actually outside the cone
      if (rsq < rin*(rin+TGeoShape::Tolerance())) {
         Double_t ddotn = point[0]*dir[0]+point[1]*dir[1]+0.5*(rmin1-rmin2)*dir[2]*zinv*TMath::Sqrt(rsq);
         if (ddotn<=0) return 0.0;
      } else {
         TGeoCone::DistToCone(point, dir, dz, rmin1, rmin2, b, delta);
         if (delta>0) {
            sr = -b-delta;
            if (sr>0) {
               zi = point[2]+sr*dir[2];
               if (TMath::Abs(zi)<=dz) return TMath::Min(sz,sr);
            }
            sr = -b+delta;
            if (sr>0) {
               zi = point[2]+sr*dir[2];
               if (TMath::Abs(zi)<=dz) return TMath::Min(sz,sr);
            }
         }
      }
   }
   // Do Rmax
   Double_t rout = 0.5*(rmax1+rmax2+(rmax2-rmax1)*point[2]*zinv);
   if (rsq > rout*(rout-TGeoShape::Tolerance())) {
      Double_t ddotn = point[0]*dir[0]+point[1]*dir[1]+0.5*(rmax1-rmax2)*dir[2]*zinv*TMath::Sqrt(rsq);
      if (ddotn>=0) return 0.0;
      TGeoCone::DistToCone(point, dir, dz, rmax1, rmax2, b, delta);
      if (delta<0) return 0.0;
      sr = -b+delta;
      if (sr<0) return sz;
      if (TMath::Abs(-b-delta)>sr) return sz;
      zi = point[2]+sr*dir[2];
      if (TMath::Abs(zi)<=dz) return TMath::Min(sz,sr);
      return sz;
   }
   TGeoCone::DistToCone(point, dir, dz, rmax1, rmax2, b, delta);
   if (delta>0) {
      sr = -b-delta;
      if (sr>0) {
         zi = point[2]+sr*dir[2];
         if (TMath::Abs(zi)<=dz) return TMath::Min(sz,sr);
      }
      sr = -b+delta;
      if (sr>TGeoShape::Tolerance()) {
         zi = point[2]+sr*dir[2];
         if (TMath::Abs(zi)<=dz) return TMath::Min(sz,sr);
      }
   }
   return sz;
}

//_____________________________________________________________________________
Double_t TGeoCone::DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact, Double_t step, Double_t *safe) const
{
// Compute distance from inside point to surface of the cone
// Boundary safe algorithm.

   if (iact<3 && safe) {
      *safe = Safety(point, kTRUE);
      if (iact==0) return TGeoShape::Big();
      if ((iact==1) && (*safe>step)) return TGeoShape::Big();
   }
   // compute distance to surface
   return TGeoCone::DistFromInsideS(point, dir, fDz, fRmin1, fRmax1, fRmin2, fRmax2);
}

//_____________________________________________________________________________
Double_t TGeoCone::DistFromOutsideS(const Double_t *point, const Double_t *dir, Double_t dz,
                             Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2)
{
// Compute distance from outside point to surface of the tube
// Boundary safe algorithm.
   // compute distance to Z planes
   if (dz<=0) return TGeoShape::Big();
   Double_t snxt;
   Double_t xp, yp, zp;
   Bool_t inz = kTRUE;

   if (point[2]<=-dz) {
      if (dir[2]<=0) return TGeoShape::Big();
      snxt = (-dz-point[2])/dir[2];
      xp = point[0]+snxt*dir[0];
      yp = point[1]+snxt*dir[1];
      Double_t r2 = xp*xp+yp*yp;
      if ((r2>=rmin1*rmin1) && (r2<=rmax1*rmax1)) return snxt;
      inz = kFALSE;
   } else {
      if (point[2]>=dz) {
         if (dir[2]>=0) return TGeoShape::Big();
         snxt = (dz-point[2])/dir[2];
         xp = point[0]+snxt*dir[0];
         yp = point[1]+snxt*dir[1];
         Double_t r2 = xp*xp+yp*yp;
         if ((r2>=rmin2*rmin2) && (r2<=rmax2*rmax2)) return snxt;
         inz = kFALSE;
      }
   }

   Double_t rsq = point[0]*point[0]+point[1]*point[1];
   Double_t dzinv = 1./dz;
   Double_t ro1=0.5*(rmin1+rmin2);
   Bool_t hasrmin = (ro1>0)?kTRUE:kFALSE;
   Double_t tg1 = 0.;
   Double_t rin = 0.;
   Bool_t inrmin = kTRUE;  // r>=rmin
   if (hasrmin) {
      tg1=0.5*(rmin2-rmin1)*dzinv;
      rin=ro1+tg1*point[2];
      if (rin>0 && rsq<rin*(rin-TGeoShape::Tolerance())) inrmin=kFALSE;
   }
   Double_t ro2=0.5*(rmax1+rmax2);
   Double_t tg2=0.5*(rmax2-rmax1)*dzinv;
   Double_t rout=tg2*point[2]+ro2;
   Bool_t inrmax = kFALSE;
   if (rout>0 && rsq<rout*(rout+TGeoShape::Tolerance())) inrmax=kTRUE;
   Bool_t in = inz & inrmin & inrmax;
   Double_t b,delta;
   // If inside cone, we are most likely on a boundary within machine precision.
   if (in) {
      Double_t r=TMath::Sqrt(rsq);
      Double_t safz = dz-TMath::Abs(point[2]); // positive
      Double_t safrmin = (hasrmin)?(r-rin):TGeoShape::Big();
      Double_t safrmax = rout - r;
      if (safz<=safrmin && safz<=safrmax) {
         // on Z boundary
         if (point[2]*dir[2]<0) return 0.0;
         return TGeoShape::Big();
      }
      if (safrmax<safrmin) {
         // on rmax boundary
         Double_t ddotn = point[0]*dir[0]+point[1]*dir[1]-tg2*dir[2]*r;
         if (ddotn<=0) return 0.0;
         return TGeoShape::Big();
      }
      // on rmin boundary
      Double_t ddotn = point[0]*dir[0]+point[1]*dir[1]-tg1*dir[2]*r;
      if (ddotn>=0) return 0.0;
      // we can cross (+) solution of rmin
      TGeoCone::DistToCone(point, dir, dz, rmin1, rmin2, b, delta);

      if (delta<0) return 0.0;
      snxt = -b+delta;
      if (snxt<0) return TGeoShape::Big();
      if (TMath::Abs(-b-delta)>snxt) return TGeoShape::Big();
      zp = point[2]+snxt*dir[2];
      if (TMath::Abs(zp)<=dz) return snxt;
      return TGeoShape::Big();
   }

   // compute distance to inner cone
   snxt = TGeoShape::Big();
   if (!inrmin) {
      // ray can cross inner cone (but not only!)
      TGeoCone::DistToCone(point, dir, dz, rmin1, rmin2, b, delta);
      if (delta<0) return TGeoShape::Big();
      snxt = -b+delta;
      if (snxt>0) {
         zp = point[2]+snxt*dir[2];
         if (TMath::Abs(zp)<=dz) return snxt;
      }
      snxt = -b-delta;
      if (snxt>0) {
         zp = point[2]+snxt*dir[2];
         if (TMath::Abs(zp)<=dz) return snxt;
      }
      snxt = TGeoShape::Big();
   } else {
      if (hasrmin) {
         TGeoCone::DistToCone(point, dir, dz, rmin1, rmin2, b, delta);
         if (delta>0) {
            Double_t din = -b+delta;
            if (din>0) {
               zp = point[2]+din*dir[2];
               if (TMath::Abs(zp)<=dz) snxt = din;
            }
         }
      }
   }

   if (inrmax) return snxt;
   // We can cross outer cone, both solutions possible
   // compute distance to outer cone
   TGeoCone::DistToCone(point, dir, dz, rmax1, rmax2, b, delta);
   if (delta<0) return snxt;
   Double_t dout = -b-delta;
   if (dout>0 && dout<snxt) {
      zp = point[2]+dout*dir[2];
      if (TMath::Abs(zp)<=dz) return dout;
   }
   dout = -b+delta;
   if (dout<=0 || dout>snxt) return snxt;
   zp = point[2]+dout*dir[2];
   if (TMath::Abs(zp)<=dz) return dout;
   return snxt;
}

//_____________________________________________________________________________
Double_t TGeoCone::DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact, Double_t step, Double_t *safe) const
{
// compute distance from outside point to surface of the tube
   // compute safe radius
   if (iact<3 && safe) {
      *safe = Safety(point, kFALSE);
      if (iact==0) return TGeoShape::Big();
      if ((iact==1) && (*safe>step)) return TGeoShape::Big();
   }
// Check if the bounding box is crossed within the requested distance
   Double_t sdist = TGeoBBox::DistFromOutside(point,dir, fDX, fDY, fDZ, fOrigin, step);
   if (sdist>=step) return TGeoShape::Big();
   // compute distance to Z planes
   return TGeoCone::DistFromOutsideS(point, dir, fDz, fRmin1, fRmax1, fRmin2, fRmax2);
}

//_____________________________________________________________________________
void TGeoCone::DistToCone(const Double_t *point, const Double_t *dir, Double_t dz, Double_t r1, Double_t r2,
                              Double_t &b, Double_t &delta)
{
   // Static method to compute distance to a conical surface with :
   // - r1, z1 - radius and Z position of lower base
   // - r2, z2 - radius and Z position of upper base
   delta = -1.;
   if (dz<0) return;
   Double_t ro0 = 0.5*(r1+r2);
   Double_t tz  = 0.5*(r2-r1)/dz;
   Double_t rsq = point[0]*point[0] + point[1]*point[1];
   Double_t rc = ro0 + point[2]*tz;

   Double_t a = dir[0]*dir[0] + dir[1]*dir[1] - tz*tz*dir[2]*dir[2];
   b = point[0]*dir[0] + point[1]*dir[1] - tz*rc*dir[2];
   Double_t c = rsq - rc*rc;

   if (TMath::Abs(a)<TGeoShape::Tolerance()) {
      if (TMath::Abs(b)<TGeoShape::Tolerance()) return;
      b = 0.5*c/b;
      delta = 0.;
      return;
   }
   a = 1./a;
   b *= a;
   c *= a;
   delta = b*b - c;
   if (delta>0) {
      delta = TMath::Sqrt(delta);
   } else {
      delta = -1.;
   }
}

//_____________________________________________________________________________
Int_t TGeoCone::DistancetoPrimitive(Int_t px, Int_t py)
{
// compute closest distance from point px,py to each corner
   Int_t n = gGeoManager->GetNsegments();
   const Int_t numPoints = 4*n;
   return ShapeDistancetoPrimitive(numPoints, px, py);
}

//_____________________________________________________________________________
TGeoVolume *TGeoCone::Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv,
                             Double_t start, Double_t step)
{
//--- Divide this cone shape belonging to volume "voldiv" into ndiv volumes
// called divname, from start position with the given step. Returns pointer
// to created division cell volume in case of Z divisions. For Z division
// creates all volumes with different shapes and returns pointer to volume that
// was divided. In case a wrong division axis is supplied, returns pointer to
// volume that was divided.
   TGeoShape *shape;           //--- shape to be created
   TGeoVolume *vol;            //--- division volume to be created
   TGeoVolumeMulti *vmulti;    //--- generic divided volume
   TGeoPatternFinder *finder;  //--- finder to be attached
   TString opt = "";           //--- option to be attached
   Int_t id;
   Double_t end = start+ndiv*step;
   switch (iaxis) {
      case 1:  //---              R division
         Error("Divide","division of a cone on R not implemented");
         return 0;
      case 2:  // ---             Phi division
         finder = new TGeoPatternCylPhi(voldiv, ndiv, start, end);
         voldiv->SetFinder(finder);
         finder->SetDivIndex(voldiv->GetNdaughters());
         shape = new TGeoConeSeg(fDz, fRmin1, fRmax1, fRmin2, fRmax2, -step/2, step/2);
         vol = new TGeoVolume(divname, shape, voldiv->GetMedium());
         vmulti = gGeoManager->MakeVolumeMulti(divname, voldiv->GetMedium());
         vmulti->AddVolume(vol);
         opt = "Phi";
         for (id=0; id<ndiv; id++) {
            voldiv->AddNodeOffset(vol, id, start+id*step+step/2, opt.Data());
            ((TGeoNodeOffset*)voldiv->GetNodes()->At(voldiv->GetNdaughters()-1))->SetFinder(finder);
         }
         return vmulti;
      case 3: //---               Z division
         vmulti = gGeoManager->MakeVolumeMulti(divname, voldiv->GetMedium());
         finder = new TGeoPatternZ(voldiv, ndiv, start, end);
         voldiv->SetFinder(finder);
         finder->SetDivIndex(voldiv->GetNdaughters());
         for (id=0; id<ndiv; id++) {
            Double_t z1 = start+id*step;
            Double_t z2 = start+(id+1)*step;
            Double_t rmin1n = 0.5*(fRmin1*(fDz-z1)+fRmin2*(fDz+z1))/fDz;
            Double_t rmax1n = 0.5*(fRmax1*(fDz-z1)+fRmax2*(fDz+z1))/fDz;
            Double_t rmin2n = 0.5*(fRmin1*(fDz-z2)+fRmin2*(fDz+z2))/fDz;
            Double_t rmax2n = 0.5*(fRmax1*(fDz-z2)+fRmax2*(fDz+z2))/fDz;
            shape = new TGeoCone(0.5*step,rmin1n, rmax1n, rmin2n, rmax2n);
            vol = new TGeoVolume(divname, shape, voldiv->GetMedium());
            vmulti->AddVolume(vol);
            opt = "Z";
            voldiv->AddNodeOffset(vol, id, start+id*step+step/2, opt.Data());
            ((TGeoNodeOffset*)voldiv->GetNodes()->At(voldiv->GetNdaughters()-1))->SetFinder(finder);
         }
         return vmulti;
      default:
         Error("Divide", "Wrong axis type for division");
         return 0;
   }
}

//_____________________________________________________________________________
const char *TGeoCone::GetAxisName(Int_t iaxis) const
{
// Returns name of axis IAXIS.
   switch (iaxis) {
      case 1:
         return "R";
      case 2:
         return "PHI";
      case 3:
         return "Z";
      default:
         return "undefined";
   }
}

//_____________________________________________________________________________
Double_t TGeoCone::GetAxisRange(Int_t iaxis, Double_t &xlo, Double_t &xhi) const
{
// Get range of shape for a given axis.
   xlo = 0;
   xhi = 0;
   Double_t dx = 0;
   switch (iaxis) {
      case 2:
         xlo = 0.;
         xhi = 360.;
         return 360.;
      case 3:
         xlo = -fDz;
         xhi = fDz;
         dx = xhi-xlo;
         return dx;
   }
   return dx;
}

//_____________________________________________________________________________
void TGeoCone::GetBoundingCylinder(Double_t *param) const
{
//--- Fill vector param[4] with the bounding cylinder parameters. The order
// is the following : Rmin, Rmax, Phi1, Phi2, dZ
   param[0] = TMath::Min(fRmin1, fRmin2); // Rmin
   param[0] *= param[0];
   param[1] = TMath::Max(fRmax1, fRmax2); // Rmax
   param[1] *= param[1];
   param[2] = 0.;                         // Phi1
   param[3] = 360.;                       // Phi1
}

//_____________________________________________________________________________
TGeoShape *TGeoCone::GetMakeRuntimeShape(TGeoShape *mother, TGeoMatrix * /*mat*/) const
{
// in case shape has some negative parameters, these has to be computed
// in order to fit the mother
   if (!TestShapeBit(kGeoRunTimeShape)) return 0;
   if (!mother->TestShapeBit(kGeoCone)) {
      Error("GetMakeRuntimeShape", "invalid mother");
      return 0;
   }
   Double_t rmin1, rmax1, rmin2, rmax2, dz;
   rmin1 = fRmin1;
   rmax1 = fRmax1;
   rmin2 = fRmin2;
   rmax2 = fRmax2;
   dz = fDz;
   if (fDz<0) dz=((TGeoCone*)mother)->GetDz();
   if (fRmin1<0)
      rmin1 = ((TGeoCone*)mother)->GetRmin1();
   if (fRmax1<0)
      rmax1 = ((TGeoCone*)mother)->GetRmax1();
   if (fRmin2<0)
      rmin2 = ((TGeoCone*)mother)->GetRmin2();
   if (fRmax2<0)
      rmax2 = ((TGeoCone*)mother)->GetRmax2();

   return (new TGeoCone(GetName(), dz, rmin1, rmax1, rmin2, rmax2));
}

//_____________________________________________________________________________
Bool_t TGeoCone::GetPointsOnSegments(Int_t npoints, Double_t *array) const
{
// Fills array with n random points located on the line segments of the shape mesh.
// The output array must be provided with a length of minimum 3*npoints. Returns
// true if operation is implemented.
   if (npoints > (npoints/2)*2) {
      Error("GetPointsOnSegments","Npoints must be even number");
      return kFALSE;
   }
   Bool_t hasrmin = (fRmin1>0 || fRmin2>0)?kTRUE:kFALSE;
   Int_t nc = 0;
   if (hasrmin)   nc = (Int_t)TMath::Sqrt(0.5*npoints);
   else           nc = (Int_t)TMath::Sqrt(1.*npoints);
   Double_t dphi = TMath::TwoPi()/nc;
   Double_t phi = 0;
   Int_t ntop = 0;
   if (hasrmin)   ntop = npoints/2 - nc*(nc-1);
   else           ntop = npoints - nc*(nc-1);
   Double_t dz = 2*fDz/(nc-1);
   Double_t z = 0;
   Int_t icrt = 0;
   Int_t nphi = nc;
   Double_t rmin = 0.;
   Double_t rmax = 0.;
   // loop z sections
   for (Int_t i=0; i<nc; i++) {
      if (i == (nc-1)) nphi = ntop;
      z = -fDz + i*dz;
      if (hasrmin) rmin = 0.5*(fRmin1+fRmin2) + 0.5*(fRmin2-fRmin1)*z/fDz;
      rmax = 0.5*(fRmax1+fRmax2) + 0.5*(fRmax2-fRmax1)*z/fDz;
      // loop points on circle sections
      for (Int_t j=0; j<nphi; j++) {
         phi = j*dphi;
         if (hasrmin) {
            array[icrt++] = rmin * TMath::Cos(phi);
            array[icrt++] = rmin * TMath::Sin(phi);
            array[icrt++] = z;
         }
         array[icrt++] = rmax * TMath::Cos(phi);
         array[icrt++] = rmax * TMath::Sin(phi);
         array[icrt++] = z;
      }
   }
   return kTRUE;
}


//_____________________________________________________________________________
void TGeoCone::InspectShape() const
{
// print shape parameters
   printf("*** Shape %s TGeoCone ***\n", GetName());
   printf("    dz    =: %11.5f\n", fDz);
   printf("    Rmin1 = %11.5f\n", fRmin1);
   printf("    Rmax1 = %11.5f\n", fRmax1);
   printf("    Rmin2 = %11.5f\n", fRmin2);
   printf("    Rmax2 = %11.5f\n", fRmax2);
   printf(" Bounding box:\n");
   TGeoBBox::InspectShape();
}

//_____________________________________________________________________________
TBuffer3D *TGeoCone::MakeBuffer3D() const
{
   // Creates a TBuffer3D describing *this* shape.
   // Coordinates are in local reference frame.

   Int_t n = gGeoManager->GetNsegments();
   Int_t nbPnts = 4*n;
   Int_t nbSegs = 8*n;
   Int_t nbPols = 4*n;
   TBuffer3D* buff = new TBuffer3D(TBuffer3DTypes::kGeneric,
                                   nbPnts, 3*nbPnts,
                                   nbSegs, 3*nbSegs,
                                   nbPols, 6*nbPols);

   if (buff)
   {
      SetPoints(buff->fPnts);
      SetSegsAndPols(*buff);
   }
   return buff;
}

//_____________________________________________________________________________
void TGeoCone::SetSegsAndPols(TBuffer3D &buffer) const
{
// Fill TBuffer3D structure for segments and polygons.
   Int_t i,j;
   Int_t n = gGeoManager->GetNsegments();
   Int_t c = GetBasicColor();

   for (i = 0; i < 4; i++) {
      for (j = 0; j < n; j++) {
         buffer.fSegs[(i*n+j)*3  ] = c;
         buffer.fSegs[(i*n+j)*3+1] = i*n+j;
         buffer.fSegs[(i*n+j)*3+2] = i*n+j+1;
      }
      buffer.fSegs[(i*n+j-1)*3+2] = i*n;
   }
   for (i = 4; i < 6; i++) {
      for (j = 0; j < n; j++) {
         buffer.fSegs[(i*n+j)*3  ] = c+1;
         buffer.fSegs[(i*n+j)*3+1] = (i-4)*n+j;
         buffer.fSegs[(i*n+j)*3+2] = (i-2)*n+j;
      }
   }
   for (i = 6; i < 8; i++) {
      for (j = 0; j < n; j++) {
         buffer.fSegs[(i*n+j)*3  ] = c;
         buffer.fSegs[(i*n+j)*3+1] = 2*(i-6)*n+j;
         buffer.fSegs[(i*n+j)*3+2] = (2*(i-6)+1)*n+j;
      }
   }

   Int_t indx = 0;
   i=0;
   for (j = 0; j < n; j++) {
      indx = 6*(i*n+j);
      buffer.fPols[indx  ] = c;
      buffer.fPols[indx+1] = 4;
      buffer.fPols[indx+5] = i*n+j;
      buffer.fPols[indx+4] = (4+i)*n+j;
      buffer.fPols[indx+3] = (2+i)*n+j;
      buffer.fPols[indx+2] = (4+i)*n+j+1;
   }
   buffer.fPols[indx+2] = (4+i)*n;
   i=1;
   for (j = 0; j < n; j++) {
      indx = 6*(i*n+j);
      buffer.fPols[indx  ] = c;
      buffer.fPols[indx+1] = 4;
      buffer.fPols[indx+2] = i*n+j;
      buffer.fPols[indx+3] = (4+i)*n+j;
      buffer.fPols[indx+4] = (2+i)*n+j;
      buffer.fPols[indx+5] = (4+i)*n+j+1;
   }
   buffer.fPols[indx+5] = (4+i)*n;
   i=2;
   for (j = 0; j < n; j++) {
      indx = 6*(i*n+j);
      buffer.fPols[indx  ] = c+i;
      buffer.fPols[indx+1] = 4;
      buffer.fPols[indx+2] = (i-2)*2*n+j;
      buffer.fPols[indx+3] = (4+i)*n+j;
      buffer.fPols[indx+4] = ((i-2)*2+1)*n+j;
      buffer.fPols[indx+5] = (4+i)*n+j+1;
   }
   buffer.fPols[indx+5] = (4+i)*n;
   i=3;
   for (j = 0; j < n; j++) {
      indx = 6*(i*n+j);
      buffer.fPols[indx  ] = c+i;
      buffer.fPols[indx+1] = 4;
      buffer.fPols[indx+5] = (i-2)*2*n+j;
      buffer.fPols[indx+4] = (4+i)*n+j;
      buffer.fPols[indx+3] = ((i-2)*2+1)*n+j;
      buffer.fPols[indx+2] = (4+i)*n+j+1;
   }
   buffer.fPols[indx+2] = (4+i)*n;
}

//_____________________________________________________________________________
Double_t TGeoCone::Safety(const Double_t *point, Bool_t in) const
{
// computes the closest distance from given point to this shape, according
// to option. The matching point on the shape is stored in spoint.
   Double_t saf[4];
   Double_t r=TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
   saf[0] = TGeoShape::SafetySeg(r,point[2], fRmin1, -fDz, fRmax1, -fDz, !in);
   saf[1] = TGeoShape::SafetySeg(r,point[2], fRmax2, fDz, fRmin2, fDz, !in);
   saf[2] = TGeoShape::SafetySeg(r,point[2], fRmin2, fDz, fRmin1, -fDz, !in);
   saf[3] = TGeoShape::SafetySeg(r,point[2], fRmax1, -fDz, fRmax2, fDz, !in);
   return saf[TMath::LocMin(4,saf)];
}

//_____________________________________________________________________________
Double_t TGeoCone::SafetyS(const Double_t *point, Bool_t in, Double_t dz, Double_t rmin1, Double_t rmax1,
                           Double_t rmin2, Double_t rmax2, Int_t skipz)
{
// computes the closest distance from given point to this shape, according
// to option. The matching point on the shape is stored in spoint.
   Double_t saf[4];
   Double_t r=TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
//   Double_t rin = tg1*point[2]+ro1;
//   Double_t rout = tg2*point[2]+ro2;
   switch (skipz) {
      case 1: // skip lower Z plane
         saf[0] = TGeoShape::Big();
         saf[1] = TGeoShape::SafetySeg(r,point[2], rmax2, dz, rmin2, dz, !in);
         break;
      case 2: // skip upper Z plane
         saf[0] = TGeoShape::SafetySeg(r,point[2], rmin1, -dz, rmax1, -dz, !in);
         saf[1] = TGeoShape::Big();
         break;
      case 3: // skip both
         saf[0] = saf[1] = TGeoShape::Big();
         break;
      default:
         saf[0] = TGeoShape::SafetySeg(r,point[2], rmin1, -dz, rmax1, -dz, !in);
         saf[1] = TGeoShape::SafetySeg(r,point[2], rmax2, dz, rmin2, dz, !in);
   }
   // Safety to inner part
   saf[2] = TGeoShape::SafetySeg(r,point[2], rmin1, -dz, rmin2, dz, in);
   saf[3] = TGeoShape::SafetySeg(r,point[2], rmax1, -dz, rmax2, dz, !in);
   return saf[TMath::LocMin(4,saf)];
}

//_____________________________________________________________________________
void TGeoCone::SavePrimitive(std::ostream &out, Option_t * /*option*/ /*= ""*/)
{
// Save a primitive as a C++ statement(s) on output stream "out".
   if (TObject::TestBit(kGeoSavePrimitive)) return;
   out << "   // Shape: " << GetName() << " type: " << ClassName() << std::endl;
   out << "   dz    = " << fDz << ";" << std::endl;
   out << "   rmin1 = " << fRmin1 << ";" << std::endl;
   out << "   rmax1 = " << fRmax1 << ";" << std::endl;
   out << "   rmin2 = " << fRmin2 << ";" << std::endl;
   out << "   rmax2 = " << fRmax2 << ";" << std::endl;
   out << "   TGeoShape *" << GetPointerName() << " = new TGeoCone(\"" << GetName() << "\", dz,rmin1,rmax1,rmin2,rmax2);" << std::endl;
   TObject::SetBit(TGeoShape::kGeoSavePrimitive);
}

//_____________________________________________________________________________
void TGeoCone::SetConeDimensions(Double_t dz, Double_t rmin1, Double_t rmax1,
                             Double_t rmin2, Double_t rmax2)
{
// Set cone dimensions.
   if (rmin1>=0) {
      if (rmax1>0) {
         if (rmin1<=rmax1) {
         // normal rmin/rmax
            fRmin1 = rmin1;
            fRmax1 = rmax1;
         } else {
            fRmin1 = rmax1;
            fRmax1 = rmin1;
            Warning("SetConeDimensions", "rmin1>rmax1 Switch rmin1<->rmax1");
            SetShapeBit(TGeoShape::kGeoBad);
         }
      } else {
         // run-time
         fRmin1 = rmin1;
         fRmax1 = rmax1;
      }
   } else {
      // run-time
      fRmin1 = rmin1;
      fRmax1 = rmax1;
   }
   if (rmin2>=0) {
      if (rmax2>0) {
         if (rmin2<=rmax2) {
         // normal rmin/rmax
            fRmin2 = rmin2;
            fRmax2 = rmax2;
         } else {
            fRmin2 = rmax2;
            fRmax2 = rmin2;
            Warning("SetConeDimensions", "rmin2>rmax2 Switch rmin2<->rmax2");
            SetShapeBit(TGeoShape::kGeoBad);
         }
      } else {
         // run-time
         fRmin2 = rmin2;
         fRmax2 = rmax2;
      }
   } else {
      // run-time
      fRmin2 = rmin2;
      fRmax2 = rmax2;
   }

   fDz   = dz;
}

//_____________________________________________________________________________
void TGeoCone::SetDimensions(Double_t *param)
{
// Set cone dimensions from an array.
   Double_t dz    = param[0];
   Double_t rmin1 = param[1];
   Double_t rmax1 = param[2];
   Double_t rmin2 = param[3];
   Double_t rmax2 = param[4];
   SetConeDimensions(dz, rmin1, rmax1, rmin2, rmax2);
}

//_____________________________________________________________________________
void TGeoCone::SetPoints(Double_t *points) const
{
// Create cone mesh points.
   Double_t dz, phi, dphi;
   Int_t j, n;

   n = gGeoManager->GetNsegments();
   dphi = 360./n;
   dz    = fDz;
   Int_t indx = 0;

   if (points) {
      for (j = 0; j < n; j++) {
         phi = j*dphi*TMath::DegToRad();
         points[indx++] = fRmin1 * TMath::Cos(phi);
         points[indx++] = fRmin1 * TMath::Sin(phi);
         points[indx++] = -dz;
      }

      for (j = 0; j < n; j++) {
         phi = j*dphi*TMath::DegToRad();
         points[indx++] = fRmax1 * TMath::Cos(phi);
         points[indx++] = fRmax1 * TMath::Sin(phi);
         points[indx++] = -dz;
      }

      for (j = 0; j < n; j++) {
         phi = j*dphi*TMath::DegToRad();
         points[indx++] = fRmin2 * TMath::Cos(phi);
         points[indx++] = fRmin2 * TMath::Sin(phi);
         points[indx++] = dz;
      }

      for (j = 0; j < n; j++) {
         phi = j*dphi*TMath::DegToRad();
         points[indx++] = fRmax2 * TMath::Cos(phi);
         points[indx++] = fRmax2 * TMath::Sin(phi);
         points[indx++] = dz;
      }
   }
}

//_____________________________________________________________________________
void TGeoCone::SetPoints(Float_t *points) const
{
// Create cone mesh points.
   Double_t dz, phi, dphi;
   Int_t j, n;

   n = gGeoManager->GetNsegments();
   dphi = 360./n;
   dz    = fDz;
   Int_t indx = 0;

   if (points) {
      for (j = 0; j < n; j++) {
         phi = j*dphi*TMath::DegToRad();
         points[indx++] = fRmin1 * TMath::Cos(phi);
         points[indx++] = fRmin1 * TMath::Sin(phi);
         points[indx++] = -dz;
      }

      for (j = 0; j < n; j++) {
         phi = j*dphi*TMath::DegToRad();
         points[indx++] = fRmax1 * TMath::Cos(phi);
         points[indx++] = fRmax1 * TMath::Sin(phi);
         points[indx++] = -dz;
      }

      for (j = 0; j < n; j++) {
         phi = j*dphi*TMath::DegToRad();
         points[indx++] = fRmin2 * TMath::Cos(phi);
         points[indx++] = fRmin2 * TMath::Sin(phi);
         points[indx++] = dz;
      }

      for (j = 0; j < n; j++) {
         phi = j*dphi*TMath::DegToRad();
         points[indx++] = fRmax2 * TMath::Cos(phi);
         points[indx++] = fRmax2 * TMath::Sin(phi);
         points[indx++] = dz;
      }
   }
}

//_____________________________________________________________________________
void TGeoCone::GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const
{
// Returns numbers of vertices, segments and polygons composing the shape mesh.
   Int_t n = gGeoManager->GetNsegments();
   nvert = n*4;
   nsegs = n*8;
   npols = n*4;
}

//_____________________________________________________________________________
Int_t TGeoCone::GetNmeshVertices() const
{
// Return number of vertices of the mesh representation
   Int_t n = gGeoManager->GetNsegments();
   Int_t numPoints = n*4;
   return numPoints;
}

//_____________________________________________________________________________
void TGeoCone::Sizeof3D() const
{
///// fill size of this 3-D object
///    TVirtualGeoPainter *painter = gGeoManager->GetGeomPainter();
///    if (!painter) return;
///    Int_t n = gGeoManager->GetNsegments();
///    Int_t numPoints = n*4;
///    Int_t numSegs   = n*8;
///    Int_t numPolys  = n*4;
///    painter->AddSize3D(numPoints, numSegs, numPolys);
}

//_____________________________________________________________________________
const TBuffer3D & TGeoCone::GetBuffer3D(Int_t reqSections, Bool_t localFrame) const
{
// Fills a static 3D buffer and returns a reference.
   static TBuffer3D buffer(TBuffer3DTypes::kGeneric);

   TGeoBBox::FillBuffer3D(buffer, reqSections, localFrame);

   if (reqSections & TBuffer3D::kRawSizes) {
      Int_t n = gGeoManager->GetNsegments();
      Int_t nbPnts = 4*n;
      Int_t nbSegs = 8*n;
      Int_t nbPols = 4*n;
      if (buffer.SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
         buffer.SetSectionsValid(TBuffer3D::kRawSizes);
      }
   }

   // TODO: Can we push this as common down to TGeoShape?
   if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes)) {
      SetPoints(buffer.fPnts);
      if (!buffer.fLocalFrame) {
         TransformPoints(buffer.fPnts, buffer.NbPnts());
      }

      SetSegsAndPols(buffer);
      buffer.SetSectionsValid(TBuffer3D::kRaw);
   }

   return buffer;
}

//_____________________________________________________________________________
void TGeoCone::Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const
{
// Check the inside status for each of the points in the array.
// Input: Array of point coordinates + vector size
// Output: Array of Booleans for the inside of each point
   for (Int_t i=0; i<vecsize; i++) inside[i] = Contains(&points[3*i]);
}

//_____________________________________________________________________________
void TGeoCone::ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize)
{
// Compute the normal for an array o points so that norm.dot.dir is positive
// Input: Arrays of point coordinates and directions + vector size
// Output: Array of normal directions
   for (Int_t i=0; i<vecsize; i++) ComputeNormal(&points[3*i], &dirs[3*i], &norms[3*i]);
}

//_____________________________________________________________________________
void TGeoCone::DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t* step) const
{
// Compute distance from array of input points having directions specisied by dirs. Store output in dists
   for (Int_t i=0; i<vecsize; i++) dists[i] = DistFromInside(&points[3*i], &dirs[3*i], 3, step[i]);
}

//_____________________________________________________________________________
void TGeoCone::DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t* step) const
{
// Compute distance from array of input points having directions specisied by dirs. Store output in dists
   for (Int_t i=0; i<vecsize; i++) dists[i] = DistFromOutside(&points[3*i], &dirs[3*i], 3, step[i]);
}

//_____________________________________________________________________________
void TGeoCone::Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const
{
// Compute safe distance from each of the points in the input array.
// Input: Array of point coordinates, array of statuses for these points, size of the arrays
// Output: Safety values
   for (Int_t i=0; i<vecsize; i++) safe[i] = Safety(&points[3*i], inside[i]);
}

ClassImp(TGeoConeSeg)

//_____________________________________________________________________________
TGeoConeSeg::TGeoConeSeg()
            :TGeoCone(),
             fPhi1(0.), fPhi2(0.), fS1(0.), fC1(0.), fS2(0.), fC2(0.), fSm(0.), fCm(0.), fCdfi(0.)
{
// Default constructor
   SetShapeBit(TGeoShape::kGeoConeSeg);
   fPhi1 = fPhi2 = 0.0;
}

//_____________________________________________________________________________
TGeoConeSeg::TGeoConeSeg(Double_t dz, Double_t rmin1, Double_t rmax1,
                          Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2)
            :TGeoCone(dz, rmin1, rmax1, rmin2, rmax2),
             fPhi1(0.), fPhi2(0.), fS1(0.), fC1(0.), fS2(0.), fC2(0.), fSm(0.), fCm(0.), fCdfi(0.)

{
// Default constructor specifying minimum and maximum radius
   SetShapeBit(TGeoShape::kGeoConeSeg);
   SetConsDimensions(dz, rmin1, rmax1, rmin2, rmax2, phi1, phi2);
   ComputeBBox();
}

//_____________________________________________________________________________
TGeoConeSeg::TGeoConeSeg(const char *name, Double_t dz, Double_t rmin1, Double_t rmax1,
                          Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2)
            :TGeoCone(name, dz, rmin1, rmax1, rmin2, rmax2),
             fPhi1(0.), fPhi2(0.), fS1(0.), fC1(0.), fS2(0.), fC2(0.), fSm(0.), fCm(0.), fCdfi(0.)
{
// Default constructor specifying minimum and maximum radius
   SetShapeBit(TGeoShape::kGeoConeSeg);
   SetConsDimensions(dz, rmin1, rmax1, rmin2, rmax2, phi1, phi2);
   ComputeBBox();
}

//_____________________________________________________________________________
TGeoConeSeg::TGeoConeSeg(Double_t *param)
            :TGeoCone(0,0,0,0,0),
             fPhi1(0.), fPhi2(0.), fS1(0.), fC1(0.), fS2(0.), fC2(0.), fSm(0.), fCm(0.), fCdfi(0.)
{
// Default constructor specifying minimum and maximum radius
// param[0] = dz
// param[1] = Rmin1
// param[2] = Rmax1
// param[3] = Rmin2
// param[4] = Rmax2
// param[5] = phi1
// param[6] = phi2
   SetShapeBit(TGeoShape::kGeoConeSeg);
   SetDimensions(param);
   ComputeBBox();
}

//_____________________________________________________________________________
TGeoConeSeg::~TGeoConeSeg()
{
// destructor
}

//_____________________________________________________________________________
void TGeoConeSeg::AfterStreamer()
{
// Function called after streaming an object of this class.
   InitTrigonometry();
}

//_____________________________________________________________________________
void TGeoConeSeg::InitTrigonometry()
{
// Init frequently used trigonometric values
   Double_t phi1 = fPhi1*TMath::DegToRad();
   Double_t phi2 = fPhi2*TMath::DegToRad();
   fC1 = TMath::Cos(phi1);
   fS1 = TMath::Sin(phi1);
   fC2 = TMath::Cos(phi2);
   fS2 = TMath::Sin(phi2);
   Double_t fio = 0.5*(phi1+phi2);
   fCm = TMath::Cos(fio);
   fSm = TMath::Sin(fio);
   Double_t dfi = 0.5*(phi2-phi1);
   fCdfi = TMath::Cos(dfi);
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::Capacity() const
{
// Computes capacity of the shape in [length^3]
   return TGeoConeSeg::Capacity(fDz, fRmin1, fRmax1, fRmin2, fRmax2, fPhi1, fPhi2);
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::Capacity(Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2)
{
// Computes capacity of the shape in [length^3]
   Double_t capacity = (TMath::Abs(phi2-phi1)*TMath::DegToRad()*dz/3.)*
                       (rmax1*rmax1+rmax2*rmax2+rmax1*rmax2-
                        rmin1*rmin1-rmin2*rmin2-rmin1*rmin2);
   return capacity;
}

//_____________________________________________________________________________
void TGeoConeSeg::ComputeBBox()
{
// compute bounding box of the tube segment
   Double_t rmin, rmax;
   rmin = TMath::Min(fRmin1, fRmin2);
   rmax = TMath::Max(fRmax1, fRmax2);

   Double_t xc[4];
   Double_t yc[4];
   xc[0] = rmax*fC1;
   yc[0] = rmax*fS1;
   xc[1] = rmax*fC2;
   yc[1] = rmax*fS2;
   xc[2] = rmin*fC1;
   yc[2] = rmin*fS1;
   xc[3] = rmin*fC2;
   yc[3] = rmin*fS2;

   Double_t xmin = xc[TMath::LocMin(4, &xc[0])];
   Double_t xmax = xc[TMath::LocMax(4, &xc[0])];
   Double_t ymin = yc[TMath::LocMin(4, &yc[0])];
   Double_t ymax = yc[TMath::LocMax(4, &yc[0])];

   Double_t dp = fPhi2-fPhi1;
   Double_t ddp = -fPhi1;
   if (ddp<0) ddp+= 360;
   if (ddp<=dp) xmax = rmax;
   ddp = 90-fPhi1;
   if (ddp<0) ddp+= 360;
   if (ddp<=dp) ymax = rmax;
   ddp = 180-fPhi1;
   if (ddp<0) ddp+= 360;
   if (ddp<=dp) xmin = -rmax;
   ddp = 270-fPhi1;
   if (ddp<0) ddp+= 360;
   if (ddp<=dp) ymin = -rmax;
   fOrigin[0] = (xmax+xmin)/2;
   fOrigin[1] = (ymax+ymin)/2;
   fOrigin[2] = 0;
   fDX = (xmax-xmin)/2;
   fDY = (ymax-ymin)/2;
   fDZ = fDz;
}

//_____________________________________________________________________________
void TGeoConeSeg::ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm)
{
// Compute normal to closest surface from POINT.
   Double_t saf[3];
   Double_t ro1 = 0.5*(fRmin1+fRmin2);
   Double_t tg1 = 0.5*(fRmin2-fRmin1)/fDz;
   Double_t cr1 = 1./TMath::Sqrt(1.+tg1*tg1);
   Double_t ro2 = 0.5*(fRmax1+fRmax2);
   Double_t tg2 = 0.5*(fRmax2-fRmax1)/fDz;
   Double_t cr2 = 1./TMath::Sqrt(1.+tg2*tg2);

   Double_t r=TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
   Double_t rin = tg1*point[2]+ro1;
   Double_t rout = tg2*point[2]+ro2;
   saf[0] = TMath::Abs(fDz-TMath::Abs(point[2]));
   saf[1] = (ro1>0)?(TMath::Abs((r-rin)*cr1)):TGeoShape::Big();
   saf[2] = TMath::Abs((rout-r)*cr2);
   Int_t i = TMath::LocMin(3,saf);
   if (((fPhi2-fPhi1)<360.) && TGeoShape::IsCloseToPhi(saf[i], point,fC1,fS1,fC2,fS2)) {
      TGeoShape::NormalPhi(point,dir,norm,fC1,fS1,fC2,fS2);
      return;
   }
   if (i==0) {
      norm[0] = norm[1] = 0.;
      norm[2] = TMath::Sign(1.,dir[2]);
      return;
   }

   Double_t phi = TMath::ATan2(point[1],point[0]);
   Double_t cphi = TMath::Cos(phi);
   Double_t sphi = TMath::Sin(phi);

   if (i==1) {
      norm[0] = cr1*cphi;
      norm[1] = cr1*sphi;
      norm[2] = -tg1*cr1;
   } else {
      norm[0] = cr2*cphi;
      norm[1] = cr2*sphi;
      norm[2] = -tg2*cr2;
   }

   if (norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2]<0) {
      norm[0] = -norm[0];
      norm[1] = -norm[1];
      norm[2] = -norm[2];
   }
}

//_____________________________________________________________________________
void TGeoConeSeg::ComputeNormalS(const Double_t *point, const Double_t *dir, Double_t *norm,
                                 Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2,
                                 Double_t c1, Double_t s1, Double_t c2, Double_t s2)
{
// Compute normal to closest surface from POINT.
   Double_t saf[2];
   Double_t ro1 = 0.5*(rmin1+rmin2);
   Double_t tg1 = 0.5*(rmin2-rmin1)/dz;
   Double_t cr1 = 1./TMath::Sqrt(1.+tg1*tg1);
   Double_t ro2 = 0.5*(rmax1+rmax2);
   Double_t tg2 = 0.5*(rmax2-rmax1)/dz;
   Double_t cr2 = 1./TMath::Sqrt(1.+tg2*tg2);

   Double_t r=TMath::Sqrt(point[0]*point[0]+point[1]*point[1]);
   Double_t rin = tg1*point[2]+ro1;
   Double_t rout = tg2*point[2]+ro2;
   saf[0] = (ro1>0)?(TMath::Abs((r-rin)*cr1)):TGeoShape::Big();
   saf[1] = TMath::Abs((rout-r)*cr2);
   Int_t i = TMath::LocMin(2,saf);
   if (TGeoShape::IsCloseToPhi(saf[i], point,c1,s1,c2,s2)) {
      TGeoShape::NormalPhi(point,dir,norm,c1,s1,c2,s2);
      return;
   }

   Double_t phi = TMath::ATan2(point[1],point[0]);
   Double_t cphi = TMath::Cos(phi);
   Double_t sphi = TMath::Sin(phi);

   if (i==0) {
      norm[0] = cr1*cphi;
      norm[1] = cr1*sphi;
      norm[2] = -tg1*cr1;
   } else {
      norm[0] = cr2*cphi;
      norm[1] = cr2*sphi;
      norm[2] = -tg2*cr2;
   }

   if (norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2]<0) {
      norm[0] = -norm[0];
      norm[1] = -norm[1];
      norm[2] = -norm[2];
   }
}

//_____________________________________________________________________________
Bool_t TGeoConeSeg::Contains(const Double_t *point) const
{
// test if point is inside this sphere
   if (!TGeoCone::Contains(point)) return kFALSE;
   Double_t dphi = fPhi2 - fPhi1;
   if (dphi >= 360.) return kTRUE;
   Double_t phi = TMath::ATan2(point[1], point[0]) * TMath::RadToDeg();
   if (phi < 0 ) phi+=360.;
   Double_t ddp = phi-fPhi1;
   if (ddp < 0) ddp+=360.;
//   if (ddp > 360) ddp-=360;
   if (ddp > dphi) return kFALSE;
   return kTRUE;
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::DistToCons(const Double_t *point, const Double_t *dir, Double_t r1, Double_t z1, Double_t r2, Double_t z2, Double_t phi1, Double_t phi2)
{
   // Static method to compute distance to a conical surface with :
   // - r1, z1 - radius and Z position of lower base
   // - r2, z2 - radius and Z position of upper base
   // - phi1, phi2 - phi limits
   Double_t dz = z2-z1;
   if (dz<=0) {
      return TGeoShape::Big();
   }

   Double_t dphi = phi2 - phi1;
   Bool_t hasphi = kTRUE;
   if (dphi >= 360.) hasphi=kFALSE;
   if (dphi < 0) dphi+=360.;
//   printf("phi1=%f phi2=%f dphi=%f\n", phi1, phi2, dphi);

   Double_t ro0 = 0.5*(r1+r2);
   Double_t fz  = (r2-r1)/dz;
   Double_t r0sq = point[0]*point[0] + point[1]*point[1];
   Double_t rc = ro0 + fz*(point[2]-0.5*(z1+z2));

   Double_t a = dir[0]*dir[0] + dir[1]*dir[1] - fz*fz*dir[2]*dir[2];
   Double_t b = point[0]*dir[0] + point[1]*dir[1] - fz*rc*dir[2];
   Double_t c = r0sq - rc*rc;

   if (a==0) return TGeoShape::Big();
   a = 1./a;
   b *= a;
   c *= a;
   Double_t delta = b*b - c;
   if (delta<0) return TGeoShape::Big();
   delta = TMath::Sqrt(delta);

   Double_t snxt = -b-delta;
   Double_t ptnew[3];
   Double_t ddp, phi;
   if (snxt>0) {
      // check Z range
      ptnew[2] = point[2] + snxt*dir[2];
      if (((ptnew[2]-z1)*(ptnew[2]-z2)) < 0) {
      // check phi range
         if (!hasphi) return snxt;
         ptnew[0] = point[0] + snxt*dir[0];
         ptnew[1] = point[1] + snxt*dir[1];
         phi = TMath::ATan2(ptnew[1], ptnew[0]) * TMath::RadToDeg();
         if (phi < 0 ) phi+=360.;
         ddp = phi-phi1;
         if (ddp < 0) ddp+=360.;
         // printf("snxt1=%f phi=%f ddp=%f\n", snxt, phi, ddp);
         if (ddp<=dphi) return snxt;
      }
   }
   snxt = -b+delta;
   if (snxt>0) {
      // check Z range
      ptnew[2] = point[2] + snxt*dir[2];
      if (((ptnew[2]-z1)*(ptnew[2]-z2)) < 0) {
      // check phi range
         if (!hasphi) return snxt;
         ptnew[0] = point[0] + snxt*dir[0];
         ptnew[1] = point[1] + snxt*dir[1];
         phi = TMath::ATan2(ptnew[1], ptnew[0]) * TMath::RadToDeg();
         if (phi < 0 ) phi+=360.;
         ddp = phi-phi1;
         if (ddp < 0) ddp+=360.;
         // printf("snxt2=%f phi=%f ddp=%f\n", snxt, phi, ddp);
         if (ddp<=dphi) return snxt;
      }
   }
   return TGeoShape::Big();
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::DistFromInsideS(const Double_t *point, const Double_t *dir, Double_t dz,
                       Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2,
                       Double_t c1, Double_t s1, Double_t c2, Double_t s2, Double_t cm, Double_t sm, Double_t cdfi)
{
// compute distance from inside point to surface of the tube segment
   if (dz<=0) return TGeoShape::Big();
   // Do Z
   Double_t scone = TGeoCone::DistFromInsideS(point,dir,dz,rmin1,rmax1,rmin2,rmax2);
   if (scone<=0) return 0.0;
   Double_t sfmin = TGeoShape::Big();
   Double_t rsq = point[0]*point[0]+point[1]*point[1];
   Double_t r = TMath::Sqrt(rsq);
   Double_t cpsi=point[0]*cm+point[1]*sm;
   if (cpsi>r*cdfi+TGeoShape::Tolerance())  {
      sfmin = TGeoShape::DistToPhiMin(point, dir, s1, c1, s2, c2, sm, cm);
      return TMath::Min(scone,sfmin);
   }
   // Point on the phi boundary or outside
   // which one: phi1 or phi2
   Double_t ddotn, xi, yi;
   if (TMath::Abs(point[1]-s1*r) < TMath::Abs(point[1]-s2*r)) {
      ddotn = s1*dir[0]-c1*dir[1];
      if (ddotn>=0) return 0.0;
      ddotn = -s2*dir[0]+c2*dir[1];
      if (ddotn<=0) return scone;
      sfmin = s2*point[0]-c2*point[1];
      if (sfmin<=0) return scone;
      sfmin /= ddotn;
      if (sfmin >= scone) return scone;
      xi = point[0]+sfmin*dir[0];
      yi = point[1]+sfmin*dir[1];
      if (yi*cm-xi*sm<0) return scone;
      return sfmin;
   }
   ddotn = -s2*dir[0]+c2*dir[1];
   if (ddotn>=0) return 0.0;
   ddotn = s1*dir[0]-c1*dir[1];
   if (ddotn<=0) return scone;
   sfmin = -s1*point[0]+c1*point[1];
   if (sfmin<=0) return scone;
   sfmin /= ddotn;
   if (sfmin >= scone) return scone;
   xi = point[0]+sfmin*dir[0];
   yi = point[1]+sfmin*dir[1];
   if (yi*cm-xi*sm>0) return scone;
   return sfmin;
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact, Double_t step, Double_t *safe) const
{
// compute distance from inside point to surface of the tube segment
   if (iact<3 && safe) {
      *safe = TGeoConeSeg::SafetyS(point, kTRUE, fDz,fRmin1,fRmax1,fRmin2,fRmax2,fPhi1,fPhi2);
      if (iact==0) return TGeoShape::Big();
      if ((iact==1) && (*safe>step)) return TGeoShape::Big();
   }
   if ((fPhi2-fPhi1)>=360.) return TGeoCone::DistFromInsideS(point,dir,fDz,fRmin1,fRmax1,fRmin2,fRmax2);

   // compute distance to surface
   return TGeoConeSeg::DistFromInsideS(point,dir,fDz,fRmin1,fRmax1,fRmin2,fRmax2,fC1,fS1,fC2,fS2,fCm,fSm,fCdfi);
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::DistFromOutsideS(const Double_t *point, const Double_t *dir, Double_t dz,
                       Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2,
                       Double_t c1, Double_t s1, Double_t c2, Double_t s2, Double_t cm, Double_t sm, Double_t cdfi)
{
// compute distance from outside point to surface of arbitrary tube
   if (dz<=0) return TGeoShape::Big();
   Double_t r2, cpsi;
   // check Z planes
   Double_t xi, yi, zi;
   Double_t b,delta;
   zi = dz - TMath::Abs(point[2]);
   Double_t rin,rout;
   Double_t s = TGeoShape::Big();
   Double_t snxt=TGeoShape::Big();
   Bool_t in = kFALSE;
   Bool_t inz = (zi<0)?kFALSE:kTRUE;
   if (!inz) {
      if (point[2]*dir[2]>=0) return TGeoShape::Big();
      s = -zi/TMath::Abs(dir[2]);
      xi = point[0]+s*dir[0];
      yi = point[1]+s*dir[1];
      r2=xi*xi+yi*yi;
      if (dir[2]>0) {
         rin = rmin1;
         rout = rmax1;
      } else {
         rin = rmin2;
         rout = rmax2;
      }
      if ((rin*rin<=r2) && (r2<=rout*rout)) {
         cpsi=xi*cm+yi*sm;
         if (cpsi>=(cdfi*TMath::Sqrt(r2))) return s;
      }
   }
   Double_t zinv = 1./dz;
   Double_t rsq = point[0]*point[0]+point[1]*point[1];
   Double_t r = TMath::Sqrt(rsq);
   Double_t ro1=0.5*(rmin1+rmin2);
   Bool_t hasrmin = (ro1>0)?kTRUE:kFALSE;
   Double_t tg1 = 0.0;
   Bool_t inrmin = kFALSE;
   rin = 0.0;
   if (hasrmin) {
      tg1=0.5*(rmin2-rmin1)*zinv;
      rin = ro1+tg1*point[2];
      if (rsq > rin*(rin-TGeoShape::Tolerance())) inrmin=kTRUE;
   } else {
      inrmin = kTRUE;
   }
   Double_t ro2=0.5*(rmax1+rmax2);
   Double_t tg2=0.5*(rmax2-rmax1)*zinv;
   rout = ro2+tg2*point[2];
   Bool_t inrmax = kFALSE;
   if (r < rout+TGeoShape::Tolerance()) inrmax = kTRUE;
   Bool_t inphi = kFALSE;
   cpsi=point[0]*cm+point[1]*sm;
   if (cpsi>r*cdfi-TGeoShape::Tolerance())  inphi = kTRUE;
   in = inz & inrmin & inrmax & inphi;
   // If inside, we are most likely on a boundary within machine precision.
   if (in) {
      Double_t safphi = (cpsi-r*cdfi)*TMath::Sqrt(1.-cdfi*cdfi);
      Double_t safrmin = (hasrmin)?TMath::Abs(r-rin):(TGeoShape::Big());
      Double_t safrmax = TMath::Abs(r-rout);
      // check if on Z boundaries
      if (zi<safrmax && zi<safrmin && zi<safphi) {
         if (point[2]*dir[2]<0) return 0.0;
         return TGeoShape::Big();
      }
      // check if on Rmax boundary
      if (safrmax<safrmin && safrmax<safphi) {
         Double_t ddotn = point[0]*dir[0]+point[1]*dir[1]-tg2*dir[2]*r;
         if (ddotn<=0) return 0.0;
         return TGeoShape::Big();
      }
      // check if on phi boundary
      if (safphi<safrmin) {
      // We may cross again a phi of rmin boundary
      // check first if we are on phi1 or phi2
         Double_t un;
         if (TMath::Abs(point[1]-s1*r) < TMath::Abs(point[1]-s2*r)) {
            un = dir[0]*s1-dir[1]*c1;
            if (un < 0) return 0.0;
            if (cdfi>=0) return TGeoShape::Big();
            un = -dir[0]*s2+dir[1]*c2;
            if (un<0) {
               s = -point[0]*s2+point[1]*c2;
               if (s>0) {
                  s /= (-un);
                  zi = point[2]+s*dir[2];
                  if (TMath::Abs(zi)<=dz) {
                     xi = point[0]+s*dir[0];
                     yi = point[1]+s*dir[1];
                     if ((yi*cm-xi*sm)>0) {
                        r2=xi*xi+yi*yi;
                        rin = ro1+tg1*zi;
                        rout = ro2+tg2*zi;
                        if ((rin*rin<=r2) && (rout*rout>=r2)) return s;
                     }
                  }
               }
            }
         } else {
            un = -dir[0]*s2+dir[1]*c2;
            if (un < 0) return 0.0;
            if (cdfi>=0) return TGeoShape::Big();
            un = dir[0]*s1-dir[1]*c1;
            if (un<0) {
               s = point[0]*s1-point[1]*c1;
               if (s>0) {
                  s /= (-un);
                  zi = point[2]+s*dir[2];
                  if (TMath::Abs(zi)<=dz) {
                     xi = point[0]+s*dir[0];
                     yi = point[1]+s*dir[1];
                     if ((yi*cm-xi*sm)<0) {
                        r2=xi*xi+yi*yi;
                        rin = ro1+tg1*zi;
                        rout = ro2+tg2*zi;
                        if ((rin*rin<=r2) && (rout*rout>=r2)) return s;
                     }
                  }
               }
            }
         }
         // We may also cross rmin, second solution coming from outside
         Double_t ddotn = point[0]*dir[0]+point[1]*dir[1]-tg1*dir[2]*r;
         if (ddotn>=0) return TGeoShape::Big();
         if (cdfi>=0) return TGeoShape::Big();
         TGeoCone::DistToCone(point, dir, dz, rmin1, rmin2, b, delta);
         if (delta<0) return TGeoShape::Big();
         snxt = -b-delta;
         if (snxt<0) return TGeoShape::Big();
         snxt = -b+delta;
         zi = point[2]+snxt*dir[2];
         if (TMath::Abs(zi)>dz) return TGeoShape::Big();
         xi = point[0]+snxt*dir[0];
         yi = point[1]+snxt*dir[1];
         r2=xi*xi+yi*yi;
         cpsi=xi*cm+yi*sm;
         if (cpsi>=(cdfi*TMath::Sqrt(r2))) return snxt;
         return TGeoShape::Big();
      }
      // We are on rmin boundary: we may cross again rmin or a phi facette
      Double_t ddotn = point[0]*dir[0]+point[1]*dir[1]-tg1*dir[2]*r;
      if (ddotn>=0) return 0.0;
      TGeoCone::DistToCone(point, dir, dz, rmin1, rmin2, b, delta);
      if (delta<0) return 0.0;
      snxt = -b+delta;
      if (snxt<0) return TGeoShape::Big();
      if (TMath::Abs(-b-delta)>snxt) return TGeoShape::Big();
      zi = point[2]+snxt*dir[2];
      if (TMath::Abs(zi)>dz) return TGeoShape::Big();
      // OK, we cross rmin at snxt - check if within phi range
      xi = point[0]+snxt*dir[0];
      yi = point[1]+snxt*dir[1];
      r2=xi*xi+yi*yi;
      cpsi=xi*cm+yi*sm;
      if (cpsi>=(cdfi*TMath::Sqrt(r2))) return snxt;
      // we cross rmin in the phi gap - we may cross a phi facette
      if (cdfi>=0) return TGeoShape::Big();
      Double_t un=-dir[0]*s1+dir[1]*c1;
      if (un > 0) {
         s=point[0]*s1-point[1]*c1;
         if (s>=0) {
            s /= un;
            zi=point[2]+s*dir[2];
            if (TMath::Abs(zi)<=dz) {
               xi=point[0]+s*dir[0];
               yi=point[1]+s*dir[1];
               if ((yi*cm-xi*sm)<=0) {
                  r2=xi*xi+yi*yi;
                  rin = ro1+tg1*zi;
                  rout = ro2+tg2*zi;
                  if ((rin*rin<=r2) && (rout*rout>=r2)) return s;
               }
            }
         }
      }
      un=dir[0]*s2-dir[1]*c2;
      if (un > 0) {
         s=(point[1]*c2-point[0]*s2)/un;
         if (s>=0) {
            zi=point[2]+s*dir[2];
            if (TMath::Abs(zi)<=dz) {
               xi=point[0]+s*dir[0];
               yi=point[1]+s*dir[1];
               if ((yi*cm-xi*sm)>=0) {
                  r2=xi*xi+yi*yi;
                  rin = ro1+tg1*zi;
                  rout = ro2+tg2*zi;
                  if ((rin*rin<=r2) && (rout*rout>=r2)) return s;
               }
            }
         }
      }
      return TGeoShape::Big();
   }

   // The point is really outside
   Double_t sr1 = TGeoShape::Big();
   if (!inrmax) {
      // check crossing with outer cone
      TGeoCone::DistToCone(point, dir, dz, rmax1, rmax2, b, delta);
      if (delta>=0) {
         s = -b-delta;
         if (s>0) {
            zi=point[2]+s*dir[2];
            if (TMath::Abs(zi)<=dz) {
               xi=point[0]+s*dir[0];
               yi=point[1]+s*dir[1];
               r2=xi*xi+yi*yi;
               cpsi=xi*cm+yi*sm;
               if (cpsi>=(cdfi*TMath::Sqrt(r2))) return s; // rmax crossing
            }
         }
         s = -b+delta;
         if (s>0) {
            zi=point[2]+s*dir[2];
            if (TMath::Abs(zi)<=dz) {
               xi=point[0]+s*dir[0];
               yi=point[1]+s*dir[1];
               r2=xi*xi+yi*yi;
               cpsi=xi*cm+yi*sm;
               if (cpsi>=(cdfi*TMath::Sqrt(r2))) sr1=s;
            }
         }
      }
   }
   // check crossing with inner cone
   Double_t sr2 = TGeoShape::Big();
   TGeoCone::DistToCone(point, dir, dz, rmin1, rmin2, b, delta);
   if (delta>=0) {
      s = -b-delta;
      if (s>0) {
         zi=point[2]+s*dir[2];
         if (TMath::Abs(zi)<=dz) {
            xi=point[0]+s*dir[0];
            yi=point[1]+s*dir[1];
            r2=xi*xi+yi*yi;
            cpsi=xi*cm+yi*sm;
            if (cpsi>=(cdfi*TMath::Sqrt(r2))) sr2=s;
         }
      }
      if (sr2>1E10) {
         s = -b+delta;
         if (s>0) {
         zi=point[2]+s*dir[2];
            if (TMath::Abs(zi)<=dz) {
               xi=point[0]+s*dir[0];
               yi=point[1]+s*dir[1];
               r2=xi*xi+yi*yi;
               cpsi=xi*cm+yi*sm;
               if (cpsi>=(cdfi*TMath::Sqrt(r2))) sr2=s;
            }
         }
      }
   }
   snxt = TMath::Min(sr1,sr2);
   // Check phi crossing
   s = TGeoShape::DistToPhiMin(point,dir,s1,c1,s2,c2,sm,cm,kFALSE);
   if (s>snxt) return snxt;
   zi=point[2]+s*dir[2];
   if (TMath::Abs(zi)>dz) return snxt;
   xi=point[0]+s*dir[0];
   yi=point[1]+s*dir[1];
   r2=xi*xi+yi*yi;
   rout = ro2+tg2*zi;
   if (r2>rout*rout) return snxt;
   rin = ro1+tg1*zi;
   if (r2>=rin*rin) return s; // phi crossing
   return snxt;
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact, Double_t step, Double_t *safe) const
{
// compute distance from outside point to surface of the tube
   // compute safe radius
   if (iact<3 && safe) {
      *safe = Safety(point, kFALSE);
      if (iact==0) return TGeoShape::Big();
      if ((iact==1) && (*safe>step)) return TGeoShape::Big();
   }
// Check if the bounding box is crossed within the requested distance
   Double_t sdist = TGeoBBox::DistFromOutside(point,dir, fDX, fDY, fDZ, fOrigin, step);
   if (sdist>=step) return TGeoShape::Big();
   if ((fPhi2-fPhi1)>=360.) return TGeoCone::DistFromOutsideS(point,dir,fDz,fRmin1,fRmax1,fRmin2,fRmax2);
   return TGeoConeSeg::DistFromOutsideS(point,dir,fDz,fRmin1,fRmax1,fRmin2,fRmax2,fC1,fS1,fC2,fS2,fCm,fSm,fCdfi);
}

//_____________________________________________________________________________
Int_t TGeoConeSeg::DistancetoPrimitive(Int_t px, Int_t py)
{
// compute closest distance from point px,py to each corner
   Int_t n = gGeoManager->GetNsegments()+1;
   const Int_t numPoints = 4*n;
   return ShapeDistancetoPrimitive(numPoints, px, py);
}

//_____________________________________________________________________________
TGeoVolume *TGeoConeSeg::Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv,
                             Double_t start, Double_t step)
{
//--- Divide this cone segment shape belonging to volume "voldiv" into ndiv volumes
// called divname, from start position with the given step. Returns pointer
// to created division cell volume in case of Z divisions. For Z division
// creates all volumes with different shapes and returns pointer to volume that
// was divided. In case a wrong division axis is supplied, returns pointer to
// volume that was divided.
   TGeoShape *shape;           //--- shape to be created
   TGeoVolume *vol;            //--- division volume to be created
   TGeoVolumeMulti *vmulti;    //--- generic divided volume
   TGeoPatternFinder *finder;  //--- finder to be attached
   TString opt = "";           //--- option to be attached
   Double_t dphi;
   Int_t id;
   Double_t end = start+ndiv*step;
   switch (iaxis) {
      case 1:  //---               R division
         Error("Divide","division of a cone segment on R not implemented");
         return 0;
      case 2:  //---               Phi division
         dphi = fPhi2-fPhi1;
         if (dphi<0) dphi+=360.;
         finder = new TGeoPatternCylPhi(voldiv, ndiv, start, end);
         voldiv->SetFinder(finder);
         finder->SetDivIndex(voldiv->GetNdaughters());
         shape = new TGeoConeSeg(fDz, fRmin1, fRmax1, fRmin2, fRmax2, -step/2, step/2);
         vol = new TGeoVolume(divname, shape, voldiv->GetMedium());
         vmulti = gGeoManager->MakeVolumeMulti(divname, voldiv->GetMedium());
         vmulti->AddVolume(vol);
         opt = "Phi";
         for (id=0; id<ndiv; id++) {
            voldiv->AddNodeOffset(vol, id, start+id*step+step/2, opt.Data());
            ((TGeoNodeOffset*)voldiv->GetNodes()->At(voldiv->GetNdaughters()-1))->SetFinder(finder);
         }
         return vmulti;
      case 3: //---                 Z division
         finder = new TGeoPatternZ(voldiv, ndiv, start, end);
         vmulti = gGeoManager->MakeVolumeMulti(divname, voldiv->GetMedium());
         voldiv->SetFinder(finder);
         finder->SetDivIndex(voldiv->GetNdaughters());
         for (id=0; id<ndiv; id++) {
            Double_t z1 = start+id*step;
            Double_t z2 = start+(id+1)*step;
            Double_t rmin1n = 0.5*(fRmin1*(fDz-z1)+fRmin2*(fDz+z1))/fDz;
            Double_t rmax1n = 0.5*(fRmax1*(fDz-z1)+fRmax2*(fDz+z1))/fDz;
            Double_t rmin2n = 0.5*(fRmin1*(fDz-z2)+fRmin2*(fDz+z2))/fDz;
            Double_t rmax2n = 0.5*(fRmax1*(fDz-z2)+fRmax2*(fDz+z2))/fDz;
            shape = new TGeoConeSeg(step/2, rmin1n, rmax1n, rmin2n, rmax2n, fPhi1, fPhi2);
            vol = new TGeoVolume(divname, shape, voldiv->GetMedium());
            vmulti->AddVolume(vol);
            opt = "Z";
            voldiv->AddNodeOffset(vol, id, start+id*step+step/2, opt.Data());
            ((TGeoNodeOffset*)voldiv->GetNodes()->At(voldiv->GetNdaughters()-1))->SetFinder(finder);
         }
         return vmulti;
      default:
         Error("Divide", "Wrong axis type for division");
         return 0;
   }
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::GetAxisRange(Int_t iaxis, Double_t &xlo, Double_t &xhi) const
{
// Get range of shape for a given axis.
   xlo = 0;
   xhi = 0;
   Double_t dx = 0;
   switch (iaxis) {
      case 2:
         xlo = fPhi1;
         xhi = fPhi2;
         dx = xhi-xlo;
         return dx;
      case 3:
         xlo = -fDz;
         xhi = fDz;
         dx = xhi-xlo;
         return dx;
   }
   return dx;
}

//_____________________________________________________________________________
void TGeoConeSeg::GetBoundingCylinder(Double_t *param) const
{
//--- Fill vector param[4] with the bounding cylinder parameters. The order
// is the following : Rmin, Rmax, Phi1, Phi2
   param[0] = TMath::Min(fRmin1, fRmin2); // Rmin
   param[0] *= param[0];
   param[1] = TMath::Max(fRmax1, fRmax2); // Rmax
   param[1] *= param[1];
   param[2] = (fPhi1<0)?(fPhi1+360.):fPhi1; // Phi1
   param[3] = fPhi2;                        // Phi2
   while (param[3]<param[2]) param[3]+=360.;
}

//_____________________________________________________________________________
TGeoShape *TGeoConeSeg::GetMakeRuntimeShape(TGeoShape *mother, TGeoMatrix * /*mat*/) const
{
// in case shape has some negative parameters, these has to be computed
// in order to fit the mother
   if (!TestShapeBit(kGeoRunTimeShape)) return 0;
   if (!mother->TestShapeBit(kGeoConeSeg)) {
      Error("GetMakeRuntimeShape", "invalid mother");
      return 0;
   }
   Double_t rmin1, rmax1, rmin2, rmax2, dz;
   rmin1 = fRmin1;
   rmax1 = fRmax1;
   rmin2 = fRmin2;
   rmax2 = fRmax2;
   dz = fDz;
   if (fDz<0) dz=((TGeoCone*)mother)->GetDz();
   if (fRmin1<0)
      rmin1 = ((TGeoCone*)mother)->GetRmin1();
   if ((fRmax1<0) || (fRmax1<fRmin1))
      rmax1 = ((TGeoCone*)mother)->GetRmax1();
   if (fRmin2<0)
      rmin2 = ((TGeoCone*)mother)->GetRmin2();
   if ((fRmax2<0) || (fRmax2<fRmin2))
      rmax2 = ((TGeoCone*)mother)->GetRmax2();

   return (new TGeoConeSeg(GetName(), dz, rmin1, rmax1, rmin2, rmax2, fPhi1, fPhi2));
}

//_____________________________________________________________________________
void TGeoConeSeg::InspectShape() const
{
// print shape parameters
   printf("*** Shape %s: TGeoConeSeg ***\n", GetName());
   printf("    dz    = %11.5f\n", fDz);
   printf("    Rmin1 = %11.5f\n", fRmin1);
   printf("    Rmax1 = %11.5f\n", fRmax1);
   printf("    Rmin2 = %11.5f\n", fRmin2);
   printf("    Rmax2 = %11.5f\n", fRmax2);
   printf("    phi1  = %11.5f\n", fPhi1);
   printf("    phi2  = %11.5f\n", fPhi2);
   printf(" Bounding box:\n");
   TGeoBBox::InspectShape();
}

 //_____________________________________________________________________________
TBuffer3D *TGeoConeSeg::MakeBuffer3D() const
{
   // Creates a TBuffer3D describing *this* shape.
   // Coordinates are in local reference frame.

   Int_t n = gGeoManager->GetNsegments()+1;
   Int_t nbPnts = 4*n;
   Int_t nbSegs = 2*nbPnts;
   Int_t nbPols = nbPnts-2;
   TBuffer3D* buff = new TBuffer3D(TBuffer3DTypes::kGeneric,
                                   nbPnts, 3*nbPnts,
                                   nbSegs, 3*nbSegs,
                                   nbPols, 6*nbPols);

   if (buff)
   {
      SetPoints(buff->fPnts);
      SetSegsAndPols(*buff);
   }

   return buff;
}

//_____________________________________________________________________________
void TGeoConeSeg::SetSegsAndPols(TBuffer3D &buffer) const
{
// Fill TBuffer3D structure for segments and polygons.
   Int_t i, j;
   Int_t n = gGeoManager->GetNsegments()+1;
   Int_t c = GetBasicColor();

   memset(buffer.fSegs, 0, buffer.NbSegs()*3*sizeof(Int_t));
   for (i = 0; i < 4; i++) {
      for (j = 1; j < n; j++) {
         buffer.fSegs[(i*n+j-1)*3  ] = c;
         buffer.fSegs[(i*n+j-1)*3+1] = i*n+j-1;
         buffer.fSegs[(i*n+j-1)*3+2] = i*n+j;
      }
   }
   for (i = 4; i < 6; i++) {
      for (j = 0; j < n; j++) {
         buffer.fSegs[(i*n+j)*3  ] = c+1;
         buffer.fSegs[(i*n+j)*3+1] = (i-4)*n+j;
         buffer.fSegs[(i*n+j)*3+2] = (i-2)*n+j;
      }
   }
   for (i = 6; i < 8; i++) {
      for (j = 0; j < n; j++) {
         buffer.fSegs[(i*n+j)*3  ] = c;
         buffer.fSegs[(i*n+j)*3+1] = 2*(i-6)*n+j;
         buffer.fSegs[(i*n+j)*3+2] = (2*(i-6)+1)*n+j;
      }
   }

   Int_t indx = 0;
   memset(buffer.fPols, 0, buffer.NbPols()*6*sizeof(Int_t));
   i = 0;
   for (j = 0; j < n-1; j++) {
      buffer.fPols[indx++] = c;
      buffer.fPols[indx++] = 4;
      buffer.fPols[indx++] = (4+i)*n+j+1;
      buffer.fPols[indx++] = (2+i)*n+j;
      buffer.fPols[indx++] = (4+i)*n+j;
      buffer.fPols[indx++] = i*n+j;
   }
   i = 1;
   for (j = 0; j < n-1; j++) {
      buffer.fPols[indx++] = c;
      buffer.fPols[indx++] = 4;
      buffer.fPols[indx++] = i*n+j;
      buffer.fPols[indx++] = (4+i)*n+j;
      buffer.fPols[indx++] = (2+i)*n+j;
      buffer.fPols[indx++] = (4+i)*n+j+1;
   }
   i = 2;
   for (j = 0; j < n-1; j++) {
      buffer.fPols[indx++] = c+i;
      buffer.fPols[indx++] = 4;
      buffer.fPols[indx++] = (i-2)*2*n+j;
      buffer.fPols[indx++] = (4+i)*n+j;
      buffer.fPols[indx++] = ((i-2)*2+1)*n+j;
      buffer.fPols[indx++] = (4+i)*n+j+1;
   }
   i = 3;
   for (j = 0; j < n-1; j++) {
      buffer.fPols[indx++] = c+i;
      buffer.fPols[indx++] = 4;
      buffer.fPols[indx++] = (4+i)*n+j+1;
      buffer.fPols[indx++] = ((i-2)*2+1)*n+j;
      buffer.fPols[indx++] = (4+i)*n+j;
      buffer.fPols[indx++] = (i-2)*2*n+j;
   }
   buffer.fPols[indx++] = c+2;
   buffer.fPols[indx++] = 4;
   buffer.fPols[indx++] = 6*n;
   buffer.fPols[indx++] = 4*n;
   buffer.fPols[indx++] = 7*n;
   buffer.fPols[indx++] = 5*n;
   buffer.fPols[indx++] = c+2;
   buffer.fPols[indx++] = 4;
   buffer.fPols[indx++] = 6*n-1;
   buffer.fPols[indx++] = 8*n-1;
   buffer.fPols[indx++] = 5*n-1;
   buffer.fPols[indx++] = 7*n-1;
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::Safety(const Double_t *point, Bool_t in) const
{
// computes the closest distance from given point to this shape, according
// to option. The matching point on the shape is stored in spoint.

   Double_t safe = TGeoCone::Safety(point,in);
   if ((fPhi2-fPhi1)>=360.) return safe;
   Double_t safphi = TGeoShape::SafetyPhi(point, in, fPhi1, fPhi2);
   if (in) return TMath::Min(safe, safphi);
   if (safe>1.E10) return safphi;
   return TMath::Max(safe, safphi);
}

//_____________________________________________________________________________
Double_t TGeoConeSeg::SafetyS(const Double_t *point, Bool_t in, Double_t dz, Double_t rmin1, Double_t rmax1,
                              Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2, Int_t skipz)
{
// Static method to compute the closest distance from given point to this shape.
   Double_t safe = TGeoCone::SafetyS(point,in,dz,rmin1,rmax1,rmin2,rmax2,skipz);
   if ((phi2-phi1)>=360.) return safe;
   Double_t safphi = TGeoShape::SafetyPhi(point,in,phi1,phi2);
   if (in) return TMath::Min(safe, safphi);
   if (safe>1.E10) return safphi;
   return TMath::Max(safe, safphi);
}

//_____________________________________________________________________________
void TGeoConeSeg::SavePrimitive(std::ostream &out, Option_t * /*option*/ /*= ""*/)
{
// Save a primitive as a C++ statement(s) on output stream "out".
   if (TObject::TestBit(kGeoSavePrimitive)) return;
   out << "   // Shape: " << GetName() << " type: " << ClassName() << std::endl;
   out << "   dz    = " << fDz << ";" << std::endl;
   out << "   rmin1 = " << fRmin1 << ";" << std::endl;
   out << "   rmax1 = " << fRmax1 << ";" << std::endl;
   out << "   rmin2 = " << fRmin2 << ";" << std::endl;
   out << "   rmax2 = " << fRmax2 << ";" << std::endl;
   out << "   phi1  = " << fPhi1 << ";" << std::endl;
   out << "   phi2  = " << fPhi2 << ";" << std::endl;
   out << "   TGeoShape *" << GetPointerName() << " = new TGeoConeSeg(\"" << GetName() << "\", dz,rmin1,rmax1,rmin2,rmax2,phi1,phi2);" << std::endl;
   TObject::SetBit(TGeoShape::kGeoSavePrimitive);
}

//_____________________________________________________________________________
void TGeoConeSeg::SetConsDimensions(Double_t dz, Double_t rmin1, Double_t rmax1,
                   Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2)
{
// Set dimensions of the cone segment.
   fDz   = dz;
   fRmin1 = rmin1;
   fRmax1 = rmax1;
   fRmin2 = rmin2;
   fRmax2 = rmax2;
   fPhi1 = phi1;
   while (fPhi1<0) fPhi1+=360.;
   fPhi2 = phi2;
   while (fPhi2<=fPhi1) fPhi2+=360.;
   if (TGeoShape::IsSameWithinTolerance(fPhi1,fPhi2)) Fatal("SetConsDimensions", "In shape %s invalid phi1=%g, phi2=%g\n", GetName(), fPhi1, fPhi2);
   InitTrigonometry();
}

//_____________________________________________________________________________
void TGeoConeSeg::SetDimensions(Double_t *param)
{
// Set dimensions of the cone segment from an array.
   Double_t dz    = param[0];
   Double_t rmin1 = param[1];
   Double_t rmax1 = param[2];
   Double_t rmin2 = param[3];
   Double_t rmax2 = param[4];
   Double_t phi1  = param[5];
   Double_t phi2  = param[6];
   SetConsDimensions(dz, rmin1, rmax1,rmin2, rmax2, phi1, phi2);
}

//_____________________________________________________________________________
void TGeoConeSeg::SetPoints(Double_t *points) const
{
// Create cone segment mesh points.
   Int_t j, n;
   Float_t dphi,phi,phi1, phi2,dz;

   n = gGeoManager->GetNsegments()+1;
   dz    = fDz;
   phi1 = fPhi1;
   phi2 = fPhi2;

   dphi = (phi2-phi1)/(n-1);

   Int_t indx = 0;

   if (points) {
      for (j = 0; j < n; j++) {
         phi = (fPhi1+j*dphi)*TMath::DegToRad();
         points[indx++] = fRmin1 * TMath::Cos(phi);
         points[indx++] = fRmin1 * TMath::Sin(phi);
         points[indx++] = -dz;
      }
      for (j = 0; j < n; j++) {
         phi = (fPhi1+j*dphi)*TMath::DegToRad();
         points[indx++] = fRmax1 * TMath::Cos(phi);
         points[indx++] = fRmax1 * TMath::Sin(phi);
         points[indx++] = -dz;
      }
      for (j = 0; j < n; j++) {
         phi = (fPhi1+j*dphi)*TMath::DegToRad();
         points[indx++] = fRmin2 * TMath::Cos(phi);
         points[indx++] = fRmin2 * TMath::Sin(phi);
         points[indx++] = dz;
      }
      for (j = 0; j < n; j++) {
         phi = (fPhi1+j*dphi)*TMath::DegToRad();
         points[indx++] = fRmax2 * TMath::Cos(phi);
         points[indx++] = fRmax2 * TMath::Sin(phi);
         points[indx++] = dz;
      }
   }
}

//_____________________________________________________________________________
void TGeoConeSeg::SetPoints(Float_t *points) const
{
// Create cone segment mesh points.
   Int_t j, n;
   Float_t dphi,phi,phi1, phi2,dz;

   n = gGeoManager->GetNsegments()+1;
   dz    = fDz;
   phi1 = fPhi1;
   phi2 = fPhi2;

   dphi = (phi2-phi1)/(n-1);

   Int_t indx = 0;

   if (points) {
      for (j = 0; j < n; j++) {
         phi = (fPhi1+j*dphi)*TMath::DegToRad();
         points[indx++] = fRmin1 * TMath::Cos(phi);
         points[indx++] = fRmin1 * TMath::Sin(phi);
         points[indx++] = -dz;
      }
      for (j = 0; j < n; j++) {
         phi = (fPhi1+j*dphi)*TMath::DegToRad();
         points[indx++] = fRmax1 * TMath::Cos(phi);
         points[indx++] = fRmax1 * TMath::Sin(phi);
         points[indx++] = -dz;
      }
      for (j = 0; j < n; j++) {
         phi = (fPhi1+j*dphi)*TMath::DegToRad();
         points[indx++] = fRmin2 * TMath::Cos(phi);
         points[indx++] = fRmin2 * TMath::Sin(phi);
         points[indx++] = dz;
      }
      for (j = 0; j < n; j++) {
         phi = (fPhi1+j*dphi)*TMath::DegToRad();
         points[indx++] = fRmax2 * TMath::Cos(phi);
         points[indx++] = fRmax2 * TMath::Sin(phi);
         points[indx++] = dz;
      }
   }
}

//_____________________________________________________________________________
void TGeoConeSeg::GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const
{
// Returns numbers of vertices, segments and polygons composing the shape mesh.
   Int_t n = gGeoManager->GetNsegments()+1;
   nvert = n*4;
   nsegs = n*8;
   npols = n*4-2;
}

//_____________________________________________________________________________
Int_t TGeoConeSeg::GetNmeshVertices() const
{
// Return number of vertices of the mesh representation
   Int_t n = gGeoManager->GetNsegments()+1;
   Int_t numPoints = n*4;
   return numPoints;
}

//_____________________________________________________________________________
void TGeoConeSeg::Sizeof3D() const
{
///// fill size of this 3-D object
///    TVirtualGeoPainter *painter = gGeoManager->GetGeomPainter();
///    if (!painter) return;
///
///    Int_t n = gGeoManager->GetNsegments()+1;
///
///    Int_t numPoints = n*4;
///    Int_t numSegs   = n*8;
///    Int_t numPolys  = n*4-2;
///    painter->AddSize3D(numPoints, numSegs, numPolys);
}

//_____________________________________________________________________________
const TBuffer3D & TGeoConeSeg::GetBuffer3D(Int_t reqSections, Bool_t localFrame) const
{
// Fills a static 3D buffer and returns a reference.
   static TBuffer3D buffer(TBuffer3DTypes::kGeneric);

   TGeoBBox::FillBuffer3D(buffer, reqSections, localFrame);

   if (reqSections & TBuffer3D::kRawSizes) {
      Int_t n = gGeoManager->GetNsegments()+1;
      Int_t nbPnts = 4*n;
      Int_t nbSegs = 2*nbPnts;
      Int_t nbPols = nbPnts-2;
      if (buffer.SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
         buffer.SetSectionsValid(TBuffer3D::kRawSizes);
      }
   }
   if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes)) {
      SetPoints(buffer.fPnts);
      if (!buffer.fLocalFrame) {
         TransformPoints(buffer.fPnts, buffer.NbPnts());
      }

      SetSegsAndPols(buffer);
      buffer.SetSectionsValid(TBuffer3D::kRaw);
   }

   return buffer;
}

//_____________________________________________________________________________
Bool_t TGeoConeSeg::GetPointsOnSegments(Int_t npoints, Double_t *array) const
{
// Fills array with n random points located on the line segments of the shape mesh.
// The output array must be provided with a length of minimum 3*npoints. Returns
// true if operation is implemented.
   if (npoints > (npoints/2)*2) {
      Error("GetPointsOnSegments","Npoints must be even number");
      return kFALSE;
   }
   Int_t nc = (Int_t)TMath::Sqrt(0.5*npoints);
   Double_t dphi = (fPhi2-fPhi1)*TMath::DegToRad()/(nc-1);
   Double_t phi = 0;
   Double_t phi1 = fPhi1 * TMath::DegToRad();
   Int_t ntop = npoints/2 - nc*(nc-1);
   Double_t dz = 2*fDz/(nc-1);
   Double_t z = 0;
   Double_t rmin = 0.;
   Double_t rmax = 0.;
   Int_t icrt = 0;
   Int_t nphi = nc;
   // loop z sections
   for (Int_t i=0; i<nc; i++) {
      if (i == (nc-1)) {
         nphi = ntop;
         dphi = (fPhi2-fPhi1)*TMath::DegToRad()/(nphi-1);
      }
      z = -fDz + i*dz;
      rmin = 0.5*(fRmin1+fRmin2) + 0.5*(fRmin2-fRmin1)*z/fDz;
      rmax = 0.5*(fRmax1+fRmax2) + 0.5*(fRmax2-fRmax1)*z/fDz;
      // loop points on circle sections
      for (Int_t j=0; j<nphi; j++) {
         phi = phi1 + j*dphi;
         array[icrt++] = rmin * TMath::Cos(phi);
         array[icrt++] = rmin * TMath::Sin(phi);
         array[icrt++] = z;
         array[icrt++] = rmax * TMath::Cos(phi);
         array[icrt++] = rmax * TMath::Sin(phi);
         array[icrt++] = z;
      }
   }
   return kTRUE;
}

//_____________________________________________________________________________
void TGeoConeSeg::Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const
{
// Check the inside status for each of the points in the array.
// Input: Array of point coordinates + vector size
// Output: Array of Booleans for the inside of each point
   for (Int_t i=0; i<vecsize; i++) inside[i] = Contains(&points[3*i]);
}

//_____________________________________________________________________________
void TGeoConeSeg::ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize)
{
// Compute the normal for an array o points so that norm.dot.dir is positive
// Input: Arrays of point coordinates and directions + vector size
// Output: Array of normal directions
   for (Int_t i=0; i<vecsize; i++) ComputeNormal(&points[3*i], &dirs[3*i], &norms[3*i]);
}

//_____________________________________________________________________________
void TGeoConeSeg::DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t* step) const
{
// Compute distance from array of input points having directions specisied by dirs. Store output in dists
   for (Int_t i=0; i<vecsize; i++) dists[i] = DistFromInside(&points[3*i], &dirs[3*i], 3, step[i]);
}

//_____________________________________________________________________________
void TGeoConeSeg::DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t* step) const
{
// Compute distance from array of input points having directions specisied by dirs. Store output in dists
   for (Int_t i=0; i<vecsize; i++) dists[i] = DistFromOutside(&points[3*i], &dirs[3*i], 3, step[i]);
}

//_____________________________________________________________________________
void TGeoConeSeg::Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const
{
// Compute safe distance from each of the points in the input array.
// Input: Array of point coordinates, array of statuses for these points, size of the arrays
// Output: Safety values
   for (Int_t i=0; i<vecsize; i++) safe[i] = Safety(&points[3*i], inside[i]);
}
 TGeoCone.cxx:1
 TGeoCone.cxx:2
 TGeoCone.cxx:3
 TGeoCone.cxx:4
 TGeoCone.cxx:5
 TGeoCone.cxx:6
 TGeoCone.cxx:7
 TGeoCone.cxx:8
 TGeoCone.cxx:9
 TGeoCone.cxx:10
 TGeoCone.cxx:11
 TGeoCone.cxx:12
 TGeoCone.cxx:13
 TGeoCone.cxx:14
 TGeoCone.cxx:15
 TGeoCone.cxx:16
 TGeoCone.cxx:17
 TGeoCone.cxx:18
 TGeoCone.cxx:19
 TGeoCone.cxx:20
 TGeoCone.cxx:21
 TGeoCone.cxx:22
 TGeoCone.cxx:23
 TGeoCone.cxx:24
 TGeoCone.cxx:25
 TGeoCone.cxx:26
 TGeoCone.cxx:27
 TGeoCone.cxx:28
 TGeoCone.cxx:29
 TGeoCone.cxx:30
 TGeoCone.cxx:31
 TGeoCone.cxx:32
 TGeoCone.cxx:33
 TGeoCone.cxx:34
 TGeoCone.cxx:35
 TGeoCone.cxx:36
 TGeoCone.cxx:37
 TGeoCone.cxx:38
 TGeoCone.cxx:39
 TGeoCone.cxx:40
 TGeoCone.cxx:41
 TGeoCone.cxx:42
 TGeoCone.cxx:43
 TGeoCone.cxx:44
 TGeoCone.cxx:45
 TGeoCone.cxx:46
 TGeoCone.cxx:47
 TGeoCone.cxx:48
 TGeoCone.cxx:49
 TGeoCone.cxx:50
 TGeoCone.cxx:51
 TGeoCone.cxx:52
 TGeoCone.cxx:53
 TGeoCone.cxx:54
 TGeoCone.cxx:55
 TGeoCone.cxx:56
 TGeoCone.cxx:57
 TGeoCone.cxx:58
 TGeoCone.cxx:59
 TGeoCone.cxx:60
 TGeoCone.cxx:61
 TGeoCone.cxx:62
 TGeoCone.cxx:63
 TGeoCone.cxx:64
 TGeoCone.cxx:65
 TGeoCone.cxx:66
 TGeoCone.cxx:67
 TGeoCone.cxx:68
 TGeoCone.cxx:69
 TGeoCone.cxx:70
 TGeoCone.cxx:71
 TGeoCone.cxx:72
 TGeoCone.cxx:73
 TGeoCone.cxx:74
 TGeoCone.cxx:75
 TGeoCone.cxx:76
 TGeoCone.cxx:77
 TGeoCone.cxx:78
 TGeoCone.cxx:79
 TGeoCone.cxx:80
 TGeoCone.cxx:81
 TGeoCone.cxx:82
 TGeoCone.cxx:83
 TGeoCone.cxx:84
 TGeoCone.cxx:85
 TGeoCone.cxx:86
 TGeoCone.cxx:87
 TGeoCone.cxx:88
 TGeoCone.cxx:89
 TGeoCone.cxx:90
 TGeoCone.cxx:91
 TGeoCone.cxx:92
 TGeoCone.cxx:93
 TGeoCone.cxx:94
 TGeoCone.cxx:95
 TGeoCone.cxx:96
 TGeoCone.cxx:97
 TGeoCone.cxx:98
 TGeoCone.cxx:99
 TGeoCone.cxx:100
 TGeoCone.cxx:101
 TGeoCone.cxx:102
 TGeoCone.cxx:103
 TGeoCone.cxx:104
 TGeoCone.cxx:105
 TGeoCone.cxx:106
 TGeoCone.cxx:107
 TGeoCone.cxx:108
 TGeoCone.cxx:109
 TGeoCone.cxx:110
 TGeoCone.cxx:111
 TGeoCone.cxx:112
 TGeoCone.cxx:113
 TGeoCone.cxx:114
 TGeoCone.cxx:115
 TGeoCone.cxx:116
 TGeoCone.cxx:117
 TGeoCone.cxx:118
 TGeoCone.cxx:119
 TGeoCone.cxx:120
 TGeoCone.cxx:121
 TGeoCone.cxx:122
 TGeoCone.cxx:123
 TGeoCone.cxx:124
 TGeoCone.cxx:125
 TGeoCone.cxx:126
 TGeoCone.cxx:127
 TGeoCone.cxx:128
 TGeoCone.cxx:129
 TGeoCone.cxx:130
 TGeoCone.cxx:131
 TGeoCone.cxx:132
 TGeoCone.cxx:133
 TGeoCone.cxx:134
 TGeoCone.cxx:135
 TGeoCone.cxx:136
 TGeoCone.cxx:137
 TGeoCone.cxx:138
 TGeoCone.cxx:139
 TGeoCone.cxx:140
 TGeoCone.cxx:141
 TGeoCone.cxx:142
 TGeoCone.cxx:143
 TGeoCone.cxx:144
 TGeoCone.cxx:145
 TGeoCone.cxx:146
 TGeoCone.cxx:147
 TGeoCone.cxx:148
 TGeoCone.cxx:149
 TGeoCone.cxx:150
 TGeoCone.cxx:151
 TGeoCone.cxx:152
 TGeoCone.cxx:153
 TGeoCone.cxx:154
 TGeoCone.cxx:155
 TGeoCone.cxx:156
 TGeoCone.cxx:157
 TGeoCone.cxx:158
 TGeoCone.cxx:159
 TGeoCone.cxx:160
 TGeoCone.cxx:161
 TGeoCone.cxx:162
 TGeoCone.cxx:163
 TGeoCone.cxx:164
 TGeoCone.cxx:165
 TGeoCone.cxx:166
 TGeoCone.cxx:167
 TGeoCone.cxx:168
 TGeoCone.cxx:169
 TGeoCone.cxx:170
 TGeoCone.cxx:171
 TGeoCone.cxx:172
 TGeoCone.cxx:173
 TGeoCone.cxx:174
 TGeoCone.cxx:175
 TGeoCone.cxx:176
 TGeoCone.cxx:177
 TGeoCone.cxx:178
 TGeoCone.cxx:179
 TGeoCone.cxx:180
 TGeoCone.cxx:181
 TGeoCone.cxx:182
 TGeoCone.cxx:183
 TGeoCone.cxx:184
 TGeoCone.cxx:185
 TGeoCone.cxx:186
 TGeoCone.cxx:187
 TGeoCone.cxx:188
 TGeoCone.cxx:189
 TGeoCone.cxx:190
 TGeoCone.cxx:191
 TGeoCone.cxx:192
 TGeoCone.cxx:193
 TGeoCone.cxx:194
 TGeoCone.cxx:195
 TGeoCone.cxx:196
 TGeoCone.cxx:197
 TGeoCone.cxx:198
 TGeoCone.cxx:199
 TGeoCone.cxx:200
 TGeoCone.cxx:201
 TGeoCone.cxx:202
 TGeoCone.cxx:203
 TGeoCone.cxx:204
 TGeoCone.cxx:205
 TGeoCone.cxx:206
 TGeoCone.cxx:207
 TGeoCone.cxx:208
 TGeoCone.cxx:209
 TGeoCone.cxx:210
 TGeoCone.cxx:211
 TGeoCone.cxx:212
 TGeoCone.cxx:213
 TGeoCone.cxx:214
 TGeoCone.cxx:215
 TGeoCone.cxx:216
 TGeoCone.cxx:217
 TGeoCone.cxx:218
 TGeoCone.cxx:219
 TGeoCone.cxx:220
 TGeoCone.cxx:221
 TGeoCone.cxx:222
 TGeoCone.cxx:223
 TGeoCone.cxx:224
 TGeoCone.cxx:225
 TGeoCone.cxx:226
 TGeoCone.cxx:227
 TGeoCone.cxx:228
 TGeoCone.cxx:229
 TGeoCone.cxx:230
 TGeoCone.cxx:231
 TGeoCone.cxx:232
 TGeoCone.cxx:233
 TGeoCone.cxx:234
 TGeoCone.cxx:235
 TGeoCone.cxx:236
 TGeoCone.cxx:237
 TGeoCone.cxx:238
 TGeoCone.cxx:239
 TGeoCone.cxx:240
 TGeoCone.cxx:241
 TGeoCone.cxx:242
 TGeoCone.cxx:243
 TGeoCone.cxx:244
 TGeoCone.cxx:245
 TGeoCone.cxx:246
 TGeoCone.cxx:247
 TGeoCone.cxx:248
 TGeoCone.cxx:249
 TGeoCone.cxx:250
 TGeoCone.cxx:251
 TGeoCone.cxx:252
 TGeoCone.cxx:253
 TGeoCone.cxx:254
 TGeoCone.cxx:255
 TGeoCone.cxx:256
 TGeoCone.cxx:257
 TGeoCone.cxx:258
 TGeoCone.cxx:259
 TGeoCone.cxx:260
 TGeoCone.cxx:261
 TGeoCone.cxx:262
 TGeoCone.cxx:263
 TGeoCone.cxx:264
 TGeoCone.cxx:265
 TGeoCone.cxx:266
 TGeoCone.cxx:267
 TGeoCone.cxx:268
 TGeoCone.cxx:269
 TGeoCone.cxx:270
 TGeoCone.cxx:271
 TGeoCone.cxx:272
 TGeoCone.cxx:273
 TGeoCone.cxx:274
 TGeoCone.cxx:275
 TGeoCone.cxx:276
 TGeoCone.cxx:277
 TGeoCone.cxx:278
 TGeoCone.cxx:279
 TGeoCone.cxx:280
 TGeoCone.cxx:281
 TGeoCone.cxx:282
 TGeoCone.cxx:283
 TGeoCone.cxx:284
 TGeoCone.cxx:285
 TGeoCone.cxx:286
 TGeoCone.cxx:287
 TGeoCone.cxx:288
 TGeoCone.cxx:289
 TGeoCone.cxx:290
 TGeoCone.cxx:291
 TGeoCone.cxx:292
 TGeoCone.cxx:293
 TGeoCone.cxx:294
 TGeoCone.cxx:295
 TGeoCone.cxx:296
 TGeoCone.cxx:297
 TGeoCone.cxx:298
 TGeoCone.cxx:299
 TGeoCone.cxx:300
 TGeoCone.cxx:301
 TGeoCone.cxx:302
 TGeoCone.cxx:303
 TGeoCone.cxx:304
 TGeoCone.cxx:305
 TGeoCone.cxx:306
 TGeoCone.cxx:307
 TGeoCone.cxx:308
 TGeoCone.cxx:309
 TGeoCone.cxx:310
 TGeoCone.cxx:311
 TGeoCone.cxx:312
 TGeoCone.cxx:313
 TGeoCone.cxx:314
 TGeoCone.cxx:315
 TGeoCone.cxx:316
 TGeoCone.cxx:317
 TGeoCone.cxx:318
 TGeoCone.cxx:319
 TGeoCone.cxx:320
 TGeoCone.cxx:321
 TGeoCone.cxx:322
 TGeoCone.cxx:323
 TGeoCone.cxx:324
 TGeoCone.cxx:325
 TGeoCone.cxx:326
 TGeoCone.cxx:327
 TGeoCone.cxx:328
 TGeoCone.cxx:329
 TGeoCone.cxx:330
 TGeoCone.cxx:331
 TGeoCone.cxx:332
 TGeoCone.cxx:333
 TGeoCone.cxx:334
 TGeoCone.cxx:335
 TGeoCone.cxx:336
 TGeoCone.cxx:337
 TGeoCone.cxx:338
 TGeoCone.cxx:339
 TGeoCone.cxx:340
 TGeoCone.cxx:341
 TGeoCone.cxx:342
 TGeoCone.cxx:343
 TGeoCone.cxx:344
 TGeoCone.cxx:345
 TGeoCone.cxx:346
 TGeoCone.cxx:347
 TGeoCone.cxx:348
 TGeoCone.cxx:349
 TGeoCone.cxx:350
 TGeoCone.cxx:351
 TGeoCone.cxx:352
 TGeoCone.cxx:353
 TGeoCone.cxx:354
 TGeoCone.cxx:355
 TGeoCone.cxx:356
 TGeoCone.cxx:357
 TGeoCone.cxx:358
 TGeoCone.cxx:359
 TGeoCone.cxx:360
 TGeoCone.cxx:361
 TGeoCone.cxx:362
 TGeoCone.cxx:363
 TGeoCone.cxx:364
 TGeoCone.cxx:365
 TGeoCone.cxx:366
 TGeoCone.cxx:367
 TGeoCone.cxx:368
 TGeoCone.cxx:369
 TGeoCone.cxx:370
 TGeoCone.cxx:371
 TGeoCone.cxx:372
 TGeoCone.cxx:373
 TGeoCone.cxx:374
 TGeoCone.cxx:375
 TGeoCone.cxx:376
 TGeoCone.cxx:377
 TGeoCone.cxx:378
 TGeoCone.cxx:379
 TGeoCone.cxx:380
 TGeoCone.cxx:381
 TGeoCone.cxx:382
 TGeoCone.cxx:383
 TGeoCone.cxx:384
 TGeoCone.cxx:385
 TGeoCone.cxx:386
 TGeoCone.cxx:387
 TGeoCone.cxx:388
 TGeoCone.cxx:389
 TGeoCone.cxx:390
 TGeoCone.cxx:391
 TGeoCone.cxx:392
 TGeoCone.cxx:393
 TGeoCone.cxx:394
 TGeoCone.cxx:395
 TGeoCone.cxx:396
 TGeoCone.cxx:397
 TGeoCone.cxx:398
 TGeoCone.cxx:399
 TGeoCone.cxx:400
 TGeoCone.cxx:401
 TGeoCone.cxx:402
 TGeoCone.cxx:403
 TGeoCone.cxx:404
 TGeoCone.cxx:405
 TGeoCone.cxx:406
 TGeoCone.cxx:407
 TGeoCone.cxx:408
 TGeoCone.cxx:409
 TGeoCone.cxx:410
 TGeoCone.cxx:411
 TGeoCone.cxx:412
 TGeoCone.cxx:413
 TGeoCone.cxx:414
 TGeoCone.cxx:415
 TGeoCone.cxx:416
 TGeoCone.cxx:417
 TGeoCone.cxx:418
 TGeoCone.cxx:419
 TGeoCone.cxx:420
 TGeoCone.cxx:421
 TGeoCone.cxx:422
 TGeoCone.cxx:423
 TGeoCone.cxx:424
 TGeoCone.cxx:425
 TGeoCone.cxx:426
 TGeoCone.cxx:427
 TGeoCone.cxx:428
 TGeoCone.cxx:429
 TGeoCone.cxx:430
 TGeoCone.cxx:431
 TGeoCone.cxx:432
 TGeoCone.cxx:433
 TGeoCone.cxx:434
 TGeoCone.cxx:435
 TGeoCone.cxx:436
 TGeoCone.cxx:437
 TGeoCone.cxx:438
 TGeoCone.cxx:439
 TGeoCone.cxx:440
 TGeoCone.cxx:441
 TGeoCone.cxx:442
 TGeoCone.cxx:443
 TGeoCone.cxx:444
 TGeoCone.cxx:445
 TGeoCone.cxx:446
 TGeoCone.cxx:447
 TGeoCone.cxx:448
 TGeoCone.cxx:449
 TGeoCone.cxx:450
 TGeoCone.cxx:451
 TGeoCone.cxx:452
 TGeoCone.cxx:453
 TGeoCone.cxx:454
 TGeoCone.cxx:455
 TGeoCone.cxx:456
 TGeoCone.cxx:457
 TGeoCone.cxx:458
 TGeoCone.cxx:459
 TGeoCone.cxx:460
 TGeoCone.cxx:461
 TGeoCone.cxx:462
 TGeoCone.cxx:463
 TGeoCone.cxx:464
 TGeoCone.cxx:465
 TGeoCone.cxx:466
 TGeoCone.cxx:467
 TGeoCone.cxx:468
 TGeoCone.cxx:469
 TGeoCone.cxx:470
 TGeoCone.cxx:471
 TGeoCone.cxx:472
 TGeoCone.cxx:473
 TGeoCone.cxx:474
 TGeoCone.cxx:475
 TGeoCone.cxx:476
 TGeoCone.cxx:477
 TGeoCone.cxx:478
 TGeoCone.cxx:479
 TGeoCone.cxx:480
 TGeoCone.cxx:481
 TGeoCone.cxx:482
 TGeoCone.cxx:483
 TGeoCone.cxx:484
 TGeoCone.cxx:485
 TGeoCone.cxx:486
 TGeoCone.cxx:487
 TGeoCone.cxx:488
 TGeoCone.cxx:489
 TGeoCone.cxx:490
 TGeoCone.cxx:491
 TGeoCone.cxx:492
 TGeoCone.cxx:493
 TGeoCone.cxx:494
 TGeoCone.cxx:495
 TGeoCone.cxx:496
 TGeoCone.cxx:497
 TGeoCone.cxx:498
 TGeoCone.cxx:499
 TGeoCone.cxx:500
 TGeoCone.cxx:501
 TGeoCone.cxx:502
 TGeoCone.cxx:503
 TGeoCone.cxx:504
 TGeoCone.cxx:505
 TGeoCone.cxx:506
 TGeoCone.cxx:507
 TGeoCone.cxx:508
 TGeoCone.cxx:509
 TGeoCone.cxx:510
 TGeoCone.cxx:511
 TGeoCone.cxx:512
 TGeoCone.cxx:513
 TGeoCone.cxx:514
 TGeoCone.cxx:515
 TGeoCone.cxx:516
 TGeoCone.cxx:517
 TGeoCone.cxx:518
 TGeoCone.cxx:519
 TGeoCone.cxx:520
 TGeoCone.cxx:521
 TGeoCone.cxx:522
 TGeoCone.cxx:523
 TGeoCone.cxx:524
 TGeoCone.cxx:525
 TGeoCone.cxx:526
 TGeoCone.cxx:527
 TGeoCone.cxx:528
 TGeoCone.cxx:529
 TGeoCone.cxx:530
 TGeoCone.cxx:531
 TGeoCone.cxx:532
 TGeoCone.cxx:533
 TGeoCone.cxx:534
 TGeoCone.cxx:535
 TGeoCone.cxx:536
 TGeoCone.cxx:537
 TGeoCone.cxx:538
 TGeoCone.cxx:539
 TGeoCone.cxx:540
 TGeoCone.cxx:541
 TGeoCone.cxx:542
 TGeoCone.cxx:543
 TGeoCone.cxx:544
 TGeoCone.cxx:545
 TGeoCone.cxx:546
 TGeoCone.cxx:547
 TGeoCone.cxx:548
 TGeoCone.cxx:549
 TGeoCone.cxx:550
 TGeoCone.cxx:551
 TGeoCone.cxx:552
 TGeoCone.cxx:553
 TGeoCone.cxx:554
 TGeoCone.cxx:555
 TGeoCone.cxx:556
 TGeoCone.cxx:557
 TGeoCone.cxx:558
 TGeoCone.cxx:559
 TGeoCone.cxx:560
 TGeoCone.cxx:561
 TGeoCone.cxx:562
 TGeoCone.cxx:563
 TGeoCone.cxx:564
 TGeoCone.cxx:565
 TGeoCone.cxx:566
 TGeoCone.cxx:567
 TGeoCone.cxx:568
 TGeoCone.cxx:569
 TGeoCone.cxx:570
 TGeoCone.cxx:571
 TGeoCone.cxx:572
 TGeoCone.cxx:573
 TGeoCone.cxx:574
 TGeoCone.cxx:575
 TGeoCone.cxx:576
 TGeoCone.cxx:577
 TGeoCone.cxx:578
 TGeoCone.cxx:579
 TGeoCone.cxx:580
 TGeoCone.cxx:581
 TGeoCone.cxx:582
 TGeoCone.cxx:583
 TGeoCone.cxx:584
 TGeoCone.cxx:585
 TGeoCone.cxx:586
 TGeoCone.cxx:587
 TGeoCone.cxx:588
 TGeoCone.cxx:589
 TGeoCone.cxx:590
 TGeoCone.cxx:591
 TGeoCone.cxx:592
 TGeoCone.cxx:593
 TGeoCone.cxx:594
 TGeoCone.cxx:595
 TGeoCone.cxx:596
 TGeoCone.cxx:597
 TGeoCone.cxx:598
 TGeoCone.cxx:599
 TGeoCone.cxx:600
 TGeoCone.cxx:601
 TGeoCone.cxx:602
 TGeoCone.cxx:603
 TGeoCone.cxx:604
 TGeoCone.cxx:605
 TGeoCone.cxx:606
 TGeoCone.cxx:607
 TGeoCone.cxx:608
 TGeoCone.cxx:609
 TGeoCone.cxx:610
 TGeoCone.cxx:611
 TGeoCone.cxx:612
 TGeoCone.cxx:613
 TGeoCone.cxx:614
 TGeoCone.cxx:615
 TGeoCone.cxx:616
 TGeoCone.cxx:617
 TGeoCone.cxx:618
 TGeoCone.cxx:619
 TGeoCone.cxx:620
 TGeoCone.cxx:621
 TGeoCone.cxx:622
 TGeoCone.cxx:623
 TGeoCone.cxx:624
 TGeoCone.cxx:625
 TGeoCone.cxx:626
 TGeoCone.cxx:627
 TGeoCone.cxx:628
 TGeoCone.cxx:629
 TGeoCone.cxx:630
 TGeoCone.cxx:631
 TGeoCone.cxx:632
 TGeoCone.cxx:633
 TGeoCone.cxx:634
 TGeoCone.cxx:635
 TGeoCone.cxx:636
 TGeoCone.cxx:637
 TGeoCone.cxx:638
 TGeoCone.cxx:639
 TGeoCone.cxx:640
 TGeoCone.cxx:641
 TGeoCone.cxx:642
 TGeoCone.cxx:643
 TGeoCone.cxx:644
 TGeoCone.cxx:645
 TGeoCone.cxx:646
 TGeoCone.cxx:647
 TGeoCone.cxx:648
 TGeoCone.cxx:649
 TGeoCone.cxx:650
 TGeoCone.cxx:651
 TGeoCone.cxx:652
 TGeoCone.cxx:653
 TGeoCone.cxx:654
 TGeoCone.cxx:655
 TGeoCone.cxx:656
 TGeoCone.cxx:657
 TGeoCone.cxx:658
 TGeoCone.cxx:659
 TGeoCone.cxx:660
 TGeoCone.cxx:661
 TGeoCone.cxx:662
 TGeoCone.cxx:663
 TGeoCone.cxx:664
 TGeoCone.cxx:665
 TGeoCone.cxx:666
 TGeoCone.cxx:667
 TGeoCone.cxx:668
 TGeoCone.cxx:669
 TGeoCone.cxx:670
 TGeoCone.cxx:671
 TGeoCone.cxx:672
 TGeoCone.cxx:673
 TGeoCone.cxx:674
 TGeoCone.cxx:675
 TGeoCone.cxx:676
 TGeoCone.cxx:677
 TGeoCone.cxx:678
 TGeoCone.cxx:679
 TGeoCone.cxx:680
 TGeoCone.cxx:681
 TGeoCone.cxx:682
 TGeoCone.cxx:683
 TGeoCone.cxx:684
 TGeoCone.cxx:685
 TGeoCone.cxx:686
 TGeoCone.cxx:687
 TGeoCone.cxx:688
 TGeoCone.cxx:689
 TGeoCone.cxx:690
 TGeoCone.cxx:691
 TGeoCone.cxx:692
 TGeoCone.cxx:693
 TGeoCone.cxx:694
 TGeoCone.cxx:695
 TGeoCone.cxx:696
 TGeoCone.cxx:697
 TGeoCone.cxx:698
 TGeoCone.cxx:699
 TGeoCone.cxx:700
 TGeoCone.cxx:701
 TGeoCone.cxx:702
 TGeoCone.cxx:703
 TGeoCone.cxx:704
 TGeoCone.cxx:705
 TGeoCone.cxx:706
 TGeoCone.cxx:707
 TGeoCone.cxx:708
 TGeoCone.cxx:709
 TGeoCone.cxx:710
 TGeoCone.cxx:711
 TGeoCone.cxx:712
 TGeoCone.cxx:713
 TGeoCone.cxx:714
 TGeoCone.cxx:715
 TGeoCone.cxx:716
 TGeoCone.cxx:717
 TGeoCone.cxx:718
 TGeoCone.cxx:719
 TGeoCone.cxx:720
 TGeoCone.cxx:721
 TGeoCone.cxx:722
 TGeoCone.cxx:723
 TGeoCone.cxx:724
 TGeoCone.cxx:725
 TGeoCone.cxx:726
 TGeoCone.cxx:727
 TGeoCone.cxx:728
 TGeoCone.cxx:729
 TGeoCone.cxx:730
 TGeoCone.cxx:731
 TGeoCone.cxx:732
 TGeoCone.cxx:733
 TGeoCone.cxx:734
 TGeoCone.cxx:735
 TGeoCone.cxx:736
 TGeoCone.cxx:737
 TGeoCone.cxx:738
 TGeoCone.cxx:739
 TGeoCone.cxx:740
 TGeoCone.cxx:741
 TGeoCone.cxx:742
 TGeoCone.cxx:743
 TGeoCone.cxx:744
 TGeoCone.cxx:745
 TGeoCone.cxx:746
 TGeoCone.cxx:747
 TGeoCone.cxx:748
 TGeoCone.cxx:749
 TGeoCone.cxx:750
 TGeoCone.cxx:751
 TGeoCone.cxx:752
 TGeoCone.cxx:753
 TGeoCone.cxx:754
 TGeoCone.cxx:755
 TGeoCone.cxx:756
 TGeoCone.cxx:757
 TGeoCone.cxx:758
 TGeoCone.cxx:759
 TGeoCone.cxx:760
 TGeoCone.cxx:761
 TGeoCone.cxx:762
 TGeoCone.cxx:763
 TGeoCone.cxx:764
 TGeoCone.cxx:765
 TGeoCone.cxx:766
 TGeoCone.cxx:767
 TGeoCone.cxx:768
 TGeoCone.cxx:769
 TGeoCone.cxx:770
 TGeoCone.cxx:771
 TGeoCone.cxx:772
 TGeoCone.cxx:773
 TGeoCone.cxx:774
 TGeoCone.cxx:775
 TGeoCone.cxx:776
 TGeoCone.cxx:777
 TGeoCone.cxx:778
 TGeoCone.cxx:779
 TGeoCone.cxx:780
 TGeoCone.cxx:781
 TGeoCone.cxx:782
 TGeoCone.cxx:783
 TGeoCone.cxx:784
 TGeoCone.cxx:785
 TGeoCone.cxx:786
 TGeoCone.cxx:787
 TGeoCone.cxx:788
 TGeoCone.cxx:789
 TGeoCone.cxx:790
 TGeoCone.cxx:791
 TGeoCone.cxx:792
 TGeoCone.cxx:793
 TGeoCone.cxx:794
 TGeoCone.cxx:795
 TGeoCone.cxx:796
 TGeoCone.cxx:797
 TGeoCone.cxx:798
 TGeoCone.cxx:799
 TGeoCone.cxx:800
 TGeoCone.cxx:801
 TGeoCone.cxx:802
 TGeoCone.cxx:803
 TGeoCone.cxx:804
 TGeoCone.cxx:805
 TGeoCone.cxx:806
 TGeoCone.cxx:807
 TGeoCone.cxx:808
 TGeoCone.cxx:809
 TGeoCone.cxx:810
 TGeoCone.cxx:811
 TGeoCone.cxx:812
 TGeoCone.cxx:813
 TGeoCone.cxx:814
 TGeoCone.cxx:815
 TGeoCone.cxx:816
 TGeoCone.cxx:817
 TGeoCone.cxx:818
 TGeoCone.cxx:819
 TGeoCone.cxx:820
 TGeoCone.cxx:821
 TGeoCone.cxx:822
 TGeoCone.cxx:823
 TGeoCone.cxx:824
 TGeoCone.cxx:825
 TGeoCone.cxx:826
 TGeoCone.cxx:827
 TGeoCone.cxx:828
 TGeoCone.cxx:829
 TGeoCone.cxx:830
 TGeoCone.cxx:831
 TGeoCone.cxx:832
 TGeoCone.cxx:833
 TGeoCone.cxx:834
 TGeoCone.cxx:835
 TGeoCone.cxx:836
 TGeoCone.cxx:837
 TGeoCone.cxx:838
 TGeoCone.cxx:839
 TGeoCone.cxx:840
 TGeoCone.cxx:841
 TGeoCone.cxx:842
 TGeoCone.cxx:843
 TGeoCone.cxx:844
 TGeoCone.cxx:845
 TGeoCone.cxx:846
 TGeoCone.cxx:847
 TGeoCone.cxx:848
 TGeoCone.cxx:849
 TGeoCone.cxx:850
 TGeoCone.cxx:851
 TGeoCone.cxx:852
 TGeoCone.cxx:853
 TGeoCone.cxx:854
 TGeoCone.cxx:855
 TGeoCone.cxx:856
 TGeoCone.cxx:857
 TGeoCone.cxx:858
 TGeoCone.cxx:859
 TGeoCone.cxx:860
 TGeoCone.cxx:861
 TGeoCone.cxx:862
 TGeoCone.cxx:863
 TGeoCone.cxx:864
 TGeoCone.cxx:865
 TGeoCone.cxx:866
 TGeoCone.cxx:867
 TGeoCone.cxx:868
 TGeoCone.cxx:869
 TGeoCone.cxx:870
 TGeoCone.cxx:871
 TGeoCone.cxx:872
 TGeoCone.cxx:873
 TGeoCone.cxx:874
 TGeoCone.cxx:875
 TGeoCone.cxx:876
 TGeoCone.cxx:877
 TGeoCone.cxx:878
 TGeoCone.cxx:879
 TGeoCone.cxx:880
 TGeoCone.cxx:881
 TGeoCone.cxx:882
 TGeoCone.cxx:883
 TGeoCone.cxx:884
 TGeoCone.cxx:885
 TGeoCone.cxx:886
 TGeoCone.cxx:887
 TGeoCone.cxx:888
 TGeoCone.cxx:889
 TGeoCone.cxx:890
 TGeoCone.cxx:891
 TGeoCone.cxx:892
 TGeoCone.cxx:893
 TGeoCone.cxx:894
 TGeoCone.cxx:895
 TGeoCone.cxx:896
 TGeoCone.cxx:897
 TGeoCone.cxx:898
 TGeoCone.cxx:899
 TGeoCone.cxx:900
 TGeoCone.cxx:901
 TGeoCone.cxx:902
 TGeoCone.cxx:903
 TGeoCone.cxx:904
 TGeoCone.cxx:905
 TGeoCone.cxx:906
 TGeoCone.cxx:907
 TGeoCone.cxx:908
 TGeoCone.cxx:909
 TGeoCone.cxx:910
 TGeoCone.cxx:911
 TGeoCone.cxx:912
 TGeoCone.cxx:913
 TGeoCone.cxx:914
 TGeoCone.cxx:915
 TGeoCone.cxx:916
 TGeoCone.cxx:917
 TGeoCone.cxx:918
 TGeoCone.cxx:919
 TGeoCone.cxx:920
 TGeoCone.cxx:921
 TGeoCone.cxx:922
 TGeoCone.cxx:923
 TGeoCone.cxx:924
 TGeoCone.cxx:925
 TGeoCone.cxx:926
 TGeoCone.cxx:927
 TGeoCone.cxx:928
 TGeoCone.cxx:929
 TGeoCone.cxx:930
 TGeoCone.cxx:931
 TGeoCone.cxx:932
 TGeoCone.cxx:933
 TGeoCone.cxx:934
 TGeoCone.cxx:935
 TGeoCone.cxx:936
 TGeoCone.cxx:937
 TGeoCone.cxx:938
 TGeoCone.cxx:939
 TGeoCone.cxx:940
 TGeoCone.cxx:941
 TGeoCone.cxx:942
 TGeoCone.cxx:943
 TGeoCone.cxx:944
 TGeoCone.cxx:945
 TGeoCone.cxx:946
 TGeoCone.cxx:947
 TGeoCone.cxx:948
 TGeoCone.cxx:949
 TGeoCone.cxx:950
 TGeoCone.cxx:951
 TGeoCone.cxx:952
 TGeoCone.cxx:953
 TGeoCone.cxx:954
 TGeoCone.cxx:955
 TGeoCone.cxx:956
 TGeoCone.cxx:957
 TGeoCone.cxx:958
 TGeoCone.cxx:959
 TGeoCone.cxx:960
 TGeoCone.cxx:961
 TGeoCone.cxx:962
 TGeoCone.cxx:963
 TGeoCone.cxx:964
 TGeoCone.cxx:965
 TGeoCone.cxx:966
 TGeoCone.cxx:967
 TGeoCone.cxx:968
 TGeoCone.cxx:969
 TGeoCone.cxx:970
 TGeoCone.cxx:971
 TGeoCone.cxx:972
 TGeoCone.cxx:973
 TGeoCone.cxx:974
 TGeoCone.cxx:975
 TGeoCone.cxx:976
 TGeoCone.cxx:977
 TGeoCone.cxx:978
 TGeoCone.cxx:979
 TGeoCone.cxx:980
 TGeoCone.cxx:981
 TGeoCone.cxx:982
 TGeoCone.cxx:983
 TGeoCone.cxx:984
 TGeoCone.cxx:985
 TGeoCone.cxx:986
 TGeoCone.cxx:987
 TGeoCone.cxx:988
 TGeoCone.cxx:989
 TGeoCone.cxx:990
 TGeoCone.cxx:991
 TGeoCone.cxx:992
 TGeoCone.cxx:993
 TGeoCone.cxx:994
 TGeoCone.cxx:995
 TGeoCone.cxx:996
 TGeoCone.cxx:997
 TGeoCone.cxx:998
 TGeoCone.cxx:999
 TGeoCone.cxx:1000
 TGeoCone.cxx:1001
 TGeoCone.cxx:1002
 TGeoCone.cxx:1003
 TGeoCone.cxx:1004
 TGeoCone.cxx:1005
 TGeoCone.cxx:1006
 TGeoCone.cxx:1007
 TGeoCone.cxx:1008
 TGeoCone.cxx:1009
 TGeoCone.cxx:1010
 TGeoCone.cxx:1011
 TGeoCone.cxx:1012
 TGeoCone.cxx:1013
 TGeoCone.cxx:1014
 TGeoCone.cxx:1015
 TGeoCone.cxx:1016
 TGeoCone.cxx:1017
 TGeoCone.cxx:1018
 TGeoCone.cxx:1019
 TGeoCone.cxx:1020
 TGeoCone.cxx:1021
 TGeoCone.cxx:1022
 TGeoCone.cxx:1023
 TGeoCone.cxx:1024
 TGeoCone.cxx:1025
 TGeoCone.cxx:1026
 TGeoCone.cxx:1027
 TGeoCone.cxx:1028
 TGeoCone.cxx:1029
 TGeoCone.cxx:1030
 TGeoCone.cxx:1031
 TGeoCone.cxx:1032
 TGeoCone.cxx:1033
 TGeoCone.cxx:1034
 TGeoCone.cxx:1035
 TGeoCone.cxx:1036
 TGeoCone.cxx:1037
 TGeoCone.cxx:1038
 TGeoCone.cxx:1039
 TGeoCone.cxx:1040
 TGeoCone.cxx:1041
 TGeoCone.cxx:1042
 TGeoCone.cxx:1043
 TGeoCone.cxx:1044
 TGeoCone.cxx:1045
 TGeoCone.cxx:1046
 TGeoCone.cxx:1047
 TGeoCone.cxx:1048
 TGeoCone.cxx:1049
 TGeoCone.cxx:1050
 TGeoCone.cxx:1051
 TGeoCone.cxx:1052
 TGeoCone.cxx:1053
 TGeoCone.cxx:1054
 TGeoCone.cxx:1055
 TGeoCone.cxx:1056
 TGeoCone.cxx:1057
 TGeoCone.cxx:1058
 TGeoCone.cxx:1059
 TGeoCone.cxx:1060
 TGeoCone.cxx:1061
 TGeoCone.cxx:1062
 TGeoCone.cxx:1063
 TGeoCone.cxx:1064
 TGeoCone.cxx:1065
 TGeoCone.cxx:1066
 TGeoCone.cxx:1067
 TGeoCone.cxx:1068
 TGeoCone.cxx:1069
 TGeoCone.cxx:1070
 TGeoCone.cxx:1071
 TGeoCone.cxx:1072
 TGeoCone.cxx:1073
 TGeoCone.cxx:1074
 TGeoCone.cxx:1075
 TGeoCone.cxx:1076
 TGeoCone.cxx:1077
 TGeoCone.cxx:1078
 TGeoCone.cxx:1079
 TGeoCone.cxx:1080
 TGeoCone.cxx:1081
 TGeoCone.cxx:1082
 TGeoCone.cxx:1083
 TGeoCone.cxx:1084
 TGeoCone.cxx:1085
 TGeoCone.cxx:1086
 TGeoCone.cxx:1087
 TGeoCone.cxx:1088
 TGeoCone.cxx:1089
 TGeoCone.cxx:1090
 TGeoCone.cxx:1091
 TGeoCone.cxx:1092
 TGeoCone.cxx:1093
 TGeoCone.cxx:1094
 TGeoCone.cxx:1095
 TGeoCone.cxx:1096
 TGeoCone.cxx:1097
 TGeoCone.cxx:1098
 TGeoCone.cxx:1099
 TGeoCone.cxx:1100
 TGeoCone.cxx:1101
 TGeoCone.cxx:1102
 TGeoCone.cxx:1103
 TGeoCone.cxx:1104
 TGeoCone.cxx:1105
 TGeoCone.cxx:1106
 TGeoCone.cxx:1107
 TGeoCone.cxx:1108
 TGeoCone.cxx:1109
 TGeoCone.cxx:1110
 TGeoCone.cxx:1111
 TGeoCone.cxx:1112
 TGeoCone.cxx:1113
 TGeoCone.cxx:1114
 TGeoCone.cxx:1115
 TGeoCone.cxx:1116
 TGeoCone.cxx:1117
 TGeoCone.cxx:1118
 TGeoCone.cxx:1119
 TGeoCone.cxx:1120
 TGeoCone.cxx:1121
 TGeoCone.cxx:1122
 TGeoCone.cxx:1123
 TGeoCone.cxx:1124
 TGeoCone.cxx:1125
 TGeoCone.cxx:1126
 TGeoCone.cxx:1127
 TGeoCone.cxx:1128
 TGeoCone.cxx:1129
 TGeoCone.cxx:1130
 TGeoCone.cxx:1131
 TGeoCone.cxx:1132
 TGeoCone.cxx:1133
 TGeoCone.cxx:1134
 TGeoCone.cxx:1135
 TGeoCone.cxx:1136
 TGeoCone.cxx:1137
 TGeoCone.cxx:1138
 TGeoCone.cxx:1139
 TGeoCone.cxx:1140
 TGeoCone.cxx:1141
 TGeoCone.cxx:1142
 TGeoCone.cxx:1143
 TGeoCone.cxx:1144
 TGeoCone.cxx:1145
 TGeoCone.cxx:1146
 TGeoCone.cxx:1147
 TGeoCone.cxx:1148
 TGeoCone.cxx:1149
 TGeoCone.cxx:1150
 TGeoCone.cxx:1151
 TGeoCone.cxx:1152
 TGeoCone.cxx:1153
 TGeoCone.cxx:1154
 TGeoCone.cxx:1155
 TGeoCone.cxx:1156
 TGeoCone.cxx:1157
 TGeoCone.cxx:1158
 TGeoCone.cxx:1159
 TGeoCone.cxx:1160
 TGeoCone.cxx:1161
 TGeoCone.cxx:1162
 TGeoCone.cxx:1163
 TGeoCone.cxx:1164
 TGeoCone.cxx:1165
 TGeoCone.cxx:1166
 TGeoCone.cxx:1167
 TGeoCone.cxx:1168
 TGeoCone.cxx:1169
 TGeoCone.cxx:1170
 TGeoCone.cxx:1171
 TGeoCone.cxx:1172
 TGeoCone.cxx:1173
 TGeoCone.cxx:1174
 TGeoCone.cxx:1175
 TGeoCone.cxx:1176
 TGeoCone.cxx:1177
 TGeoCone.cxx:1178
 TGeoCone.cxx:1179
 TGeoCone.cxx:1180
 TGeoCone.cxx:1181
 TGeoCone.cxx:1182
 TGeoCone.cxx:1183
 TGeoCone.cxx:1184
 TGeoCone.cxx:1185
 TGeoCone.cxx:1186
 TGeoCone.cxx:1187
 TGeoCone.cxx:1188
 TGeoCone.cxx:1189
 TGeoCone.cxx:1190
 TGeoCone.cxx:1191
 TGeoCone.cxx:1192
 TGeoCone.cxx:1193
 TGeoCone.cxx:1194
 TGeoCone.cxx:1195
 TGeoCone.cxx:1196
 TGeoCone.cxx:1197
 TGeoCone.cxx:1198
 TGeoCone.cxx:1199
 TGeoCone.cxx:1200
 TGeoCone.cxx:1201
 TGeoCone.cxx:1202
 TGeoCone.cxx:1203
 TGeoCone.cxx:1204
 TGeoCone.cxx:1205
 TGeoCone.cxx:1206
 TGeoCone.cxx:1207
 TGeoCone.cxx:1208
 TGeoCone.cxx:1209
 TGeoCone.cxx:1210
 TGeoCone.cxx:1211
 TGeoCone.cxx:1212
 TGeoCone.cxx:1213
 TGeoCone.cxx:1214
 TGeoCone.cxx:1215
 TGeoCone.cxx:1216
 TGeoCone.cxx:1217
 TGeoCone.cxx:1218
 TGeoCone.cxx:1219
 TGeoCone.cxx:1220
 TGeoCone.cxx:1221
 TGeoCone.cxx:1222
 TGeoCone.cxx:1223
 TGeoCone.cxx:1224
 TGeoCone.cxx:1225
 TGeoCone.cxx:1226
 TGeoCone.cxx:1227
 TGeoCone.cxx:1228
 TGeoCone.cxx:1229
 TGeoCone.cxx:1230
 TGeoCone.cxx:1231
 TGeoCone.cxx:1232
 TGeoCone.cxx:1233
 TGeoCone.cxx:1234
 TGeoCone.cxx:1235
 TGeoCone.cxx:1236
 TGeoCone.cxx:1237
 TGeoCone.cxx:1238
 TGeoCone.cxx:1239
 TGeoCone.cxx:1240
 TGeoCone.cxx:1241
 TGeoCone.cxx:1242
 TGeoCone.cxx:1243
 TGeoCone.cxx:1244
 TGeoCone.cxx:1245
 TGeoCone.cxx:1246
 TGeoCone.cxx:1247
 TGeoCone.cxx:1248
 TGeoCone.cxx:1249
 TGeoCone.cxx:1250
 TGeoCone.cxx:1251
 TGeoCone.cxx:1252
 TGeoCone.cxx:1253
 TGeoCone.cxx:1254
 TGeoCone.cxx:1255
 TGeoCone.cxx:1256
 TGeoCone.cxx:1257
 TGeoCone.cxx:1258
 TGeoCone.cxx:1259
 TGeoCone.cxx:1260
 TGeoCone.cxx:1261
 TGeoCone.cxx:1262
 TGeoCone.cxx:1263
 TGeoCone.cxx:1264
 TGeoCone.cxx:1265
 TGeoCone.cxx:1266
 TGeoCone.cxx:1267
 TGeoCone.cxx:1268
 TGeoCone.cxx:1269
 TGeoCone.cxx:1270
 TGeoCone.cxx:1271
 TGeoCone.cxx:1272
 TGeoCone.cxx:1273
 TGeoCone.cxx:1274
 TGeoCone.cxx:1275
 TGeoCone.cxx:1276
 TGeoCone.cxx:1277
 TGeoCone.cxx:1278
 TGeoCone.cxx:1279
 TGeoCone.cxx:1280
 TGeoCone.cxx:1281
 TGeoCone.cxx:1282
 TGeoCone.cxx:1283
 TGeoCone.cxx:1284
 TGeoCone.cxx:1285
 TGeoCone.cxx:1286
 TGeoCone.cxx:1287
 TGeoCone.cxx:1288
 TGeoCone.cxx:1289
 TGeoCone.cxx:1290
 TGeoCone.cxx:1291
 TGeoCone.cxx:1292
 TGeoCone.cxx:1293
 TGeoCone.cxx:1294
 TGeoCone.cxx:1295
 TGeoCone.cxx:1296
 TGeoCone.cxx:1297
 TGeoCone.cxx:1298
 TGeoCone.cxx:1299
 TGeoCone.cxx:1300
 TGeoCone.cxx:1301
 TGeoCone.cxx:1302
 TGeoCone.cxx:1303
 TGeoCone.cxx:1304
 TGeoCone.cxx:1305
 TGeoCone.cxx:1306
 TGeoCone.cxx:1307
 TGeoCone.cxx:1308
 TGeoCone.cxx:1309
 TGeoCone.cxx:1310
 TGeoCone.cxx:1311
 TGeoCone.cxx:1312
 TGeoCone.cxx:1313
 TGeoCone.cxx:1314
 TGeoCone.cxx:1315
 TGeoCone.cxx:1316
 TGeoCone.cxx:1317
 TGeoCone.cxx:1318
 TGeoCone.cxx:1319
 TGeoCone.cxx:1320
 TGeoCone.cxx:1321
 TGeoCone.cxx:1322
 TGeoCone.cxx:1323
 TGeoCone.cxx:1324
 TGeoCone.cxx:1325
 TGeoCone.cxx:1326
 TGeoCone.cxx:1327
 TGeoCone.cxx:1328
 TGeoCone.cxx:1329
 TGeoCone.cxx:1330
 TGeoCone.cxx:1331
 TGeoCone.cxx:1332
 TGeoCone.cxx:1333
 TGeoCone.cxx:1334
 TGeoCone.cxx:1335
 TGeoCone.cxx:1336
 TGeoCone.cxx:1337
 TGeoCone.cxx:1338
 TGeoCone.cxx:1339
 TGeoCone.cxx:1340
 TGeoCone.cxx:1341
 TGeoCone.cxx:1342
 TGeoCone.cxx:1343
 TGeoCone.cxx:1344
 TGeoCone.cxx:1345
 TGeoCone.cxx:1346
 TGeoCone.cxx:1347
 TGeoCone.cxx:1348
 TGeoCone.cxx:1349
 TGeoCone.cxx:1350
 TGeoCone.cxx:1351
 TGeoCone.cxx:1352
 TGeoCone.cxx:1353
 TGeoCone.cxx:1354
 TGeoCone.cxx:1355
 TGeoCone.cxx:1356
 TGeoCone.cxx:1357
 TGeoCone.cxx:1358
 TGeoCone.cxx:1359
 TGeoCone.cxx:1360
 TGeoCone.cxx:1361
 TGeoCone.cxx:1362
 TGeoCone.cxx:1363
 TGeoCone.cxx:1364
 TGeoCone.cxx:1365
 TGeoCone.cxx:1366
 TGeoCone.cxx:1367
 TGeoCone.cxx:1368
 TGeoCone.cxx:1369
 TGeoCone.cxx:1370
 TGeoCone.cxx:1371
 TGeoCone.cxx:1372
 TGeoCone.cxx:1373
 TGeoCone.cxx:1374
 TGeoCone.cxx:1375
 TGeoCone.cxx:1376
 TGeoCone.cxx:1377
 TGeoCone.cxx:1378
 TGeoCone.cxx:1379
 TGeoCone.cxx:1380
 TGeoCone.cxx:1381
 TGeoCone.cxx:1382
 TGeoCone.cxx:1383
 TGeoCone.cxx:1384
 TGeoCone.cxx:1385
 TGeoCone.cxx:1386
 TGeoCone.cxx:1387
 TGeoCone.cxx:1388
 TGeoCone.cxx:1389
 TGeoCone.cxx:1390
 TGeoCone.cxx:1391
 TGeoCone.cxx:1392
 TGeoCone.cxx:1393
 TGeoCone.cxx:1394
 TGeoCone.cxx:1395
 TGeoCone.cxx:1396
 TGeoCone.cxx:1397
 TGeoCone.cxx:1398
 TGeoCone.cxx:1399
 TGeoCone.cxx:1400
 TGeoCone.cxx:1401
 TGeoCone.cxx:1402
 TGeoCone.cxx:1403
 TGeoCone.cxx:1404
 TGeoCone.cxx:1405
 TGeoCone.cxx:1406
 TGeoCone.cxx:1407
 TGeoCone.cxx:1408
 TGeoCone.cxx:1409
 TGeoCone.cxx:1410
 TGeoCone.cxx:1411
 TGeoCone.cxx:1412
 TGeoCone.cxx:1413
 TGeoCone.cxx:1414
 TGeoCone.cxx:1415
 TGeoCone.cxx:1416
 TGeoCone.cxx:1417
 TGeoCone.cxx:1418
 TGeoCone.cxx:1419
 TGeoCone.cxx:1420
 TGeoCone.cxx:1421
 TGeoCone.cxx:1422
 TGeoCone.cxx:1423
 TGeoCone.cxx:1424
 TGeoCone.cxx:1425
 TGeoCone.cxx:1426
 TGeoCone.cxx:1427
 TGeoCone.cxx:1428
 TGeoCone.cxx:1429
 TGeoCone.cxx:1430
 TGeoCone.cxx:1431
 TGeoCone.cxx:1432
 TGeoCone.cxx:1433
 TGeoCone.cxx:1434
 TGeoCone.cxx:1435
 TGeoCone.cxx:1436
 TGeoCone.cxx:1437
 TGeoCone.cxx:1438
 TGeoCone.cxx:1439
 TGeoCone.cxx:1440
 TGeoCone.cxx:1441
 TGeoCone.cxx:1442
 TGeoCone.cxx:1443
 TGeoCone.cxx:1444
 TGeoCone.cxx:1445
 TGeoCone.cxx:1446
 TGeoCone.cxx:1447
 TGeoCone.cxx:1448
 TGeoCone.cxx:1449
 TGeoCone.cxx:1450
 TGeoCone.cxx:1451
 TGeoCone.cxx:1452
 TGeoCone.cxx:1453
 TGeoCone.cxx:1454
 TGeoCone.cxx:1455
 TGeoCone.cxx:1456
 TGeoCone.cxx:1457
 TGeoCone.cxx:1458
 TGeoCone.cxx:1459
 TGeoCone.cxx:1460
 TGeoCone.cxx:1461
 TGeoCone.cxx:1462
 TGeoCone.cxx:1463
 TGeoCone.cxx:1464
 TGeoCone.cxx:1465
 TGeoCone.cxx:1466
 TGeoCone.cxx:1467
 TGeoCone.cxx:1468
 TGeoCone.cxx:1469
 TGeoCone.cxx:1470
 TGeoCone.cxx:1471
 TGeoCone.cxx:1472
 TGeoCone.cxx:1473
 TGeoCone.cxx:1474
 TGeoCone.cxx:1475
 TGeoCone.cxx:1476
 TGeoCone.cxx:1477
 TGeoCone.cxx:1478
 TGeoCone.cxx:1479
 TGeoCone.cxx:1480
 TGeoCone.cxx:1481
 TGeoCone.cxx:1482
 TGeoCone.cxx:1483
 TGeoCone.cxx:1484
 TGeoCone.cxx:1485
 TGeoCone.cxx:1486
 TGeoCone.cxx:1487
 TGeoCone.cxx:1488
 TGeoCone.cxx:1489
 TGeoCone.cxx:1490
 TGeoCone.cxx:1491
 TGeoCone.cxx:1492
 TGeoCone.cxx:1493
 TGeoCone.cxx:1494
 TGeoCone.cxx:1495
 TGeoCone.cxx:1496
 TGeoCone.cxx:1497
 TGeoCone.cxx:1498
 TGeoCone.cxx:1499
 TGeoCone.cxx:1500
 TGeoCone.cxx:1501
 TGeoCone.cxx:1502
 TGeoCone.cxx:1503
 TGeoCone.cxx:1504
 TGeoCone.cxx:1505
 TGeoCone.cxx:1506
 TGeoCone.cxx:1507
 TGeoCone.cxx:1508
 TGeoCone.cxx:1509
 TGeoCone.cxx:1510
 TGeoCone.cxx:1511
 TGeoCone.cxx:1512
 TGeoCone.cxx:1513
 TGeoCone.cxx:1514
 TGeoCone.cxx:1515
 TGeoCone.cxx:1516
 TGeoCone.cxx:1517
 TGeoCone.cxx:1518
 TGeoCone.cxx:1519
 TGeoCone.cxx:1520
 TGeoCone.cxx:1521
 TGeoCone.cxx:1522
 TGeoCone.cxx:1523
 TGeoCone.cxx:1524
 TGeoCone.cxx:1525
 TGeoCone.cxx:1526
 TGeoCone.cxx:1527
 TGeoCone.cxx:1528
 TGeoCone.cxx:1529
 TGeoCone.cxx:1530
 TGeoCone.cxx:1531
 TGeoCone.cxx:1532
 TGeoCone.cxx:1533
 TGeoCone.cxx:1534
 TGeoCone.cxx:1535
 TGeoCone.cxx:1536
 TGeoCone.cxx:1537
 TGeoCone.cxx:1538
 TGeoCone.cxx:1539
 TGeoCone.cxx:1540
 TGeoCone.cxx:1541
 TGeoCone.cxx:1542
 TGeoCone.cxx:1543
 TGeoCone.cxx:1544
 TGeoCone.cxx:1545
 TGeoCone.cxx:1546
 TGeoCone.cxx:1547
 TGeoCone.cxx:1548
 TGeoCone.cxx:1549
 TGeoCone.cxx:1550
 TGeoCone.cxx:1551
 TGeoCone.cxx:1552
 TGeoCone.cxx:1553
 TGeoCone.cxx:1554
 TGeoCone.cxx:1555
 TGeoCone.cxx:1556
 TGeoCone.cxx:1557
 TGeoCone.cxx:1558
 TGeoCone.cxx:1559
 TGeoCone.cxx:1560
 TGeoCone.cxx:1561
 TGeoCone.cxx:1562
 TGeoCone.cxx:1563
 TGeoCone.cxx:1564
 TGeoCone.cxx:1565
 TGeoCone.cxx:1566
 TGeoCone.cxx:1567
 TGeoCone.cxx:1568
 TGeoCone.cxx:1569
 TGeoCone.cxx:1570
 TGeoCone.cxx:1571
 TGeoCone.cxx:1572
 TGeoCone.cxx:1573
 TGeoCone.cxx:1574
 TGeoCone.cxx:1575
 TGeoCone.cxx:1576
 TGeoCone.cxx:1577
 TGeoCone.cxx:1578
 TGeoCone.cxx:1579
 TGeoCone.cxx:1580
 TGeoCone.cxx:1581
 TGeoCone.cxx:1582
 TGeoCone.cxx:1583
 TGeoCone.cxx:1584
 TGeoCone.cxx:1585
 TGeoCone.cxx:1586
 TGeoCone.cxx:1587
 TGeoCone.cxx:1588
 TGeoCone.cxx:1589
 TGeoCone.cxx:1590
 TGeoCone.cxx:1591
 TGeoCone.cxx:1592
 TGeoCone.cxx:1593
 TGeoCone.cxx:1594
 TGeoCone.cxx:1595
 TGeoCone.cxx:1596
 TGeoCone.cxx:1597
 TGeoCone.cxx:1598
 TGeoCone.cxx:1599
 TGeoCone.cxx:1600
 TGeoCone.cxx:1601
 TGeoCone.cxx:1602
 TGeoCone.cxx:1603
 TGeoCone.cxx:1604
 TGeoCone.cxx:1605
 TGeoCone.cxx:1606
 TGeoCone.cxx:1607
 TGeoCone.cxx:1608
 TGeoCone.cxx:1609
 TGeoCone.cxx:1610
 TGeoCone.cxx:1611
 TGeoCone.cxx:1612
 TGeoCone.cxx:1613
 TGeoCone.cxx:1614
 TGeoCone.cxx:1615
 TGeoCone.cxx:1616
 TGeoCone.cxx:1617
 TGeoCone.cxx:1618
 TGeoCone.cxx:1619
 TGeoCone.cxx:1620
 TGeoCone.cxx:1621
 TGeoCone.cxx:1622
 TGeoCone.cxx:1623
 TGeoCone.cxx:1624
 TGeoCone.cxx:1625
 TGeoCone.cxx:1626
 TGeoCone.cxx:1627
 TGeoCone.cxx:1628
 TGeoCone.cxx:1629
 TGeoCone.cxx:1630
 TGeoCone.cxx:1631
 TGeoCone.cxx:1632
 TGeoCone.cxx:1633
 TGeoCone.cxx:1634
 TGeoCone.cxx:1635
 TGeoCone.cxx:1636
 TGeoCone.cxx:1637
 TGeoCone.cxx:1638
 TGeoCone.cxx:1639
 TGeoCone.cxx:1640
 TGeoCone.cxx:1641
 TGeoCone.cxx:1642
 TGeoCone.cxx:1643
 TGeoCone.cxx:1644
 TGeoCone.cxx:1645
 TGeoCone.cxx:1646
 TGeoCone.cxx:1647
 TGeoCone.cxx:1648
 TGeoCone.cxx:1649
 TGeoCone.cxx:1650
 TGeoCone.cxx:1651
 TGeoCone.cxx:1652
 TGeoCone.cxx:1653
 TGeoCone.cxx:1654
 TGeoCone.cxx:1655
 TGeoCone.cxx:1656
 TGeoCone.cxx:1657
 TGeoCone.cxx:1658
 TGeoCone.cxx:1659
 TGeoCone.cxx:1660
 TGeoCone.cxx:1661
 TGeoCone.cxx:1662
 TGeoCone.cxx:1663
 TGeoCone.cxx:1664
 TGeoCone.cxx:1665
 TGeoCone.cxx:1666
 TGeoCone.cxx:1667
 TGeoCone.cxx:1668
 TGeoCone.cxx:1669
 TGeoCone.cxx:1670
 TGeoCone.cxx:1671
 TGeoCone.cxx:1672
 TGeoCone.cxx:1673
 TGeoCone.cxx:1674
 TGeoCone.cxx:1675
 TGeoCone.cxx:1676
 TGeoCone.cxx:1677
 TGeoCone.cxx:1678
 TGeoCone.cxx:1679
 TGeoCone.cxx:1680
 TGeoCone.cxx:1681
 TGeoCone.cxx:1682
 TGeoCone.cxx:1683
 TGeoCone.cxx:1684
 TGeoCone.cxx:1685
 TGeoCone.cxx:1686
 TGeoCone.cxx:1687
 TGeoCone.cxx:1688
 TGeoCone.cxx:1689
 TGeoCone.cxx:1690
 TGeoCone.cxx:1691
 TGeoCone.cxx:1692
 TGeoCone.cxx:1693
 TGeoCone.cxx:1694
 TGeoCone.cxx:1695
 TGeoCone.cxx:1696
 TGeoCone.cxx:1697
 TGeoCone.cxx:1698
 TGeoCone.cxx:1699
 TGeoCone.cxx:1700
 TGeoCone.cxx:1701
 TGeoCone.cxx:1702
 TGeoCone.cxx:1703
 TGeoCone.cxx:1704
 TGeoCone.cxx:1705
 TGeoCone.cxx:1706
 TGeoCone.cxx:1707
 TGeoCone.cxx:1708
 TGeoCone.cxx:1709
 TGeoCone.cxx:1710
 TGeoCone.cxx:1711
 TGeoCone.cxx:1712
 TGeoCone.cxx:1713
 TGeoCone.cxx:1714
 TGeoCone.cxx:1715
 TGeoCone.cxx:1716
 TGeoCone.cxx:1717
 TGeoCone.cxx:1718
 TGeoCone.cxx:1719
 TGeoCone.cxx:1720
 TGeoCone.cxx:1721
 TGeoCone.cxx:1722
 TGeoCone.cxx:1723
 TGeoCone.cxx:1724
 TGeoCone.cxx:1725
 TGeoCone.cxx:1726
 TGeoCone.cxx:1727
 TGeoCone.cxx:1728
 TGeoCone.cxx:1729
 TGeoCone.cxx:1730
 TGeoCone.cxx:1731
 TGeoCone.cxx:1732
 TGeoCone.cxx:1733
 TGeoCone.cxx:1734
 TGeoCone.cxx:1735
 TGeoCone.cxx:1736
 TGeoCone.cxx:1737
 TGeoCone.cxx:1738
 TGeoCone.cxx:1739
 TGeoCone.cxx:1740
 TGeoCone.cxx:1741
 TGeoCone.cxx:1742
 TGeoCone.cxx:1743
 TGeoCone.cxx:1744
 TGeoCone.cxx:1745
 TGeoCone.cxx:1746
 TGeoCone.cxx:1747
 TGeoCone.cxx:1748
 TGeoCone.cxx:1749
 TGeoCone.cxx:1750
 TGeoCone.cxx:1751
 TGeoCone.cxx:1752
 TGeoCone.cxx:1753
 TGeoCone.cxx:1754
 TGeoCone.cxx:1755
 TGeoCone.cxx:1756
 TGeoCone.cxx:1757
 TGeoCone.cxx:1758
 TGeoCone.cxx:1759
 TGeoCone.cxx:1760
 TGeoCone.cxx:1761
 TGeoCone.cxx:1762
 TGeoCone.cxx:1763
 TGeoCone.cxx:1764
 TGeoCone.cxx:1765
 TGeoCone.cxx:1766
 TGeoCone.cxx:1767
 TGeoCone.cxx:1768
 TGeoCone.cxx:1769
 TGeoCone.cxx:1770
 TGeoCone.cxx:1771
 TGeoCone.cxx:1772
 TGeoCone.cxx:1773
 TGeoCone.cxx:1774
 TGeoCone.cxx:1775
 TGeoCone.cxx:1776
 TGeoCone.cxx:1777
 TGeoCone.cxx:1778
 TGeoCone.cxx:1779
 TGeoCone.cxx:1780
 TGeoCone.cxx:1781
 TGeoCone.cxx:1782
 TGeoCone.cxx:1783
 TGeoCone.cxx:1784
 TGeoCone.cxx:1785
 TGeoCone.cxx:1786
 TGeoCone.cxx:1787
 TGeoCone.cxx:1788
 TGeoCone.cxx:1789
 TGeoCone.cxx:1790
 TGeoCone.cxx:1791
 TGeoCone.cxx:1792
 TGeoCone.cxx:1793
 TGeoCone.cxx:1794
 TGeoCone.cxx:1795
 TGeoCone.cxx:1796
 TGeoCone.cxx:1797
 TGeoCone.cxx:1798
 TGeoCone.cxx:1799
 TGeoCone.cxx:1800
 TGeoCone.cxx:1801
 TGeoCone.cxx:1802
 TGeoCone.cxx:1803
 TGeoCone.cxx:1804
 TGeoCone.cxx:1805
 TGeoCone.cxx:1806
 TGeoCone.cxx:1807
 TGeoCone.cxx:1808
 TGeoCone.cxx:1809
 TGeoCone.cxx:1810
 TGeoCone.cxx:1811
 TGeoCone.cxx:1812
 TGeoCone.cxx:1813
 TGeoCone.cxx:1814
 TGeoCone.cxx:1815
 TGeoCone.cxx:1816
 TGeoCone.cxx:1817
 TGeoCone.cxx:1818
 TGeoCone.cxx:1819
 TGeoCone.cxx:1820
 TGeoCone.cxx:1821
 TGeoCone.cxx:1822
 TGeoCone.cxx:1823
 TGeoCone.cxx:1824
 TGeoCone.cxx:1825
 TGeoCone.cxx:1826
 TGeoCone.cxx:1827
 TGeoCone.cxx:1828
 TGeoCone.cxx:1829
 TGeoCone.cxx:1830
 TGeoCone.cxx:1831
 TGeoCone.cxx:1832
 TGeoCone.cxx:1833
 TGeoCone.cxx:1834
 TGeoCone.cxx:1835
 TGeoCone.cxx:1836
 TGeoCone.cxx:1837
 TGeoCone.cxx:1838
 TGeoCone.cxx:1839
 TGeoCone.cxx:1840
 TGeoCone.cxx:1841
 TGeoCone.cxx:1842
 TGeoCone.cxx:1843
 TGeoCone.cxx:1844
 TGeoCone.cxx:1845
 TGeoCone.cxx:1846
 TGeoCone.cxx:1847
 TGeoCone.cxx:1848
 TGeoCone.cxx:1849
 TGeoCone.cxx:1850
 TGeoCone.cxx:1851
 TGeoCone.cxx:1852
 TGeoCone.cxx:1853
 TGeoCone.cxx:1854
 TGeoCone.cxx:1855
 TGeoCone.cxx:1856
 TGeoCone.cxx:1857
 TGeoCone.cxx:1858
 TGeoCone.cxx:1859
 TGeoCone.cxx:1860
 TGeoCone.cxx:1861
 TGeoCone.cxx:1862
 TGeoCone.cxx:1863
 TGeoCone.cxx:1864
 TGeoCone.cxx:1865
 TGeoCone.cxx:1866
 TGeoCone.cxx:1867
 TGeoCone.cxx:1868
 TGeoCone.cxx:1869
 TGeoCone.cxx:1870
 TGeoCone.cxx:1871
 TGeoCone.cxx:1872
 TGeoCone.cxx:1873
 TGeoCone.cxx:1874
 TGeoCone.cxx:1875
 TGeoCone.cxx:1876
 TGeoCone.cxx:1877
 TGeoCone.cxx:1878
 TGeoCone.cxx:1879
 TGeoCone.cxx:1880
 TGeoCone.cxx:1881
 TGeoCone.cxx:1882
 TGeoCone.cxx:1883
 TGeoCone.cxx:1884
 TGeoCone.cxx:1885
 TGeoCone.cxx:1886
 TGeoCone.cxx:1887
 TGeoCone.cxx:1888
 TGeoCone.cxx:1889
 TGeoCone.cxx:1890
 TGeoCone.cxx:1891
 TGeoCone.cxx:1892
 TGeoCone.cxx:1893
 TGeoCone.cxx:1894
 TGeoCone.cxx:1895
 TGeoCone.cxx:1896
 TGeoCone.cxx:1897
 TGeoCone.cxx:1898
 TGeoCone.cxx:1899
 TGeoCone.cxx:1900
 TGeoCone.cxx:1901
 TGeoCone.cxx:1902
 TGeoCone.cxx:1903
 TGeoCone.cxx:1904
 TGeoCone.cxx:1905
 TGeoCone.cxx:1906
 TGeoCone.cxx:1907
 TGeoCone.cxx:1908
 TGeoCone.cxx:1909
 TGeoCone.cxx:1910
 TGeoCone.cxx:1911
 TGeoCone.cxx:1912
 TGeoCone.cxx:1913
 TGeoCone.cxx:1914
 TGeoCone.cxx:1915
 TGeoCone.cxx:1916
 TGeoCone.cxx:1917
 TGeoCone.cxx:1918
 TGeoCone.cxx:1919
 TGeoCone.cxx:1920
 TGeoCone.cxx:1921
 TGeoCone.cxx:1922
 TGeoCone.cxx:1923
 TGeoCone.cxx:1924
 TGeoCone.cxx:1925
 TGeoCone.cxx:1926
 TGeoCone.cxx:1927
 TGeoCone.cxx:1928
 TGeoCone.cxx:1929
 TGeoCone.cxx:1930
 TGeoCone.cxx:1931
 TGeoCone.cxx:1932
 TGeoCone.cxx:1933
 TGeoCone.cxx:1934
 TGeoCone.cxx:1935
 TGeoCone.cxx:1936
 TGeoCone.cxx:1937
 TGeoCone.cxx:1938
 TGeoCone.cxx:1939
 TGeoCone.cxx:1940
 TGeoCone.cxx:1941
 TGeoCone.cxx:1942
 TGeoCone.cxx:1943
 TGeoCone.cxx:1944
 TGeoCone.cxx:1945
 TGeoCone.cxx:1946
 TGeoCone.cxx:1947
 TGeoCone.cxx:1948
 TGeoCone.cxx:1949
 TGeoCone.cxx:1950
 TGeoCone.cxx:1951
 TGeoCone.cxx:1952
 TGeoCone.cxx:1953
 TGeoCone.cxx:1954
 TGeoCone.cxx:1955
 TGeoCone.cxx:1956
 TGeoCone.cxx:1957
 TGeoCone.cxx:1958
 TGeoCone.cxx:1959
 TGeoCone.cxx:1960
 TGeoCone.cxx:1961
 TGeoCone.cxx:1962
 TGeoCone.cxx:1963
 TGeoCone.cxx:1964
 TGeoCone.cxx:1965
 TGeoCone.cxx:1966
 TGeoCone.cxx:1967
 TGeoCone.cxx:1968
 TGeoCone.cxx:1969
 TGeoCone.cxx:1970
 TGeoCone.cxx:1971
 TGeoCone.cxx:1972
 TGeoCone.cxx:1973
 TGeoCone.cxx:1974
 TGeoCone.cxx:1975
 TGeoCone.cxx:1976
 TGeoCone.cxx:1977
 TGeoCone.cxx:1978
 TGeoCone.cxx:1979
 TGeoCone.cxx:1980
 TGeoCone.cxx:1981
 TGeoCone.cxx:1982
 TGeoCone.cxx:1983
 TGeoCone.cxx:1984
 TGeoCone.cxx:1985
 TGeoCone.cxx:1986
 TGeoCone.cxx:1987
 TGeoCone.cxx:1988
 TGeoCone.cxx:1989
 TGeoCone.cxx:1990
 TGeoCone.cxx:1991
 TGeoCone.cxx:1992
 TGeoCone.cxx:1993
 TGeoCone.cxx:1994
 TGeoCone.cxx:1995
 TGeoCone.cxx:1996
 TGeoCone.cxx:1997
 TGeoCone.cxx:1998
 TGeoCone.cxx:1999
 TGeoCone.cxx:2000
 TGeoCone.cxx:2001
 TGeoCone.cxx:2002
 TGeoCone.cxx:2003
 TGeoCone.cxx:2004
 TGeoCone.cxx:2005
 TGeoCone.cxx:2006
 TGeoCone.cxx:2007
 TGeoCone.cxx:2008
 TGeoCone.cxx:2009
 TGeoCone.cxx:2010
 TGeoCone.cxx:2011
 TGeoCone.cxx:2012
 TGeoCone.cxx:2013
 TGeoCone.cxx:2014
 TGeoCone.cxx:2015
 TGeoCone.cxx:2016
 TGeoCone.cxx:2017
 TGeoCone.cxx:2018
 TGeoCone.cxx:2019
 TGeoCone.cxx:2020
 TGeoCone.cxx:2021
 TGeoCone.cxx:2022
 TGeoCone.cxx:2023
 TGeoCone.cxx:2024
 TGeoCone.cxx:2025
 TGeoCone.cxx:2026
 TGeoCone.cxx:2027
 TGeoCone.cxx:2028
 TGeoCone.cxx:2029
 TGeoCone.cxx:2030
 TGeoCone.cxx:2031
 TGeoCone.cxx:2032
 TGeoCone.cxx:2033
 TGeoCone.cxx:2034
 TGeoCone.cxx:2035
 TGeoCone.cxx:2036
 TGeoCone.cxx:2037
 TGeoCone.cxx:2038
 TGeoCone.cxx:2039
 TGeoCone.cxx:2040
 TGeoCone.cxx:2041
 TGeoCone.cxx:2042
 TGeoCone.cxx:2043
 TGeoCone.cxx:2044
 TGeoCone.cxx:2045
 TGeoCone.cxx:2046
 TGeoCone.cxx:2047
 TGeoCone.cxx:2048
 TGeoCone.cxx:2049
 TGeoCone.cxx:2050
 TGeoCone.cxx:2051
 TGeoCone.cxx:2052
 TGeoCone.cxx:2053
 TGeoCone.cxx:2054
 TGeoCone.cxx:2055
 TGeoCone.cxx:2056
 TGeoCone.cxx:2057
 TGeoCone.cxx:2058
 TGeoCone.cxx:2059
 TGeoCone.cxx:2060
 TGeoCone.cxx:2061
 TGeoCone.cxx:2062
 TGeoCone.cxx:2063
 TGeoCone.cxx:2064
 TGeoCone.cxx:2065
 TGeoCone.cxx:2066
 TGeoCone.cxx:2067
 TGeoCone.cxx:2068
 TGeoCone.cxx:2069
 TGeoCone.cxx:2070
 TGeoCone.cxx:2071
 TGeoCone.cxx:2072
 TGeoCone.cxx:2073
 TGeoCone.cxx:2074
 TGeoCone.cxx:2075
 TGeoCone.cxx:2076
 TGeoCone.cxx:2077
 TGeoCone.cxx:2078
 TGeoCone.cxx:2079
 TGeoCone.cxx:2080
 TGeoCone.cxx:2081
 TGeoCone.cxx:2082
 TGeoCone.cxx:2083
 TGeoCone.cxx:2084
 TGeoCone.cxx:2085
 TGeoCone.cxx:2086
 TGeoCone.cxx:2087
 TGeoCone.cxx:2088
 TGeoCone.cxx:2089
 TGeoCone.cxx:2090
 TGeoCone.cxx:2091
 TGeoCone.cxx:2092
 TGeoCone.cxx:2093
 TGeoCone.cxx:2094
 TGeoCone.cxx:2095
 TGeoCone.cxx:2096
 TGeoCone.cxx:2097
 TGeoCone.cxx:2098
 TGeoCone.cxx:2099
 TGeoCone.cxx:2100
 TGeoCone.cxx:2101
 TGeoCone.cxx:2102
 TGeoCone.cxx:2103
 TGeoCone.cxx:2104
 TGeoCone.cxx:2105
 TGeoCone.cxx:2106
 TGeoCone.cxx:2107
 TGeoCone.cxx:2108
 TGeoCone.cxx:2109
 TGeoCone.cxx:2110
 TGeoCone.cxx:2111
 TGeoCone.cxx:2112
 TGeoCone.cxx:2113
 TGeoCone.cxx:2114
 TGeoCone.cxx:2115
 TGeoCone.cxx:2116
 TGeoCone.cxx:2117
 TGeoCone.cxx:2118
 TGeoCone.cxx:2119
 TGeoCone.cxx:2120
 TGeoCone.cxx:2121
 TGeoCone.cxx:2122
 TGeoCone.cxx:2123
 TGeoCone.cxx:2124
 TGeoCone.cxx:2125
 TGeoCone.cxx:2126
 TGeoCone.cxx:2127
 TGeoCone.cxx:2128
 TGeoCone.cxx:2129
 TGeoCone.cxx:2130
 TGeoCone.cxx:2131
 TGeoCone.cxx:2132
 TGeoCone.cxx:2133
 TGeoCone.cxx:2134
 TGeoCone.cxx:2135
 TGeoCone.cxx:2136
 TGeoCone.cxx:2137
 TGeoCone.cxx:2138
 TGeoCone.cxx:2139
 TGeoCone.cxx:2140
 TGeoCone.cxx:2141
 TGeoCone.cxx:2142
 TGeoCone.cxx:2143
 TGeoCone.cxx:2144
 TGeoCone.cxx:2145
 TGeoCone.cxx:2146
 TGeoCone.cxx:2147
 TGeoCone.cxx:2148
 TGeoCone.cxx:2149
 TGeoCone.cxx:2150
 TGeoCone.cxx:2151
 TGeoCone.cxx:2152
 TGeoCone.cxx:2153
 TGeoCone.cxx:2154
 TGeoCone.cxx:2155
 TGeoCone.cxx:2156
 TGeoCone.cxx:2157
 TGeoCone.cxx:2158
 TGeoCone.cxx:2159
 TGeoCone.cxx:2160
 TGeoCone.cxx:2161
 TGeoCone.cxx:2162
 TGeoCone.cxx:2163
 TGeoCone.cxx:2164
 TGeoCone.cxx:2165
 TGeoCone.cxx:2166
 TGeoCone.cxx:2167
 TGeoCone.cxx:2168
 TGeoCone.cxx:2169
 TGeoCone.cxx:2170
 TGeoCone.cxx:2171
 TGeoCone.cxx:2172
 TGeoCone.cxx:2173
 TGeoCone.cxx:2174
 TGeoCone.cxx:2175
 TGeoCone.cxx:2176
 TGeoCone.cxx:2177
 TGeoCone.cxx:2178
 TGeoCone.cxx:2179
 TGeoCone.cxx:2180
 TGeoCone.cxx:2181
 TGeoCone.cxx:2182
 TGeoCone.cxx:2183
 TGeoCone.cxx:2184
 TGeoCone.cxx:2185
 TGeoCone.cxx:2186
 TGeoCone.cxx:2187
 TGeoCone.cxx:2188
 TGeoCone.cxx:2189
 TGeoCone.cxx:2190
 TGeoCone.cxx:2191
 TGeoCone.cxx:2192
 TGeoCone.cxx:2193
 TGeoCone.cxx:2194
 TGeoCone.cxx:2195
 TGeoCone.cxx:2196
 TGeoCone.cxx:2197
 TGeoCone.cxx:2198
 TGeoCone.cxx:2199
 TGeoCone.cxx:2200
 TGeoCone.cxx:2201
 TGeoCone.cxx:2202
 TGeoCone.cxx:2203
 TGeoCone.cxx:2204
 TGeoCone.cxx:2205
 TGeoCone.cxx:2206
 TGeoCone.cxx:2207
 TGeoCone.cxx:2208
 TGeoCone.cxx:2209
 TGeoCone.cxx:2210
 TGeoCone.cxx:2211
 TGeoCone.cxx:2212
 TGeoCone.cxx:2213
 TGeoCone.cxx:2214
 TGeoCone.cxx:2215
 TGeoCone.cxx:2216
 TGeoCone.cxx:2217
 TGeoCone.cxx:2218
 TGeoCone.cxx:2219
 TGeoCone.cxx:2220
 TGeoCone.cxx:2221
 TGeoCone.cxx:2222
 TGeoCone.cxx:2223
 TGeoCone.cxx:2224
 TGeoCone.cxx:2225
 TGeoCone.cxx:2226
 TGeoCone.cxx:2227
 TGeoCone.cxx:2228
 TGeoCone.cxx:2229
 TGeoCone.cxx:2230
 TGeoCone.cxx:2231
 TGeoCone.cxx:2232
 TGeoCone.cxx:2233
 TGeoCone.cxx:2234
 TGeoCone.cxx:2235
 TGeoCone.cxx:2236
 TGeoCone.cxx:2237
 TGeoCone.cxx:2238
 TGeoCone.cxx:2239
 TGeoCone.cxx:2240
 TGeoCone.cxx:2241
 TGeoCone.cxx:2242
 TGeoCone.cxx:2243
 TGeoCone.cxx:2244
 TGeoCone.cxx:2245
 TGeoCone.cxx:2246
 TGeoCone.cxx:2247
 TGeoCone.cxx:2248
 TGeoCone.cxx:2249
 TGeoCone.cxx:2250
 TGeoCone.cxx:2251
 TGeoCone.cxx:2252
 TGeoCone.cxx:2253
 TGeoCone.cxx:2254
 TGeoCone.cxx:2255
 TGeoCone.cxx:2256
 TGeoCone.cxx:2257
 TGeoCone.cxx:2258
 TGeoCone.cxx:2259
 TGeoCone.cxx:2260
 TGeoCone.cxx:2261
 TGeoCone.cxx:2262
 TGeoCone.cxx:2263
 TGeoCone.cxx:2264
 TGeoCone.cxx:2265
 TGeoCone.cxx:2266
 TGeoCone.cxx:2267
 TGeoCone.cxx:2268
 TGeoCone.cxx:2269
 TGeoCone.cxx:2270
 TGeoCone.cxx:2271
 TGeoCone.cxx:2272
 TGeoCone.cxx:2273
 TGeoCone.cxx:2274
 TGeoCone.cxx:2275
 TGeoCone.cxx:2276
 TGeoCone.cxx:2277
 TGeoCone.cxx:2278
 TGeoCone.cxx:2279
 TGeoCone.cxx:2280
 TGeoCone.cxx:2281
 TGeoCone.cxx:2282
 TGeoCone.cxx:2283
 TGeoCone.cxx:2284
 TGeoCone.cxx:2285
 TGeoCone.cxx:2286
 TGeoCone.cxx:2287
 TGeoCone.cxx:2288
 TGeoCone.cxx:2289
 TGeoCone.cxx:2290
 TGeoCone.cxx:2291
 TGeoCone.cxx:2292
 TGeoCone.cxx:2293
 TGeoCone.cxx:2294
 TGeoCone.cxx:2295
 TGeoCone.cxx:2296
 TGeoCone.cxx:2297
 TGeoCone.cxx:2298
 TGeoCone.cxx:2299
 TGeoCone.cxx:2300
 TGeoCone.cxx:2301
 TGeoCone.cxx:2302
 TGeoCone.cxx:2303
 TGeoCone.cxx:2304
 TGeoCone.cxx:2305
 TGeoCone.cxx:2306
 TGeoCone.cxx:2307
 TGeoCone.cxx:2308
 TGeoCone.cxx:2309
 TGeoCone.cxx:2310
 TGeoCone.cxx:2311
 TGeoCone.cxx:2312
 TGeoCone.cxx:2313
 TGeoCone.cxx:2314
 TGeoCone.cxx:2315
 TGeoCone.cxx:2316
 TGeoCone.cxx:2317
 TGeoCone.cxx:2318
 TGeoCone.cxx:2319
 TGeoCone.cxx:2320
 TGeoCone.cxx:2321
 TGeoCone.cxx:2322
 TGeoCone.cxx:2323
 TGeoCone.cxx:2324
 TGeoCone.cxx:2325
 TGeoCone.cxx:2326
 TGeoCone.cxx:2327
 TGeoCone.cxx:2328
 TGeoCone.cxx:2329
 TGeoCone.cxx:2330
 TGeoCone.cxx:2331
 TGeoCone.cxx:2332
 TGeoCone.cxx:2333
 TGeoCone.cxx:2334
 TGeoCone.cxx:2335
 TGeoCone.cxx:2336
 TGeoCone.cxx:2337
 TGeoCone.cxx:2338
 TGeoCone.cxx:2339
 TGeoCone.cxx:2340
 TGeoCone.cxx:2341
 TGeoCone.cxx:2342
 TGeoCone.cxx:2343
 TGeoCone.cxx:2344
 TGeoCone.cxx:2345
 TGeoCone.cxx:2346
 TGeoCone.cxx:2347
 TGeoCone.cxx:2348
 TGeoCone.cxx:2349
 TGeoCone.cxx:2350
 TGeoCone.cxx:2351
 TGeoCone.cxx:2352
 TGeoCone.cxx:2353
 TGeoCone.cxx:2354
 TGeoCone.cxx:2355
 TGeoCone.cxx:2356
 TGeoCone.cxx:2357
 TGeoCone.cxx:2358
 TGeoCone.cxx:2359
 TGeoCone.cxx:2360
 TGeoCone.cxx:2361
 TGeoCone.cxx:2362
 TGeoCone.cxx:2363
 TGeoCone.cxx:2364
 TGeoCone.cxx:2365
 TGeoCone.cxx:2366
 TGeoCone.cxx:2367
 TGeoCone.cxx:2368
 TGeoCone.cxx:2369
 TGeoCone.cxx:2370
 TGeoCone.cxx:2371
 TGeoCone.cxx:2372
 TGeoCone.cxx:2373
 TGeoCone.cxx:2374
 TGeoCone.cxx:2375
 TGeoCone.cxx:2376
 TGeoCone.cxx:2377
 TGeoCone.cxx:2378
 TGeoCone.cxx:2379
 TGeoCone.cxx:2380
 TGeoCone.cxx:2381
 TGeoCone.cxx:2382
 TGeoCone.cxx:2383
 TGeoCone.cxx:2384
 TGeoCone.cxx:2385
 TGeoCone.cxx:2386
 TGeoCone.cxx:2387
 TGeoCone.cxx:2388
 TGeoCone.cxx:2389
 TGeoCone.cxx:2390
 TGeoCone.cxx:2391
 TGeoCone.cxx:2392
 TGeoCone.cxx:2393
 TGeoCone.cxx:2394
 TGeoCone.cxx:2395
 TGeoCone.cxx:2396
 TGeoCone.cxx:2397
 TGeoCone.cxx:2398
 TGeoCone.cxx:2399
 TGeoCone.cxx:2400
 TGeoCone.cxx:2401
 TGeoCone.cxx:2402
 TGeoCone.cxx:2403
 TGeoCone.cxx:2404
 TGeoCone.cxx:2405
 TGeoCone.cxx:2406
 TGeoCone.cxx:2407
 TGeoCone.cxx:2408
 TGeoCone.cxx:2409
 TGeoCone.cxx:2410
 TGeoCone.cxx:2411