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;