59    faX = faY = faZ = 1.0;      
 
   66 TSPHE::TSPHE(
const char *name, 
const char *title, 
const char *material, Float_t rmin, Float_t rmax, Float_t themin,
 
   67              Float_t themax, Float_t phimin, Float_t phimax)
 
   68      : TShape(name, title,material)
 
   83    faX = faY = faZ = 1.0;      
 
   85    SetNumberOfDivisions (20);
 
   91 TSPHE::TSPHE(
const char *name, 
const char *title, 
const char *material, Float_t rmax)
 
   92      : TShape(name, title,material)
 
  107    faX = faY = faZ = 1.0;      
 
  109    SetNumberOfDivisions (20);
 
  117    if (fCoThetaTab) 
delete [] fCoThetaTab;
 
  118    if (fSiTab) 
delete [] fSiTab;
 
  119    if (fCoTab) 
delete [] fCoTab;
 
  132 Int_t TSPHE::DistancetoPrimitive(Int_t px, Int_t py)
 
  134    Int_t n = GetNumberOfDivisions()+1;
 
  135    Int_t numPoints = 2*n*(fNz+1);
 
  136    return ShapeDistancetoPrimitive(numPoints,px,py);
 
  142 void TSPHE::SetEllipse(
const Float_t *factors)
 
  144    if (factors[0] > 0) faX = factors[0];
 
  145    if (factors[1] > 0) faY = factors[1];
 
  146    if (factors[2] > 0) faZ = factors[2];
 
  152 void TSPHE::SetNumberOfDivisions (Int_t p)
 
  154    if (GetNumberOfDivisions () == p) 
return;
 
  156    fNz = Int_t(fAspectRatio*fNdiv*(fThemax - fThemin )/(fPhimax - fPhimin )) + 1;
 
  163 void TSPHE::SetPoints(Double_t *points)
 const 
  168    n = GetNumberOfDivisions()+1;
 
  171       if (!fCoTab)   MakeTableOfCoSin();
 
  173       for (i = 0; i < fNz+1; i++) {
 
  174          z = fRmin * fCoThetaTab[i]; 
 
  175          Float_t sithet = TMath::Sqrt(TMath::Abs(1-fCoThetaTab[i]*fCoThetaTab[i]));
 
  176          Float_t zi = fRmin*sithet;
 
  177          for (j = 0; j < n; j++) {
 
  178             points[indx++] = faX*zi * fCoTab[j];
 
  179             points[indx++] = faY*zi * fSiTab[j];
 
  180             points[indx++] = faZ*z;
 
  182          z = fRmax * fCoThetaTab[i];
 
  184          for (j = 0; j < n; j++) {
 
  185             points[indx++] = faX*zi * fCoTab[j];
 
  186             points[indx++] = faY*zi * fSiTab[j];
 
  187             points[indx++] = faZ*z;
 
  196 void TSPHE::Sizeof3D()
 const 
  200    n = GetNumberOfDivisions()+1;
 
  202    Bool_t specialCase = kFALSE;
 
  204    if (TMath::Abs(TMath::Sin(2*(fPhimax - fPhimin))) <= 0.01)  
 
  207    gSize3D.numPoints += 2*n*nz;
 
  208    gSize3D.numSegs   += 4*(nz*n-1+(specialCase == kTRUE));
 
  209    gSize3D.numPolys  += 2*(nz*n-1+(specialCase == kTRUE));
 
  215 void TSPHE::MakeTableOfCoSin()
 const 
  217    const Double_t pi  = TMath::ATan(1) * 4.0;
 
  218    const Double_t ragrad  = pi/180.0;
 
  220    Float_t dphi = fPhimax - fPhimin;
 
  221    while (dphi > 360) dphi -= 360;
 
  223    Float_t dtet = fThemax - fThemin;
 
  224    while (dtet > 180) dtet -= 180;
 
  227    Int_t n = GetNumberOfDivisions () + 1;
 
  230    fCoTab = 
new Double_t [n];
 
  231    if (!fCoTab ) 
return;
 
  235    fSiTab = 
new Double_t [n];
 
  236    if (!fSiTab ) 
return;
 
  238    Double_t range   = Double_t(dphi * ragrad);
 
  239    Double_t phi1    = Double_t(fPhimin  * ragrad);
 
  240    Double_t angstep = range/(n-1);
 
  243    for (j = 0; j < n; j++)
 
  245       ph = phi1 + j*angstep;
 
  246       fCoTab[j] = TMath::Cos(ph);
 
  247       fSiTab[j] = TMath::Sin(ph);
 
  253       delete [] fCoThetaTab; 
 
  254    fCoThetaTab = 
new Double_t [n];
 
  255    if (!fCoThetaTab ) 
return;
 
  257    range   = Double_t(dtet * ragrad);
 
  258    phi1    = Double_t(fThemin  * ragrad);
 
  259    angstep = range/(n-1);
 
  262    for (j = 0; j < n; j++)
 
  264       fCoThetaTab[n-j-1] = TMath::Cos(ph);
 
  273 void TSPHE::Streamer(TBuffer &b)
 
  277       Version_t R__v = b.ReadVersion(&R__s, &R__c);
 
  279          b.ReadClassBuffer(TSPHE::Class(), 
this, R__v, R__s, R__c);
 
  282          SetNumberOfDivisions (ndiv);
 
  300       SetNumberOfDivisions (tNdiv); 
 
  301       b.CheckByteCount(R__s, R__c, TSPHE::IsA());
 
  305       b.WriteClassBuffer(TSPHE::Class(),
this);
 
  312 const TBuffer3D & TSPHE::GetBuffer3D(Int_t reqSections)
 const 
  314    static TBuffer3D buffer(TBuffer3DTypes::kGeneric);
 
  316    TShape::FillBuffer3D(buffer, reqSections);
 
  319    const Int_t n = GetNumberOfDivisions()+1;
 
  320    const Int_t nz = fNz+1;
 
  321    Bool_t specialCase = (TMath::Abs(TMath::Sin(2*(fPhimax - fPhimin))) <= 0.01);
 
  323    if (reqSections & TBuffer3D::kRawSizes) {
 
  324       Int_t nbPnts = 2*n*nz;
 
  325       Int_t nbSegs = 4*(nz*n-1+(specialCase == kTRUE));
 
  326       Int_t nbPols = 2*(nz*n-1+(specialCase == kTRUE));
 
  327       if (buffer.SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
 
  328          buffer.SetSectionsValid(TBuffer3D::kRawSizes);
 
  331    if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes)) {
 
  333       SetPoints(buffer.fPnts);
 
  334       if (!buffer.fLocalFrame) {
 
  335          TransformPoints(buffer.fPnts, buffer.NbPnts());
 
  338       Int_t c = GetBasicColor();
 
  346       for (i = 0; i < nz*2; i++) {
 
  348          for (j = 1; j < n; j++) {
 
  349             buffer.fSegs[indx++] = c;
 
  350             buffer.fSegs[indx++] = indx2+j-1;
 
  351             buffer.fSegs[indx++] = indx2+j;
 
  354             buffer.fSegs[indx++] = c;
 
  355             buffer.fSegs[indx++] = indx2+j-1;
 
  356             buffer.fSegs[indx++] = indx2;
 
  361       for (i = 0; i < 2; i++) {
 
  362          indx2 = i*(nz-1)*2*n;
 
  363          for (j = 0; j < n; j++) {
 
  364             buffer.fSegs[indx++] = c;
 
  365             buffer.fSegs[indx++] = indx2+j;
 
  366             buffer.fSegs[indx++] = indx2+n+j;
 
  371       for (i = 0; i < (nz-1); i++) {
 
  375          for (j = 0; j < n; j++) {
 
  376             buffer.fSegs[indx++] = c+2;
 
  377             buffer.fSegs[indx++] = indx2+j;
 
  378             buffer.fSegs[indx++] = indx2+n*2+j;
 
  382          for (j = 0; j < n; j++) {
 
  383             buffer.fSegs[indx++] = c+3;
 
  384             buffer.fSegs[indx++] = indx2+j;
 
  385             buffer.fSegs[indx++] = indx2+n*2+j;
 
  392          for (i = 1; i < (nz-1); i++) {
 
  393             for (j = 0; j < 2; j++) {
 
  394                buffer.fSegs[indx++] = c;
 
  395                buffer.fSegs[indx++] =  2*i    * n + j*(n-1);
 
  396                buffer.fSegs[indx++] = (2*i+1) * n + j*(n-1);
 
  402       Int_t m = n - 1 + (specialCase == kTRUE);
 
  407       for (j = 0; j < n-1; j++) {
 
  408          buffer.fPols[indx++] = c+3;
 
  409          buffer.fPols[indx++] = 4;
 
  410          buffer.fPols[indx++] = 2*nz*m+j;
 
  411          buffer.fPols[indx++] = m+j;
 
  412          buffer.fPols[indx++] = 2*nz*m+j+1;
 
  413          buffer.fPols[indx++] = j;
 
  415       for (j = 0; j < n-1; j++) {
 
  416          buffer.fPols[indx++] = c+3;
 
  417          buffer.fPols[indx++] = 4;
 
  418          buffer.fPols[indx++] = 2*nz*m+n+j;
 
  419          buffer.fPols[indx++] = (nz*2-2)*m+j;
 
  420          buffer.fPols[indx++] = 2*nz*m+n+j+1;
 
  421          buffer.fPols[indx++] = (nz*2-2)*m+m+j;
 
  424          buffer.fPols[indx++] = c+3;
 
  425          buffer.fPols[indx++] = 4;
 
  426          buffer.fPols[indx++] = 2*nz*m+j;
 
  427          buffer.fPols[indx++] = m+j;
 
  428          buffer.fPols[indx++] = 2*nz*m;
 
  429          buffer.fPols[indx++] = j;
 
  431          buffer.fPols[indx++] = c+3;
 
  432          buffer.fPols[indx++] = 4;
 
  433          buffer.fPols[indx++] = 2*nz*m+n+j;
 
  434          buffer.fPols[indx++] = (nz*2-2)*m+j;
 
  435          buffer.fPols[indx++] = 2*nz*m+n;
 
  436          buffer.fPols[indx++] = (nz*2-2)*m+m+j;
 
  440       for (k = 0; k < (nz-1); k++) {
 
  441          for (j = 0; j < n-1; j++) {
 
  442             buffer.fPols[indx++] = c;
 
  443             buffer.fPols[indx++] = 4;
 
  444             buffer.fPols[indx++] = 2*k*m+j;
 
  445             buffer.fPols[indx++] = nz*2*m+(2*k+2)*n+j+1;
 
  446             buffer.fPols[indx++] = (2*k+2)*m+j;
 
  447             buffer.fPols[indx++] = nz*2*m+(2*k+2)*n+j;
 
  449          for (j = 0; j < n-1; j++) {
 
  450             buffer.fPols[indx++] = c+1;
 
  451             buffer.fPols[indx++] = 4;
 
  452             buffer.fPols[indx++] = (2*k+1)*m+j;
 
  453             buffer.fPols[indx++] = nz*2*m+(2*k + 3)*n+j;
 
  454             buffer.fPols[indx++] = (2*k+ 3)*m+j;
 
  455             buffer.fPols[indx++] = nz*2*m+(2*k+3)*n+j+1;
 
  459             buffer.fPols[indx++] = c;
 
  460             buffer.fPols[indx++] = 4;
 
  461             buffer.fPols[indx++] = 2*k*m+j;
 
  462             buffer.fPols[indx++] = nz*2*m+(2*k+2)*n+j;
 
  463             buffer.fPols[indx++] = (2*k+2)*m+j;
 
  464             buffer.fPols[indx++] = nz*2*m+(2*k+2)*n;
 
  466             buffer.fPols[indx++] = c+1;
 
  467             buffer.fPols[indx++] = 4;
 
  468             buffer.fPols[indx++] = (2*k+1)*m+j;
 
  469             buffer.fPols[indx++] = nz*2*m+(2*k+3)*n+j;
 
  470             buffer.fPols[indx++] = (2*k+3)*m+j;
 
  471             buffer.fPols[indx++] = nz*2*m+(2*k+3)*n;
 
  479          for (k = 0; k < (nz-1); k++) {
 
  480             buffer.fPols[indx++] = c+2;
 
  481             buffer.fPols[indx++] = 4;
 
  482             buffer.fPols[indx++] = k==0 ? indx2 : indx2+2*nz*n+2*(k-1);
 
  483             buffer.fPols[indx++] = indx2+2*(k+1)*n;
 
  484             buffer.fPols[indx++] = indx2+2*nz*n+2*k;
 
  485             buffer.fPols[indx++] = indx2+(2*k+3)*n;
 
  487             buffer.fPols[indx++] = c+2;
 
  488             buffer.fPols[indx++] = 4;
 
  489             buffer.fPols[indx++] = k==0 ? indx2+n-1 : indx2+2*nz*n+2*(k-1)+1;
 
  490             buffer.fPols[indx++] = indx2+(2*k+3)*n+n-1;
 
  491             buffer.fPols[indx++] = indx2+2*nz*n+2*k+1;
 
  492             buffer.fPols[indx++] = indx2+2*(k+1)*n+n-1;
 
  495          buffer.fPols[indx-8] = indx2+n;
 
  496          buffer.fPols[indx-2] = indx2+2*n-1;
 
  499       buffer.SetSectionsValid(TBuffer3D::kRaw);