ROBAST logo
/******************************************************************************
 * Copyright (C) 2006-, Akira Okumura                                         *
 * All rights reserved.                                                       *
 *****************************************************************************/

///////////////////////////////////////////////////////////////////////////////
//
// AGeoWinstonConePoly
//
// Geometry class for tubes which have two aspheric surface
//
///////////////////////////////////////////////////////////////////////////////

#include "AGeoWinstonConePoly.h"

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

ClassImp(AGeoWinstonConePoly);

//_____________________________________________________________________________
AGeoWinstonConePoly::AGeoWinstonConePoly() : AGeoWinstonCone2D() {
  // Default constructor
}

//_____________________________________________________________________________
AGeoWinstonConePoly::AGeoWinstonConePoly(Double_t r1, Double_t r2, Int_t n)
    : AGeoWinstonCone2D(r1, r2, 0) {
  SetWinstonDimensions(r1, r2, n);
  ComputeBBox();
}

//_____________________________________________________________________________
AGeoWinstonConePoly::AGeoWinstonConePoly(const char* name, Double_t r1,
                                         Double_t r2, Int_t n)
    : AGeoWinstonCone2D(name, r1, r2, 0) {
  SetWinstonDimensions(r1, r2, n);
  ComputeBBox();
}

//_____________________________________________________________________________
AGeoWinstonConePoly::~AGeoWinstonConePoly() {
  // Destructor
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::ComputeBBox() {
  // Compute bounding box of the shape
  fDX = fDX;
  fDY = fDY;
  fDZ = fDZ;
  fOrigin[0] = 0;
  fOrigin[1] = 0;
  fOrigin[2] = 0;
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::ComputeNormal(CONST53410 Double_t* point,
                                        CONST53410 Double_t* dir,
                                        Double_t* norm) {
  // Compute normal to closest surface from POINT.

  // Following calculation assumes that the point is very close to surfaces.
  Double_t x = point[0];
  Double_t y = point[1];
  Double_t z = point[2];

  Double_t saf[2];
  saf[0] = TMath::Abs(TMath::Abs(fDZ) - TMath::Abs(z));
  Double_t phi = TMath::ATan2(y, x);
  while (phi > TMath::Pi() / fPolyN) {
    phi -= TMath::TwoPi() / fPolyN;
  }
  while (phi < -TMath::Pi() / fPolyN) {
    phi += TMath::TwoPi() / fPolyN;
  }
  try {
    saf[1] =
        TMath::Abs(CalcR(z) - TMath::Sqrt(x * x + y * y) * TMath::Cos(phi));
  } catch (...) {
    saf[1] = TGeoShape::Big();
  }

  Int_t i = TMath::LocMin(2, saf);  // find minimum

  if (i == 0) {  // on the XY surface
    norm[0] = 0;
    norm[1] = 0;
    norm[2] = 1;
  } else {
    phi = TMath::ATan2(y, x);
    if (phi < -TMath::Pi() / fPolyN) {
      phi += TMath::TwoPi();
    }
    Int_t n =
        TMath::Floor((phi + TMath::Pi() / fPolyN) / (TMath::TwoPi() / fPolyN));
    norm[0] = TMath::Cos(n * TMath::TwoPi() / fPolyN);
    norm[1] = TMath::Sin(n * TMath::TwoPi() / fPolyN);
    norm[2] = -CalcdRdZ(z);
  }

  TVector3 vec(norm);
  vec.SetMag(1.);
  norm[0] = vec.X();
  norm[1] = vec.Y();
  norm[2] = vec.Z();

  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 AGeoWinstonConePoly::Contains(CONST53410 Double_t* point) const {
  // Test if point is in this shape
  Double_t x = point[0];
  Double_t y = point[1];
  Double_t z = point[2];
  if (TMath::Abs(z) > fDZ) {
    return kFALSE;
  }

  Double_t r = CalcR(z);

  return InsidePolygon(x, y, r);
}

//_____________________________________________________________________________
Int_t AGeoWinstonConePoly::DistancetoPrimitive(Int_t px, Int_t py) {
  // compute closest distance from point px,py to each corner
  Int_t n = gGeoManager->GetNsegments();

  Int_t numPoints = (n + 1) * fPolyN + 2;

  return ShapeDistancetoPrimitive(numPoints, px, py);
}

//_____________________________________________________________________________
Double_t AGeoWinstonConePoly::DistFromInside(CONST53410 Double_t* point,
                                             CONST53410 Double_t* dir,
                                             Int_t iact, Double_t step,
                                             Double_t* safe) const {
  // compute distance from inside point to surface of the sphere

  // compute safe distance
  if (iact < 3 and safe) {
    *safe = Safety(point, kFALSE);
    if (iact == 0) return TGeoShape::Big();
    if (iact == 1 && step < *safe) return TGeoShape::Big();
  }

  // calculate distance
  Double_t d[1 + fPolyN];
  d[0] = TGeoShape::Big();
  if (dir[2] < 0) {
    d[0] = (-point[2] - fDZ) / dir[2];
  } else if (dir[2] > 0) {
    d[0] = (fDZ - point[2]) / dir[2];
  }

  for (Int_t i = 0; i < fPolyN; i++) {
    d[1 + i] =
        DistToParabola(point, dir, i * TMath::TwoPi() / fPolyN, TMath::Pi());
  }

  return d[TMath::LocMin(1 + fPolyN, d)];
}

//_____________________________________________________________________________
Double_t AGeoWinstonConePoly::DistFromOutside(CONST53410 Double_t* point,
                                              CONST53410 Double_t* dir,
                                              Int_t iact, Double_t step,
                                              Double_t* safe) const {
  // compute distance from outside point to surface of the sphere

  // compute safe distance
  if (iact < 3 and safe) {
    *safe = Safety(point, kFALSE);
    if (iact == 0) return TGeoShape::Big();
    if (iact == 1 && step < *safe) return TGeoShape::Big();
  }

  // calculate distance
  if (point[2] <= -fDZ) {
    if (dir[2] <= 0) {
      return TGeoShape::Big();
    }
    Double_t snxt = -(fDZ + point[2]) / dir[2];
    // find extrapolated X and Y
    Double_t xnew = point[0] + snxt * dir[0];
    Double_t ynew = point[1] + snxt * dir[1];
    if (InsidePolygon(xnew, ynew, fR2)) {
      return snxt;
    }
  } else if (point[2] >= fDZ) {
    if (dir[2] >= 0) {
      return TGeoShape::Big();
    }
    Double_t snxt = (fDZ - point[2]) / dir[2];
    // find extrapolated X and Y
    Double_t xnew = point[0] + snxt * dir[0];
    Double_t ynew = point[1] + snxt * dir[1];
    if (InsidePolygon(xnew, ynew, fR1)) {
      return snxt;
    }
  }

  Double_t d[fPolyN];
  for (Int_t i = 0; i < fPolyN; i++) {
    d[i] = DistToParabola(point, dir, i * TMath::TwoPi() / fPolyN,
                          TMath::TwoPi() / fPolyN);
  }

  return d[TMath::LocMin(fPolyN, d)];
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::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;
  param[1] = TMath::Power(fR1 / TMath::Cos(TMath::Pi() / fPolyN), 2);
  param[2] = 0;
  param[3] = 360;
}

//_____________________________________________________________________________
const TBuffer3D& AGeoWinstonConePoly::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 = fPolyN * (n + 1) + 2;  // Number of points
    Int_t nbSegs = fPolyN * (2 * n + 3);  // Number of segments
    Int_t nbPols3 = fPolyN * 2;           // Number of triangle polygons
    Int_t nbPols4 = fPolyN * n;           // Number of rectangle polygons

    if (buffer.SetRawSizes(nbPnts, 3 * nbPnts, nbSegs, 3 * nbSegs,
                           nbPols3 + nbPols4, 5 * nbPols3 + 6 * nbPols4)) {
      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;
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::GetMeshNumbers(Int_t& nvert, Int_t& nsegs,
                                         Int_t& npols) const {
  Int_t n = gGeoManager->GetNsegments();

  nvert = fPolyN * (n + 1) + 2;
  nsegs = fPolyN * (2 * n + 3);
  npols = fPolyN * (n + 2);
}

//_____________________________________________________________________________
Int_t AGeoWinstonConePoly::GetNmeshVertices() const {
  // Return number of vertices of the mesh representation

  Int_t n = gGeoManager->GetNsegments();
  Int_t nbPnts = fPolyN * (n + 1) + 2;

  return nbPnts;
}

//_____________________________________________________________________________
Bool_t AGeoWinstonConePoly::InsidePolygon(Double_t x, Double_t y,
                                          Double_t r) const {
  Double_t theta = TMath::ATan2(y, x);

  while (theta > TMath::Pi() / fPolyN) {
    theta -= TMath::TwoPi() / fPolyN;
  }
  while (theta < -TMath::Pi() / fPolyN) {
    theta += TMath::TwoPi() / fPolyN;
  }

  if (TMath::Sqrt(x * x + y * y) * TMath::Cos(theta) > r) {
    return kFALSE;
  }

  return kTRUE;
}
//_____________________________________________________________________________
void AGeoWinstonConePoly::InspectShape() const {
  // print shape parameters
  printf("*** Shape %s: AGeoWinstonConePoly ***\n", GetName());
  printf("    N      = %d\n", fPolyN);
  printf(" 2D Base:\n");
  AGeoWinstonCone2D::InspectShape();
}

//_____________________________________________________________________________
TBuffer3D* AGeoWinstonConePoly::MakeBuffer3D() const {
  Int_t n = gGeoManager->GetNsegments();
  Int_t nbPnts = fPolyN * (n + 1) + 2;
  Int_t nbSegs = fPolyN * (2 * n + 3);
  Int_t nbPols3 = fPolyN * 2;
  Int_t nbPols4 = fPolyN * n;

  TBuffer3D* buff =
      new TBuffer3D(TBuffer3DTypes::kGeneric, nbPnts, 3 * nbPnts, nbSegs,
                    3 * nbSegs, nbPols3 + nbPols4, 5 * nbPols3 + 6 * nbPols4);

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

  return buff;
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::SavePrimitive(std::ostream& out, Option_t*) {
  // 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 << "   r1 = " << fR1 << ";" << std::endl;
  out << "   r2 = " << fR2 << ";" << std::endl;
  out << "   n  = " << fPolyN << ";" << std::endl;
  out << "   AGeoWinstonConePoly* cone = new AGeoWinstonConePoly(\""
      << GetName() << "\", r1, r2, n);" << std::endl;

  out << "   TGeoShape* " << GetPointerName() << " = cone;" << std::endl;
  TObject::SetBit(TGeoShape::kGeoSavePrimitive);
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::SetWinstonDimensions(Double_t r1, Double_t r2,
                                               Int_t n) {
  if (TMath::Abs(r1) > TMath::Abs(r2)) {
    fR1 = TMath::Abs(r1);
    fR2 = TMath::Abs(r2);
  } else {
    fR1 = TMath::Abs(r2);
    fR2 = TMath::Abs(r1);
  }

  fPolyN = n >= 3 ? n : 3;

  Double_t r = r1 / TMath::Cos(TMath::Pi() / n);

  fDX = 0;
  for (Int_t i = 0; i < fPolyN; i++) {
    fDX = TMath::Max(TMath::Abs(r * TMath::Cos(TMath::Pi() / n * (2 * i + 1))),
                     fDX);
  }

  fDY = 0;
  for (Int_t i = 0; i < fPolyN; i++) {
    fDY = TMath::Max(TMath::Abs(r * TMath::Sin(TMath::Pi() / n * (2 * i + 1))),
                     fDY);
  }

  fTheta = TMath::ASin(fR2 / fR1);
  fDZ = (fR1 + fR2) / TMath::Tan(fTheta) / 2.;

  fF = fR2 * (1 + TMath::Sin(fTheta));
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::SetDimensions(Double_t* param) {
  SetWinstonDimensions(param[0], param[1], param[2]);
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::SetPoints(Double_t* points) const {
  // create mesh points
  if (!points) {
    return;
  }

  Int_t n = gGeoManager->GetNsegments();

  Int_t index = 0;
  for (int i = 0; i <= n; i++) {
    // see
    // http://cherenkov.physics.iastate.edu/research/LightconeStudies-collector_optimization.pdf
    Double_t t = 2. * fDZ * i / n;
    Double_t z = -fDZ + t;
    Double_t r = CalcR(z) / TMath::Cos(TMath::Pi() / fPolyN);

    for (Int_t j = 0; j < fPolyN; j++) {
      Double_t theta = (j + 0.5) * TMath::TwoPi() / fPolyN;
      Double_t x = r * TMath::Cos(theta);
      Double_t y = r * TMath::Sin(theta);
      points[index++] = x;
      points[index++] = y;
      points[index++] = z;
    }
  }

  points[index++] = 0;
  points[index++] = 0;
  points[index++] = -fDZ;

  points[index++] = 0;
  points[index++] = 0;
  points[index++] = fDZ;
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::SetPoints(Float_t* points) const {
  // create mesh points
  if (!points) {
    return;
  }

  Int_t n = gGeoManager->GetNsegments();

  Int_t index = 0;
  for (int i = 0; i <= n; i++) {
    // see
    // http://cherenkov.physics.iastate.edu/research/LightconeStudies-collector_optimization.pdf
    Double_t t = 2. * fDZ * i / n;
    Double_t z = -fDZ + t;
    Double_t r = CalcR(z) / TMath::Cos(TMath::TwoPi() / fPolyN);
    ;

    for (Int_t j = 0; j < fPolyN; j++) {
      Double_t theta = (j + 0.5) * TMath::TwoPi() / fPolyN;
      Double_t x = r * TMath::Cos(theta);
      Double_t y = r * TMath::Sin(theta);
      points[index++] = x;
      points[index++] = y;
      points[index++] = z;
    }
  }

  points[index++] = 0;
  points[index++] = 0;
  points[index++] = -fDZ;

  points[index++] = 0;
  points[index++] = 0;
  points[index++] = fDZ;
}

//_____________________________________________________________________________
void AGeoWinstonConePoly::SetSegsAndPols(TBuffer3D& buff) const {
  // Fill TBuffer3D structure for segments and polygons.

  Int_t n = gGeoManager->GetNsegments();
  Int_t c = GetBasicColor();

  // segments
  Int_t index = 0;
  for (Int_t i = 0; i < n; i++) {
    // segments on parabola
    for (Int_t j = 0; j < fPolyN; j++) {
      buff.fSegs[index++] = c;
      buff.fSegs[index++] = fPolyN * i + j;
      buff.fSegs[index++] = fPolyN * (i + 1) + j;
    }
  }

  for (Int_t i = 0; i <= n; i++) {
    // segments parallel to X-Y plane
    for (Int_t j = 0; j < fPolyN; j++) {
      buff.fSegs[index++] = c;
      buff.fSegs[index++] = fPolyN * i + j;
      buff.fSegs[index++] = j == (fPolyN - 1) ? fPolyN * i : fPolyN * i + j + 1;
    }
  }

  for (Int_t i = 0; i < fPolyN; i++) {
    buff.fSegs[index++] = c;
    buff.fSegs[index++] = i;
    buff.fSegs[index++] = fPolyN * (n + 1);
  }

  for (Int_t i = 0; i < fPolyN; i++) {
    buff.fSegs[index++] = c;
    buff.fSegs[index++] = fPolyN * (n + 1) - fPolyN + i;
    buff.fSegs[index++] = fPolyN * (n + 1) + 1;
  }

  // polygons
  index = 0;
  for (Int_t i = 0; i < n; i++) {
    for (Int_t j = 0; j < fPolyN; j++) {
      // polygon on parabola
      buff.fPols[index++] = c;
      buff.fPols[index++] = 4;
      buff.fPols[index++] = fPolyN * i + j;  // this is a segment number
      buff.fPols[index++] = fPolyN * n + fPolyN * i + j + fPolyN;
      buff.fPols[index++] = j == (fPolyN - 1) ? fPolyN * i : fPolyN * i + j + 1;
      buff.fPols[index++] = fPolyN * n + fPolyN * i + j;
    }
  }

  // polygon at -fDZ
  for (Int_t i = 0; i < fPolyN; i++) {
    buff.fPols[index++] = c;
    buff.fPols[index++] = 3;
    buff.fPols[index++] = fPolyN * n + i;
    buff.fPols[index++] = i == (fPolyN - 1)
                              ? fPolyN * (2 * n + 1) + i + 1 - fPolyN
                              : fPolyN * (2 * n + 1) + i + 1;
    buff.fPols[index++] = fPolyN * (2 * n + 1) + i;
  }

  // polygon at +fDZ
  for (Int_t i = 0; i < fPolyN; i++) {
    buff.fPols[index++] = c;
    buff.fPols[index++] = 3;
    buff.fPols[index++] = fPolyN * 2 * n + i;
    buff.fPols[index++] = fPolyN * (2 * n + 2) + i;
    buff.fPols[index++] = i == (fPolyN - 1)
                              ? fPolyN * (2 * n + 2) + i + 1 - fPolyN
                              : fPolyN * (2 * n + 2) + i + 1;
  }
}

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