ROOT logo
// @(#)root/geom:$Id: TGeoPara.cxx 27731 2009-03-09 17:40:56Z brun $
// Author: Andrei Gheata   31/01/02
// TGeoPara::Contains() 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.             *
 *************************************************************************/

//_____________________________________________________________________________
// TGeoPara - parallelipeped class. It has 6 parameters :
//         dx, dy, dz - half lengths in X, Y, Z
//         alpha - angle w.r.t the Y axis from center of low Y edge to
//                 center of high Y edge [deg]
//         theta, phi - polar and azimuthal angles of the segment between
//                 low and high Z surfaces [deg]
//
//_____________________________________________________________________________
//
//Begin_Html
/*
<img src="gif/t_para.gif">
*/
//End_Html
//Begin_Html
/*
<img src="gif/t_paradivX.gif">
*/
//End_Html
//Begin_Html
/*
<img src="gif/t_paradivY.gif">
*/
//End_Html
//Begin_Html
/*
<img src="gif/t_paradivZ.gif">
*/
//End_Html

#include "Riostream.h"

#include "TGeoManager.h"
#include "TGeoMatrix.h"
#include "TGeoVolume.h"
#include "TGeoPara.h"
#include "TMath.h"

ClassImp(TGeoPara)
   
//_____________________________________________________________________________
TGeoPara::TGeoPara()
{
// Default constructor
   SetShapeBit(TGeoShape::kGeoPara);
   fX = fY = fZ = 0;
   fAlpha = 0;
   fTheta = 0;
   fPhi = 0;
   fTxy = 0;
   fTxz = 0;
   fTyz = 0;
}   

//_____________________________________________________________________________
TGeoPara::TGeoPara(Double_t dx, Double_t dy, Double_t dz, Double_t alpha,
                   Double_t theta, Double_t phi)
           :TGeoBBox(0, 0, 0)
{
// Default constructor specifying minimum and maximum radius
   SetShapeBit(TGeoShape::kGeoPara);
   fX = dx;
   fY = dy;
   fZ = dz;
   fAlpha = alpha;
   fTheta = theta;
   fPhi = phi;
   fTxy = TMath::Tan(alpha*TMath::DegToRad());
   Double_t tth = TMath::Tan(theta*TMath::DegToRad());
   Double_t ph  = phi*TMath::DegToRad();
   fTxz = tth*TMath::Cos(ph);
   fTyz = tth*TMath::Sin(ph);
   if ((fX<0) || (fY<0) || (fZ<0)) {
//      printf("para : %f %f %f\n", fX, fY, fZ);
      SetShapeBit(kGeoRunTimeShape);
   }
   else ComputeBBox();
}

//_____________________________________________________________________________
TGeoPara::TGeoPara(const char *name, Double_t dx, Double_t dy, Double_t dz, Double_t alpha,
                   Double_t theta, Double_t phi)
           :TGeoBBox(name, 0, 0, 0)
{
// Default constructor specifying minimum and maximum radius
   SetShapeBit(TGeoShape::kGeoPara);
   fX = dx;
   fY = dy;
   fZ = dz;
   fAlpha = alpha;
   fTheta = theta;
   fPhi = phi;
   fTxy = TMath::Tan(alpha*TMath::DegToRad());
   Double_t tth = TMath::Tan(theta*TMath::DegToRad());
   Double_t ph  = phi*TMath::DegToRad();
   fTxz = tth*TMath::Cos(ph);
   fTyz = tth*TMath::Sin(ph);
   if ((fX<0) || (fY<0) || (fZ<0)) {
//      printf("para : %f %f %f\n", fX, fY, fZ);
      SetShapeBit(kGeoRunTimeShape);
   }
   else ComputeBBox();
}

//_____________________________________________________________________________
TGeoPara::TGeoPara(Double_t *param)
           :TGeoBBox(0, 0, 0)
{
// Default constructor
// param[0] = dx
// param[1] = dy
// param[2] = dz
// param[3] = alpha
// param[4] = theta
// param[5] = phi
   SetShapeBit(TGeoShape::kGeoPara);
   SetDimensions(param);
   if ((fX<0) || (fY<0) || (fZ<0)) SetShapeBit(kGeoRunTimeShape);
   else ComputeBBox();
}

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

//_____________________________________________________________________________
Double_t TGeoPara::Capacity() const
{
// Computes capacity of the shape in [length^3]
   Double_t capacity = 8.*fX*fY*fZ;
   return capacity;
}      

//_____________________________________________________________________________   
void TGeoPara::ComputeBBox()
{
// compute bounding box
   Double_t dx = fX+fY*TMath::Abs(fTxy)+fZ*TMath::Abs(fTxz);
   Double_t dy = fY+fZ*TMath::Abs(fTyz);
   Double_t dz = fZ;
   TGeoBBox::SetBoxDimensions(dx, dy, dz);
   memset(fOrigin, 0, 3*sizeof(Double_t));
}   

//_____________________________________________________________________________   
void TGeoPara::ComputeNormal(Double_t *point, Double_t *dir, Double_t *norm)
{
// Compute normal to closest surface from POINT. 
   Double_t saf[3];
   // distance from point to higher Z face
   saf[0] = TMath::Abs(fZ-TMath::Abs(point[2])); // Z

   Double_t yt = point[1]-fTyz*point[2];      
   saf[1] = TMath::Abs(fY-TMath::Abs(yt));       // Y
   // cos of angle YZ
   Double_t cty = 1.0/TMath::Sqrt(1.0+fTyz*fTyz);

   Double_t xt = point[0]-fTxz*point[2]-fTxy*yt;      
   saf[2] = TMath::Abs(fX-TMath::Abs(xt));       // X
   // cos of angle XZ
   Double_t ctx = 1.0/TMath::Sqrt(1.0+fTxy*fTxy+fTxz*fTxz);
   saf[2] *= ctx;
   saf[1] *= cty;
   Int_t i = TMath::LocMin(3,saf);
   switch (i) {
      case 0:
         norm[0] = norm[1] = 0;
         norm[2] = TMath::Sign(1.,dir[2]);
         return;
      case 1:
         norm[0] = 0;   
         norm[1] = cty;
         norm[2] = - fTyz*cty;
         break;
      case 2:
         norm[0] = TMath::Cos(fTheta*TMath::DegToRad())*TMath::Cos(fAlpha*TMath::DegToRad());
         norm[1] = - TMath::Cos(fTheta*TMath::DegToRad())*TMath::Sin(fAlpha*TMath::DegToRad());
         norm[2] = -TMath::Sin(fTheta*TMath::DegToRad());
   }
   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 TGeoPara::Contains(Double_t *point) const
{
// test if point is inside this sphere
   // test Z range
   if (TMath::Abs(point[2]) > fZ) return kFALSE;
   // check X and Y
   Double_t yt=point[1]-fTyz*point[2];
   if (TMath::Abs(yt) > fY) return kFALSE;
   Double_t xt=point[0]-fTxz*point[2]-fTxy*yt;
   if (TMath::Abs(xt) > fX) return kFALSE;
   return kTRUE;
}

//_____________________________________________________________________________
Double_t TGeoPara::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 para
// Boundary safe algorithm.
   if (iact<3 && safe) {
   // compute safety
      *safe = Safety(point, kTRUE);
      if (iact==0) return TGeoShape::Big();
      if (iact==1 && step<*safe) return TGeoShape::Big(); 
   }
   Double_t saf[2];
   Double_t snxt = TGeoShape::Big();
   Double_t s;
   saf[0] = fZ+point[2];
   saf[1] = fZ-point[2];
   if (!TGeoShape::IsSameWithinTolerance(dir[2],0)) {
      s = (dir[2]>0)?(saf[1]/dir[2]):(-saf[0]/dir[2]);
      if (s<0) return 0.0;
      if (s<snxt) snxt = s;
   }
   // distance from point to center axis on Y 
   Double_t yt = point[1]-fTyz*point[2];      
   saf[0] = fY+yt;
   saf[1] = fY-yt;
   Double_t dy = dir[1]-fTyz*dir[2];
   if (!TGeoShape::IsSameWithinTolerance(dy,0)) {
      s = (dy>0)?(saf[1]/dy):(-saf[0]/dy);
      if (s<0) return 0.0;
      if (s<snxt) snxt = s;
   }   
   // distance from point to center axis on X 
   Double_t xt = point[0]-fTxz*point[2]-fTxy*yt;      
   saf[0] = fX+xt;
   saf[1] = fX-xt;
   Double_t dx = dir[0]-fTxz*dir[2]-fTxy*dy;
   if (!TGeoShape::IsSameWithinTolerance(dx,0)) {
      s = (dx>0)?(saf[1]/dx):(-saf[0]/dx);
      if (s<0) return 0.0;
      if (s<snxt) snxt = s;
   }   
   return snxt;
}

//_____________________________________________________________________________
Double_t TGeoPara::DistFromOutside(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 para
   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();
   }
   Bool_t in = kTRUE;
   Double_t safz;
   safz = TMath::Abs(point[2])-fZ;
   if (safz>0) {
      // outside Z
      if (point[2]*dir[2]>=0) return TGeoShape::Big();
      in = kFALSE;
   }   
   Double_t yt=point[1]-fTyz*point[2];
   Double_t safy = TMath::Abs(yt)-fY;
   Double_t dy=dir[1]-fTyz*dir[2];   
   if (safy>0) {
      if (yt*dy>=0) return TGeoShape::Big();
      in = kFALSE;
   }   
   Double_t xt=point[0]-fTxy*yt-fTxz*point[2];
   Double_t safx = TMath::Abs(xt)-fX;
   Double_t dx=dir[0]-fTxy*dy-fTxz*dir[2];
   if (safx>0) {
      if (xt*dx>=0) return TGeoShape::Big();
      in = kFALSE;
   }   
   // protection in case point is actually inside
   if (in) {
      if (safz>safx && safz>safy) {
         if (point[2]*dir[2]>0) return TGeoShape::Big();
         return 0.0;
      }
      if (safx>safy) {
         if (xt*dx>0) return TGeoShape::Big();
         return 0.0;
      }
      if (yt*dy>0) return TGeoShape::Big();
      return 0.0;
   }         
   Double_t xnew,ynew,znew;
   if (safz>0) {
      snxt = safz/TMath::Abs(dir[2]);
      xnew = point[0]+snxt*dir[0];
      ynew = point[1]+snxt*dir[1];
      znew = (point[2]>0)?fZ:(-fZ);
      Double_t ytn = ynew-fTyz*znew;
      if (TMath::Abs(ytn)<=fY) {
         Double_t xtn = xnew-fTxy*ytn-fTxz*znew;
         if (TMath::Abs(xtn)<=fX) return snxt;
      }
   }
   if (safy>0) {
      snxt = safy/TMath::Abs(dy);
      znew = point[2]+snxt*dir[2];
      if (TMath::Abs(znew)<=fZ) {
         Double_t ytn = (yt>0)?fY:(-fY);
         xnew = point[0]+snxt*dir[0];
         Double_t xtn = xnew-fTxy*ytn-fTxz*znew;
         if (TMath::Abs(xtn)<=fX) return snxt;
      }
   }
   if (safx>0) {
      snxt = safx/TMath::Abs(dx);
      znew = point[2]+snxt*dir[2];
      if (TMath::Abs(znew)<=fZ) { 
         ynew = point[1]+snxt*dir[1];
         Double_t ytn = ynew-fTyz*znew;
         if (TMath::Abs(ytn)<=fY) return snxt;
      }
   }          
   return TGeoShape::Big();                  
}

//_____________________________________________________________________________
TGeoVolume *TGeoPara::Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv, 
                             Double_t start, Double_t step) 
{
//--- Divide this paralelipiped shape belonging to volume "voldiv" into ndiv equal volumes
// called divname, from start position with the given step. Returns pointer
// to created division cell volume. In case a wrong division axis is supplied,
// returns pointer to volume to be 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 end=start+ndiv*step;
   switch (iaxis) {
      case 1:                  //--- divide on X
         shape = new TGeoPara(step/2, fY, fZ,fAlpha,fTheta, fPhi);
         finder = new TGeoPatternParaX(voldiv, ndiv, start, end);
         opt = "X";
         break;
      case 2:                  //--- divide on Y
         shape = new TGeoPara(fX, step/2, fZ, fAlpha, fTheta, fPhi);
         finder = new TGeoPatternParaY(voldiv, ndiv, start, end);
         opt = "Y";
         break;
      case 3:                  //--- divide on Z
         shape = new TGeoPara(fX, fY, step/2, fAlpha, fTheta, fPhi);
         finder = new TGeoPatternParaZ(voldiv, ndiv, start, end);
         opt = "Z";
         break;
      default:
         Error("Divide", "Wrong axis type for division");
         return 0;            
   }
   vol = new TGeoVolume(divname, shape, voldiv->GetMedium());
   vmulti = gGeoManager->MakeVolumeMulti(divname, voldiv->GetMedium());
   vmulti->AddVolume(vol);
   voldiv->SetFinder(finder);
   finder->SetDivIndex(voldiv->GetNdaughters());
   for (Int_t ic=0; ic<ndiv; ic++) {
      voldiv->AddNodeOffset(vol, ic, start+step/2.+ic*step, opt.Data());
      ((TGeoNodeOffset*)voldiv->GetNodes()->At(voldiv->GetNdaughters()-1))->SetFinder(finder);    
   }
   return vmulti;
}   

//_____________________________________________________________________________
Double_t TGeoPara::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 1:
         xlo = -fX;
         xhi = fX;
         dx = xhi-xlo;
         return dx;
      case 2:
         xlo = -fY;
         xhi = fY;
         dx = xhi-xlo;
         return dx;
      case 3:
         xlo = -fZ;
         xhi = fZ;
         dx = xhi-xlo;
         return dx;
   }
   return dx;
}         
            
//_____________________________________________________________________________
void TGeoPara::GetBoundingCylinder(Double_t *param) const
{
//--- Fill vector param[4] with the bounding cylinder parameters. The order
// is the following : Rmin, Rmax, Phi1, Phi2
   TGeoBBox::GetBoundingCylinder(param);
}   

//_____________________________________________________________________________
Int_t TGeoPara::GetFittingBox(const TGeoBBox *parambox, TGeoMatrix *mat, Double_t &dx, Double_t &dy, Double_t &dz) const
{
// Fills real parameters of a positioned box inside this. Returns 0 if successfull.
   dx=dy=dz=0;
   if (mat->IsRotation()) {
      Error("GetFittingBox", "cannot handle parametrized rotated volumes");
      return 1; // ### rotation not accepted ###
   }
   //--> translate the origin of the parametrized box to the frame of this box.
   Double_t origin[3];
   mat->LocalToMaster(parambox->GetOrigin(), origin);
   if (!Contains(origin)) {
      Error("GetFittingBox", "wrong matrix - parametrized box is outside this");
      return 1; // ### wrong matrix ###
   }
   //--> now we have to get the valid range for all parametrized axis
   Double_t dd[3];
   dd[0] = parambox->GetDX();
   dd[1] = parambox->GetDY();
   dd[2] = parambox->GetDZ();
   //-> check if Z range is fixed
   if (dd[2]<0) {
      dd[2] = TMath::Min(origin[2]+fZ, fZ-origin[2]); 
      if (dd[2]<0) {
         Error("GetFittingBox", "wrong matrix");
         return 1;
      }
   }
   if (dd[0]>=0 && dd[1]>=0) {
      dx = dd[0];
      dy = dd[1];
      dz = dd[2];
      return 0;
   }
   //-> check now range at Z = origin[2] +/- dd[2]
   Double_t upper[8];
   Double_t lower[8];
   Double_t z=origin[2]-dd[2];
   lower[0]=z*fTxz-fTxy*fY-fX; 
   lower[1]=-fY+z*fTyz;
   lower[2]=z*fTxz+fTxy*fY-fX; 
   lower[3]=fY+z*fTyz;
   lower[4]=z*fTxz+fTxy*fY+fX; 
   lower[5]=fY+z*fTyz;
   lower[6]=z*fTxz-fTxy*fY+fX; 
   lower[7]=-fY+z*fTyz;
   z=origin[2]+dd[2];
   upper[0]=z*fTxz-fTxy*fY-fX; 
   upper[1]=-fY+z*fTyz;
   upper[2]=z*fTxz+fTxy*fY-fX; 
   upper[3]=fY+z*fTyz;
   upper[4]=z*fTxz+fTxy*fY+fX; 
   upper[5]=fY+z*fTyz;
   upper[6]=z*fTxz-fTxy*fY+fX; 
   upper[7]=-fY+z*fTyz;
   
   Double_t ddmin=TGeoShape::Big();
   for (Int_t iaxis=0; iaxis<2; iaxis++) {
      if (dd[iaxis]>=0) continue;
      ddmin=TGeoShape::Big();
      for (Int_t ivert=0; ivert<4; ivert++) {
         ddmin = TMath::Min(ddmin, TMath::Abs(origin[iaxis]-lower[2*ivert+iaxis]));
         ddmin = TMath::Min(ddmin, TMath::Abs(origin[iaxis]-upper[2*ivert+iaxis]));
      }
      dd[iaxis] = ddmin;
   }
   dx = dd[0];
   dy = dd[1];
   dz = dd[2];
   return 0;
}   

//_____________________________________________________________________________
TGeoShape *TGeoPara::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(kGeoPara)) {
      Error("GetMakeRuntimeShape", "invalid mother");
      return 0;
   }
   Double_t dx, dy, dz;
   if (fX<0) dx=((TGeoPara*)mother)->GetX();
   else dx=fX;
   if (fY<0) dy=((TGeoPara*)mother)->GetY();
   else dy=fY;
   if (fZ<0) dz=((TGeoPara*)mother)->GetZ();
   else dz=fZ;
   return (new TGeoPara(dx, dy, dz, fAlpha, fTheta, fPhi));
}

//_____________________________________________________________________________
void TGeoPara::InspectShape() const
{
// print shape parameters
   printf("*** Shape %s: TGeoPara ***\n", GetName());
   printf("    dX = %11.5f\n", fX);
   printf("    dY = %11.5f\n", fY);
   printf("    dZ = %11.5f\n", fZ);
   printf("    alpha = %11.5f\n", fAlpha);
   printf("    theta = %11.5f\n", fTheta);
   printf("    phi   = %11.5f\n", fPhi);
   printf(" Bounding box:\n");
   TGeoBBox::InspectShape();
}

//_____________________________________________________________________________
Double_t TGeoPara::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.
   Double_t saf[3];
   // distance from point to higher Z face
   saf[0] = fZ-TMath::Abs(point[2]); // Z

   Double_t yt = point[1]-fTyz*point[2];      
   saf[1] = fY-TMath::Abs(yt);       // Y
   // cos of angle YZ
   Double_t cty = 1.0/TMath::Sqrt(1.0+fTyz*fTyz);

   Double_t xt = point[0]-fTxz*point[2]-fTxy*yt;      
   saf[2] = fX-TMath::Abs(xt);       // X
   // cos of angle XZ
   Double_t ctx = 1.0/TMath::Sqrt(1.0+fTxy*fTxy+fTxz*fTxz);
   saf[2] *= ctx;
   saf[1] *= cty;
   if (in) return saf[TMath::LocMin(3,saf)];
   for (Int_t i=0; i<3; i++) saf[i]=-saf[i];
   return saf[TMath::LocMax(3,saf)];
}

//_____________________________________________________________________________
void TGeoPara::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 << "   dx    = " << fX << ";" << endl;
   out << "   dy    = " << fY << ";" << endl;
   out << "   dz    = " << fZ << ";" << endl;
   out << "   alpha = " << fAlpha<< ";" << endl;
   out << "   theta = " << fTheta << ";" << endl;
   out << "   phi   = " << fPhi << ";" << endl;
   out << "   TGeoShape *" << GetPointerName() << " = new TGeoPara(\"" << GetName() << "\",dx,dy,dz,alpha,theta,phi);" << endl;  
   TObject::SetBit(TGeoShape::kGeoSavePrimitive);
}

//_____________________________________________________________________________
void TGeoPara::SetDimensions(Double_t *param)
{
// Set dimensions starting from an array.
   fX     = param[0];
   fY     = param[1];
   fZ     = param[2];
   fAlpha = param[3];
   fTheta = param[4];
   fPhi   = param[5];
   fTxy = TMath::Tan(param[3]*TMath::DegToRad());
   Double_t tth = TMath::Tan(param[4]*TMath::DegToRad());
   Double_t ph  = param[5]*TMath::DegToRad();
   fTxz   = tth*TMath::Cos(ph);
   fTyz   = tth*TMath::Sin(ph);
}   

//_____________________________________________________________________________
void TGeoPara::SetPoints(Double_t *points) const
{
// Create PARA mesh points
   if (!points) return;
   Double_t txy = fTxy;
   Double_t txz = fTxz;
   Double_t tyz = fTyz;
   *points++ = -fZ*txz-txy*fY-fX; *points++ = -fY-fZ*tyz; *points++ = -fZ;
   *points++ = -fZ*txz+txy*fY-fX; *points++ = +fY-fZ*tyz; *points++ = -fZ;
   *points++ = -fZ*txz+txy*fY+fX; *points++ = +fY-fZ*tyz; *points++ = -fZ;
   *points++ = -fZ*txz-txy*fY+fX; *points++ = -fY-fZ*tyz; *points++ = -fZ;
   *points++ = +fZ*txz-txy*fY-fX; *points++ = -fY+fZ*tyz; *points++ = +fZ;
   *points++ = +fZ*txz+txy*fY-fX; *points++ = +fY+fZ*tyz; *points++ = +fZ;
   *points++ = +fZ*txz+txy*fY+fX; *points++ = +fY+fZ*tyz; *points++ = +fZ;
   *points++ = +fZ*txz-txy*fY+fX; *points++ = -fY+fZ*tyz; *points++ = +fZ;
}

//_____________________________________________________________________________
void TGeoPara::SetPoints(Float_t *points) const
{
// create sphere mesh points
   if (!points) return;
   Double_t txy = fTxy;
   Double_t txz = fTxz;
   Double_t tyz = fTyz;
   *points++ = -fZ*txz-txy*fY-fX; *points++ = -fY-fZ*tyz; *points++ = -fZ;
   *points++ = -fZ*txz+txy*fY-fX; *points++ = +fY-fZ*tyz; *points++ = -fZ;
   *points++ = -fZ*txz+txy*fY+fX; *points++ = +fY-fZ*tyz; *points++ = -fZ;
   *points++ = -fZ*txz-txy*fY+fX; *points++ = -fY-fZ*tyz; *points++ = -fZ;
   *points++ = +fZ*txz-txy*fY-fX; *points++ = -fY+fZ*tyz; *points++ = +fZ;
   *points++ = +fZ*txz+txy*fY-fX; *points++ = +fY+fZ*tyz; *points++ = +fZ;
   *points++ = +fZ*txz+txy*fY+fX; *points++ = +fY+fZ*tyz; *points++ = +fZ;
   *points++ = +fZ*txz-txy*fY+fX; *points++ = -fY+fZ*tyz; *points++ = +fZ;
}

//_____________________________________________________________________________
void TGeoPara::Sizeof3D() const
{
// fill size of this 3-D object
   TGeoBBox::Sizeof3D();
}

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