]>
Commit | Line | Data |
---|---|---|
db486a6e | 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> | |
bf86817c | 42 | //#include <TGeoRotation.h> |
43 | //#include <TGeoCombiTrans.h> | |
44 | //#include <TGeoTranslation.h> | |
db486a6e | 45 | #include "AliITSv11GeometrySPD.h" |
46 | ||
47 | ClassImp(AliITSv11GeometrySPD) | |
48 | ||
49 | #define SQ(A) (A)*(A) | |
50 | ||
51 | //______________________________________________________________________ | |
bf86817c | 52 | void AliITSv11GeometrySPD::CarbonFiberSector(TGeoVolume *moth){ |
db486a6e | 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: | |
bf86817c | 60 | // none. |
db486a6e | 61 | // Outputs: |
62 | // none. | |
63 | // Return: | |
bf86817c | 64 | // none. |
db486a6e | 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 | |
bf86817c | 93 | const Double_t ksecDip0 = 5.9*fgkmm; |
db486a6e | 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 | |
bf86817c | 101 | const Double_t ksecDip1 = 8.035*fgkmm; |
db486a6e | 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 | |
bf86817c | 109 | const Double_t ksecDip2 = 4.553*fgkmm; |
db486a6e | 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 | |
bf86817c | 117 | const Double_t ksecDip3 = 6.978*fgkmm; |
db486a6e | 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 | |
bf86817c | 125 | const Double_t ksecDip4 = 6.978*fgkmm; |
db486a6e | 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 | |
bf86817c | 133 | const Double_t ksecDip5 = 6.978*fgkmm; |
db486a6e | 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 | // | |
bf86817c | 143 | const Int_t ksecNRadii = 14; |
db486a6e | 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; | |
bf86817c | 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; | |
db486a6e | 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; | |
bf86817c | 167 | const Double_t ksecCoolTubeThick = 10.0*fgkmicron; |
db486a6e | 168 | // |
bf86817c | 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, | |
db486a6e | 173 | ksecX12,-1000.0}; |
bf86817c | 174 | Double_t secY[ksecNRadii] = {ksecY0,ksecY1,ksecY2,ksecY3,ksecY4,ksecY5, |
175 | ksecY6,ksecY7,ksecY8,ksecY9,ksecY10,ksecY11, | |
db486a6e | 176 | ksecY12,-1000.0}; |
bf86817c | 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] = { | |
db486a6e | 191 | ksecR0,ksecR1,ksecRCoolOut,ksecR2,ksecR3,ksecRCoolOut,ksecR4,ksecR5, |
192 | ksecRCoolOut,ksecR6,ksecR7,ksecRCoolOut,ksecR8,ksecR9,ksecRCoolOut, | |
193 | ksecR10,ksecR11,ksecRCoolOut,ksecR12,ksecR13}; | |
bf86817c | 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}; | |
db486a6e | 196 | const Int_t ksecDipIndex[ksecNCoolingTubeDips] = {2,5,8,11,14,17}; |
197 | Double_t secAngleStart[ksecNRadii]; | |
198 | Double_t secAngleEnd[ksecNRadii]; | |
bf86817c | 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]; | |
db486a6e | 204 | TGeoXtru *sA0,*sA1,*sB0,*sB1; |
205 | TGeoEltu *sTA0,*sTA1; | |
bf86817c | 206 | TGeoTube *sTB0,*sTB1; |
db486a6e | 207 | TGeoRotation *rot; |
208 | TGeoTranslation *trans; | |
209 | TGeoCombiTrans *rotrans; | |
210 | Double_t t,t0,t1,a,b,x0,y0,x1,y1; | |
bf86817c | 211 | Int_t i,j,k; |
db486a6e | 212 | |
213 | if(moth==0){ | |
214 | Error("CarbonFiberSector","moth=%p",moth); | |
bf86817c | 215 | return; |
db486a6e | 216 | } // end if moth==0 |
bf86817c | 217 | SetDebug(3); |
db486a6e | 218 | |
db486a6e | 219 | secAngleStart[0] = 0.5*ksecAngleSide13; |
220 | for(i=0;i<ksecNRadii-2;i++){ | |
db486a6e | 221 | AnglesForRoundedCorners(secX[i],secY[i],secR[i], |
bf86817c | 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]) | |
db486a6e | 225 | secAngleEnd[i] += 360.0; |
bf86817c | 226 | secAngleStart[i+1] = t1; |
db486a6e | 227 | } // end for i |
228 | secAngleEnd[ksecNRadii-2] = secAngleStart[ksecNRadii-2] + | |
bf86817c | 229 | (secAngleEnd[10]-secAngleStart[10]); |
db486a6e | 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]; | |
bf86817c | 233 | // |
db486a6e | 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]; | |
bf86817c | 239 | // Note, secR[i=0] <0; secR[j=12]>0; and secR[j+1=13] <0 |
db486a6e | 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]; | |
db486a6e | 248 | // |
f77f13c8 | 249 | if(AliDebugLevel()>=2){ |
bf86817c | 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 | |
db486a6e | 278 | } // end for k |
bf86817c | 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; | |
db486a6e | 331 | sA0 = new TGeoXtru(2); |
332 | sA0->SetName("ITS SPD Carbon fiber support Sector A0"); | |
bf86817c | 333 | sA0->DefinePolygon(j+1,xp,yp); |
db486a6e | 334 | sA0->DefineSection(0,-ksecDz); |
335 | sA0->DefineSection(1,ksecDz); | |
336 | // | |
bf86817c | 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; | |
db486a6e | 408 | sA1 = new TGeoXtru(2); |
409 | sA1->SetName("ITS SPD Carbon fiber support Sector Air A1"); | |
bf86817c | 410 | sA1->DefinePolygon(j+1,xp,yp); |
db486a6e | 411 | sA1->DefineSection(0,-ksecDz); |
412 | sA1->DefineSection(1,ksecDz); | |
413 | // | |
db486a6e | 414 | sTA0 = new TGeoEltu("ITS SPD Cooling Tube TA0", |
bf86817c | 415 | ksecDipRadii,0.5*ksecDipLength,ksecDz); |
db486a6e | 416 | sTA1 = new TGeoEltu("ITS SPD Cooling Tube coolant TA1", |
417 | sTA0->GetA()-ksecCoolTubeThick, | |
418 | sTA0->GetB()-ksecCoolTubeThick,ksecDz); | |
419 | // | |
bf86817c | 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 | |
db486a6e | 525 | // |
bf86817c | 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; | |
db486a6e | 623 | sB0 = new TGeoXtru(2); |
624 | sB0->SetName("ITS SPD Carbon fiber support Sector End B0"); | |
bf86817c | 625 | sB0->DefinePolygon(j+1,xp,yp); |
db486a6e | 626 | sB0->DefineSection(0,ksecDz); |
627 | sB0->DefineSection(1,ksecDz+ksecZEndLen); | |
628 | // | |
bf86817c | 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; | |
db486a6e | 667 | } // end for i |
bf86817c | 668 | if(GetDebug(3)) cout<<"{"<<xp[0]<<","<<yp[0]; |
669 | if(GetDebug(4)) cout<<","<< secAngleStart2[0]; | |
670 | if(GetDebug(3)) cout<<"}} j="<<j<<endl; | |
db486a6e | 671 | sB1 = new TGeoXtru(2); |
672 | sB1->SetName("ITS SPD Carbon fiber support Sector Air End B1"); | |
bf86817c | 673 | sB1->DefinePolygon(j+1,xp,yp); |
db486a6e | 674 | sB1->DefineSection(0,ksecDz); |
675 | sB1->DefineSection(1,ksecDz+ksecLen); | |
676 | sTB0 = new TGeoTube("ITS SPD Cooling Tube End TB0",0.0, | |
bf86817c | 677 | ksecRCoolIn,0.5*ksecLen); |
db486a6e | 678 | sTB1 = new TGeoTube("ITS SPD Cooling Tube End coolant TB0",0.0, |
679 | sTB0->GetRmax()-ksecCoolTubeThick,0.5*ksecLen); | |
680 | // | |
db486a6e | 681 | if(GetDebug()){ |
db486a6e | 682 | sA0->InspectShape(); |
683 | sA1->InspectShape(); | |
684 | sB0->InspectShape(); | |
685 | sB1->InspectShape(); | |
686 | } // end if GetDebug | |
687 | // | |
bf86817c | 688 | TGeoVolume *vM,*vA0,*vA1,*vTA0,*vTA1,*vB0,*vB1,*vTB0,*vTB1; |
689 | vM = moth; | |
db486a6e | 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 | |
bf86817c | 720 | vB1 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndAirB1",sB1,medSPDair); |
db486a6e | 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 | // | |
db486a6e | 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++){ | |
bf86817c | 744 | x0 = secX2[ksecDipIndex[i]]; |
745 | y0 = secY2[ksecDipIndex[i]]; | |
746 | trans = new TGeoTranslation("",x0,y0,0.0); | |
db486a6e | 747 | vB1->AddNode(vTB0,i+1,trans); |
bf86817c | 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; | |
db486a6e | 753 | } // end for i |
bf86817c | 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. | |
db486a6e | 757 | if(GetDebug()){ |
db486a6e | 758 | vA0->PrintNodes(); |
759 | vA1->PrintNodes(); | |
760 | vB0->PrintNodes(); | |
761 | vB1->PrintNodes(); | |
762 | } // end if GetDebug | |
763 | // | |
db486a6e | 764 | } |
765 | //______________________________________________________________________ | |
bf86817c | 766 | void AliITSv11GeometrySPD::HalfStave(TGeoVolume *moth){ |
db486a6e | 767 | // Define the detail SPD Half Stave geometry. |
768 | // Inputs: | |
769 | // none. | |
770 | // Outputs: | |
771 | // none. | |
772 | // Return: | |
773 | // none. | |
774 | ||
bf86817c | 775 | if(moth==0){ |
776 | Error("HalfStave","moth=%p",moth); | |
777 | return; | |
778 | } // end if moth==0 | |
db486a6e | 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; | |
bf86817c | 799 | Double_t x,y; |
db486a6e | 800 | |
bf86817c | 801 | sA0 = (TGeoXtru*) gGeomManager->GetVolume( |
db486a6e | 802 | "ITSSPDCarbonFiberSupportSectorA0_1")->GetShape(); |
bf86817c | 803 | sA1 = (TGeoXtru*) gGeomManager->GetVolume( |
db486a6e | 804 | "ITSSPDCarbonFiberSupportSectorAirA1_1")->GetShape(); |
bf86817c | 805 | sB0 = (TGeoXtru*) gGeomManager->GetVolume( |
db486a6e | 806 | "ITSSPDCarbonFiberSupportSectorEndB0_1")->GetShape(); |
bf86817c | 807 | sB1 = (TGeoXtru*) gGeomManager->GetVolume( |
db486a6e | 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 | |
bf86817c | 815 | plA0.SetPolyline(sA0->GetNvert()); |
db486a6e | 816 | plA0.SetLineColor(1); // black |
817 | plA0.SetLineStyle(1); | |
bf86817c | 818 | plA1.SetPolyline(sA1->GetNvert()); |
db486a6e | 819 | plA1.SetLineColor(2); // red |
820 | plA1.SetLineStyle(1); | |
bf86817c | 821 | plB0.SetPolyLine(sB0.GetNvert()); |
db486a6e | 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); | |
bf86817c | 834 | canvas.Range(-3.,-3.,3.,3.); |
835 | txt.SetTextsize(0.05); | |
db486a6e | 836 | txt.SetTextAlign(33); |
837 | txt.SetTextColor(1); | |
bf86817c | 838 | txt.Draw(2.9,2.9,"Section A-A outer Carbon Fiber surface"); |
db486a6e | 839 | txt.SetTextColor(2); |
bf86817c | 840 | txt.Draw(2.9,2.5,"Section A-A Inner Carbon Fiber surface"); |
db486a6e | 841 | txt.SetTextColor(3); |
bf86817c | 842 | txt.Draw(2.9,2.1,"Section E-E outer Carbon Fiber surface"); |
db486a6e | 843 | txt.SetTextColor(4); |
bf86817c | 844 | txt.Draw(2.9,1.7,"Section E-E Inner Carbon Fiber surface"); |
db486a6e | 845 | plA0.Draw(); |
846 | plA1.Draw(); | |
847 | plB0.Draw(); | |
848 | plB1.Draw(); | |
849 | //pmA.Draw(); | |
850 | //pmB.Draw(); | |
851 | // | |
db486a6e | 852 | Char_t chr[3]; |
853 | for(i=0;i<kNRadii;i++){ | |
854 | sprintf(chr,"%2d",i);txt.DrawLatex(x-0.1,y,chr); | |
bf86817c | 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"); | |
db486a6e | 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 | } |