ROOT logo
// @(#)root/g3d:$Id: TCTUB.cxx 31624 2009-12-08 09:58:40Z couet $
// Author: Rene Brun   26/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 "TCTUB.h"
#include "TClass.h"
#include "TMath.h"

ClassImp(TCTUB)

//______________________________________________________________________________
// Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/ctub.gif"> </P> End_Html
//                                                                        //
// 'CTUB' is a cut  tube with 11 parameters.  The  first 5 parameters     //
//        are the same  as for the TUBS.  The  remaining 6 parameters     //
//        are the director  cosines of the surfaces  cutting the tube     //
//        respectively at the low and high Z values.                      //
//                                                                        //
//     - name       name of the shape
//     - title      shape's title
//     - material  (see TMaterial)
//     - rmin       inside radius
//     - rmax       outside radius
//     - dz         half length in z
//     - phi1       starting angle of the segment
//     - phi2       ending angle of the segment
//     - coslx      x dir cosinus at low z face
//     - cosly      y dir cosinus at low z face
//     - coslz      z dir cosinus at low z face
//     - coshx      x dir cosinus at high z face
//     - coshy      y dir cosinus at high z face
//     - coshz      z dir cosinus at high z face


//______________________________________________________________________________
TCTUB::TCTUB()
{
   // CTUB shape default constructor

   fCosLow[0]  = 0.;
   fCosLow[1]  = 0.;
   fCosLow[2]  = 0.;
   fCosHigh[0] = 0.;
   fCosHigh[1] = 0.;
   fCosHigh[2] = 0.;
}


//______________________________________________________________________________
TCTUB::TCTUB(const char *name, const char *title, const char *material, Float_t rmin,
             Float_t rmax, Float_t dz, Float_t phi1, Float_t phi2,
             Float_t coslx, Float_t cosly, Float_t coslz,
             Float_t coshx, Float_t coshy, Float_t coshz)
      : TTUBS(name,title,material,rmin,rmax,dz,phi1,phi2)
{
   // CTUB shape normal constructor

   fCosLow[0]  = coslx;
   fCosLow[1]  = cosly;
   fCosLow[2]  = coslz;
   fCosHigh[0] = coshx;
   fCosHigh[1] = coshy;
   fCosHigh[2] = coshz;
   TMath::Normalize(fCosLow);
   TMath::Normalize(fCosHigh);
}


//______________________________________________________________________________
TCTUB::TCTUB(const char *name, const char *title, const char *material, Float_t rmin,
             Float_t rmax, Float_t dz, Float_t phi1, Float_t phi2,
             Float_t *lowNormal, Float_t *highNormal)
      : TTUBS(name,title,material,rmin,rmax,dz,phi1,phi2)
{
   // CTUB shape normal constructor

   memcpy(fCosLow, lowNormal, sizeof(fCosLow) );
   memcpy(fCosHigh,highNormal,sizeof(fCosHigh));
   TMath::Normalize(fCosLow);
   TMath::Normalize(fCosHigh);
}


//______________________________________________________________________________
TCTUB::~TCTUB()
{
   // CTUB shape default destructor
}


//______________________________________________________________________________
static Double_t Product(const Double_t *x, const Float_t *y)
{
   // Product.
   
   Double_t s = 0;
   for (int i= 0 ; i <2 ; i++ ) s += x[i]*y[i];
   return s;
}


//______________________________________________________________________________
void TCTUB::SetPoints(Double_t *points) const
{
   // Create TUBS points

   Float_t dz;
   Int_t j, n;

   n = GetNumberOfDivisions()+1;

   dz   = TTUBE::fDz;

   if (points) {
      Int_t indx = 0;

      if (!fCoTab)   MakeTableOfCoSin();

      for (j = 0; j < n; j++) {
         points[indx+6*n] = points[indx] = fRmin * fCoTab[j];
         indx++;
         points[indx+6*n] = points[indx] = fAspectRatio*fRmin * fSiTab[j];
         indx++;
         points[indx+6*n] = dz;
         points[indx+6*n]-= Product(&points[indx+6*n-2],fCosHigh)/fCosHigh[2];
         points[indx]     =-dz;
         points[indx]    -= Product(&points[indx-2],fCosLow)/fCosLow[2];
         indx++;
      }
      for (j = 0; j < n; j++) {
         points[indx+6*n] = points[indx] = fRmax * fCoTab[j];
         indx++;
         points[indx+6*n] = points[indx] = fAspectRatio*fRmax * fSiTab[j];
         indx++;
         points[indx+6*n] = dz;
         points[indx+6*n]-= Product(&points[indx+6*n-2],fCosHigh)/fCosHigh[2];
         points[indx]     =-dz;
         points[indx]    -= Product(&points[indx-2],fCosLow)/fCosLow[2];
         indx++;
      }
   }
}


//______________________________________________________________________________
void TCTUB::Streamer(TBuffer &R__b)
{
   // Stream an object of class TCTUB.

   if (R__b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
      if (R__v > 1) {
         R__b.ReadClassBuffer(TCTUB::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TTUBS::Streamer(R__b);
      R__b.ReadStaticArray(fCosLow);
      R__b.ReadStaticArray(fCosHigh);
      R__b.CheckByteCount(R__s, R__c, TCTUB::IsA());
      //====end of old versions
      
   } else {
      R__b.WriteClassBuffer(TCTUB::Class(),this);
   }
}
 TCTUB.cxx:1
 TCTUB.cxx:2
 TCTUB.cxx:3
 TCTUB.cxx:4
 TCTUB.cxx:5
 TCTUB.cxx:6
 TCTUB.cxx:7
 TCTUB.cxx:8
 TCTUB.cxx:9
 TCTUB.cxx:10
 TCTUB.cxx:11
 TCTUB.cxx:12
 TCTUB.cxx:13
 TCTUB.cxx:14
 TCTUB.cxx:15
 TCTUB.cxx:16
 TCTUB.cxx:17
 TCTUB.cxx:18
 TCTUB.cxx:19
 TCTUB.cxx:20
 TCTUB.cxx:21
 TCTUB.cxx:22
 TCTUB.cxx:23
 TCTUB.cxx:24
 TCTUB.cxx:25
 TCTUB.cxx:26
 TCTUB.cxx:27
 TCTUB.cxx:28
 TCTUB.cxx:29
 TCTUB.cxx:30
 TCTUB.cxx:31
 TCTUB.cxx:32
 TCTUB.cxx:33
 TCTUB.cxx:34
 TCTUB.cxx:35
 TCTUB.cxx:36
 TCTUB.cxx:37
 TCTUB.cxx:38
 TCTUB.cxx:39
 TCTUB.cxx:40
 TCTUB.cxx:41
 TCTUB.cxx:42
 TCTUB.cxx:43
 TCTUB.cxx:44
 TCTUB.cxx:45
 TCTUB.cxx:46
 TCTUB.cxx:47
 TCTUB.cxx:48
 TCTUB.cxx:49
 TCTUB.cxx:50
 TCTUB.cxx:51
 TCTUB.cxx:52
 TCTUB.cxx:53
 TCTUB.cxx:54
 TCTUB.cxx:55
 TCTUB.cxx:56
 TCTUB.cxx:57
 TCTUB.cxx:58
 TCTUB.cxx:59
 TCTUB.cxx:60
 TCTUB.cxx:61
 TCTUB.cxx:62
 TCTUB.cxx:63
 TCTUB.cxx:64
 TCTUB.cxx:65
 TCTUB.cxx:66
 TCTUB.cxx:67
 TCTUB.cxx:68
 TCTUB.cxx:69
 TCTUB.cxx:70
 TCTUB.cxx:71
 TCTUB.cxx:72
 TCTUB.cxx:73
 TCTUB.cxx:74
 TCTUB.cxx:75
 TCTUB.cxx:76
 TCTUB.cxx:77
 TCTUB.cxx:78
 TCTUB.cxx:79
 TCTUB.cxx:80
 TCTUB.cxx:81
 TCTUB.cxx:82
 TCTUB.cxx:83
 TCTUB.cxx:84
 TCTUB.cxx:85
 TCTUB.cxx:86
 TCTUB.cxx:87
 TCTUB.cxx:88
 TCTUB.cxx:89
 TCTUB.cxx:90
 TCTUB.cxx:91
 TCTUB.cxx:92
 TCTUB.cxx:93
 TCTUB.cxx:94
 TCTUB.cxx:95
 TCTUB.cxx:96
 TCTUB.cxx:97
 TCTUB.cxx:98
 TCTUB.cxx:99
 TCTUB.cxx:100
 TCTUB.cxx:101
 TCTUB.cxx:102
 TCTUB.cxx:103
 TCTUB.cxx:104
 TCTUB.cxx:105
 TCTUB.cxx:106
 TCTUB.cxx:107
 TCTUB.cxx:108
 TCTUB.cxx:109
 TCTUB.cxx:110
 TCTUB.cxx:111
 TCTUB.cxx:112
 TCTUB.cxx:113
 TCTUB.cxx:114
 TCTUB.cxx:115
 TCTUB.cxx:116
 TCTUB.cxx:117
 TCTUB.cxx:118
 TCTUB.cxx:119
 TCTUB.cxx:120
 TCTUB.cxx:121
 TCTUB.cxx:122
 TCTUB.cxx:123
 TCTUB.cxx:124
 TCTUB.cxx:125
 TCTUB.cxx:126
 TCTUB.cxx:127
 TCTUB.cxx:128
 TCTUB.cxx:129
 TCTUB.cxx:130
 TCTUB.cxx:131
 TCTUB.cxx:132
 TCTUB.cxx:133
 TCTUB.cxx:134
 TCTUB.cxx:135
 TCTUB.cxx:136
 TCTUB.cxx:137
 TCTUB.cxx:138
 TCTUB.cxx:139
 TCTUB.cxx:140
 TCTUB.cxx:141
 TCTUB.cxx:142
 TCTUB.cxx:143
 TCTUB.cxx:144
 TCTUB.cxx:145
 TCTUB.cxx:146
 TCTUB.cxx:147
 TCTUB.cxx:148
 TCTUB.cxx:149
 TCTUB.cxx:150
 TCTUB.cxx:151
 TCTUB.cxx:152
 TCTUB.cxx:153
 TCTUB.cxx:154
 TCTUB.cxx:155
 TCTUB.cxx:156
 TCTUB.cxx:157
 TCTUB.cxx:158
 TCTUB.cxx:159
 TCTUB.cxx:160
 TCTUB.cxx:161
 TCTUB.cxx:162
 TCTUB.cxx:163
 TCTUB.cxx:164
 TCTUB.cxx:165
 TCTUB.cxx:166
 TCTUB.cxx:167
 TCTUB.cxx:168
 TCTUB.cxx:169
 TCTUB.cxx:170
 TCTUB.cxx:171
 TCTUB.cxx:172
 TCTUB.cxx:173
 TCTUB.cxx:174