67 TPCON::TPCON(
const char *name, 
const char *title, 
const char *material, Float_t phi1, Float_t dphi1, Int_t nz)
 
   68       : TShape(name, title,material)
 
   71       Error(name, 
"number of z planes for %s must be at least two !", name);
 
   78    fRmin  = 
new Float_t [nz+1];
 
   79    fRmax  = 
new Float_t [nz+1];
 
   80    fDz    = 
new Float_t [nz+1];
 
   85    while (fDphi1 > 360) fDphi1 -= 360;
 
   93 TPCON::TPCON(
const TPCON& pc) :
 
  110 TPCON& TPCON::operator=(
const TPCON& pc)
 
  113       TShape::operator=(pc);
 
  130 void TPCON::MakeTableOfCoSin()
 const 
  132    const Double_t pi  = TMath::ATan(1) * 4.0;
 
  133    const Double_t ragrad  = pi/180.0;
 
  135    Int_t n = GetNumberOfDivisions () + 1;
 
  136    if (fCoTab) 
delete [] fCoTab; 
 
  137    fCoTab = 
new Double_t [n];
 
  138    if (!fCoTab ) 
return;
 
  140    if (fSiTab) 
delete [] fSiTab; 
 
  141    fSiTab = 
new Double_t [n];
 
  142    if (!fSiTab ) 
return;
 
  144    Double_t range   = Double_t(fDphi1 * ragrad);
 
  145    Double_t phi1    = Double_t(fPhi1  * ragrad);
 
  146    Double_t angstep = range/(n-1);
 
  148    FillTableOfCoSin(phi1,angstep,n);
 
  156    if (fRmin) 
delete [] fRmin;
 
  157    if (fRmax) 
delete [] fRmax;
 
  158    if (fDz)   
delete [] fDz;
 
  159    if (fSiTab) 
delete [] fSiTab;
 
  160    if (fCoTab) 
delete [] fCoTab;
 
  176 void TPCON::DefineSection(Int_t secNum, Float_t z, Float_t rmin, Float_t rmax)
 
  178    if ((secNum < 0) || (secNum >= fNz)) 
return;
 
  180    fRmin[secNum] = rmin;
 
  181    fRmax[secNum] = rmax;
 
  191 Int_t TPCON::DistancetoPrimitive(Int_t px, Int_t py)
 
  193    Int_t n = GetNumberOfDivisions()+1;
 
  194    Int_t numPoints = fNz*2*n;
 
  195    return ShapeDistancetoPrimitive(numPoints,px,py);
 
  201 void  TPCON::FillTableOfCoSin(Double_t phi, Double_t angstep,Int_t n)
 const 
  203    Double_t ph = phi-angstep;
 
  204    for (Int_t j = 0; j < n; j++) {
 
  206       fCoTab[j] = TMath::Cos(ph);
 
  207       fSiTab[j] = TMath::Sin(ph);
 
  214 void TPCON::SetNumberOfDivisions (Int_t p)
 
  216    if (GetNumberOfDivisions () == p) 
return;
 
  224 void TPCON::SetPoints(Double_t *points)
 const 
  229    Int_t n = GetNumberOfDivisions()+1;
 
  232       if (!fCoTab) MakeTableOfCoSin();
 
  233       for (i = 0; i < fNz; i++) {
 
  234          for (j = 0; j < n; j++) {
 
  235             points[indx++] = fRmin[i] * fCoTab[j];
 
  236             points[indx++] = fRmin[i] * fSiTab[j];
 
  237             points[indx++] = fDz[i];
 
  239          for (j = 0; j < n; j++) {
 
  240             points[indx++] = fRmax[i] * fCoTab[j];
 
  241             points[indx++] = fRmax[i] * fSiTab[j];
 
  242             points[indx++] = fDz[i];
 
  251 void TPCON::Sizeof3D()
 const 
  255    n = GetNumberOfDivisions()+1;
 
  257    gSize3D.numPoints += fNz*2*n;
 
  258    gSize3D.numSegs   += 4*(fNz*n-1+(fDphi1 == 360));
 
  259    gSize3D.numPolys  += 2*(fNz*n-1+(fDphi1 == 360));
 
  265 void TPCON::Streamer(TBuffer &b)
 
  269       Version_t R__v = b.ReadVersion(&R__s, &R__c);
 
  271          b.ReadClassBuffer(TPCON::Class(), 
this, R__v, R__s, R__c);
 
  279       fRmin  = 
new Float_t [fNz];
 
  280       fRmax  = 
new Float_t [fNz];
 
  281       fDz    = 
new Float_t [fNz];
 
  286       b.CheckByteCount(R__s, R__c, TPCON::IsA());
 
  290       b.WriteClassBuffer(TPCON::Class(),
this);
 
  297 const TBuffer3D & TPCON::GetBuffer3D(Int_t reqSections)
 const 
  299    static TBuffer3D buffer(TBuffer3DTypes::kGeneric);
 
  301    TShape::FillBuffer3D(buffer, reqSections);
 
  305    if (reqSections & TBuffer3D::kRawSizes)
 
  307       const Int_t n = GetNumberOfDivisions()+1;
 
  308       Int_t nbPnts = fNz*2*n;
 
  309       Bool_t specialCase = (fDphi1 == 360);
 
  310       Int_t nbSegs = 4*(fNz*n-1+(specialCase == kTRUE));
 
  311       Int_t nbPols = 2*(fNz*n-1+(specialCase == kTRUE));
 
  313       if (buffer.SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
 
  314          buffer.SetSectionsValid(TBuffer3D::kRawSizes);
 
  317    if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes))
 
  320       SetPoints(buffer.fPnts);
 
  321       if (!buffer.fLocalFrame) {
 
  322          TransformPoints(buffer.fPnts, buffer.NbPnts());
 
  326       if (SetSegsAndPols(buffer))
 
  328          buffer.SetSectionsValid(TBuffer3D::kRaw);
 
  337 Bool_t TPCON::SetSegsAndPols(TBuffer3D & buffer)
 const 
  339    if (fNz < 2) 
return kFALSE;
 
  340    const Int_t n = GetNumberOfDivisions()+1;
 
  341    Bool_t specialCase = (fDphi1 == 360);
 
  343    Int_t c = GetBasicColor();
 
  351    for (i = 0; i < fNz*2; i++) {
 
  353       for (j = 1; j < n; j++) {
 
  354          buffer.fSegs[indx++] = c;
 
  355          buffer.fSegs[indx++] = indx2+j-1;
 
  356          buffer.fSegs[indx++] = indx2+j;
 
  359          buffer.fSegs[indx++] = c;
 
  360          buffer.fSegs[indx++] = indx2+j-1;
 
  361          buffer.fSegs[indx++] = indx2;
 
  366    for (i = 0; i < 2; i++) {
 
  367       indx2 = i*(fNz-1)*2*n;
 
  368       for (j = 0; j < n; j++) {
 
  369          buffer.fSegs[indx++] = c;
 
  370          buffer.fSegs[indx++] = indx2+j;
 
  371          buffer.fSegs[indx++] = indx2+n+j;
 
  376    for (i = 0; i < (fNz-1); i++) {
 
  380       for (j = 0; j < n; j++) {
 
  381          buffer.fSegs[indx++] = c+2;
 
  382          buffer.fSegs[indx++] = indx2+j;
 
  383          buffer.fSegs[indx++] = indx2+n*2+j;
 
  387       for (j = 0; j < n; j++) {
 
  388          buffer.fSegs[indx++] = c+3;
 
  389          buffer.fSegs[indx++] = indx2+j;
 
  390          buffer.fSegs[indx++] = indx2+n*2+j;
 
  397       for (i = 1; i < (fNz-1); i++) {
 
  398          for (j = 0; j < 2; j++) {
 
  399             buffer.fSegs[indx++] = c;
 
  400             buffer.fSegs[indx++] =  2*i    * n + j*(n-1);
 
  401             buffer.fSegs[indx++] = (2*i+1) * n + j*(n-1);
 
  406    Int_t m = n - 1 + (specialCase == kTRUE);
 
  411    for (j = 0; j < n-1; j++) {
 
  412       buffer.fPols[indx++] = c+3;
 
  413       buffer.fPols[indx++] = 4;
 
  414       buffer.fPols[indx++] = 2*fNz*m+j;
 
  415       buffer.fPols[indx++] = m+j;
 
  416       buffer.fPols[indx++] = 2*fNz*m+j+1;
 
  417       buffer.fPols[indx++] = j;
 
  419    for (j = 0; j < n-1; j++) {
 
  420       buffer.fPols[indx++] = c+3;
 
  421       buffer.fPols[indx++] = 4;
 
  422       buffer.fPols[indx++] = 2*fNz*m+n+j;
 
  423       buffer.fPols[indx++] = (fNz*2-2)*m+j;
 
  424       buffer.fPols[indx++] = 2*fNz*m+n+j+1;
 
  425       buffer.fPols[indx++] = (fNz*2-2)*m+m+j;
 
  428       buffer.fPols[indx++] = c+3;
 
  429       buffer.fPols[indx++] = 4;
 
  430       buffer.fPols[indx++] = 2*fNz*m+j;
 
  431       buffer.fPols[indx++] = m+j;
 
  432       buffer.fPols[indx++] = 2*fNz*m;
 
  433       buffer.fPols[indx++] = j;
 
  435       buffer.fPols[indx++] = c+3;
 
  436       buffer.fPols[indx++] = 4;
 
  437       buffer.fPols[indx++] = 2*fNz*m+n+j;
 
  438       buffer.fPols[indx++] = (fNz*2-2)*m+j;
 
  439       buffer.fPols[indx++] = 2*fNz*m+n;
 
  440       buffer.fPols[indx++] = (fNz*2-2)*m+m+j;
 
  442    for (k = 0; k < (fNz-1); k++) {
 
  443       for (j = 0; j < n-1; j++) {
 
  444          buffer.fPols[indx++] = c;
 
  445          buffer.fPols[indx++] = 4;
 
  446          buffer.fPols[indx++] = 2*k*m+j;
 
  447          buffer.fPols[indx++] = fNz*2*m+(2*k+2)*n+j+1;
 
  448          buffer.fPols[indx++] = (2*k+2)*m+j;
 
  449          buffer.fPols[indx++] = fNz*2*m+(2*k+2)*n+j;
 
  451       for (j = 0; j < n-1; j++) {
 
  452          buffer.fPols[indx++] = c+1;
 
  453          buffer.fPols[indx++] = 4;
 
  454          buffer.fPols[indx++] = (2*k+1)*m+j;
 
  455          buffer.fPols[indx++] = fNz*2*m+(2*k+3)*n+j;
 
  456          buffer.fPols[indx++] = (2*k+3)*m+j;
 
  457          buffer.fPols[indx++] = fNz*2*m+(2*k+3)*n+j+1;
 
  461          buffer.fPols[indx++] = c;
 
  462          buffer.fPols[indx++] = 4;
 
  463          buffer.fPols[indx++] = 2*k*m+j;
 
  464          buffer.fPols[indx++] = fNz*2*m+(2*k+2)*n;
 
  465          buffer.fPols[indx++] = (2*k+2)*m+j;
 
  466          buffer.fPols[indx++] = fNz*2*m+(2*k+2)*n+j;
 
  468          buffer.fPols[indx++] = c+1;
 
  469          buffer.fPols[indx++] = 4;
 
  470          buffer.fPols[indx++] = (2*k+1)*m+j;
 
  471          buffer.fPols[indx++] = fNz*2*m+(2*k+3)*n+j;
 
  472          buffer.fPols[indx++] = (2*k+3)*m+j;
 
  473          buffer.fPols[indx++] = fNz*2*m+(2*k+3)*n;
 
  479       for (k = 0; k < (fNz-1); k++) {
 
  480          buffer.fPols[indx++] = c+2;
 
  481          buffer.fPols[indx++] = 4;
 
  482          buffer.fPols[indx++] = k==0 ? indx2 : indx2+2*fNz*n+2*(k-1);
 
  483          buffer.fPols[indx++] = indx2+2*(k+1)*n;
 
  484          buffer.fPols[indx++] = indx2+2*fNz*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*fNz*n+2*(k-1)+1;
 
  490          buffer.fPols[indx++] = indx2+(2*k+3)*n+n-1;
 
  491          buffer.fPols[indx++] = indx2+2*fNz*n+2*k+1;
 
  492          buffer.fPols[indx++] = indx2+2*(k+1)*n+n-1;
 
  494       buffer.fPols[indx-8] = indx2+n;
 
  495       buffer.fPols[indx-2] = indx2+2*n-1;