]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITSv11GeometrySPD.cxx
Removing warnings for gcc 4.0 and using AliLog
[u/mrichter/AliRoot.git] / ITS / AliITSv11GeometrySPD.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 // This class Defines the Geometry for the ITS services and support cones
17 // outside of the ceneteral volume (except for the Ceneteral support 
18 // cylinders. Other classes define the rest of the ITS. Specificaly the ITS
19 // The SSD support cone,SSD Support centeral cylinder, SDD support cone,
20 // The SDD cupport centeral cylinder, the SPD Thermal Sheald, The supports
21 // and cable trays on both the RB26 (muon dump) and RB24 sides, and all of
22 // the cabling from the ladders/stave ends out past the TPC. 
23
24 /* $Id$ */
25 // General Root includes
26 #include <Riostream.h>
27 #include <TMath.h>
28 #include <TLatex.h>
29 #include <TCanvas.h>
30 #include <TPolyLine.h>
31 // Root Geometry includes
32 #include <TGeoManager.h>
33 #include <TGeoVolume.h>
34 #include <TGeoPcon.h>
35 #include <TGeoCone.h>
36 #include <TGeoTube.h> // contaings TGeoTubeSeg
37 #include <TGeoArb8.h>
38 #include <TGeoEltu.h>
39 #include <TGeoXtru.h>
40 #include <TGeoCompositeShape.h>
41 #include <TGeoMatrix.h>
42 //#include <TGeoRotation.h>
43 //#include <TGeoCombiTrans.h>
44 //#include <TGeoTranslation.h>
45 #include "AliITSv11GeometrySPD.h"
46
47 ClassImp(AliITSv11GeometrySPD)
48
49 #define SQ(A) (A)*(A)
50
51 //______________________________________________________________________
52 void AliITSv11GeometrySPD::CarbonFiberSector(TGeoVolume *moth){
53     // Define the detail SPD Carbon fiber support Sector geometry.
54     // Based on the drawings ALICE-Pixel "Construzione Profilo Modulo"
55     // March 25 2004 and ALICE-SUPPORTO "construzione Profilo Modulo"
56     // Define Outside radii as negitive, Outside in the sence that the
57     // center of the arc is outside of the object.
58     // February 16 2004.
59     // Inputs:
60     //   none.
61     // Outputs:
62     //  none.
63     // Return:
64     //  none.
65     TGeoManager *mgr = gGeoManager;
66     TGeoMedium *medSPDcf  = 0; // SPD support cone Carbon Fiber materal number.
67     //TGeoMedium *medSPDfs  = 0; // SPD support cone inserto stesalite 4411w.
68     //TGeoMedium *medSPDfo  = 0; // SPD support cone foam, Rohacell 50A.
69     TGeoMedium *medSPDss  = 0; // SPD support cone screw material,Stainless
70     TGeoMedium *medSPDair = 0; // SPD support cone Air
71     //TGeoMedium *medSPDal  = 0; // SPD support cone SDD mounting bracket Al
72     TGeoMedium *medSPDcoolfl  = 0; // SPD cooling fluid, Freeon
73     medSPDcf = mgr->GetMedium("ITSspdCarbonFiber");
74     //medSPDfs = mgr->GetMedium("ITSspdStaselite4411w");
75     //medSPDfo = mgr->GetMedium("ITSspdRohacell50A");
76     medSPDss = mgr->GetMedium("ITSspdStainlessSteal");
77     medSPDair= mgr->GetMedium("ITSspdAir");
78     medSPDcoolfl= mgr->GetMedium("ITSspdCoolingFluid");
79     //
80     const Double_t ksecDz        = 0.5*500.0*fgkmm;
81     const Double_t ksecLen       = 30.0*fgkmm;
82     const Double_t ksecCthick    = 0.20*fgkmm;
83     const Double_t ksecDipLength = 3.2*fgkmm;
84     const Double_t ksecDipRadii  = 0.4*fgkmm;
85     //const Double_t ksecCoolingTubeExtraDepth = 0.86*fgkmm;
86     //
87     const Double_t ksecX0   = -10.725*fgkmm;
88     const Double_t ksecY0   = -14.853*fgkmm;
89     const Double_t ksecR0   = -0.8*fgkmm; // Outside
90     const Double_t ksecX1   = -13.187*fgkmm;
91     const Double_t ksecY1   = -19.964*fgkmm;
92     const Double_t ksecR1   = +0.6*fgkmm; // Inside
93     const Double_t ksecDip0 = 5.9*fgkmm;
94     //
95     const Double_t ksecX2   = -3.883*fgkmm;
96     const Double_t ksecY2   = -17.805*fgkmm;
97     const Double_t ksecR2   = +0.80*fgkmm; // Inside Guess. 
98     const Double_t ksecX3   = -3.123*fgkmm;
99     const Double_t ksecY3   = -14.618*fgkmm;
100     const Double_t ksecR3   = -0.6*fgkmm; // Outside
101     const Double_t ksecDip1 = 8.035*fgkmm;
102     //
103     const Double_t ksecX4   = +11.280*fgkmm;
104     const Double_t ksecY4   = -14.473*fgkmm;
105     const Double_t ksecR4   = +0.8*fgkmm; // Inside
106     const Double_t ksecX5   = +19.544*fgkmm;
107     const Double_t ksecY5   = +10.961*fgkmm;
108     const Double_t ksecR5   = +0.8*fgkmm; // Inside
109     const Double_t ksecDip2 = 4.553*fgkmm;
110     //
111     const Double_t ksecX6   = +10.830*fgkmm;
112     const Double_t ksecY6   = +16.858*fgkmm;
113     const Double_t ksecR6   = +0.6*fgkmm; // Inside
114     const Double_t ksecX7   = +11.581*fgkmm;
115     const Double_t ksecY7   = +13.317*fgkmm;
116     const Double_t ksecR7   = -0.6*fgkmm; // Outside
117     const Double_t ksecDip3 = 6.978*fgkmm;
118     //
119     const Double_t ksecX8   = -0.733*fgkmm;
120     const Double_t ksecY8   = +17.486*fgkmm;
121     const Double_t ksecR8   = +0.6*fgkmm; // Inside
122     const Double_t ksecX9   = +0.562*fgkmm;
123     const Double_t ksecY9   = +14.486*fgkmm;
124     const Double_t ksecR9   = -0.6*fgkmm; // Outside
125     const Double_t ksecDip4 = 6.978*fgkmm;
126     //
127     const Double_t ksecX10  = -12.252*fgkmm;
128     const Double_t ksecY10  = +16.298*fgkmm;
129     const Double_t ksecR10  = +0.6*fgkmm; // Inside
130     const Double_t ksecX11  = -10.445*fgkmm;
131     const Double_t ksecY11  = +13.162*fgkmm;
132     const Double_t ksecR11  = -0.6*fgkmm; // Outside
133     const Double_t ksecDip5 = 6.978*fgkmm;
134     //
135     const Double_t ksecX12  = -22.276*fgkmm;
136     const Double_t ksecY12  = +12.948*fgkmm;
137     const Double_t ksecR12  = +0.85*fgkmm; // Inside
138     //const Double_t ksecX13 = *fgkmm;
139     //const Double_t ksecY13 = *fgkmm;
140     const Double_t ksecR13  = -0.8*fgkmm; // Outside
141     const Double_t ksecAngleSide13 = 36.0*fgkDegree;
142     //
143     const Int_t ksecNRadii = 14;
144     const Int_t ksecNPointsPerRadii = 4;
145     const Int_t ksecNCoolingTubeDips = 6;
146     // Since the Rounded parts are aproximated by a regular polygon and
147     // a cooling tube of the propper diameter must fit, a scaling factor
148     // increases the size of the polygon for the tube to fit.
149     //const Double_t ksecRCoolScale = 1./TMath::Cos(TMath::Pi()/
150     //                                          (Double_t)ksecNPointsPerRadii);
151     const Double_t ksecZEndLen  = 30.00*fgkmm;
152     //const Double_t ksecZFlangLen= 45.00*fgkmm;
153     const Double_t ksecTl       = 0.860*fgkmm;
154     const Double_t ksecCthick2  = 0.600*fgkmm;
155     const Double_t ksecCthick3  = 1.800*fgkmm;
156     const Double_t ksecSidelen  = 22.00*fgkmm;
157     const Double_t ksecSideD5   = 3.679*fgkmm;
158     const Double_t ksecSideD12  = 7.066*fgkmm;
159     const Double_t ksecRCoolOut = 2.400*fgkmm;
160     const Double_t ksecRCoolIn  = 2.000*fgkmm;
161     const Double_t ksecDl1      = 5.900*fgkmm;
162     const Double_t ksecDl2      = 8.035*fgkmm;
163     const Double_t ksecDl3      = 4.553*fgkmm;
164     const Double_t ksecDl4      = 6.978*fgkmm;
165     const Double_t ksecDl5      = 6.978*fgkmm;
166     const Double_t ksecDl6      = 6.978*fgkmm;
167     const Double_t ksecCoolTubeThick = 10.0*fgkmicron;
168     //
169     const Int_t ksecNPoints = (ksecNPointsPerRadii+1)*(ksecNRadii+
170                                ksecNCoolingTubeDips) + 8;
171     Double_t secX[ksecNRadii] = {ksecX0,ksecX1,ksecX2,ksecX3,ksecX4,ksecX5,
172                                  ksecX6,ksecX7,ksecX8,ksecX9,ksecX10,ksecX11,
173                                  ksecX12,-1000.0};
174     Double_t secY[ksecNRadii] = {ksecY0,ksecY1,ksecY2,ksecY3,ksecY4,ksecY5,
175                                  ksecY6,ksecY7,ksecY8,ksecY9,ksecY10,ksecY11,
176                                  ksecY12,-1000.0};
177     Double_t secR[ksecNRadii] = {ksecR0,ksecR1,ksecR2,ksecR3,ksecR4,ksecR5,
178                                  ksecR6,ksecR7,ksecR8,ksecR9,ksecR10,ksecR11,
179                                  ksecR12,ksecR13};
180     Double_t secDip[ksecNRadii]={0.0,ksecDip0,0.0,ksecDip1,0.0,ksecDip2,0.0,
181                                  ksecDip3,0.0,ksecDip4,0.0,ksecDip5,0.0,0.0};
182     Double_t secX2[ksecNRadii+ksecNCoolingTubeDips] = {
183         ksecX0,ksecX1,-1000.,ksecX2,ksecX3,-1000.,ksecX4,ksecX5,
184         -1000.,ksecX6,ksecX7,-1000.,ksecX8,ksecX9,-1000.,
185         ksecX10,ksecX11,-1000.,ksecX12,-1000.0};
186     Double_t secY2[ksecNRadii+ksecNCoolingTubeDips] = {
187         ksecY0,ksecY1,-1000.,ksecY2,ksecY3,-1000.,ksecY4,ksecY5,
188         -1000.,ksecY6,ksecY7,-1000.,ksecY8,ksecY9,-1000.,
189         ksecY10,ksecY11,-1000.,ksecY12,-1000.0};
190     Double_t secR2[ksecNRadii+ksecNCoolingTubeDips] = {
191         ksecR0,ksecR1,ksecRCoolOut,ksecR2,ksecR3,ksecRCoolOut,ksecR4,ksecR5,
192         ksecRCoolOut,ksecR6,ksecR7,ksecRCoolOut,ksecR8,ksecR9,ksecRCoolOut,
193         ksecR10,ksecR11,ksecRCoolOut,ksecR12,ksecR13};
194     Double_t secDip2[ksecNRadii]={0.0,ksecDl1,0.0,ksecDl2,0.0,ksecDl3,0.0,
195                                  ksecDl4,0.0,ksecDl5,0.0,ksecDl6,0.0,0.0};
196     const Int_t ksecDipIndex[ksecNCoolingTubeDips] = {2,5,8,11,14,17};
197     Double_t secAngleStart[ksecNRadii];
198     Double_t secAngleEnd[ksecNRadii];
199     Double_t secAngleStart2[ksecNRadii+ksecNCoolingTubeDips];
200     Double_t secAngleEnd2[ksecNRadii+ksecNCoolingTubeDips];
201     Double_t secAngleStart3[ksecNRadii+ksecNCoolingTubeDips];
202     Double_t secAngleEnd3[ksecNRadii+ksecNCoolingTubeDips];
203     Double_t xp[ksecNPoints],yp[ksecNPoints];
204     TGeoXtru *sA0,*sA1,*sB0,*sB1;
205     TGeoEltu *sTA0,*sTA1;
206     TGeoTube *sTB0,*sTB1;
207     TGeoRotation    *rot;
208     TGeoTranslation *trans;
209     TGeoCombiTrans  *rotrans;
210     Double_t t,t0,t1,a,b,x0,y0,x1,y1;
211     Int_t i,j,k;
212
213     if(moth==0){
214         Error("CarbonFiberSector","moth=%p",moth);
215         return;
216     } // end if moth==0
217     SetDebug(3);
218
219     secAngleStart[0] = 0.5*ksecAngleSide13;
220     for(i=0;i<ksecNRadii-2;i++){
221         AnglesForRoundedCorners(secX[i],secY[i],secR[i],
222                                 secX[i+1],secY[i+1],secR[i+1],t0,t1);
223         secAngleEnd[i]     = t0;
224         if(secR[i]>0.0&&secR[i+1]>0.0)if(secAngleStart[i]>secAngleEnd[i])
225             secAngleEnd[i] += 360.0;
226         secAngleStart[i+1] = t1;
227     } // end for i
228     secAngleEnd[ksecNRadii-2]   = secAngleStart[ksecNRadii-2] + 
229                                      (secAngleEnd[10]-secAngleStart[10]);
230     if(secAngleEnd[ksecNRadii-2]<0.0) secAngleEnd[ksecNRadii-2] += 360.0;
231     secAngleStart[ksecNRadii-1] = secAngleEnd[ksecNRadii-2] - 180.0;
232     secAngleEnd[ksecNRadii-1]   = secAngleStart[0];
233     //
234     i = 0;
235     j = ksecNRadii-2;
236     t0 = TanD(secAngleStart[i]-90.);
237     t1 = TanD(secAngleEnd[j]-90.);
238     t  = secY[i] - secY[j];
239     // Note, secR[i=0] <0; secR[j=12]>0; and secR[j+1=13] <0
240     t += (-secR[i]+secR[j+1])*SinD(secAngleStart[i]);
241     t -= (secR[j]-secR[j+1])*SinD(secAngleEnd[j]);
242     t += t1*secX[j] - t0*secX[i];
243     t += t1*(secR[j]-secR[j+1])*CosD(secAngleEnd[j]);
244     t -= t0*(-secR[i]+secR[j+1])*CosD(secAngleStart[i]);
245     secX[ksecNRadii-1] = t/(t1-t0);
246     secY[ksecNRadii-1] = TanD(90.+0.5*ksecAngleSide13)*
247                           (secX[ksecNRadii-1]-secX[0]) + secY[0];
248     //
249     if(AliDebugLevel()>=2){
250         cout <<"    X    \t  Y  \t  R  \t  S  \t  E"<<endl;
251         for(i=0;i<ksecNRadii;i++){
252             cout <<"{"<< secX[i] <<",";
253             cout << secY[i] <<",";
254             cout << secR[i] <<",";
255             cout << secAngleStart[i] <<",";
256             cout << secAngleEnd[i] <<"},"<< endl;
257         } // end for i
258     } // end if GetDebug
259     //
260     if(GetDebug(3)) cout <<"Double_t sA0[][";
261     if(GetDebug(4)) cout <<"3]{";
262     else if(GetDebug(3)) cout <<"2]{";
263     j = -1;
264     t0 = (Double_t)ksecNPointsPerRadii;
265     for(i=0;i<ksecNRadii;i++){
266         t1 = (secAngleEnd[i]-secAngleStart[i])/t0;
267         if(GetDebug(5)) cout<<"t1="<< t1<<endl;
268         for(k=0;k<=ksecNPointsPerRadii;k++){
269             t=secAngleStart[i]+((Double_t)k)*t1;
270             j++;
271             xp[j] = TMath::Abs(secR[i])*CosD(t)+secX[i];
272             yp[j] = TMath::Abs(secR[i])*SinD(t)+secY[i];
273             if(GetDebug(3)){
274                 cout << "{"<<xp[j]<<","<<yp[j];
275                 if(GetDebug(4)) cout <<","<<t;
276                 cout <<"},";
277             } // end if GetDebug
278         } // end for k
279         if(GetDebug(3)) cout << endl;
280         t = secAngleEnd[i];
281         a = ksecDipLength+2.0*(ksecDipRadii);
282         b = secDip[i]-0.5*a;
283         switch (i){
284         case 1: case 5: // Dip0,2
285             j++;
286             xp[j] = xp[j-1]-b*CosD(t-90.);
287             yp[j] = yp[j-1]-b*SinD(t-90.);
288             j++;
289             xp[j] = xp[j-1]-(2.0*ksecDipRadii)*CosD(t);
290             yp[j] = yp[j-1]-(2.0*ksecDipRadii)*SinD(t);
291             j++;
292             xp[j] = xp[j-1]-a*CosD(t-90.);
293             yp[j] = yp[j-1]-a*SinD(t-90.);
294             j++;
295             xp[j] = xp[j-1]+(2.0*ksecDipRadii)*CosD(t);
296             yp[j] = yp[j-1]+(2.0*ksecDipRadii)*SinD(t);
297             if(GetDebug(3))for(k=-3;k<=0;k++){
298                 cout << "{"<<xp[j+k]<<","<<yp[j+k];
299                 if(GetDebug(4)) cout <<","<<0.0;
300                 cout <<"},";
301             } // end if GetDebug
302             if(GetDebug(3)) cout << endl;
303             break;
304         case 3: case 7: case 9: case 11:// Dip 1,3,4,5
305             j++;
306             xp[j] = xp[j-1]+b*CosD(t-90.);
307             yp[j] = yp[j-1]+b*SinD(t-90.);
308             j++;
309             xp[j] = xp[j-1]+(2.0*ksecDipRadii)*CosD(t);
310             yp[j] = yp[j-1]+(2.0*ksecDipRadii)*SinD(t);
311             j++;
312             xp[j] = xp[j-1]+a*CosD(t-90.);
313             yp[j] = yp[j-1]+a*SinD(t-90.);
314             j++;
315             xp[j] = xp[j-1]-(2.0*ksecDipRadii)*CosD(t);
316             yp[j] = yp[j-1]-(2.0*ksecDipRadii)*SinD(t);
317             if(GetDebug(3))for(k=-3;k<=0;k++){
318                 cout << "{"<<xp[j+k]<<","<<yp[j+k];
319                 if(GetDebug(4)) cout <<","<<0.0;
320                 cout <<"},";
321             } // end if GetDebug
322             if(GetDebug(3)) cout << endl;
323             break;
324         default:
325             break;
326         } // end switch
327     } // end of i
328     if(GetDebug(3)) cout<<"{"<<xp[0]<<","<<yp[0];
329     if(GetDebug(4)) cout<<","<< secAngleStart[0];
330     if(GetDebug(3)) cout<<"}} j="<<j<<endl;
331     sA0 = new TGeoXtru(2);
332     sA0->SetName("ITS SPD Carbon fiber support Sector A0");
333     sA0->DefinePolygon(j+1,xp,yp);
334     sA0->DefineSection(0,-ksecDz);
335     sA0->DefineSection(1,ksecDz);
336     //
337     if(GetDebug(3)) cout <<"Double_t sA1[][{";
338     if(GetDebug(4)) cout <<"3]{";
339     else if(GetDebug(3)) cout <<"2]{";
340     j = -1;
341     t0 = (Double_t)ksecNPointsPerRadii;
342     for(i=0;i<ksecNRadii;i++){
343         t1 = (secAngleEnd[i]-secAngleStart[i])/t0;
344         if(GetDebug(5)) cout<<"t1="<< t1<<endl;
345         for(k=0;k<=ksecNPointsPerRadii;k++){
346             t=secAngleStart[i]+((Double_t)k)*t1;
347             j++;
348             xp[j] = TMath::Abs(secR[i]-ksecCthick)*CosD(t)+secX[i];
349             yp[j] = TMath::Abs(secR[i]-ksecCthick)*SinD(t)+secY[i];
350             if(GetDebug(3)){
351                 cout << "{"<<xp[j]<<","<<yp[j];
352                 if(GetDebug(4)) cout <<","<<t;
353                 cout <<"},";
354             } // end if GetDebug
355         } // end for t
356         if(GetDebug(3)) cout << endl;
357         t = secAngleEnd[i];
358         a = ksecDipLength+2.0*(ksecDipRadii+ksecCthick);
359         b = secDip[i]-0.5*a;
360         switch (i){
361         case 1: case 5: // Dip0,2
362             j++;
363             xp[j] = xp[j-1]-b*CosD(t-90.);
364             yp[j] = yp[j-1]-b*SinD(t-90.);
365             j++;
366             xp[j] = xp[j-1]-(2.0*ksecDipRadii)*CosD(t);
367             yp[j] = yp[j-1]-(2.0*ksecDipRadii)*SinD(t);
368             j++;
369             xp[j] = xp[j-1]-a*CosD(t-90.);
370             yp[j] = yp[j-1]-a*SinD(t-90.);
371             j++;
372             xp[j] = xp[j-1]+(2.0*ksecDipRadii)*CosD(t);
373             yp[j] = yp[j-1]+(2.0*ksecDipRadii)*SinD(t);
374             if(GetDebug(3))for(k=-3;k<=0;k++){
375                 cout << "{"<<xp[j+k]<<","<<yp[j+k];
376                 if(GetDebug(4)) cout <<",t="<<0.0;
377                 cout <<"},";
378             } // end if GetDebug
379             if(GetDebug(3)) cout << endl;
380             break;
381         case 3: case 7: case 9: case 11:// Dip 1,3,4,5
382             j++;
383             xp[j] = xp[j-1]+b*CosD(t-90.);
384             yp[j] = yp[j-1]+b*SinD(t-90.);
385             j++;
386             xp[j] = xp[j-1]+(2.0*ksecDipRadii)*CosD(t);
387             yp[j] = yp[j-1]+(2.0*ksecDipRadii)*SinD(t);
388             j++;
389             xp[j] = xp[j-1]+a*CosD(t-90.);
390             yp[j] = yp[j-1]+a*SinD(t-90.);
391             j++;
392             xp[j] = xp[j-1]-(2.0*ksecDipRadii)*CosD(t);
393             yp[j] = yp[j-1]-(2.0*ksecDipRadii)*SinD(t);
394             if(GetDebug(3))for(k=-3;k<=0;k++){
395                 cout << "{"<<xp[j+k]<<","<<yp[j+k];
396                 if(GetDebug(4)) cout <<",t="<<0.0;
397                 cout <<"},";
398             } // end if GetDebug
399             if(GetDebug(3)) cout << endl;
400             break;
401         default:
402             break;
403         } // end switch
404     } // end of i
405     if(GetDebug(3)) cout<<"{"<<xp[0]<<","<<yp[0];
406     if(GetDebug(4)) cout<<","<< secAngleStart[0];
407     if(GetDebug(3)) cout<<"}} j="<<j<<endl;
408     sA1 = new TGeoXtru(2);
409     sA1->SetName("ITS SPD Carbon fiber support Sector Air A1");
410     sA1->DefinePolygon(j+1,xp,yp);
411     sA1->DefineSection(0,-ksecDz);
412     sA1->DefineSection(1,ksecDz);
413     //
414     sTA0 = new TGeoEltu("ITS SPD Cooling Tube TA0",
415                        ksecDipRadii,0.5*ksecDipLength,ksecDz);
416     sTA1 = new TGeoEltu("ITS SPD Cooling Tube coolant TA1",
417                         sTA0->GetA()-ksecCoolTubeThick,
418                         sTA0->GetB()-ksecCoolTubeThick,ksecDz);
419     //
420     j = 0;
421     for(i=0;i<ksecNRadii;i++){
422         secAngleStart2[j] = secAngleStart[i];
423         secAngleEnd2[j]   = secAngleEnd[i];
424         secAngleStart3[j] = secAngleStart2[j];
425         secAngleEnd3[j]   = secAngleEnd2[j];
426         secX2[j]          = secX[i];
427         secY2[j]          = secY[i];
428         secR2[j]          = secR[i];
429         j++;
430         t = secAngleEnd[i];
431         switch (i){
432         case 1: case 5: // Tube 0,2
433             x0 = secX[i] + TMath::Abs(secR[i])*CosD(t); // last point of turn
434             y0 = secY[i] + TMath::Abs(secR[i])*SinD(t);
435             x1 = x0-secDip2[i]*CosD(t-90.);  // center point of dip 
436             y1 = y0-secDip2[i]*SinD(t-90.);  // along line
437             secX2[j] = x1-ksecTl*CosD(t);  // location of circle center.
438             secY2[j] = y1-ksecTl*SinD(t);
439             x1 = secX[i+1]+TMath::Abs(secR[i+1])*CosD(secAngleStart2[i+1]);
440             y1 = secY[i+1]+TMath::Abs(secR[i+1])*SinD(secAngleStart2[i+1]);
441             //Find starting and ending angles, break if error.
442             if(!AngleOfIntersectionWithLine(x0,y0,x1,y1,secX2[j],secY2[j],
443             secR2[j],secAngleStart2[j],secAngleEnd2[j]))break;
444             // thicknes of Carbon fiber over the cooling tubes.
445             a  = ksecRCoolOut-ksecRCoolIn;
446             // last point of turn
447             x0 = secX[i]+(TMath::Abs(secR[i])-ksecCthick2)*CosD(t);
448             y0 = secY[i]+(TMath::Abs(secR[i])-ksecCthick2)*SinD(t);
449             x1 = secX[i+1]+(TMath::Abs(secR[i+1])-ksecCthick2)*CosD(secAngleStart3[i+1]);
450             y1 = secY[i+1]+(TMath::Abs(secR[i+1])-ksecCthick2)*SinD(secAngleStart3[i+1]);
451             //Find starting and ending angles, break if error.
452             if(!AngleOfIntersectionWithLine(x0,y0,x1,y1,secX2[j],secY2[j],
453             secR2[j]-a,secAngleStart3[j],secAngleEnd3[j]))break;
454             if(i==1) { // Fix odd case.
455                 x0 = secAngleStart3[j];
456                 secAngleStart3[j] = secAngleEnd3[j] - 360.0;
457                 secAngleEnd3[j] = x0;
458             } // end if i==1
459             if(i==5) { // Fix odd case.
460                 x0 = secAngleStart2[j];
461                 secAngleStart2[j] = secAngleEnd2[j] - 360.0;
462                 secAngleEnd2[j] = x0;
463                 x0 = secAngleStart3[j];
464                 secAngleStart3[j] = secAngleEnd3[j] - 360.0;
465                 secAngleEnd3[j] = x0;
466             } // end if i==5
467             // Because a polygon is replacing the rounded surface, the
468             // radius of the polygon must be larger to make room for the
469             // cooling tube of the same size. The radio of the radii of
470             // a circle fitting the inside/outside of a regualr polygon
471             // is given by Cos(180/n) where n is the number of sides of the
472             // regurla polygon. In this case, it is scalled for the partical
473             // circles involved.
474             secR2[j] = secR2[j]/CosD(0.5*(secAngleEnd[j]-secAngleStart[j])/
475                                      ((Double_t)ksecNPointsPerRadii));
476             j++;
477             break;
478         case 3: case 7: case 9: case 11:// Tube 1,2,4,5,6
479             x0 = secX[i] + TMath::Abs(secR[i])*CosD(t); // last point of turn
480             y0 = secY[i] + TMath::Abs(secR[i])*SinD(t);
481             x1 = x0+secDip2[i]*CosD(t-90.);  // center point of dip 
482             y1 = y0+secDip2[i]*SinD(t-90.);  // along line
483             secX2[j] = x1+ksecTl*CosD(t);  // location of circle center.
484             secY2[j] = y1+ksecTl*SinD(t);
485             x1 = secX[i+1]+TMath::Abs(secR[i+1])*CosD(secAngleStart2[i+1]);
486             y1 = secY[i+1]+TMath::Abs(secR[i+1])*SinD(secAngleStart2[i+1]);
487             if(!AngleOfIntersectionWithLine(x0,y0,x1,y1,secX2[j],secY2[j],
488             secR2[j],secAngleStart2[j],secAngleEnd2[j]))break;//don't intersect
489             // thicknes of Carbon fiber over the cooling tubes.
490             a  = ksecRCoolOut-ksecRCoolIn;
491             // last point of turn
492             x0 = secX[i] + (TMath::Abs(secR[i])+ksecCthick2)*CosD(t);
493             y0 = secY[i] + (TMath::Abs(secR[i])+ksecCthick2)*SinD(t);
494             x1 = secX[i+1]+(TMath::Abs(secR[i+1])-ksecCthick2)*CosD(secAngleStart3[i+1]);
495             y1 = secY[i+1]+(TMath::Abs(secR[i+1])-ksecCthick2)*SinD(secAngleStart3[i+1]);
496             //Find starting and ending angles, break if error.
497             if(!AngleOfIntersectionWithLine(x0,y0,x1,y1,secX2[j],secY2[j],
498             secR2[j]-a,secAngleStart3[j],secAngleEnd3[j]))break;
499             if(i==7) { // Fix odd case
500                 x0 = secAngleStart2[j];
501                 secAngleStart2[j] = secAngleEnd2[j] - 360.0;
502                 secAngleEnd2[j] = x0;
503                 x0 = secAngleStart3[j];
504                 secAngleStart3[j] = secAngleEnd3[j] - 360.0;
505                 secAngleEnd3[j] = x0;
506             } // end if i==7
507             if(i==9) { // Fix odd case
508                 x0 = secAngleStart3[j];
509                 secAngleStart3[j] = secAngleEnd3[j] - 360.0;
510                 secAngleEnd3[j] = x0;
511             } // end if i==7
512             // Because a polygon is replacing the rounded surface, the
513             // radius of the polygon must be larger to make room for the
514             // cooling tube of the same size. The radio of the radii of
515             // a circle fitting the inside/outside of a regualr polygon
516             // is given by Cos(180/n) where n is the number of sides of the
517             // regurla polygon. In this case, it is scalled for the partical
518             // circles involved.
519             secR2[j] = secR2[j]/CosD(0.5*(secAngleEnd[j]-secAngleStart[j])/
520                                      ((Double_t)ksecNPointsPerRadii));
521             j++;
522             break;
523         }// end switch
524     } // end for i
525     //
526     if(GetDebug(2)){
527         cout <<"    X2   \t  Y2 \t  R2 \t  S2 \t  E2"<<endl;
528         for(i=0;i<j;i++){
529             cout <<"{"<< secX2[i] <<",";
530             cout << secY2[i] <<",";
531             cout << secR2[i] <<",";
532             cout << secAngleStart2[i] <<",";
533             cout << secAngleEnd2[i] <<"}," <<  endl;
534         } // end for i
535     } // end if GetDebug
536     if(GetDebug(2)){
537         cout <<"    X2   \t  Y2 \t  R2 \t  S3 \t  E3"<<endl;
538         for(i=0;i<j;i++){
539             cout <<"{"<< secX2[i] <<",";
540             cout << secY2[i] <<",";
541             cout << secR2[i] <<",";
542             cout << secAngleStart3[i] <<",";
543             cout << secAngleEnd3[i] <<"}," <<  endl;
544         } // end for i
545     } // end if GetDebug
546     if(GetDebug(3)) cout <<"Double_t sB0[][";
547     if(GetDebug(4)) cout <<"3]{";
548     else if(GetDebug(3)) cout <<"2]{";
549     j = -1;
550     t0 = (Double_t)ksecNPointsPerRadii;
551     for(i=0;i<ksecNRadii+ksecNCoolingTubeDips;i++){
552         t1 = (secAngleEnd2[i]-secAngleStart2[i])/t0;
553         if(GetDebug(5)) cout<<"t1="<< t1<<endl;
554         for(k=0;k<=ksecNPointsPerRadii;k++){
555             t=secAngleStart2[i]+((Double_t)k)*t1;
556             j++;
557             xp[j] = TMath::Abs(secR2[i])*CosD(t)+secX2[i];
558             yp[j] = TMath::Abs(secR2[i])*SinD(t)+secY2[i];
559             if(GetDebug(3)){
560                 cout << "{"<<xp[j]<<","<<yp[j];
561                 if(GetDebug(4)) cout <<","<<t;
562                 cout <<"},";
563             } // end if GetDebug
564         } // end for k
565         if(GetDebug(3)) cout << endl;
566         if(i==6) { // add thicker side
567             b = CosD(0.5*ksecAngleSide13);
568             a = SinD(0.5*ksecAngleSide13);
569             x1 = xp[j];
570             y1 = yp[j];
571             x0 = a*a*ksecX5 + b*b*x1 - (y1-ksecY5)*a*b;
572             y0 = a*a*y1 + b*b*ksecY5 - (x1-ksecX5)*a*b;
573             j++;
574             xp[j+3] = x0 - ksecSideD5*a;
575             yp[j+3] = y0 - ksecSideD5*b;
576             xp[j+2] = xp[j+3] + (ksecCthick3-ksecCthick2)*b;
577             yp[j+2] = yp[j+3] - (ksecCthick3-ksecCthick2)*a;
578             xp[j+1] = xp[j+2] - ksecSidelen*a;
579             yp[j+1] = yp[j+2] - ksecSidelen*b;
580             xp[j]   = xp[j+1] - (ksecCthick3-ksecCthick2)*b;
581             yp[j]   = yp[j+1] + (ksecCthick3-ksecCthick2)*a;
582             j += 3;
583             if(GetDebug(3))for(k=-3;k<=0;k++){
584                 cout << "{"<<xp[j+k]<<","<<yp[j+k];
585                 if(GetDebug(4)) cout <<",t="<<0.0;
586                 cout <<"},";
587             } // end if GetDebug
588             if(GetDebug(3)) cout << endl;
589         } // end if i==6
590         if(i==19) { // add thicker side
591             // first propogate referece point 12 to -18 degree edge
592             b = CosD(0.5*ksecAngleSide13);
593             a = SinD(0.5*ksecAngleSide13);
594             x1 = secX[0]+TMath::Abs(secR[0])*CosD(secAngleStart[0]);
595             y1 = secY[0]+TMath::Abs(secR[0])*SinD(secAngleStart[0]);
596             x0 = a*b*(y1-secY[ksecNRadii-2]) +
597                      a*a*secX[ksecNRadii-2] + b*b*x1;
598             y0 = a*b*(x1-secX[ksecNRadii-2]) +
599                 b*b*secY[ksecNRadii-2] + a*a*y1;
600             j++;
601             xp[j] = x0 + ksecSideD12*a;
602             yp[j] = y0 - ksecSideD12*b;
603             j++;
604             xp[j] = xp[j-1] - (ksecCthick3-ksecCthick2)*b;
605             yp[j] = yp[j-1] - (ksecCthick3-ksecCthick2)*a;
606             j++;
607             xp[j] = xp[j-1] + ksecSidelen*a;
608             yp[j] = yp[j-1] - ksecSidelen*b;
609             j++;
610             xp[j] = xp[j-1] + (ksecCthick3-ksecCthick2)*b;
611             yp[j] = yp[j-1] + (ksecCthick3-ksecCthick2)*a;
612             if(GetDebug(3))for(k=-3;k<=0;k++){
613                 cout << "{"<<xp[j+k]<<","<<yp[j+k];
614                 if(GetDebug(4)) cout <<",t="<<0.0;
615                 cout <<"},";
616             } // end if GetDebug
617             if(GetDebug(3)) cout << endl;
618         } // end if i==19
619     } // end for i
620     if(GetDebug(3)) cout<<"{"<<xp[0]<<","<<yp[0];
621     if(GetDebug(4)) cout<<","<< secAngleStart2[0];
622     if(GetDebug(3)) cout<<"}} j="<<j<<endl;
623     sB0 = new TGeoXtru(2);
624     sB0->SetName("ITS SPD Carbon fiber support Sector End B0");
625     sB0->DefinePolygon(j+1,xp,yp);
626     sB0->DefineSection(0,ksecDz);
627     sB0->DefineSection(1,ksecDz+ksecZEndLen);
628     //
629     if(GetDebug(3)) cout <<"Double_t sB1[][{";
630     if(GetDebug(4)) cout <<"3]{";
631     else if(GetDebug(3)) cout <<"2]{";
632     j = -1;
633     t0 = (Double_t)ksecNPointsPerRadii;
634     for(i=0;i<ksecNRadii+ksecNCoolingTubeDips;i++){
635         t1 = (secAngleEnd3[i]-secAngleStart3[i])/t0;
636         if(GetDebug(5)) cout<<"t1="<< t1<<endl;
637         for(k=0;k<=ksecNPointsPerRadii;k++){
638             t=secAngleStart3[i]+((Double_t)k)*t1;
639             j++;
640             x0 = TMath::Abs(secR2[i]-ksecCthick2);
641             if(i==2||i==5||i==8||i==11||i==14||i==17){
642                 x0 = TMath::Abs(secR2[i]-ksecRCoolOut+ksecRCoolIn);/*
643                 if(k==0){// compute change in start and end angles to
644                     // compensate for thickness of carbon fiber
645                     y0 = (ksecCthick2-ksecRCoolOut*SinD(t))/
646                         ksecRCoolIn; // sin th'
647                     if(GetDebug(5))cout <<" k=0 t="<<t<<" y0="<<y0<<endl;
648                     y1 = TMath::Sqrt(1-y0*y0);     // cos th'
649                     t -= 180.*TMath::ASin(SinD(t)*y1-CosD(t)*y0)/TMath::Pi(); 
650                 }else if(k==ksecNPointsPerRadii) {
651                     y0 = (ksecCthick2-ksecRCoolOut*SinD(t))/
652                         ksecRCoolIn; // sin th'
653                     if(GetDebug(5))cout <<" k="<<k<<" t="<<t<<" y0="<<y0<<endl;
654                     y1 = TMath::Sqrt(1-y0*y0);     // cos th'
655                     t += 180.*TMath::ASin(SinD(t)*y1-CosD(t)*y0)/TMath::Pi();
656                 } // end if
657             */} // end if
658             xp[j] = x0*CosD(t)+secX2[i];
659             yp[j] = x0*SinD(t)+secY2[i];
660             if(GetDebug(3)){
661                 cout << "{"<<xp[j]<<","<<yp[j];
662                 if(GetDebug(4)) cout <<","<<t;
663                 cout <<"},";
664             } // end if GetDebug
665         } // end for k
666         if(GetDebug(3)) cout << endl;
667     } // end for i
668     if(GetDebug(3)) cout<<"{"<<xp[0]<<","<<yp[0];
669     if(GetDebug(4)) cout<<","<< secAngleStart2[0];
670     if(GetDebug(3)) cout<<"}} j="<<j<<endl;
671     sB1 = new TGeoXtru(2);
672     sB1->SetName("ITS SPD Carbon fiber support Sector Air End B1");
673     sB1->DefinePolygon(j+1,xp,yp);
674     sB1->DefineSection(0,ksecDz);
675     sB1->DefineSection(1,ksecDz+ksecLen);
676     sTB0 = new TGeoTube("ITS SPD Cooling Tube End TB0",0.0,
677                        ksecRCoolIn,0.5*ksecLen);
678     sTB1 = new TGeoTube("ITS SPD Cooling Tube End coolant TB0",0.0,
679                        sTB0->GetRmax()-ksecCoolTubeThick,0.5*ksecLen);
680     //
681     if(GetDebug()){
682         sA0->InspectShape();
683         sA1->InspectShape();
684         sB0->InspectShape();
685         sB1->InspectShape();
686     } // end if GetDebug
687     //
688     TGeoVolume *vM,*vA0,*vA1,*vTA0,*vTA1,*vB0,*vB1,*vTB0,*vTB1;
689     vM = moth;
690     vA0 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorA0",sA0,medSPDcf);
691     vA0->SetVisibility(kTRUE);
692     vA0->SetLineColor(4); // Blue
693     vA0->SetLineWidth(1);
694     vA0->SetFillColor(vA0->GetLineColor());
695     vA0->SetFillStyle(4010); // 10% transparent
696     vA1 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorAirA1",sA1,medSPDair);
697     vA1->SetVisibility(kTRUE);
698     vA1->SetLineColor(7); // light Blue
699     vA1->SetLineWidth(1);
700     vA1->SetFillColor(vA1->GetLineColor());
701     vA1->SetFillStyle(4090); // 90% transparent
702     vTA0 = new TGeoVolume("ITSSPDCoolingTubeTA0",sTA0,medSPDss);
703     vTA0->SetVisibility(kTRUE);
704     vTA0->SetLineColor(1); // Black
705     vTA0->SetLineWidth(1);
706     vTA0->SetFillColor(vTA0->GetLineColor());
707     vTA0->SetFillStyle(4000); // 0% transparent
708     vTA1 = new TGeoVolume("ITSSPDCoolingTubeFluidTA1",sTA1,medSPDcoolfl);
709     vTA1->SetVisibility(kTRUE);
710     vTA1->SetLineColor(6); // Purple
711     vTA1->SetLineWidth(1);
712     vTA1->SetFillColor(vTA1->GetLineColor());
713     vTA1->SetFillStyle(4000); // 0% transparent
714     vB0 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndB0",sB0,medSPDcf);
715     vB0->SetVisibility(kTRUE);
716     vB0->SetLineColor(4); // Blue
717     vB0->SetLineWidth(1);
718     vB0->SetFillColor(vB0->GetLineColor());
719     vB0->SetFillStyle(4010); // 10% transparent
720     vB1 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndAirB1",sB1,medSPDair);
721     vB1->SetVisibility(kTRUE);
722     vB1->SetLineColor(7); // light Blue
723     vB1->SetLineWidth(1);
724     vB1->SetFillColor(vB1->GetLineColor());
725     vB1->SetFillStyle(4090); // 90% transparent
726     vTB0 = new TGeoVolume("ITSSPDCoolingTubeEndTB0",sTB0,medSPDss);
727     vTB0->SetVisibility(kTRUE);
728     vTB0->SetLineColor(1); // Black
729     vTB0->SetLineWidth(1);
730     vTB0->SetFillColor(vTB0->GetLineColor());
731     vTB0->SetFillStyle(4000); // 0% transparent
732     vTB1 = new TGeoVolume("ITSSPDCoolingTubeEndFluidTB1",sTB1,medSPDcoolfl);
733     vTB1->SetVisibility(kTRUE);
734     vTB1->SetLineColor(6); // Purple
735     vTB1->SetLineWidth(1);
736     vTB1->SetFillColor(vTB1->GetLineColor());
737     vTB1->SetFillStyle(4000); // 0% transparent
738     //
739     vA0->AddNode(vA1,1,0); // Put air inside carbon fiber.
740     vB0->AddNode(vB1,1,0); // Put air inside carbon fiber.
741     vTA0->AddNode(vTA1,1,0); // Put air inside carbon fiber.
742     vTB0->AddNode(vTB1,1,0); // Put air inside carbon fiber.
743     for(i=0;i<ksecNCoolingTubeDips;i++){
744         x0 = secX2[ksecDipIndex[i]];
745         y0 = secY2[ksecDipIndex[i]];
746         trans = new TGeoTranslation("",x0,y0,0.0);
747         vB1->AddNode(vTB0,i+1,trans);
748         rot = new TGeoRotation("",0.0,0.0,
749                                TMath::RadToDeg()*TMath::ATan2(y0,x0));
750         rotrans = new TGeoCombiTrans(*trans,*rot);
751         vM->AddNode(vTA0,i+1,rotrans);
752         delete rot;
753     } // end for i
754     vM->AddNode(vA0,1,0);
755     vM->AddNode(vB0,1,0);
756     vM->AddNode(vB0,2,new TGeoScale(1.0,1.0,-1.0)); // Reflection.
757     if(GetDebug()){
758         vA0->PrintNodes();
759         vA1->PrintNodes();
760         vB0->PrintNodes();
761         vB1->PrintNodes();
762     } // end if GetDebug
763     //
764 }
765 //______________________________________________________________________
766 void AliITSv11GeometrySPD::HalfStave(TGeoVolume *moth){
767     // Define the detail SPD Half Stave geometry.
768     // Inputs:
769     //   none.
770     // Outputs:
771     //  none.
772     // Return:
773     //  none.
774
775     if(moth==0){
776         Error("HalfStave","moth=%p",moth);
777         return;
778     } // end if moth==0
779 }
780 //----------------------------------------------------------------------
781 void AliITSv11GeometrySPD::CreateFigure0(const Char_t *filepath,
782                                          const Char_t *type){
783     // Creates Figure 0 for the documentation of this class. In this
784     // specific case, it creates the X,Y cross section of the SPD suport
785     // section, center and ends. The output is written to a standard
786     // file name to the path specificed.
787     // Inputs:
788     //   const Char_t *filepath  Path where the figure is to be drawn
789     //   const Char_t *type      The type of file, default is gif.
790     // Output:
791     //   none.
792     // Return:
793     //   none.
794     TGeoXtru *sA0,*sA1,*sB0,*sB1;
795     //TPolyMarker *pmA,*pmB;
796     TPolyLine plA0,plA1,plB0,plB1;
797     TCanvas *canvas;
798     TLatex txt;
799     Double_t x,y;
800
801     sA0 = (TGeoXtru*) gGeomManager->GetVolume(
802         "ITSSPDCarbonFiberSupportSectorA0_1")->GetShape();
803     sA1 = (TGeoXtru*) gGeomManager->GetVolume(
804         "ITSSPDCarbonFiberSupportSectorAirA1_1")->GetShape();
805     sB0 = (TGeoXtru*) gGeomManager->GetVolume(
806         "ITSSPDCarbonFiberSupportSectorEndB0_1")->GetShape();
807     sB1 = (TGeoXtru*) gGeomManager->GetVolume(
808         "ITSSPDCarbonFiberSupportSectorEndAirB1_1")->GetShape();
809     //pmA = new TPolyMarker();
810     //pmA.SetMarkerStyle(2); // +
811     //pmA.SetMarkerColor(7); // light blue
812     //pmB = new TPolyMarker();
813     //pmB.SetMarkerStyle(5); // X
814     //pmB.SetMarkerColor(6); // purple
815     plA0.SetPolyline(sA0->GetNvert());
816     plA0.SetLineColor(1); // black
817     plA0.SetLineStyle(1);
818     plA1.SetPolyline(sA1->GetNvert());
819     plA1.SetLineColor(2); // red
820     plA1.SetLineStyle(1);
821     plB0.SetPolyLine(sB0.GetNvert());
822     plB0.SetLineColor(3); // Green
823     plB0.SetLineStyle(2);
824     plB1.SetPolyLine(sB1->GetNvert());
825     plB1.SetLineColor(4); // Blue
826     plB1.SetLineStyle(2);
827     //for(i=0;i<kNRadii;i++) pmA.SetPoint(i,xyB1p[i][0],xyB1p[i][1]);
828     //for(i=0;i<kNRadii;i++) pmB.SetPoint(i,xyB1p[i][0],xyB1p[i][1]);
829     for(i=0;i<sA0->GetNvert();i++) plA0.SetPoint(i,sA0->GetX(i),sA0->GetY(i));
830     for(i=0;i<sA1->GetNvert();i++) plA1.SetPoint(i,sA1->GetX(i),sA1->GetY(i));
831     for(i=0;i<sB0->GetNvert();i++) plB0.SetPoint(i,sB0->GetX(i),sB0->GetY(i));
832     for(i=0;i<sB1->GetNvert();i++) plB1.SetPoint(i,sB1->GetX(i),sB1->GetY(i));
833     canvas = new TCanvas("AliITSv11GeometrySPDFig0","",1000,1000);
834     canvas.Range(-3.,-3.,3.,3.);
835     txt.SetTextsize(0.05);
836     txt.SetTextAlign(33);
837     txt.SetTextColor(1);
838     txt.Draw(2.9,2.9,"Section A-A outer Carbon Fiber surface");
839     txt.SetTextColor(2);
840     txt.Draw(2.9,2.5,"Section A-A Inner Carbon Fiber surface");
841     txt.SetTextColor(3);
842     txt.Draw(2.9,2.1,"Section E-E outer Carbon Fiber surface");
843     txt.SetTextColor(4);
844     txt.Draw(2.9,1.7,"Section E-E Inner Carbon Fiber surface");
845     plA0.Draw();
846     plA1.Draw();
847     plB0.Draw();
848     plB1.Draw();
849     //pmA.Draw();
850     //pmB.Draw();
851     //
852     Char_t chr[3];
853     for(i=0;i<kNRadii;i++){
854         sprintf(chr,"%2d",i);txt.DrawLatex(x-0.1,y,chr);
855         sprintf(chr,"%8.4",);txt.DrawLatex(x,y,chr);
856         sprintf(chr,"%8.4",);txt.DrawLatex(x+0.5,y,chr);
857         sprintf(chr,"%8.4",);txt.DrawLatex(x+1.0,y,chr);
858         sprintf(chr,"%8.4",);txt.DrawLatex(x+1.5,y,chr);
859         sprintf(chr,"%8.4",);txt.DrawLatex(x+2.0,y,chr);
860         if() txt.DrawLatex(x+2.5,y,"A-A/E-E");
861         else txt.DrawLatex(x+2.5,y,"E-E");
862     } // end for i
863     txt.DrawLatex(x,y,"x_{c} mm");
864     txt.DrawLatex(x+0.5,y,"y_{c} mm");
865     txt.DrawLatex(x+1.0,y,"R mm");
866     txt.DrawLatex(x+1.5,y,"#theta_{start}^{#circle}");
867     txt.DrawLatex(x+2.0,y,"#theta_{end}^{#circle}");
868     txt.DrawLatex(x+2.5,y,"Section");
869     //
870 }