ROOT logo
// @(#)root/geom:$Id: TGeoParaboloid.cxx 27731 2009-03-09 17:40:56Z brun $
// Author: Mihaela Gheata   20/06/04

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

//_____________________________________________________________________________
// TGeoParaboloid - Paraboloid  class. A paraboloid is the solid bounded by
//            the following surfaces:
//            - 2 planes parallel with XY cutting the Z axis at Z=-dz and Z=+dz
//            - the surface of revolution of a parabola described by:
//                 z = a*(x*x + y*y) + b
//       The parameters a and b are automatically computed from:
//            - rlo - the radius of the circle of intersection between the 
//              parabolic surface and the plane z = -dz
//            - rhi - the radius of the circle of intersection between the 
//              parabolic surface and the plane z = +dz
//         | -dz = a*rlo*rlo + b
//         |  dz = a*rhi*rhi + b      where: rlo != rhi, both >= 0
//_____________________________________________________________________________

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

ClassImp(TGeoParaboloid)
   
//_____________________________________________________________________________
TGeoParaboloid::TGeoParaboloid()
{
// Dummy constructor
   fRlo = 0;
   fRhi = 0;
   fDz  = 0;
   fA   = 0;
   fB   = 0;
   SetShapeBit(TGeoShape::kGeoParaboloid);
}   

//_____________________________________________________________________________
TGeoParaboloid::TGeoParaboloid(Double_t rlo, Double_t rhi, Double_t dz)
           :TGeoBBox(0,0,0)
{
// Default constructor specifying X and Y semiaxis length
   fRlo = 0;
   fRhi = 0;
   fDz  = 0;
   fA   = 0;
   fB   = 0;
   SetShapeBit(TGeoShape::kGeoParaboloid);
   SetParaboloidDimensions(rlo, rhi, dz);
   ComputeBBox();
}

//_____________________________________________________________________________
TGeoParaboloid::TGeoParaboloid(const char *name, Double_t rlo, Double_t rhi, Double_t dz)
           :TGeoBBox(name, 0, 0, 0)
{
// Default constructor specifying X and Y semiaxis length
   fRlo = 0;
   fRhi = 0;
   fDz  = 0;
   fA   = 0;
   fB   = 0;
   SetShapeBit(TGeoShape::kGeoParaboloid);
   SetParaboloidDimensions(rlo, rhi, dz);
   ComputeBBox();
}

//_____________________________________________________________________________
TGeoParaboloid::TGeoParaboloid(Double_t *param)
{
// Default constructor specifying minimum and maximum radius
// param[0] =  rlo
// param[1] =  rhi
// param[2] = dz
   SetShapeBit(TGeoShape::kGeoParaboloid);
   SetDimensions(param);
   ComputeBBox();
}

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

//_____________________________________________________________________________
Double_t TGeoParaboloid::Capacity() const
{
// Computes capacity of the shape in [length^3]
   Double_t capacity = TMath::Pi()*fDz*(fRlo*fRlo+fRhi*fRhi);
   return capacity;
}

//_____________________________________________________________________________   
void TGeoParaboloid::ComputeBBox()
{
// compute bounding box of the tube
   fDX = TMath::Max(fRlo, fRhi);
   fDY = fDX;
   fDZ = fDz;
}   

//_____________________________________________________________________________   
void TGeoParaboloid::ComputeNormal(Double_t *point, Double_t *dir, Double_t *norm)
{
// Compute normal to closest surface from POINT.
   if ((TMath::Abs(point[2])-fDz) > -1E-5) {
      norm[0] = norm[1] = 0.0;
      norm[2] = TMath::Sign(1., dir[2]);
      return;
   }   
   Double_t talf = 2.*TMath::Sqrt(fA*(point[2]-fB))*TMath::Sign(1.0, fA);
   Double_t calf = 1./TMath::Sqrt(1.+talf*talf);
   Double_t salf = talf * calf;
   Double_t phi = TMath::ATan2(point[1], point[0]);
   if (phi<0) phi+=2.*TMath::Pi();
   Double_t cphi = TMath::Cos(phi);
   Double_t sphi = TMath::Sin(phi);
   Double_t ct   = - calf*TMath::Sign(1.,fA);
   Double_t st   = salf*TMath::Sign(1.,fA); 

   norm[0] = st*cphi;
   norm[1] = st*sphi;
   norm[2] = ct;
   Double_t ndotd = norm[0]*dir[0]+norm[1]*dir[1]+norm[2]*dir[2];
   if (ndotd < 0) {
      norm[0] = -norm[0];
      norm[1] = -norm[1];
      norm[2] = -norm[2];
   }   
}

//_____________________________________________________________________________
Bool_t TGeoParaboloid::Contains(Double_t *point) const
{
// test if point is inside the elliptical tube
   if (TMath::Abs(point[2])>fDz) return kFALSE;
   Double_t aa = fA*(point[2]-fB);
   if (aa < 0) return kFALSE;
   Double_t rsq = point[0]*point[0]+point[1]*point[1];
   if (aa < fA*fA*rsq) return kFALSE;
   return kTRUE;
}

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

//_____________________________________________________________________________
Double_t TGeoParaboloid::DistToParaboloid(Double_t *point, Double_t *dir) const
{
// Compute distance from a point to the parabola given by:
//  z = a*rsq + b;   rsq = x*x+y*y
   Double_t a = fA * (dir[0]*dir[0] + dir[1]*dir[1]);
   Double_t b = 2.*fA*(point[0]*dir[0]+point[1]*dir[1])-dir[2];
   Double_t c = fA*(point[0]*point[0]+point[1]*point[1]) + fB - point[2];
   Double_t dist = TGeoShape::Big();
   if (TMath::Abs(a)<TGeoShape::Tolerance()) {
      if (TMath::Abs(b)<TGeoShape::Tolerance()) return dist; // big
      dist = -c/b;
      if (dist < 0) return TGeoShape::Big();
      return dist; // OK
   }
   Double_t ainv = 1./a;
   Double_t sum = - b*ainv;
   Double_t prod = c*ainv;
   Double_t delta = sum*sum - 4.*prod;
   if (delta<0) return dist; // big
   if (TMath::Abs(prod)<TGeoShape::Tolerance()) return 0.;
   if (prod < 0) {
      dist = 0.5*(sum + TMath::Sqrt(delta));
      return dist; // OK
   }
   if (sum < 0) return dist; // big
   dist = 0.5 * (sum - TMath::Sqrt(delta));
   return dist; // OK
}      

//_____________________________________________________________________________
Double_t TGeoParaboloid::DistFromInside(Double_t *point, Double_t *dir, Int_t iact, Double_t step, Double_t *safe) const
{
// compute distance from inside point to surface of the paraboloid
   if (iact<3 && safe) {
   // compute safe distance
      *safe = Safety(point, kTRUE);
      if (iact==0) return TGeoShape::Big();
      if (iact==1 && step<*safe) return TGeoShape::Big();
   }
   
   Double_t dz = TGeoShape::Big();
   if (dir[2]<0) {
      dz = -(point[2]+fDz)/dir[2];
   } else if (dir[2]>0) {
      dz = (fDz-point[2])/dir[2];
   }      
   Double_t dpara = DistToParaboloid(point, dir);
   return TMath::Min(dz, dpara);
}

//_____________________________________________________________________________
Double_t TGeoParaboloid::DistFromOutside(Double_t *point, Double_t *dir, Int_t iact, Double_t step, Double_t *safe) const
{
// compute distance from outside point to surface of the paraboloid and safe distance
   Double_t snxt = TGeoShape::Big();
   if (iact<3 && safe) {
   // compute safe distance
      *safe = Safety(point, kFALSE);
      if (iact==0) return TGeoShape::Big();
      if (iact==1 && step<*safe) return TGeoShape::Big();
   }
   Double_t xnew, ynew, znew;
   if (point[2]<=-fDz) {
      if (dir[2]<=0) return TGeoShape::Big();
      snxt = -(fDz+point[2])/dir[2];
      // find extrapolated X and Y
      xnew = point[0]+snxt*dir[0];
      ynew = point[1]+snxt*dir[1];
      if ((xnew*xnew+ynew*ynew) <= fRlo*fRlo) return snxt;
   } else if (point[2]>=fDz) {
      if (dir[2]>=0) return TGeoShape::Big();
      snxt = (fDz-point[2])/dir[2];
      // find extrapolated X and Y
      xnew = point[0]+snxt*dir[0];
      ynew = point[1]+snxt*dir[1];
      if ((xnew*xnew+ynew*ynew) <= fRhi*fRhi) return snxt;
   }
   snxt = DistToParaboloid(point, dir);
   if (snxt > 1E20) return snxt;
   znew = point[2]+snxt*dir[2];
   if (TMath::Abs(znew) <= fDz) return snxt;
   return TGeoShape::Big();
}

//_____________________________________________________________________________
TGeoVolume *TGeoParaboloid::Divide(TGeoVolume * /*voldiv*/, const char * /*divname*/, Int_t /*iaxis*/, Int_t /*ndiv*/, 
                             Double_t /*start*/, Double_t /*step*/) 
{
// Divide the paraboloid along one axis.
   Error("Divide", "Paraboloid divisions not implemented");
   return 0;
}   

//_____________________________________________________________________________
void TGeoParaboloid::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] = 0.;                  // Rmin
   param[1] = fDX;                 // Rmax
   param[1] *= param[1];
   param[2] = 0.;                  // Phi1
   param[3] = 360.;                // Phi2 
}   

//_____________________________________________________________________________
TGeoShape *TGeoParaboloid::GetMakeRuntimeShape(TGeoShape *, TGeoMatrix *) const
{
// in case shape has some negative parameters, these has to be computed
// in order to fit the mother
   return 0;
}

//_____________________________________________________________________________
void TGeoParaboloid::InspectShape() const
{
// print shape parameters
   printf("*** Shape %s: TGeoParaboloid ***\n", GetName());
   printf("    rlo    = %11.5f\n", fRlo);
   printf("    rhi    = %11.5f\n", fRhi);
   printf("    dz     = %11.5f\n", fDz);
   printf(" Bounding box:\n");
   TGeoBBox::InspectShape();
}

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

   Int_t n = gGeoManager->GetNsegments();
   Int_t nbPnts = n*(n+1)+2;
   Int_t nbSegs = n*(2*n+3);
   Int_t nbPols = n*(n+2);

   TBuffer3D* buff = new TBuffer3D(TBuffer3DTypes::kGeneric,
                                   nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 2*n*5 + n*n*6);

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

   return buff; 
}

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

   Int_t c = GetBasicColor();

   Int_t nn1 = (n+1)*n+1;
   indx = 0;
   // Lower end-cap (n radial segments)
   for (j=0; j<n; j++) {
      buff.fSegs[indx++] = c+2;
      buff.fSegs[indx++] = 0;
      buff.fSegs[indx++] = j+1;
   }
   // Sectors (n)
   for (i=0; i<n+1; i++) {
      // lateral (circles) segments (n)
      for (j=0; j<n; j++) {
         buff.fSegs[indx++] = c;
         buff.fSegs[indx++] = n*i+1+j;
         buff.fSegs[indx++] = n*i+1+((j+1)%n);
      }
      if (i==n) break;  // skip i=n for generators
      // generator segments (n)
      for (j=0; j<n; j++) {
         buff.fSegs[indx++] = c;
         buff.fSegs[indx++] = n*i+1+j;
         buff.fSegs[indx++] = n*(i+1)+1+j;
      }
   }
   // Upper end-cap
   for (j=0; j<n; j++) {
      buff.fSegs[indx++] = c+1;
      buff.fSegs[indx++] = n*n+1+j;
      buff.fSegs[indx++] = nn1;
   }

   indx = 0;

   // lower end-cap (n polygons)
   for (j=0; j<n; j++) {
      buff.fPols[indx++] = c+2;
      buff.fPols[indx++] = 3;
      buff.fPols[indx++] = n+j;
      buff.fPols[indx++] = (j+1)%n;
      buff.fPols[indx++] = j;
   }
   // Sectors (n)
   for (i=0; i<n; i++) {
      // lateral faces (n)
      for (j=0; j<n; j++) {
         buff.fPols[indx++] = c;
         buff.fPols[indx++] = 4;
         buff.fPols[indx++] = (2*i+1)*n+j;
         buff.fPols[indx++] = 2*(i+1)*n+j;
         buff.fPols[indx++] = (2*i+3)*n+j;
         buff.fPols[indx++] = 2*(i+1)*n+((j+1)%n);
      }
   }
   // upper end-cap (n polygons)
   for (j=0; j<n; j++) {
      buff.fPols[indx++] = c+1;
      buff.fPols[indx++] = 3;
      buff.fPols[indx++] = 2*n*(n+1)+j;
      buff.fPols[indx++] = 2*n*(n+1)+((j+1)%n);
      buff.fPols[indx++] = (2*n+1)*n+j;
   }
}

//_____________________________________________________________________________
Double_t TGeoParaboloid::Safety(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.
   return TGeoShape::Big();
}

//_____________________________________________________________________________
void TGeoParaboloid::SetParaboloidDimensions(Double_t rlo, Double_t rhi, Double_t dz)
{
// Set paraboloid dimensions.
   if ((rlo<0) || (rlo<0) || (dz<=0) || TMath::Abs(rlo-rhi)<TGeoShape::Tolerance()) {
      SetShapeBit(kGeoRunTimeShape);
      Error("SetParaboloidDimensions", "Dimensions of %s invalid: check (rlo>=0) (rhi>=0) (rlo!=rhi) dz>0",GetName());
      return;
   }
   fRlo = rlo;
   fRhi = rhi;
   fDz  = dz;
   Double_t dd = 1./(fRhi*fRhi - fRlo*fRlo);
   fA = 2.*fDz*dd;
   fB = - fDz * (fRlo*fRlo + fRhi*fRhi)*dd;
}   

//_____________________________________________________________________________
void TGeoParaboloid::SetDimensions(Double_t *param)
{
// Set paraboloid dimensions starting from an array.
   Double_t rlo    = param[0];
   Double_t rhi    = param[1];
   Double_t dz     = param[2];
   SetParaboloidDimensions(rlo, rhi, dz);
}   

//_____________________________________________________________________________
void TGeoParaboloid::SetPoints(Double_t *points) const
{
// Create paraboloid mesh points.
// Npoints = n*(n+1) + 2
//   ifirst = 0
//   ipoint(i,j) = 1+i*n+j;                              i=[0,n]  j=[0,n-1]
//   ilast = 1+n*(n+1)
// Nsegments = n*(2*n+3)  
//   lower: (0, j+1);                                    j=[0,n-1]
//   circle(i): (n*i+1+j, n*i+1+(j+1)%n);                i=[0,n]  j=[0,n-1]
//   generator(i): (n*i+1+j, n*(i+1)+1+j);               i,j=[0,n-1]
//   upper: (n*n+1+j, (n+1)*n+1)                           j=[0,n-1]
// Npolygons = n*(n+2)
//   lower: (n+j, (j+1)%n, j)                              j=[0,n-1]
//   lateral(i): ((2*i+1)*n+j, 2*(i+1)*n+j, (2*i+3)*n+j, 2*(i+1)*n+(j+1)%n)
//                                                      i,j = [0,n-1]
//   upper: ((2n+1)*n+j, 2*n*(n+1)+(j+1)%n, 2*n*(n+1)+j)   j=[0,n-1]
   if (!points) return;
   Double_t ttmin, ttmax;
   ttmin = TMath::ATan2(-fDz, fRlo);
   ttmax = TMath::ATan2(fDz, fRhi);
   Int_t n = gGeoManager->GetNsegments();
   Double_t dtt = (ttmax-ttmin)/n;
   Double_t dphi = 360./n;
   Double_t tt;
   Double_t r, z, delta;
   Double_t phi, sph, cph;
   Int_t indx = 0;
   // center of the lower endcap:
   points[indx++] = 0; // x
   points[indx++] = 0; // y
   points[indx++] = -fDz;
   for (Int_t i=0; i<n+1; i++) {  // nz planes = n+1
      if (i==0) {
         r = fRlo;
         z = -fDz;
      } else if (i==n) {
         r = fRhi;
         z = fDz;
      } else {      
         tt = TMath::Tan(ttmin + i*dtt);
         delta = tt*tt - 4*fA*fB; // should be always positive (a*b<0)
         r = 0.5*(tt+TMath::Sqrt(delta))/fA;
         z = r*tt;
      }
      for (Int_t j=0; j<n; j++) {
         phi = j*dphi*TMath::DegToRad();
         sph=TMath::Sin(phi);
         cph=TMath::Cos(phi);
         points[indx++] = r*cph;
         points[indx++] = r*sph;
         points[indx++] = z;
      }
   } 
   // center of the upper endcap
   points[indx++] = 0; // x
   points[indx++] = 0; // y
   points[indx++] = fDz;
}

//_____________________________________________________________________________
void TGeoParaboloid::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*(n+1)+2;
   nsegs = n*(2*n+3);
   npols = n*(n+2);
}

//_____________________________________________________________________________
Int_t TGeoParaboloid::GetNmeshVertices() const
{
// Returns number of vertices on the paraboloid mesh.
   Int_t n = gGeoManager->GetNsegments();
   return (n*(n+1)+2);
}   
   
//_____________________________________________________________________________
void TGeoParaboloid::SavePrimitive(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() << endl;
   out << "   rlo = " << fRlo << ";" << endl;
   out << "   rhi = " << fRhi << ";" << endl;
   out << "   dz  = " << fDZ << ";" << endl;  
   out << "   TGeoShape *" << GetPointerName() << " = new TGeoParaboloid(\"" << GetName() << "\", rlo,rhi,dz);" << endl;
   TObject::SetBit(TGeoShape::kGeoSavePrimitive);
}         

//_____________________________________________________________________________
void TGeoParaboloid::SetPoints(Float_t *points) const
{
// Create paraboloid mesh points.
   if (!points) return;
   Double_t ttmin, ttmax;
   ttmin = TMath::ATan2(-fDz, fRlo);
   ttmax = TMath::ATan2(fDz, fRhi);
   Int_t n = gGeoManager->GetNsegments();
   Double_t dtt = (ttmax-ttmin)/n;
   Double_t dphi = 360./n;
   Double_t tt;
   Double_t r, z, delta;
   Double_t phi, sph, cph;
   Int_t indx = 0;
   // center of the lower endcap:
   points[indx++] = 0; // x
   points[indx++] = 0; // y
   points[indx++] = -fDz;
   for (Int_t i=0; i<n+1; i++) {  // nz planes = n+1
      if (i==0) {
         r = fRlo;
         z = -fDz;
      } else if (i==n) {
         r = fRhi;
         z = fDz;
      } else {      
         tt = TMath::Tan(ttmin + i*dtt);
         delta = tt*tt - 4*fA*fB; // should be always positive (a*b<0)
         r = 0.5*(tt+TMath::Sqrt(delta))/fA;
         z = r*tt;
      }
      for (Int_t j=0; j<n; j++) {
         phi = j*dphi*TMath::DegToRad();
         sph=TMath::Sin(phi);
         cph=TMath::Cos(phi);
         points[indx++] = r*cph;
         points[indx++] = r*sph;
         points[indx++] = z;
      }
   } 
   // center of the upper endcap
   points[indx++] = 0; // x
   points[indx++] = 0; // y
   points[indx++] = fDz;
}

//_____________________________________________________________________________
void TGeoParaboloid::Sizeof3D() const
{
///   Int_t n = gGeoManager->GetNsegments();
///   TVirtualGeoPainter *painter = gGeoManager->GetGeomPainter();
///   if (painter) painter->AddSize3D(n*(n+1)+2, n*(2*n+3), n*(n+2));
}

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