ROOT logo
// @(#)root/g3d:$Id: TSPHE.cxx 31635 2009-12-08 10:35:17Z couet $
// Author: Rene Brun   13/06/97

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

#include "TSPHE.h"
#include "TNode.h"
#include "TVirtualPad.h"
#include "TBuffer3D.h"
#include "TBuffer3DTypes.h"
#include "TGeometry.h"
#include "TClass.h"
#include "TMath.h"

ClassImp(TSPHE)


//______________________________________________________________________________
// Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/sphe.gif"> </P> End_Html
// SPHE is a Sphere. It has 9 parameters:
//
//     - name       name of the shape
//     - title      shape's title
//     - material  (see TMaterial)
//     - rmin       minimum radius
//     - rmax       maximum radius
//     - themin     theta min
//     - themax     theta max
//     - phimin     phi min
//     - phimax     phi max

// ROOT color indx = max(i-i0,j-j0);


//______________________________________________________________________________
TSPHE::TSPHE()
{
   // SPHE shape default constructor

   fRmin       = 0;
   fRmax       = 0;
   fThemin     = 0;
   fThemax     = 0;
   fPhimin     = 0;
   fPhimax     = 0;
   fSiTab      = 0;
   fCoTab      = 0;
   fCoThetaTab = 0;
   fNdiv       = 0;
   fAspectRatio=1.0;
   faX = faY = faZ = 1.0;      // Coeff along Ox
   fNz = 0;
}


//______________________________________________________________________________
TSPHE::TSPHE(const char *name, const char *title, const char *material, Float_t rmin, Float_t rmax, Float_t themin,
             Float_t themax, Float_t phimin, Float_t phimax)
     : TShape(name, title,material)
{
   // SPHE shape normal constructor

   fRmin   = rmin;
   fRmax   = rmax;
   fThemin = themin;
   fThemax = themax;
   fPhimin = phimin;
   fPhimax = phimax;

   fSiTab      = 0;
   fCoTab      = 0;
   fCoThetaTab = 0;
   fNdiv       = 0;

   fAspectRatio=1.0;
   faX = faY = faZ = 1.0;      // Coeff along Ox

   SetNumberOfDivisions (20);
}


//______________________________________________________________________________
TSPHE::TSPHE(const char *name, const char *title, const char *material, Float_t rmax)
     : TShape(name, title,material)
{
   // SPHE shape "simplified" constructor

   fRmin   = 0;
   fRmax   = rmax;
   fThemin = 0;
   fThemax = 180;
   fPhimin = 0;
   fPhimax = 360;

   fSiTab      = 0;
   fCoTab      = 0;
   fCoThetaTab = 0;
   fNdiv       = 0;

   fAspectRatio=1.0;
   faX = faY = faZ = 1.0;      // Coeff along Ox

   SetNumberOfDivisions (20);
}


//______________________________________________________________________________
TSPHE::~TSPHE()
{
   // SPHE shape default destructor

   if (fCoThetaTab) delete [] fCoThetaTab;
   if (fSiTab) delete [] fSiTab;
   if (fCoTab) delete [] fCoTab;

   fCoTab = 0;
   fSiTab = 0;
   fCoThetaTab=0;
}


//______________________________________________________________________________
Int_t TSPHE::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute distance from point px,py to a PSPHE
   //
   // Compute the closest distance of approach from point px,py to each
   // computed outline point of the PSPHE (stolen from PCON).

   Int_t n = GetNumberOfDivisions()+1;
   Int_t numPoints = 2*n*(fNz+1);
   return ShapeDistancetoPrimitive(numPoints,px,py);
}


//______________________________________________________________________________
void TSPHE::SetEllipse(const Float_t *factors)
{
   // Set ellipse.

   if (factors[0] > 0) faX = factors[0];
   if (factors[1] > 0) faY = factors[1];
   if (factors[2] > 0) faZ = factors[2];
}


//______________________________________________________________________________
void TSPHE::SetNumberOfDivisions (Int_t p)
{
   // Set number of divisions.

   if (GetNumberOfDivisions () == p) return;
   fNdiv=p;
   fNz = Int_t(fAspectRatio*fNdiv*(fThemax - fThemin )/(fPhimax - fPhimin )) + 1;
   MakeTableOfCoSin();
}


//______________________________________________________________________________
void TSPHE::SetPoints(Double_t *points) const
{
   // Create SPHE points

   Int_t i, j, n;
   Int_t indx = 0;

   n = GetNumberOfDivisions()+1;

   if (points) {
      if (!fCoTab)   MakeTableOfCoSin();
      Float_t z;
      for (i = 0; i < fNz+1; i++) {
         z = fRmin * fCoThetaTab[i]; // fSinPhiTab[i];
         Float_t sithet = TMath::Sqrt(TMath::Abs(1-fCoThetaTab[i]*fCoThetaTab[i]));
         Float_t zi = fRmin*sithet;
         for (j = 0; j < n; j++) {
            points[indx++] = faX*zi * fCoTab[j];
            points[indx++] = faY*zi * fSiTab[j];
            points[indx++] = faZ*z;
         }
         z = fRmax * fCoThetaTab[i];
         zi = fRmax*sithet;
         for (j = 0; j < n; j++) {
            points[indx++] = faX*zi * fCoTab[j];
            points[indx++] = faY*zi * fSiTab[j];
            points[indx++] = faZ*z;
         }
      }
   }
}


//______________________________________________________________________________
void TSPHE::Sizeof3D() const
{
   // Return total X3D needed by TNode::ls (when called with option "x")

   Int_t n;

   n = GetNumberOfDivisions()+1;
   Int_t nz = fNz+1;
   Bool_t specialCase = kFALSE;

   if (TMath::Abs(TMath::Sin(2*(fPhimax - fPhimin))) <= 0.01)  //mark this as a very special case, when
         specialCase = kTRUE;                                  //we have to draw this PCON like a TUBE

   gSize3D.numPoints += 2*n*nz;
   gSize3D.numSegs   += 4*(nz*n-1+(specialCase == kTRUE));
   gSize3D.numPolys  += 2*(nz*n-1+(specialCase == kTRUE));
}


//______________________________________________________________________________
void TSPHE::MakeTableOfCoSin() const
{
   // Make table of sine and cosine.

   const Double_t pi  = TMath::ATan(1) * 4.0;
   const Double_t ragrad  = pi/180.0;

   Float_t dphi = fPhimax - fPhimin;
   while (dphi > 360) dphi -= 360;

   Float_t dtet = fThemax - fThemin;
   while (dtet > 180) dtet -= 180;

   Int_t j;
   Int_t n = GetNumberOfDivisions () + 1;
   if (fCoTab)
      delete [] fCoTab; // Delete the old tab if any
   fCoTab = new Double_t [n];
   if (!fCoTab ) return;

   if (fSiTab)
      delete [] fSiTab; // Delete the old tab if any
   fSiTab = new Double_t [n];
   if (!fSiTab ) return;

   Double_t range   = Double_t(dphi * ragrad);
   Double_t phi1    = Double_t(fPhimin  * ragrad);
   Double_t angstep = range/(n-1);

   Double_t ph = phi1;
   for (j = 0; j < n; j++)
   {
      ph = phi1 + j*angstep;
      fCoTab[j] = TMath::Cos(ph);
      fSiTab[j] = TMath::Sin(ph);
   }

   n  = fNz + 1;

   if (fCoThetaTab)
      delete [] fCoThetaTab; // Delete the old tab if any
   fCoThetaTab = new Double_t [n];
   if (!fCoThetaTab ) return;

   range   = Double_t(dtet * ragrad);
   phi1    = Double_t(fThemin  * ragrad);
   angstep = range/(n-1);

   ph = phi1;
   for (j = 0; j < n; j++)
   {
      fCoThetaTab[n-j-1] = TMath::Cos(ph);
      ph += angstep;
   }

}


//______________________________________________________________________________
void TSPHE::Streamer(TBuffer &b)
{
   // Stream a class object

   if (b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = b.ReadVersion(&R__s, &R__c);
      if (R__v > 2) {
         b.ReadClassBuffer(TSPHE::Class(), this, R__v, R__s, R__c);
         Int_t ndiv = fNdiv;
         fNdiv = 0;
         SetNumberOfDivisions (ndiv);
         return;
      }
      //====process old versions before automatic schema evolution
      TShape::Streamer(b);
      b >> fRmin;    // minimum radius
      b >> fRmax;    // maximum radius
      b >> fThemin;  // minimum theta
      b >> fThemax;  // maximum theta
      b >> fPhimin;  // minimum phi
      b >> fPhimax;  // maximum phi
      Int_t tNdiv;   // XXX added by RvdE XXX (fNdiv is set by SetNumberOfDivisions)
      b >> tNdiv;
      if (R__v > 1) {
         b >> faX;
         b >> faY;
         b >> faZ;
      }
      SetNumberOfDivisions (tNdiv); // XXX added by RvdE
      b.CheckByteCount(R__s, R__c, TSPHE::IsA());
      //====end of old versions
      
   } else {
      b.WriteClassBuffer(TSPHE::Class(),this);
   }
}


//______________________________________________________________________________
const TBuffer3D & TSPHE::GetBuffer3D(Int_t reqSections) const
{
   // Get buffer 3d.

   static TBuffer3D buffer(TBuffer3DTypes::kGeneric);

   TShape::FillBuffer3D(buffer, reqSections);

   // Needed by kRawSizes / kRaw
   const Int_t n = GetNumberOfDivisions()+1;
   const Int_t nz = fNz+1;
   Bool_t specialCase = (TMath::Abs(TMath::Sin(2*(fPhimax - fPhimin))) <= 0.01);

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

      Int_t c = GetBasicColor();

      // Segments
      Int_t indx = 0;
      Int_t indx2 = 0;
      Int_t i, j, k;
      //inside & outside spheres, number of segments: 2*nz*(n-1)
      //             special case number of segments: 2*nz*n
      for (i = 0; i < nz*2; i++) {
         indx2 = i*n;
         for (j = 1; j < n; j++) {
            buffer.fSegs[indx++] = c;
            buffer.fSegs[indx++] = indx2+j-1;
            buffer.fSegs[indx++] = indx2+j;
         }
         if (specialCase) {
            buffer.fSegs[indx++] = c;
            buffer.fSegs[indx++] = indx2+j-1;
            buffer.fSegs[indx++] = indx2;
         }
      }

      //bottom & top lines, number of segments: 2*n
      for (i = 0; i < 2; i++) {
         indx2 = i*(nz-1)*2*n;
         for (j = 0; j < n; j++) {
            buffer.fSegs[indx++] = c;
            buffer.fSegs[indx++] = indx2+j;
            buffer.fSegs[indx++] = indx2+n+j;
         }
      }

      //inside & outside spheres, number of segments: 2*(nz-1)*n
      for (i = 0; i < (nz-1); i++) {

         //inside sphere
         indx2 = i*n*2;
         for (j = 0; j < n; j++) {
            buffer.fSegs[indx++] = c+2;
            buffer.fSegs[indx++] = indx2+j;
            buffer.fSegs[indx++] = indx2+n*2+j;
         }
         //outside sphere
         indx2 = i*n*2+n;
         for (j = 0; j < n; j++) {
            buffer.fSegs[indx++] = c+3;
            buffer.fSegs[indx++] = indx2+j;
            buffer.fSegs[indx++] = indx2+n*2+j;
         }
      }

      //left & right sections, number of segments: 2*(nz-2)
      //          special case number of segments: 0
      if (!specialCase) {
         for (i = 1; i < (nz-1); i++) {
            for (j = 0; j < 2; j++) {
               buffer.fSegs[indx++] = c;
               buffer.fSegs[indx++] =  2*i    * n + j*(n-1);
               buffer.fSegs[indx++] = (2*i+1) * n + j*(n-1);
            }
         }
      }

      // Polygons
      Int_t m = n - 1 + (specialCase == kTRUE);
      indx = 0;

      //bottom & top, number of polygons: 2*(n-1)
      // special case number of polygons: 2*n
      for (j = 0; j < n-1; j++) {
         buffer.fPols[indx++] = c+3;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = 2*nz*m+j;
         buffer.fPols[indx++] = m+j;
         buffer.fPols[indx++] = 2*nz*m+j+1;
         buffer.fPols[indx++] = j;
      }
      for (j = 0; j < n-1; j++) {
         buffer.fPols[indx++] = c+3;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = 2*nz*m+n+j;
         buffer.fPols[indx++] = (nz*2-2)*m+j;
         buffer.fPols[indx++] = 2*nz*m+n+j+1;
         buffer.fPols[indx++] = (nz*2-2)*m+m+j;
      }
      if (specialCase) {
         buffer.fPols[indx++] = c+3;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = 2*nz*m+j;
         buffer.fPols[indx++] = m+j;
         buffer.fPols[indx++] = 2*nz*m;
         buffer.fPols[indx++] = j;
         
         buffer.fPols[indx++] = c+3;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = 2*nz*m+n+j;
         buffer.fPols[indx++] = (nz*2-2)*m+j;
         buffer.fPols[indx++] = 2*nz*m+n;
         buffer.fPols[indx++] = (nz*2-2)*m+m+j;
      }

      //inside & outside, number of polygons: (nz-1)*2*(n-1)
      for (k = 0; k < (nz-1); k++) {
         for (j = 0; j < n-1; j++) {
            buffer.fPols[indx++] = c;
            buffer.fPols[indx++] = 4;
            buffer.fPols[indx++] = 2*k*m+j;
            buffer.fPols[indx++] = nz*2*m+(2*k+2)*n+j+1;
            buffer.fPols[indx++] = (2*k+2)*m+j;
            buffer.fPols[indx++] = nz*2*m+(2*k+2)*n+j;
         }
         for (j = 0; j < n-1; j++) {
            buffer.fPols[indx++] = c+1;
            buffer.fPols[indx++] = 4;
            buffer.fPols[indx++] = (2*k+1)*m+j;
            buffer.fPols[indx++] = nz*2*m+(2*k + 3)*n+j;
            buffer.fPols[indx++] = (2*k+ 3)*m+j;
            buffer.fPols[indx++] = nz*2*m+(2*k+3)*n+j+1;
         }
       	 
         if (specialCase) {
            buffer.fPols[indx++] = c;
            buffer.fPols[indx++] = 4;
            buffer.fPols[indx++] = 2*k*m+j;
            buffer.fPols[indx++] = nz*2*m+(2*k+2)*n+j;
            buffer.fPols[indx++] = (2*k+2)*m+j;
            buffer.fPols[indx++] = nz*2*m+(2*k+2)*n;
   	    
            buffer.fPols[indx++] = c+1;
            buffer.fPols[indx++] = 4;
            buffer.fPols[indx++] = (2*k+1)*m+j;
            buffer.fPols[indx++] = nz*2*m+(2*k+3)*n+j;
            buffer.fPols[indx++] = (2*k+3)*m+j;
            buffer.fPols[indx++] = nz*2*m+(2*k+3)*n;
         }
      }

      //left & right sections, number of polygons: 2*(nz-1)
      //          special case number of polygons: 0
      if (!specialCase) {
         indx2 = nz*2*(n-1);
         for (k = 0; k < (nz-1); k++) {
            buffer.fPols[indx++] = c+2;
            buffer.fPols[indx++] = 4;
            buffer.fPols[indx++] = k==0 ? indx2 : indx2+2*nz*n+2*(k-1);
            buffer.fPols[indx++] = indx2+2*(k+1)*n;
            buffer.fPols[indx++] = indx2+2*nz*n+2*k;
            buffer.fPols[indx++] = indx2+(2*k+3)*n;
   	    
   	      buffer.fPols[indx++] = c+2;
            buffer.fPols[indx++] = 4;
            buffer.fPols[indx++] = k==0 ? indx2+n-1 : indx2+2*nz*n+2*(k-1)+1;
            buffer.fPols[indx++] = indx2+(2*k+3)*n+n-1;
            buffer.fPols[indx++] = indx2+2*nz*n+2*k+1;
            buffer.fPols[indx++] = indx2+2*(k+1)*n+n-1;
         }

         buffer.fPols[indx-8] = indx2+n;
         buffer.fPols[indx-2] = indx2+2*n-1;
      }

      buffer.SetSectionsValid(TBuffer3D::kRaw);
   }

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