]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITSv11GeometrySupport.cxx
Changing default for raw data layout
[u/mrichter/AliRoot.git] / ITS / AliITSv11GeometrySupport.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 <TMath.h>
27 // Root Geometry includes
28 //#include <AliLog.h>
29 #include <TGeoManager.h>
30 #include <TGeoVolume.h>
31 #include <TGeoPcon.h>
32 #include <TGeoCone.h>
33 #include <TGeoTube.h> // contaings TGeoTubeSeg
34 #include <TGeoArb8.h>
35 #include <TGeoXtru.h>
36 #include <TGeoCompositeShape.h>
37 #include <TGeoMatrix.h>
38 #include "AliITSv11GeometrySupport.h"
39
40 ClassImp(AliITSv11GeometrySupport)
41
42 #define SQ(A) (A)*(A)
43
44 //______________________________________________________________________
45 void AliITSv11GeometrySupport::SPDCone(TGeoVolume *moth,TGeoManager *mgr)
46 {
47 //
48 // Creates the SPD thermal shield as a volume assembly
49 // and adds it to the mother volume
50 // (this is actually a merge of the previous SPDThermalSheald method
51 // of AliITSv11GeometrySupport.cxx,v 1.9 2007/06/06 and the
52 // CreateSPDThermalShield method of AliITSv11Hybrid)
53 //
54 // Input:
55 //         moth : the TGeoVolume owing the volume structure
56 //         mgr  : the GeoManager (default gGeoManager)
57 // Output:
58 //
59 // Created:         ???          ???
60 // Updated:      11 Dec 2007  Mario Sitta
61 //
62 // Technical data are taken from:  ALICE-Thermal Screen "Cone transition"
63 // (thermal-screen1_a3.ps), "Cylinder" (thermal-screen2_a3.ps), "Half
64 // assembly" (thermal-screen3_a3.ps), "Flange" (thermal-screen4_a3.ps)
65
66
67   // Dimensions of the Central shield
68   const Double_t kHalfLengthCentral  = 400.*fgkmm;
69   const Double_t kThicknessCentral   = 0.4*fgkmm;
70   const Double_t kInnerRadiusCentral = 8.1475*fgkcm;
71   const Double_t kOuterRadiusCentral = 9.9255*fgkcm;
72   const Double_t kInnerACentral = 3.1674*fgkcm;
73   const Double_t kInnerBCentral = 2.023 *fgkcm;
74   const Double_t kOuterACentral = 2.4374*fgkcm;
75   const Double_t kOuterBCentral = 3.8162*fgkcm;
76   // Dimensions of the EndCap shield
77   const Double_t kHalfLengthEndCap  = 25.*fgkmm;
78   const Double_t kThicknessEndCap   = 2.0*fgkmm;
79   const Double_t kInnerRadiusEndCap = 8.0775*fgkcm;
80   const Double_t kOuterRadiusEndCap = 9.9955*fgkcm;
81   const Double_t kInnerAEndCap = 3.1453*fgkcm;
82   const Double_t kInnerBEndCap = 2.0009*fgkcm;
83   const Double_t kOuterAEndCap = 2.4596*fgkcm;
84   const Double_t kOuterBEndCap = 3.8384*fgkcm;
85   // Dimensions of the Cone shield
86   const Double_t kHalfLengthCone  = 145.*fgkmm;
87   const Double_t kThicknessCone   = 0.3*fgkmm;
88   const Double_t kInnerRadialCone = 37.3*fgkcm;
89   const Double_t kOuterRadialCone = 39.0*fgkcm;
90   const Double_t kInnerACone = 14.2344*fgkcm;
91   //  const Double_t kInnerBCone =  9.0915*fgkcm;
92   const Double_t kOuterACone =  9.5058*fgkcm;
93   //  const Double_t kOuterBCone = 14.8831*fgkcm;
94   // Dimensions of the Flange's Ring and Wing
95   const Double_t kHalfLengthRing  = 7.5*fgkmm;
96   const Double_t kThicknessRing   = 0.3*fgkmm;
97   const Double_t kInnerRadiusRing = 37.3*fgkcm;
98   const Double_t kOuterRadiusRing = 42.0*fgkcm;
99   const Double_t kOuterRadiusWing = 49.25*fgkcm;
100   const Double_t kWideWing  = 6.0*fgkcm;
101   const Double_t kThetaWing = 45.0;
102   // Common data
103   const Double_t kTheta = 36.0*TMath::DegToRad();
104   const Double_t kThicknessOmega = 0.3*fgkmm;
105
106   // Local variables
107   Double_t x, y;
108   Double_t xshld[24], yshld[24];
109   Double_t xair[24] , yair[24];
110   Double_t xomega[48], yomega[48];
111   //  Double_t *xyarb8;
112
113   // The entire shield is made up of two half central shields
114   // symmetric with respect to the XZ plane, four half end cap
115   // shields, again symmetric with respect to the XZ plane, and four
116   // half cones, symmetric with respect to the XZ plane too.
117
118   TGeoVolumeAssembly *vM = new TGeoVolumeAssembly("ITSspdThermalShield");
119
120   // The central half shield: a half tube of carbon fiber,
121   // a similar but proportionally smaller half tube of air inside it,
122   // and a Omega-shaped carbon fiber insert inside the air.
123   // They are all XTru shapes
124
125   TGeoXtru *centralshape = new TGeoXtru(2);
126
127   CreateSPDThermalShape(kInnerACentral,kInnerBCentral,kInnerRadiusCentral,
128                         kOuterACentral,kOuterBCentral,kOuterRadiusCentral,
129                         kTheta,xshld,yshld);
130
131   centralshape->DefinePolygon(24,xshld,yshld);
132   centralshape->DefineSection(0,-kHalfLengthCentral);
133   centralshape->DefineSection(1, kHalfLengthCentral);
134
135   // Now rescale to get the air volume dimensions
136     InsidePoint(xshld[23], yshld[23],
137                 xshld[ 0], yshld[ 0],
138                 xshld[ 1], yshld[ 1], kThicknessCentral,
139                 xair[0], yair[0]);
140   for (Int_t i=1; i<23; i++) {
141     InsidePoint(xshld[i-1], yshld[i-1],
142                 xshld[ i ], yshld[ i ],
143                 xshld[i+1], yshld[i+1], kThicknessCentral,
144                 xair[i], yair[i]);
145   }
146     InsidePoint(xshld[22], yshld[22],
147                 xshld[23], yshld[23],
148                 xshld[ 0], yshld[ 0], kThicknessCentral,
149                 xair[23], yair[23]);
150
151   // Create the air shape
152   TGeoXtru *centralairshape = new TGeoXtru(2);
153
154   centralairshape->DefinePolygon(24,xair,yair);
155   centralairshape->DefineSection(0,-kHalfLengthCentral);
156   centralairshape->DefineSection(1, kHalfLengthCentral);
157
158   // Create the Omega insert
159   TGeoXtru *centralomegashape = new TGeoXtru(2);
160
161   CreateSPDOmegaShape(xair,yair,kTheta,kThicknessOmega,xomega,yomega);
162
163   centralomegashape->DefinePolygon(48,xomega,yomega);
164   centralomegashape->DefineSection(0,-kHalfLengthCentral);
165   centralomegashape->DefineSection(1, kHalfLengthCentral);
166
167   // The end cap half shield: a half tube of carbon fiber,
168   // a similar but proportionally smaller half tube of air inside it,
169   // and a Omega-shaped carbon fiber insert inside the air.
170   // They are all XTru shapes
171
172   TGeoXtru *endcapshape = new TGeoXtru(2);
173
174   CreateSPDThermalShape(kInnerAEndCap,kInnerBEndCap,kInnerRadiusEndCap,
175                         kOuterAEndCap,kOuterBEndCap,kOuterRadiusEndCap,
176                         kTheta,xshld,yshld);
177
178   endcapshape->DefinePolygon(24,xshld,yshld);
179   endcapshape->DefineSection(0,-kHalfLengthEndCap);
180   endcapshape->DefineSection(1, kHalfLengthEndCap);
181
182   // Now rescale to get the air volume dimensions
183     InsidePoint(xshld[23], yshld[23],
184                 xshld[ 0], yshld[ 0],
185                 xshld[ 1], yshld[ 1], kThicknessEndCap,
186                 xair[0], yair[0]);
187   for (Int_t i=1; i<23; i++) {
188     InsidePoint(xshld[i-1], yshld[i-1],
189                 xshld[ i ], yshld[ i ],
190                 xshld[i+1], yshld[i+1], kThicknessEndCap,
191                 xair[i], yair[i]);
192   }
193     InsidePoint(xshld[22], yshld[22],
194                 xshld[23], yshld[23],
195                 xshld[ 0], yshld[ 0], kThicknessEndCap,
196                 xair[23], yair[23]);
197
198   // Create the air shape
199   TGeoXtru *endcapairshape = new TGeoXtru(2);
200
201   endcapairshape->DefinePolygon(24,xair,yair);
202   endcapairshape->DefineSection(0,-kHalfLengthEndCap);
203   endcapairshape->DefineSection(1, kHalfLengthEndCap);
204
205   // Create the Omega insert
206   TGeoXtru *endcapomegashape = new TGeoXtru(2);
207
208   CreateSPDOmegaShape(xair,yair,kTheta,kThicknessOmega,xomega,yomega);
209
210   endcapomegashape->DefinePolygon(48,xomega,yomega);
211   endcapomegashape->DefineSection(0,-kHalfLengthEndCap);
212   endcapomegashape->DefineSection(1, kHalfLengthEndCap);
213
214   // The cone half shield is more complex since there is no basic
215   // TGeo shape to describe it correctly. So it is made of a series
216   // of TGeoArb8 shapes filled with air, which all together make up the
217   // the cone AND its internal insert. Part of the following code is
218   // adapted from SPDThermalSheald method.
219
220   // Filled portions
221   TGeoArb8 *sC1 = new TGeoArb8(kHalfLengthCone);
222   TGeoArb8 *sC2 = new TGeoArb8(kHalfLengthCone);
223
224   CreateSPDThermalShape(kInnerACentral,kInnerBCentral,kInnerRadiusCentral,
225                         kOuterACentral,kOuterBCentral,kOuterRadiusCentral,
226                         kTheta,xshld,yshld);
227
228   sC1->SetVertex(0,xshld[12],yshld[12]);
229   sC1->SetVertex(1,xshld[11],yshld[11]);
230   sC1->SetVertex(2,xshld[ 0],yshld[ 0]);
231   sC1->SetVertex(3,xshld[23],yshld[23]);
232
233   sC2->SetVertex(0,xshld[11],yshld[11]);
234   sC2->SetVertex(1,xshld[10],yshld[10]);
235   sC2->SetVertex(2,xshld[ 1],yshld[ 1]);
236   sC2->SetVertex(3,xshld[ 0],yshld[ 0]);
237
238   // Drawings give only the radius, convert it to the apothegm
239   Double_t kInnerRadiusCone = TMath::Sqrt(kInnerRadialCone*kInnerRadialCone
240                                           - 0.25*kInnerACone*kInnerACone);
241   Double_t kOuterRadiusCone = TMath::Sqrt(kOuterRadialCone*kOuterRadialCone
242                                           - 0.25*kOuterACone*kOuterACone);
243
244   Double_t xco[4], yco[4], xci[4], yci[4];
245
246   for (Int_t i=0; i<2; i++) {
247     Double_t th = i*kTheta*TMath::RadToDeg();
248     xco[2*i  ] = kOuterRadiusCone*SinD(th) - 0.5*kOuterACone*CosD(th);
249     yco[2*i  ] = kOuterRadiusCone*CosD(th) + 0.5*kOuterACone*SinD(th);
250     xci[2*i  ] = kInnerRadiusCone*SinD(th) - 0.5*kInnerACone*CosD(th);
251     yci[2*i  ] = kInnerRadiusCone*CosD(th) + 0.5*kInnerACone*SinD(th);
252     xco[2*i+1] = kOuterRadiusCone*SinD(th) + 0.5*kOuterACone*CosD(th);
253     yco[2*i+1] = kOuterRadiusCone*CosD(th) - 0.5*kOuterACone*SinD(th);
254     xci[2*i+1] = kInnerRadiusCone*SinD(th) + 0.5*kInnerACone*CosD(th);
255     yci[2*i+1] = kInnerRadiusCone*CosD(th) - 0.5*kInnerACone*SinD(th);
256   }
257
258   sC1->SetVertex(4,xco[0],yco[0]);
259   sC1->SetVertex(5,xco[1],yco[1]);
260   sC1->SetVertex(6,xci[1],yci[1]);
261   sC1->SetVertex(7,xci[0],yci[0]);
262
263   sC2->SetVertex(4,xco[1],yco[1]);
264   sC2->SetVertex(5,xco[2],yco[2]);
265   sC2->SetVertex(6,xci[2],yci[2]);
266   sC2->SetVertex(7,xci[1],yci[1]);
267
268   // Air holes
269   TGeoArb8 *sCh1 = new TGeoArb8(kHalfLengthCone);
270   TGeoArb8 *sCh2 = new TGeoArb8(kHalfLengthCone);
271
272   for(Int_t i=0; i<4; i++){
273     InsidePoint(sC1->GetVertices()[((i+3)%4)*2+0],
274                 sC1->GetVertices()[((i+3)%4)*2+1],
275                 sC1->GetVertices()[i*2+0],
276                 sC1->GetVertices()[i*2+1],
277                 sC1->GetVertices()[((i+1)%4)*2+0],
278                 sC1->GetVertices()[((i+1)%4)*2+1],-kThicknessCone,x,y);
279     sCh1->SetVertex(i,x,y);
280
281     InsidePoint(sC1->GetVertices()[((i+3)%4 +4)*2+0],
282                 sC1->GetVertices()[((i+3)%4 +4)*2+1],
283                 sC1->GetVertices()[(i+4)*2+0],
284                 sC1->GetVertices()[(i+4)*2+1],
285                 sC1->GetVertices()[((i+1)%4 +4)*2+0],
286                 sC1->GetVertices()[((i+1)%4 +4)*2+1],-kThicknessCone,x,y);
287     sCh1->SetVertex(i+4,x,y);
288
289     InsidePoint(sC2->GetVertices()[((i+3)%4)*2+0],
290                 sC2->GetVertices()[((i+3)%4)*2+1],
291                 sC2->GetVertices()[i*2+0],
292                 sC2->GetVertices()[i*2+1],
293                 sC2->GetVertices()[((i+1)%4)*2+0],
294                 sC2->GetVertices()[((i+1)%4)*2+1],-kThicknessCone,x,y);
295     sCh2->SetVertex(i,x,y);
296
297     InsidePoint(sC2->GetVertices()[((i+3)%4 +4)*2+0],
298                 sC2->GetVertices()[((i+3)%4 +4)*2+1],
299                 sC2->GetVertices()[(i+4)*2+0],
300                 sC2->GetVertices()[(i+4)*2+1],
301                 sC2->GetVertices()[((i+1)%4 +4)*2+0],
302                 sC2->GetVertices()[((i+1)%4 +4)*2+1],-kThicknessCone,x,y);
303     sCh2->SetVertex(i+4,x,y);
304   }
305
306   // Finally the carbon fiber Ring with its Wings and their
307   // stesalite inserts. They are Tube and TubeSeg shapes
308
309   TGeoTube *ringshape = new TGeoTube(kInnerRadiusRing,kOuterRadiusRing,
310                                      kHalfLengthRing);
311
312   TGeoTube *ringinsertshape = new TGeoTube(kInnerRadiusRing+kThicknessRing,
313                                            kOuterRadiusRing-kThicknessRing,
314                                            kHalfLengthRing-kThicknessRing);
315
316   Double_t angleWideWing, angleWideWingThickness;
317   angleWideWing = (kWideWing/kOuterRadiusWing)*TMath::RadToDeg();
318   angleWideWingThickness = (kThicknessRing/kOuterRadiusWing)*TMath::RadToDeg();
319
320   TGeoTubeSeg *wingshape = new TGeoTubeSeg(kOuterRadiusRing,kOuterRadiusWing,
321                                            kHalfLengthRing, 0, angleWideWing);
322
323   TGeoTubeSeg *winginsertshape = new TGeoTubeSeg(kOuterRadiusRing,
324              kOuterRadiusWing-kThicknessRing, kHalfLengthRing-kThicknessRing,
325              angleWideWingThickness, angleWideWing-angleWideWingThickness);
326
327
328   // We have the shapes: now create the real volumes
329
330   TGeoMedium *medSPDcf  = mgr->GetMedium("ITS_SPD shield$");
331   TGeoMedium *medSPDair = mgr->GetMedium("ITS_SPD AIR$");
332   TGeoMedium *medSPDste = mgr->GetMedium("ITS_G10FR4$"); // stesalite
333
334   TGeoVolume *centralshield = new TGeoVolume("SPDcentralshield",
335                                              centralshape,medSPDcf);
336   centralshield->SetVisibility(kTRUE);
337   centralshield->SetLineColor(7);
338   centralshield->SetLineWidth(1);
339
340   TGeoVolume *centralairshield = new TGeoVolume("SPDcentralairshield",
341                                                 centralairshape,medSPDair);
342   centralairshield->SetVisibility(kTRUE);
343   centralairshield->SetLineColor(5); // Yellow
344   centralairshield->SetLineWidth(1);
345   centralairshield->SetFillColor(centralairshield->GetLineColor());
346   centralairshield->SetFillStyle(4090); // 90% transparent
347
348   TGeoVolume *centralomega = new TGeoVolume("SPDcentralomega",
349                                              centralomegashape,medSPDcf);
350   centralomega->SetVisibility(kTRUE);
351   centralomega->SetLineColor(7);
352   centralomega->SetLineWidth(1);
353
354   centralairshield->AddNode(centralomega,1,0);
355   centralshield->AddNode(centralairshield,1,0);
356
357   TGeoVolume *endcapshield = new TGeoVolume("SPDendcapshield",
358                                              endcapshape,medSPDcf);
359   endcapshield->SetVisibility(kTRUE);
360   endcapshield->SetLineColor(7);
361   endcapshield->SetLineWidth(1);
362
363   TGeoVolume *endcapairshield = new TGeoVolume("SPDendcapairshield",
364                                                 endcapairshape,medSPDair);
365   endcapairshield->SetVisibility(kTRUE);
366   endcapairshield->SetLineColor(5); // Yellow
367   endcapairshield->SetLineWidth(1);
368   endcapairshield->SetFillColor(endcapairshield->GetLineColor());
369   endcapairshield->SetFillStyle(4090); // 90% transparent
370
371   TGeoVolume *endcapomega = new TGeoVolume("SPDendcapomega",
372                                            endcapomegashape,medSPDcf);
373   endcapomega->SetVisibility(kTRUE);
374   endcapomega->SetLineColor(7);
375   endcapomega->SetLineWidth(1);
376
377   endcapairshield->AddNode(endcapomega,1,0);
378   endcapshield->AddNode(endcapairshield,1,0);
379
380   TGeoVolume *vC1 = new TGeoVolume("SPDconeshieldV1",sC1,medSPDcf);
381   vC1->SetVisibility(kTRUE);
382   vC1->SetLineColor(7);
383   vC1->SetLineWidth(1);
384
385   TGeoVolume *vCh1 = new TGeoVolume("SPDconeshieldH1",sCh1,medSPDair);
386
387   vCh1->SetVisibility(kTRUE);
388   vCh1->SetLineColor(5); // Yellow
389   vCh1->SetLineWidth(1);
390   vCh1->SetFillColor(vCh1->GetLineColor());
391   vCh1->SetFillStyle(4090); // 90% transparent
392
393   vC1->AddNode(vCh1,1,0);
394
395   TGeoVolume *vC2 = new TGeoVolume("SPDconeshieldV2",sC2,medSPDcf);
396
397   vC2->SetVisibility(kTRUE);
398   vC2->SetLineColor(7);
399   vC2->SetLineWidth(1);
400
401   TGeoVolume *vCh2 = new TGeoVolume("SPDconeshieldH2",sCh2,medSPDair);
402
403   vCh2->SetVisibility(kTRUE);
404   vCh2->SetLineColor(5); // Yellow
405   vCh2->SetLineWidth(1);
406   vCh2->SetFillColor(vCh2->GetLineColor());
407   vCh2->SetFillStyle(4090); // 90% transparent
408
409   vC2->AddNode(vCh2,1,0);
410
411   TGeoVolume *ring = new TGeoVolume("SPDshieldring",ringshape,medSPDcf);
412   ring->SetVisibility(kTRUE);
413   ring->SetLineColor(7);
414   ring->SetLineWidth(1);
415
416   TGeoVolume *ringinsert = new TGeoVolume("SPDshieldringinsert",
417                                           ringinsertshape,medSPDste);
418   ringinsert->SetVisibility(kTRUE);
419   ringinsert->SetLineColor(3); // Green
420 //  ringinsert->SetLineWidth(1);
421   ringinsert->SetFillColor(ringinsert->GetLineColor());
422   ringinsert->SetFillStyle(4010); // 10% transparent
423
424   ring->AddNode(ringinsert,1,0);
425
426   TGeoVolume *wing = new TGeoVolume("SPDshieldringwing",wingshape,medSPDcf);
427   wing->SetVisibility(kTRUE);
428   wing->SetLineColor(7);
429   wing->SetLineWidth(1);
430
431   TGeoVolume *winginsert = new TGeoVolume("SPDshieldringinsert",
432                                           winginsertshape,medSPDste);
433   winginsert->SetVisibility(kTRUE);
434   winginsert->SetLineColor(3); // Green
435 //  winginsert->SetLineWidth(1);
436   winginsert->SetFillColor(winginsert->GetLineColor());
437   winginsert->SetFillStyle(4010); // 10% transparent
438
439   wing->AddNode(winginsert,1,0);
440
441
442   // Add all volumes in the assembly
443   vM->AddNode(centralshield,1,0);
444   vM->AddNode(centralshield,2,new TGeoRotation("",180,0,0));
445
446   vM->AddNode(endcapshield,1,
447               new TGeoTranslation(0,0, kHalfLengthCentral+kHalfLengthEndCap));
448   vM->AddNode(endcapshield,2,
449               new TGeoTranslation(0,0,-kHalfLengthCentral-kHalfLengthEndCap));
450   vM->AddNode(endcapshield,3,new TGeoCombiTrans(
451               0, 0, kHalfLengthCentral+kHalfLengthEndCap,
452               new TGeoRotation("",180,0,0)     ) );
453   vM->AddNode(endcapshield,4,new TGeoCombiTrans(
454               0, 0,-kHalfLengthCentral-kHalfLengthEndCap,
455               new TGeoRotation("",180,0,0)     ) );
456
457   for (Int_t i=0; i<10; i++) {
458     Double_t thetaC12 = kTheta*TMath::RadToDeg();
459     vM->AddNode(vC1,2*i+1, new TGeoCombiTrans(
460                0, 0,  kHalfLengthCentral+2*kHalfLengthEndCap+kHalfLengthCone,
461                new TGeoRotation("",0,  0,i*thetaC12)   ) );
462     vM->AddNode(vC1,2*i+2, new TGeoCombiTrans(
463                0, 0, -kHalfLengthCentral-2*kHalfLengthEndCap-kHalfLengthCone,
464                new TGeoRotation("",0,180,i*thetaC12)   ) );
465     vM->AddNode(vC2,2*i+1, new TGeoCombiTrans(
466                0, 0,  kHalfLengthCentral+2*kHalfLengthEndCap+kHalfLengthCone,
467                new TGeoRotation("",0,  0,i*thetaC12)   ) );
468     vM->AddNode(vC2,2*i+2, new TGeoCombiTrans(
469                0, 0, -kHalfLengthCentral-2*kHalfLengthEndCap-kHalfLengthCone,
470                new TGeoRotation("",0,180,i*thetaC12)   ) );
471   }
472
473   vM->AddNode(ring,1,new TGeoTranslation(0, 0,
474               kHalfLengthCentral+2*kHalfLengthEndCap+2*kHalfLengthCone
475              +kHalfLengthRing));
476   vM->AddNode(ring,2,new TGeoTranslation(0, 0,
477              -kHalfLengthCentral-2*kHalfLengthEndCap-2*kHalfLengthCone
478              -kHalfLengthRing));
479
480   for (Int_t i=0; i<4; i++) {
481     Double_t thetaW = kThetaWing*(2*i+1);
482     vM->AddNode(wing,2*i+1,new TGeoCombiTrans(0, 0,
483               kHalfLengthCentral+2*kHalfLengthEndCap+2*kHalfLengthCone
484              +kHalfLengthRing, new TGeoRotation("",thetaW,0,0)  ));
485     vM->AddNode(wing,2*i+2,new TGeoCombiTrans(0, 0,
486              -kHalfLengthCentral-2*kHalfLengthEndCap-2*kHalfLengthCone
487              -kHalfLengthRing, new TGeoRotation("",thetaW,0,0)  ));
488   }
489
490   // Some debugging if requested
491   if(GetDebug(1)){
492     vM->PrintNodes();
493     vM->InspectShape();
494   }
495
496   // Finally put the entire shield in the mother volume
497   moth->AddNode(vM,1,0);
498
499   return;
500 }
501
502 //______________________________________________________________________
503 void AliITSv11GeometrySupport::CreateSPDThermalShape(
504      Double_t ina, Double_t inb, Double_t inr,
505      Double_t oua, Double_t oub, Double_t our,
506      Double_t   t, Double_t *x , Double_t *y )
507 {
508 //
509 // Creates the proper sequence of X and Y coordinates to determine
510 // the base XTru polygon for the SPD thermal shapes
511 //
512 // Input:
513 //        ina, inb : inner shape sides
514 //        inr      : inner radius
515 //        oua, oub : outer shape sides
516 //        our      : outer radius
517 //        t        : theta angle
518 //
519 // Output:
520 //        x, y : coordinate vectors [24]
521 //
522 // Created:      14 Nov 2007  Mario Sitta
523 // Updated:      11 Dec 2007  Mario Sitta
524 //
525   Double_t xlocal[6],ylocal[6];
526
527   //Create the first inner quadrant (X > 0)
528   FillSPDXtruShape(ina,inb,inr,t,xlocal,ylocal);
529   for (Int_t i=0; i<6; i++) {
530     x[i] = xlocal[i];
531     y[i] = ylocal[i];
532   }
533
534   // Then reflex on the second quadrant (X < 0)
535   for (Int_t i=0; i<6; i++) {
536     x[23-i] = -x[i];
537     y[23-i] =  y[i];
538   }
539
540   // Now create the first outer quadrant (X > 0)
541   FillSPDXtruShape(oua,oub,our,t,xlocal,ylocal);
542   for (Int_t i=0; i<6; i++) {
543     x[11-i] = xlocal[i];
544     y[11-i] = ylocal[i];
545   }
546
547   // Finally reflex on the second quadrant (X < 0)
548   for (Int_t i=0; i<6; i++) {
549     x[12+i] = -x[11-i];
550     y[12+i] =  y[11-i];
551   }
552
553   return;
554 }
555
556 //______________________________________________________________________
557 void AliITSv11GeometrySupport::CreateSPDOmegaShape(
558                              Double_t *xin, Double_t *yin, Double_t  t,
559                              Double_t    d, Double_t   *x, Double_t *y)
560 {
561 //
562 // Creates the proper sequence of X and Y coordinates to determine
563 // the SPD Omega XTru polygon
564 //
565 // Input:
566 //        xin, yin : coordinates of the air volume
567 //        d        : Omega shape thickness
568 //        t        : theta angle
569 //
570 // Output:
571 //        x, y     : coordinate vectors [48]
572 //
573 // Created:      17 Nov 2007  Mario Sitta
574 // Updated:      11 Dec 2007  Mario Sitta
575 //
576   Double_t xlocal[6],ylocal[6];
577
578   // First determine various parameters
579   Double_t ina = TMath::Sqrt( (xin[23]-xin[0])*(xin[23]-xin[0]) +
580                               (yin[23]-yin[0])*(yin[23]-yin[0]) );
581   Double_t inb = TMath::Sqrt( (xin[ 1]-xin[0])*(xin[ 1]-xin[0]) +
582                               (yin[ 1]-yin[0])*(yin[ 1]-yin[0]) );
583   Double_t inr = yin[0];
584   Double_t oua = TMath::Sqrt( (xin[12]-xin[11])*(xin[12]-xin[11]) +
585                               (yin[12]-yin[11])*(yin[12]-yin[11]) );
586   Double_t oub = TMath::Sqrt( (xin[10]-xin[11])*(xin[10]-xin[11]) +
587                               (yin[10]-yin[11])*(yin[10]-yin[11]) );
588   Double_t our = yin[11];
589
590   //Create the first inner pseudo-quadrant
591   FillSPDXtruShape(ina,inb,inr,t,xlocal,ylocal);
592   x[ 1] = xlocal[0];
593   y[ 1] = ylocal[0];
594
595   x[ 2] = xlocal[1];
596   y[ 2] = ylocal[1];
597
598   x[ 5] = xlocal[2];
599   y[ 5] = ylocal[2];
600
601   x[ 6] = xlocal[3];
602   y[ 6] = ylocal[3];
603
604   x[ 9] = xlocal[4];
605   y[ 9] = ylocal[4];
606
607   x[10] = xlocal[5];
608   y[10] = ylocal[5];
609
610   //Create the first outer pseudo-quadrant
611   FillSPDXtruShape(oua,oub,our,t,xlocal,ylocal);
612   x[23] = xlocal[0];
613   y[23] = ylocal[0];
614
615   x[20] = xlocal[1];
616   y[20] = ylocal[1];
617
618   x[19] = xlocal[2];
619   y[19] = ylocal[2];
620
621   x[16] = xlocal[3];
622   y[16] = ylocal[3];
623
624   x[15] = xlocal[4];
625   y[15] = ylocal[4];
626
627   x[11] = xlocal[5];
628   y[11] = ylocal[5];
629
630   //Create the second inner pseudo-quadrant
631   FillSPDXtruShape(ina+2*d,inb-2*d,inr+d,t,xlocal,ylocal);
632   x[22] = xlocal[0];
633   y[22] = ylocal[0];
634
635   x[21] = xlocal[1];
636   y[21] = ylocal[1];
637
638   x[18] = xlocal[2];
639   y[18] = ylocal[2];
640
641   x[17] = xlocal[3];
642   y[17] = ylocal[3];
643
644   x[14] = xlocal[4];
645   y[14] = ylocal[4];
646
647   x[13] = xlocal[5];
648   y[13] = ylocal[5];
649
650   //Create the second outer pseudo-quadrant
651   FillSPDXtruShape(oua-2*d,oub+2*d,our-d,t,xlocal,ylocal);
652   x[ 0] = xlocal[0];
653   y[ 0] = ylocal[0];
654
655   x[ 3] = xlocal[1];
656   y[ 3] = ylocal[1];
657
658   x[ 4] = xlocal[2];
659   y[ 4] = ylocal[2];
660
661   x[ 7] = xlocal[3];
662   y[ 7] = ylocal[3];
663
664   x[ 8] = xlocal[4];
665   y[ 8] = ylocal[4];
666
667   x[12] = xlocal[5];
668   y[12] = ylocal[5];
669
670   // These need to be fixed explicitly
671   y[10] = yin[5];
672   y[11] = yin[6];
673   x[12] = x[11];
674   y[12] = y[11] + d;
675   x[13] = x[10] + d;
676   y[13] = y[12];
677
678   // Finally reflex on the negative side
679   for (Int_t i=0; i<24; i++) {
680     x[24+i] = -x[23-i];
681     y[24+i] =  y[23-i];
682   }
683
684   // Wow ! We've finished
685   return;
686 }
687
688 //______________________________________________________________________
689 void AliITSv11GeometrySupport::FillSPDXtruShape(Double_t a, Double_t b,
690                                                 Double_t r, Double_t t,
691                                                 Double_t *x, Double_t *y)
692 {
693 //
694 // Creates the partial sequence of X and Y coordinates to determine
695 // the lateral part of the SPD thermal shield
696 //
697 // Input:
698 //        a, b : shape sides
699 //        r    : radius
700 //        t    : theta angle
701 //
702 // Output:
703 //        x, y : coordinate vectors [6]
704 //
705 // Created:      14 Nov 2007  Mario Sitta
706 //
707   x[0] = a/2;
708   y[0] = r;
709
710   x[1] = x[0] + b * TMath::Cos(t/2);
711   y[1] = y[0] - b * TMath::Sin(t/2);
712
713   x[2] = x[1] + a * TMath::Cos(t);
714   y[2] = y[1] - a * TMath::Sin(t);
715
716   x[3] = x[2] + b * TMath::Cos(3*t/2);
717   y[3] = y[2] - b * TMath::Sin(3*t/2);
718
719   x[4] = x[3] + a * TMath::Cos(2*t);
720   y[4] = y[3] - a * TMath::Sin(2*t);
721
722   x[5] = x[4];
723   y[5] = 0.;
724
725   return;
726 }
727
728 //______________________________________________________________________
729 void AliITSv11GeometrySupport::SDDCone(TGeoVolume *moth,TGeoManager *mgr){
730     // Define the detail SDD support cone geometry.
731     // Inputs:
732     //   TGeoVolume  *moth  The mother volume to place this object.
733     //   TGeoManager *mgr   The pointer to the Geo-Manager defaule gGeoManager
734     // Outputs:
735     //  none.
736     // Return:
737     //  none.
738     //
739     // From Cilindro Centrale - Lavorazioni, ALR 0816/1 04/08/03 File
740     // name SDD/Cilindro.hpgl
741     const Double_t ktsLength       = 790.0*fgkmm; // Thermal Sheeld length
742     const Double_t ktsInsertoLength= 15.0*fgkmm;    // ????
743     const Double_t ktsOuterR       = 0.5*(220.+10.)*fgkmm; // ????
744     const Double_t ktsInnerR       = 0.5*(220.-10.)*fgkmm; // ????
745     const Double_t ktscarbonFiberth= 0.02*fgkmm;     // ????
746     const Double_t ktsBoltDiameter = 6.0*fgkmm; // M6 screw
747     const Double_t ktsBoltDepth    = 6.0*fgkmm; // in volume sC
748     const Double_t ktsBoltRadius   = 0.5*220.*fgkmm; // Radius in volume sC
749     const Double_t ktsBoltAngle0   = 0.0*fgkDegree; // Angle in volume sC
750     const Double_t ktsBoltdAngle   = 30.0*fgkDegree; // Angle in Volume sC
751     Double_t x,y,z,t,t0,rmin,rmax;
752     Int_t i,n;
753     TGeoTube *sA,*sB,*sC,*sD;
754     TGeoTranslation *tran;
755     TGeoRotation *rot;
756     TGeoCombiTrans *rotran;
757     TGeoMedium *medSDDcf,*medSDDfs,*medSDDfo,*medSDDss;
758
759     sA = new TGeoTube("ITS SDD Central Cylinder",ktsInnerR,ktsOuterR,
760                      0.5*ktsLength);
761     sB = new TGeoTube("ITS SDD CC Foam",ktsInnerR+ktscarbonFiberth,
762                     ktsOuterR-ktscarbonFiberth,
763                     0.5*(ktsLength-2.0*ktsInsertoLength));
764     sC = new TGeoTube("ITS SDD CC Inserto",ktsInnerR+ktscarbonFiberth,
765                     ktsOuterR-ktscarbonFiberth,0.5*ktsLength);
766     sD = new TGeoTube("ITS SDD CC M6 bolt end",0.0,0.5*ktsBoltDiameter,
767                     0.5*ktsBoltDepth);
768     if(GetDebug(1)){
769         sA->InspectShape();
770         sB->InspectShape();
771         sC->InspectShape();
772         sD->InspectShape();
773     } // end if GetDebug(1)
774     //
775     medSDDcf = mgr->GetMedium("ITSssdCarbonFiber");
776     medSDDfs = mgr->GetMedium("ITSssdStaselite4411w");
777     medSDDfo = mgr->GetMedium("ITSssdRohacell50A");
778     medSDDss = mgr->GetMedium("ITSssdStainlessSteal");
779     TGeoVolume *vA,*vB,*vC,*vD;
780     vA = new TGeoVolume("ITSsddCentCylCF",sA,medSDDcf);
781     vA->SetVisibility(kTRUE);
782     vA->SetLineColor(4);
783     vA->SetLineWidth(1);
784     vA->SetFillColor(vA->GetLineColor());
785     vA->SetFillStyle(4030); // 30% transparent
786     vB = new TGeoVolume("ITSsddCentCylF",sB,medSDDfo);
787     vB->SetVisibility(kTRUE);
788     vB->SetLineColor(3);
789     vB->SetLineWidth(1);
790     vB->SetFillColor(vB->GetLineColor());
791     vB->SetFillStyle(4050); // 50% transparent
792     vC = new TGeoVolume("ITSsddCentCylSt",sC,medSDDfs);
793     vC->SetVisibility(kTRUE);
794     vC->SetLineColor(2);
795     vC->SetLineWidth(1);
796     vC->SetFillColor(vC->GetLineColor());
797     vC->SetFillStyle(4050); // 50% transparent
798     vD = new TGeoVolume("ITSsddCentCylSS",sD,medSDDss);
799     vD->SetVisibility(kTRUE);
800     vD->SetLineColor(1);
801     vD->SetLineWidth(1);
802     vD->SetFillColor(vD->GetLineColor());
803     vD->SetFillStyle(4050); // 50% transparent
804     //
805     moth->AddNode(vA,1,0);
806     vA->AddNode(vC,1,0);
807     vC->AddNode(vB,1,0);
808     n = (Int_t)((360.*fgkDegree)/ktsBoltdAngle);
809     for(i=0;i<n;i++){
810         t = ktsBoltAngle0+((Double_t)i)*ktsBoltdAngle;
811         x = ktsBoltRadius*CosD(t);
812         y = ktsBoltRadius*SinD(t);
813         z = 0.5*(ktsLength-ktsBoltDepth);
814         tran = new TGeoTranslation("",x,y,z);
815         vC->AddNode(vD,i+1,tran);
816         tran = new TGeoTranslation("",x,y,-z);
817         vC->AddNode(vD,i+n+1,tran);
818     } // end for i
819     if(GetDebug(1)){
820         vA->PrintNodes();
821         vB->PrintNodes();
822         vC->PrintNodes();
823         vD->PrintNodes();
824     } // end if
825     // SDD Suport Cone
826     //
827     //
828     const Double_t kconThickness    = 10.5*fgkmm;//Thickness Rohacell+car. fib.
829     const Double_t kconCthick       = 1.5*fgkmm; // Carbon finber thickness
830     const Double_t kconRcurv        = 15.0*fgkmm; // Radius of curvature.
831     const Double_t kconTc           = 45.0; // angle of SDD cone [degrees].
832     const Double_t kconZouterMilled = 23.0*fgkmm;
833     const Double_t kconZcylinder    = 186.0*fgkmm;
834     // fudge factor of 0.05cm.
835     const Double_t kconZ0           = kconZcylinder + 0.5*ktsLength+0.05;
836     //const Int_t kconNspoaks         = 12;
837     //const Int_t kconNmounts         = 4;
838     //const Double_t kconDmountAngle  = 9.0; // degrees
839     const Double_t kconRoutMax      = 0.5*560.0*fgkmm;
840     const Double_t kconRoutMin      = 0.5*539.0*fgkmm;
841     // Holes in cone for cables
842     const Double_t kconPhiHole1     = 0.0*fgkDegree;
843     const Double_t kcondPhiHole1    = 25.0*fgkDegree;
844     const Double_t kconRholeMax1    = 0.5*528.*fgkmm;
845     const Double_t kconRholeMin1    = 0.5*464.*fgkmm;
846     const Double_t kconPhiHole2     = 0.0*fgkDegree;
847     const Double_t kcondPhiHole2    = 50.0*fgkDegree;
848     const Double_t kconRholeMax2    = 0.5*375.*fgkmm;
849     const Double_t kconRholeMin2    = 0.5*280.*fgkmm;
850     //
851     //const Int_t kconNpostsOut       = 6;
852     //const Int_t kconNpostsIn        = 3;
853     //const Double_t kconPhi0PostOut  = 0.0; // degree
854     //const Double_t kconPhi0PostIn   = 0.0; // degree
855     //const Double_t kcondRpostOut    = 16.0*fgkmm;
856     //const Double_t kcondRpostIn     = 16.0*fgkmm;
857     //const Double_t kconZpostMaxOut  = 116.0*fgkmm;
858     //const Double_t kconZpostMaxIn   = 190.0*fgkmm;
859     const Double_t kconRinMax       = 0.5*216*fgkmm;
860     const Double_t kconRinCylinder  = 0.5*231.0*fgkmm;
861     //const Double_t kconRinHole      = 0.5*220.0*fgkmm;
862     const Double_t kconRinMin       = 0.5*210.0*fgkmm;
863     const Double_t kcondZin         = 15.0*fgkmm; // ???
864     const Double_t kSinkconTc       = SinD(kconTc);
865     const Double_t kCoskconTc       = CosD(kconTc);
866     const Double_t kTankconTc       = TanD(kconTc);
867     //
868     TGeoPcon *sE,*sF,*sG,*sH,*sI,*sJ,*sK;
869     TGeoCompositeShape *sL,*sM,*sN;
870     //
871     Double_t dza = kconThickness/kSinkconTc-
872         (kconRoutMax-kconRoutMin)/kTankconTc;
873     if(dza<=0){ // The number or order of the points are in error for a proper
874      // call to pcons!
875      Error("SDDcone","The definition of the points for a call to PCONS is"
876            " in error. abort.");
877      return;
878     } // end if
879     sE = new TGeoPcon("ITSsddSuportConeCarbonFiberSurfaceE",0.0,360.0,12);
880     sE->Z(0)    = 0.0;
881     sE->Rmin(0) = kconRoutMin;
882     sE->Rmax(0) = kconRoutMax;
883     sE->Z(1)    = kconZouterMilled - dza;
884     sE->Rmin(1) = sE->GetRmin(0);
885     sE->Rmax(1) = sE->GetRmax(0);
886     sE->Z(2)    = kconZouterMilled;
887     sE->Rmax(2) = sE->GetRmax(0);
888     RadiusOfCurvature(kconRcurv,0.,sE->GetZ(1),sE->GetRmin(1),kconTc,z,rmin);
889     sE->Z(3)    = z;
890     sE->Rmin(3) = rmin;
891     sE->Rmin(2) = RminFrom2Points(sE,3,1,sE->GetZ(2));
892     RadiusOfCurvature(kconRcurv,0.,sE->GetZ(2),sE->GetRmax(2),kconTc,z,rmax);
893     sE->Z(4)    = z;
894     sE->Rmax(4) = rmax;
895     sE->Rmin(4) = RminFromZpCone(sE,3,kconTc,sE->GetZ(4),0.0);
896     sE->Rmax(3) = RmaxFrom2Points(sE,4,2,sE->GetZ(3));
897     sE->Rmin(7) = kconRinMin;
898     sE->Rmin(8) = kconRinMin;
899     RadiusOfCurvature(kconRcurv,90.0,0.0,kconRinMax,90.0-kconTc,z,rmax);
900     sE->Rmax(8) = rmax;
901     sE->Z(8)    = ZFromRmaxpCone(sE,4,kconTc,sE->GetRmax(8));
902     sE->Z(9)    = kconZcylinder;
903     sE->Rmin(9) = kconRinMin;
904     sE->Z(10)    = sE->GetZ(9);
905     sE->Rmin(10) = kconRinCylinder;
906     sE->Rmin(11) = kconRinCylinder;
907     sE->Rmax(11) = sE->GetRmin(11);
908     rmin         = sE->GetRmin(8);
909     RadiusOfCurvature(kconRcurv,90.0-kconTc,sE->GetZ(8),sE->GetRmax(8),90.0,
910                       z,rmax);
911     rmax = kconRinMax;
912     sE->Z(11)    = z+(sE->GetZ(8)-z)*(sE->GetRmax(11)-rmax)/
913                                            (sE->GetRmax(8)-rmax);
914     sE->Rmax(9) = RmaxFrom2Points(sE,11,8,sE->GetZ(9));
915     sE->Rmax(10) = sE->GetRmax(9);
916     sE->Z(6)    = z-kcondZin;
917     sE->Z(7)    = sE->GetZ(6);
918     sE->Rmax(6) = RmaxFromZpCone(sE,4,kconTc,sE->GetZ(6));
919     sE->Rmax(7) = sE->GetRmax(6);
920     RadiusOfCurvature(kconRcurv,90.,sE->GetZ(6),0.0,90.0-kconTc,z,rmin);
921     sE->Z(5)    = z;
922     sE->Rmin(5) = RminFromZpCone(sE,3,kconTc,z);
923     sE->Rmax(5) = RmaxFromZpCone(sE,4,kconTc,z);
924     RadiusOfCurvature(kconRcurv,90.-kconTc,0.0,sE->Rmin(5),90.0,z,rmin);
925     sE->Rmin(6) = rmin;
926     // Inner Core, Inserto material
927     sF = new TGeoPcon("ITSsddSuportConeInsertoStesaliteF",0.,360.0,9);
928     sF->Z(0)    = sE->GetZ(0);
929     sF->Rmin(0) = sE->GetRmin(0)+kconCthick;
930     sF->Rmax(0) = sE->GetRmax(0)-kconCthick;
931     sF->Z(1)    = sE->GetZ(1);
932     sF->Rmin(1) = sF->GetRmin(0);
933     sF->Rmax(1) = sF->GetRmax(0);
934     sF->Z(2)    = sE->GetZ(2);
935     sF->Rmax(2) = sF->GetRmax(1);
936     RadiusOfCurvature(kconRcurv-kconCthick,0.,sF->GetZ(1),sF->GetRmax(1),
937                       kconTc,z,rmin);
938     sF->Z(3)    = z;
939     sF->Rmin(3) = rmin;
940     sF->Rmin(2) = RminFrom2Points(sF,3,1,sF->GetZ(2));
941     RadiusOfCurvature(kconRcurv+kconCthick,0.,sF->GetZ(2),sF->GetRmax(2),
942                       kconTc,z,rmax);
943     sF->Z(4)    = z;
944     sF->Rmax(4) = rmax;
945     sF->Rmin(4) = RmaxFromZpCone(sE,2,kconTc,sF->GetZ(4),
946                                                    -kconCthick);
947     sF->Rmax(3) = RmaxFrom2Points(sF,4,2,sF->GetZ(3));
948     sF->Rmin(7) = sE->GetRmin(7);
949     sF->Rmin(8) = sE->GetRmin(8);
950     sF->Z(6)    = sE->GetZ(6)+kconCthick;
951     sF->Rmin(6) = sE->GetRmin(6);
952     sF->Z(7)    = sF->GetZ(6);
953     sF->Rmax(8) = sE->GetRmax(8)-kconCthick*kSinkconTc;
954     RadiusOfCurvature(kconRcurv+kconCthick,90.0,sF->GetZ(6),sF->GetRmin(6),
955                       90.0-kconTc,z,rmin);
956     sF->Z(5)    = z;
957     sF->Rmin(5) = rmin;
958     sF->Rmax(5) = RmaxFromZpCone(sF,4,kconTc,z);
959     sF->Rmax(6) = RmaxFromZpCone(sF,4,kconTc,sF->GetZ(6));
960     sF->Rmax(7) = sF->GetRmax(6);
961     sF->Z(8)    = ZFromRmaxpCone(sF,4,kconTc,sF->GetRmax(8),-kconCthick);
962     // Inner Core, Inserto material
963     sG = new TGeoPcon("ITSsddSuportConeFoamCoreG",0.0,360.0,4);
964     RadiusOfCurvature(kconRcurv+kconCthick,0.0,sF->GetZ(1),sF->GetRmin(1),
965                       kconTc,z,rmin);
966     sG->Z(0)    = z;
967     sG->Rmin(0) = rmin;
968     sG->Rmax(0) = sG->GetRmin(0);
969     sG->Z(1)    = sG->GetZ(0)+(kconThickness-2.0*kconCthick)/kSinkconTc;;
970     sG->Rmin(1) = RminFromZpCone(sF,3,kconTc,sG->GetZ(1));
971     sG->Rmax(1) = RmaxFromZpCone(sF,4,kconTc,sG->GetZ(1));
972     sG->Z(2)    = sE->GetZ(5)-kconCthick;
973     sG->Rmin(2) = RminFromZpCone(sF,3,kconTc,sG->GetZ(2));
974     sG->Rmax(2) = RmaxFromZpCone(sF,4,kconTc,sG->GetZ(2));
975     sG->Z(3)    = sF->GetZ(5)+(kconThickness-2.0*kconCthick)*kCoskconTc;
976     sG->Rmax(3) = RmaxFromZpCone(sF,4,kconTc,sG->GetZ(3));
977     sG->Rmin(3) = sG->GetRmax(3);
978     //
979     sH = new TGeoPcon("ITSsddSuportConeHoleH",kconPhiHole1,kcondPhiHole1,4);
980     sH->Rmin(0) = kconRholeMax1;
981     sH->Rmax(0) = sH->GetRmin(0);
982     sH->Z(0)    = ZFromRminpCone(sE,3,kconTc,sH->GetRmin(0));
983     sH->Rmax(1) = sH->GetRmax(0);
984     sH->Z(1)    = ZFromRmaxpCone(sE,4,kconTc,sH->GetRmax(1));
985     sH->Rmin(1) = RminFromZpCone(sE,3,kconTc,sH->GetZ(1));
986     sH->Rmin(2) = kconRholeMin1;
987     sH->Z(2)    = ZFromRminpCone(sE,3,kconTc,sH->GetRmin(2));
988     sH->Rmax(2) = RmaxFromZpCone(sE,4,kconTc,sH->GetZ(2));
989     sH->Rmin(3) = sH->GetRmin(2);
990     sH->Rmax(3) = sH->GetRmin(3);
991     sH->Z(3)    = ZFromRminpCone(sE,3,kconTc,sH->GetRmin(3));
992     //
993     x = kconCthick/(0.5*(kconRholeMax1+kconRholeMin1));
994     t0 = kconPhiHole1 - x*fgkRadian;
995     t  = kcondPhiHole1 + 2.0*x*fgkRadian;
996     sI = new TGeoPcon("ITSsddSuportConeHoleI",t0,t,4);
997     sI->Rmin(0) = kconRholeMax1+kconCthick;
998     sI->Rmax(0) = sI->GetRmin(0);
999     sI->Z(0)    = ZFromRminpCone(sF,3,kconTc,sI->GetRmin(0));
1000     sI->Rmax(1) = sI->GetRmax(0);
1001     sI->Z(1)    = ZFromRmaxpCone(sF,4,kconTc,sI->GetRmax(1));
1002     sI->Rmin(1) = RminFromZpCone(sF,3,kconTc,sI->GetZ(1));
1003     sI->Rmin(2) = kconRholeMin1-kconCthick;
1004     sI->Z(2)    = ZFromRminpCone(sF,3,kconTc,sI->GetRmin(2));
1005     sI->Rmax(2) = RmaxFromZpCone(sF,4,kconTc,sI->GetZ(2));
1006     sI->Rmin(3) = sI->GetRmin(2);
1007     sI->Rmax(3) = sI->GetRmin(3);
1008     sI->Z(3)    = ZFromRmaxpCone(sF,4,kconTc,sI->GetRmax(3));
1009     //
1010     sJ = new TGeoPcon("ITSsddSuportConeHoleJ",kconPhiHole2,
1011                                 kcondPhiHole2,4);
1012     sJ->Rmin(0) = kconRholeMax2;
1013     sJ->Rmax(0) = sJ->GetRmin(0);
1014     sJ->Z(0)    = ZFromRminpCone(sE,3,kconTc,sJ->GetRmin(0));
1015     sJ->Rmax(1) = sJ->GetRmax(0);
1016     sJ->Z(1)    = ZFromRmaxpCone(sE,4,kconTc,sJ->GetRmax(1));
1017     sJ->Rmin(1) = RminFromZpCone(sE,3,kconTc,sJ->GetZ(1));
1018     sJ->Rmin(2) = kconRholeMin2;
1019     sJ->Z(2)    = ZFromRminpCone(sE,3,kconTc,sJ->GetRmin(2));
1020     sJ->Rmax(2) = RmaxFromZpCone(sE,4,kconTc,sJ->GetZ(2));
1021     sJ->Rmin(3) = sJ->GetRmin(2);
1022     sJ->Rmax(3) = sJ->GetRmin(3);
1023     sJ->Z(3)    = ZFromRmaxpCone(sE,4,kconTc,sJ->GetRmax(3));
1024     //
1025     x = kconCthick/(0.5*(kconRholeMax2+kconRholeMin2));
1026     t0 = kconPhiHole2 - x*fgkRadian;
1027     t  = kcondPhiHole2 + 2.0*x*fgkRadian;
1028     sK = new TGeoPcon("ITSsddSuportConeHoleK",t0,t,4);
1029     sK->Rmin(0) = kconRholeMax2+kconCthick;
1030     sK->Rmax(0) = sK->GetRmin(0);
1031     sK->Z(0)    = ZFromRminpCone(sF,3,kconTc,sK->GetRmin(0));
1032     sK->Rmax(1) = sK->GetRmax(0);
1033     sK->Z(1)    = ZFromRmaxpCone(sF,4,kconTc,sK->GetRmax(1));
1034     sK->Rmin(1) = RminFromZpCone(sF,3,kconTc,sK->GetZ(1));
1035     sK->Rmin(2) = kconRholeMin2-kconCthick;
1036     sK->Z(2)    = ZFromRminpCone(sF,3,kconTc,sK->GetRmin(2));
1037     sK->Rmax(2) = RmaxFromZpCone(sF,4,kconTc,sK->GetZ(2));
1038     sK->Rmin(3) = sK->GetRmin(2);
1039     sK->Rmax(3) = sK->GetRmin(3);
1040     sK->Z(3)    = ZFromRmaxpCone(sF,4,kconTc,sK->GetRmax(3));
1041     //
1042     rot = new TGeoRotation("ITSsddRotZ30",0.0,0.0,30.0);
1043     rot->RegisterYourself();
1044     if(GetDebug(1)) rot->Print();
1045     rot = new TGeoRotation("ITSsddRotZ60",0.0,0.0,60.0);
1046     rot->RegisterYourself();
1047     if(GetDebug(1)) rot->Print();
1048     rot = new TGeoRotation("ITSsddRotZ90",0.0,0.0,90.0);
1049     rot->RegisterYourself();
1050     if(GetDebug(1)) rot->Print();
1051     rot = new TGeoRotation("ITSsddRotZ120",0.0,0.0,120.0);
1052     rot->RegisterYourself();
1053     if(GetDebug(1)) rot->Print();
1054     rot = new TGeoRotation("ITSsddRotZ150",0.0,0.0,150.0);
1055     rot->RegisterYourself();
1056     if(GetDebug(1)) rot->Print();
1057     rot = new TGeoRotation("ITSsddRotZ180",0.0,0.0,180.0);
1058     rot->RegisterYourself();
1059     if(GetDebug(1)) rot->Print();
1060     rot = new TGeoRotation("ITSsddRotZ210",0.0,0.0,210.0);
1061     rot->RegisterYourself();
1062     if(GetDebug(1)) rot->Print();
1063     rot = new TGeoRotation("ITSsddRotZ240",0.0,0.0,240.0);
1064     rot->RegisterYourself();
1065     if(GetDebug(1)) rot->Print();
1066     rot = new TGeoRotation("ITSsddRotZ270",0.0,0.0,270.0);
1067     rot->RegisterYourself();
1068     if(GetDebug(1)) rot->Print();
1069     rot = new TGeoRotation("ITSsddRotZ300",0.0,0.0,300.0);
1070     rot->RegisterYourself();
1071     if(GetDebug(1)) rot->Print();
1072     rot = new TGeoRotation("ITSsddRotZ330",0.0,0.0,330.0);
1073     rot->RegisterYourself();
1074     if(GetDebug(1)) rot->Print();
1075     sL = new TGeoCompositeShape("ITS SDD Suport Cone","((((((((((((((((("
1076                                 "ITSsddSuportConeCarbonFiberSurfaceE -"
1077                                 "ITSsddSuportConeHoleH)  -"
1078                                 "ITSsddSuportConeHoleH:ITSsddRotZ30) -"
1079                                 "ITSsddSuportConeHoleH:ITSsddRotZ60) -"
1080                                 "ITSsddSuportConeHoleH:ITSsddRotZ90) -"
1081                                 "ITSsddSuportConeHoleH:ITSsddRotZ120) -"
1082                                 "ITSsddSuportConeHoleH:ITSsddRotZ150) -"
1083                                 "ITSsddSuportConeHoleH:ITSsddRotZ180) -"
1084                                 "ITSsddSuportConeHoleH:ITSsddRotZ210) -"
1085                                 "ITSsddSuportConeHoleH:ITSsddRotZ240) -"
1086                                 "ITSsddSuportConeHoleH:ITSsddRotZ270) -"
1087                                 "ITSsddSuportConeHoleH:ITSsddRotZ300) -"
1088                                 "ITSsddSuportConeHoleH:ITSsddRotZ330) -"
1089                                 "ITSsddSuportConeHoleJ)  -"
1090                                 "ITSsddSuportConeHoleJ:ITSsddRotZ60) -"
1091                                 "ITSsddSuportConeHoleJ:ITSsddRotZ120) -"
1092                                 "ITSsddSuportConeHoleJ:ITSsddRotZ180) -"
1093                                "ITSsddSuportConeHoleJ:ITSsddRotZ240) -"
1094                                 "ITSsddSuportConeHoleJ:ITSsddRotZ300");
1095     sM = new TGeoCompositeShape("ITS SDD Suport Cone Inserto Stesalite",
1096                                 "((((((((((((((((("
1097                                 "ITSsddSuportConeInsertoStesaliteF -"
1098                                 "ITSsddSuportConeHoleI)  -"
1099                                 "ITSsddSuportConeHoleI:ITSsddRotZ30) -"
1100                                 "ITSsddSuportConeHoleI:ITSsddRotZ60) -"
1101                                 "ITSsddSuportConeHoleI:ITSsddRotZ90) -"
1102                                 "ITSsddSuportConeHoleI:ITSsddRotZ120) -"
1103                                 "ITSsddSuportConeHoleI:ITSsddRotZ150) -"
1104                                 "ITSsddSuportConeHoleI:ITSsddRotZ180) -"
1105                                 "ITSsddSuportConeHoleI:ITSsddRotZ210) -"
1106                                 "ITSsddSuportConeHoleI:ITSsddRotZ240) -"
1107                                 "ITSsddSuportConeHoleI:ITSsddRotZ270) -"
1108                                 "ITSsddSuportConeHoleI:ITSsddRotZ300) -"
1109                                 "ITSsddSuportConeHoleI:ITSsddRotZ330) -"
1110                                 "ITSsddSuportConeHoleK)  -"
1111                                 "ITSsddSuportConeHoleK:ITSsddRotZ60) -"
1112                                 "ITSsddSuportConeHoleK:ITSsddRotZ120) -"
1113                                 "ITSsddSuportConeHoleK:ITSsddRotZ180) -"
1114                                 "ITSsddSuportConeHoleK:ITSsddRotZ240) -"
1115                                 "ITSsddSuportConeHoleK:ITSsddRotZ300");
1116     sN = new TGeoCompositeShape("ITS SDD Suport Cone Foam Core",
1117                                 "((((((((((((((((("
1118                                 "ITSsddSuportConeFoamCoreG -"
1119                                 "ITSsddSuportConeHoleI)  -"
1120                                 "ITSsddSuportConeHoleI:ITSsddRotZ30) -"
1121                                 "ITSsddSuportConeHoleI:ITSsddRotZ60) -"
1122                                 "ITSsddSuportConeHoleI:ITSsddRotZ90) -"
1123                                 "ITSsddSuportConeHoleI:ITSsddRotZ120) -"
1124                                 "ITSsddSuportConeHoleI:ITSsddRotZ150) -"
1125                                 "ITSsddSuportConeHoleI:ITSsddRotZ180) -"
1126                                 "ITSsddSuportConeHoleI:ITSsddRotZ210) -"
1127                                 "ITSsddSuportConeHoleI:ITSsddRotZ240) -"
1128                                 "ITSsddSuportConeHoleI:ITSsddRotZ270) -"
1129                                 "ITSsddSuportConeHoleI:ITSsddRotZ300) -"
1130                                 "ITSsddSuportConeHoleI:ITSsddRotZ330) -"
1131                                 "ITSsddSuportConeHoleK)  -"
1132                                 "ITSsddSuportConeHoleK:ITSsddRotZ60) -"
1133                                 "ITSsddSuportConeHoleK:ITSsddRotZ120) -"
1134                                 "ITSsddSuportConeHoleK:ITSsddRotZ180) -"
1135                                 "ITSsddSuportConeHoleK:ITSsddRotZ240) -"
1136                                 "ITSsddSuportConeHoleK:ITSsddRotZ300");
1137     //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1138     if(GetDebug(1)){
1139         sE->InspectShape();
1140         sF->InspectShape();
1141         sG->InspectShape();
1142         sH->InspectShape();
1143         sI->InspectShape();
1144         sJ->InspectShape();
1145         sK->InspectShape();
1146         sL->InspectShape();
1147         sM->InspectShape();
1148         sN->InspectShape();
1149     } // end if GetDebug(1)
1150     //
1151     TGeoVolume *vL,*vM,*vN;
1152     vL = new TGeoVolume("ITSsddConeL",sL,medSDDcf);
1153     vL->SetVisibility(kTRUE);
1154     vL->SetLineColor(4);
1155     vL->SetLineWidth(1);
1156     vL->SetFillColor(vL->GetLineColor());
1157     vL->SetFillStyle(4000); // 0% transparent
1158     vM = new TGeoVolume("ITSsddConeM",sM,medSDDfs);
1159     vM->SetVisibility(kTRUE);
1160     vM->SetLineColor(2);
1161     vM->SetLineWidth(1);
1162     vM->SetFillColor(vM->GetLineColor());
1163     vM->SetFillStyle(4010); // 10% transparent
1164     vN = new TGeoVolume("ITSsddConeN",sN,medSDDfo);
1165     vN->SetVisibility(kTRUE);
1166     vN->SetLineColor(7);
1167     vN->SetLineWidth(1);
1168     vN->SetFillColor(vN->GetLineColor());
1169     vN->SetFillStyle(4050); // 50% transparent
1170     //
1171     vM->AddNode(vN,1,0);
1172     vL->AddNode(vM,1,0);
1173     tran = new TGeoTranslation("",0.0,0.0,-kconZ0);
1174     moth->AddNode(vL,1,tran);
1175     rot = new TGeoRotation("",0.0,180.0*fgkDegree,0.0);
1176     rotran = new TGeoCombiTrans("",0.0,0.0,kconZ0,rot);
1177     moth->AddNode(vL,2,rotran);
1178     if(GetDebug(1)){
1179         tran->Print();
1180         rot->Print();
1181         rotran->Print();
1182         vL->PrintNodes();
1183         vM->PrintNodes();
1184         vN->PrintNodes();
1185     } // end if
1186     //delete rot;// rot not explicity used in AddNode functions.
1187 }
1188 //______________________________________________________________________
1189 void AliITSv11GeometrySupport::SSDCone(TGeoVolume *moth,TGeoManager *mgr){
1190     // Define the detail SSD support cone geometry.
1191     // Inputs:
1192     //   TGeoVolume  *moth  The mother volume to place this object.
1193     //   TGeoManager *mgr   A pointer to the Geo-Manager default gGeoManager
1194     // Outputs:
1195     //  none.
1196     // Return:
1197     //  none.
1198     //
1199     Int_t i,j;
1200     Double_t t,t0,dt,x,y,z,vl[3],vg[3],x0,y0,rmin,rmax;
1201     TGeoMedium *medSSDcf  = 0; // SSD support cone Carbon Fiber materal number.
1202     TGeoMedium *medSSDfs  = 0; // SSD support cone inserto stesalite 4411w.
1203     TGeoMedium *medSSDfo  = 0; // SSD support cone foam, Rohacell 50A.
1204     TGeoMedium *medSSDss  = 0; // SSD support cone screw material,Stainless
1205     TGeoMedium *medSSDair = 0; // SSD support cone Air
1206     TGeoMedium *medSSDal  = 0; // SSD support cone SDD mounting bracket Al
1207     medSSDcf = mgr->GetMedium("ITSssdCarbonFiber");
1208     medSSDfs = mgr->GetMedium("ITSssdStaselite4411w");
1209     medSSDfo = mgr->GetMedium("ITSssdRohacell50A");
1210     medSSDss = mgr->GetMedium("ITSssdStainlessSteal");
1211     medSSDair= mgr->GetMedium("ITSssdAir");
1212     medSSDal = mgr->GetMedium("ITSssdAl");
1213     //
1214     // SSD Central cylinder/Thermal Sheald.
1215     const Double_t kcylZlength     = 1140.0*fgkmm; //
1216     const Double_t kcylZFoamlength = 1020.0*fgkmm; //
1217     const Double_t kcylROuter      = 0.5*595.0*fgkmm; //
1218     const Double_t kcylRInner      = 0.5*560.5*fgkmm; //
1219     const Double_t kcylCthick      = 0.64*fgkmm; //
1220     const Double_t kcylFoamThick   = 5.0*fgkmm; //
1221     const Double_t kcylRholes      = 0.5*570.0*fgkmm;
1222     const Double_t kcylZM6         = 6.0*fgkmm; //
1223     const Double_t kcylRM6         = 0.5*6.0*fgkmm;
1224     const Double_t kcylPhi0M6      = 4.5*fgkDegree;
1225     const Int_t    kcylNM6         = 40;
1226     const Double_t kcylZPin        = 10.0*fgkmm;
1227     const Double_t kcylRPin        = 0.5*4.0*fgkmm;
1228     const Double_t kcylPhi0Pin     = (90.0+4.5)*fgkDegree;
1229     const Int_t    kcylNPin        = 2;
1230     //
1231     TGeoPcon *sCA,*sCB;
1232     TGeoTube *sCC,*sCD,*sCE;
1233     //
1234     //Begin_Html
1235     /*
1236       <img src="picts/ITS/file_name.gif">
1237       <P>
1238       <FONT FACE'"TIMES">
1239       ITS SSD centreal support and thermal sheal cylinder.
1240       </FONT>
1241       </P>
1242      */
1243     //End_Html
1244     //
1245     sCC = new TGeoTube("ITS SSD Thermal Centeral Rohacell CylinderCC",
1246                        kcylROuter-kcylCthick-kcylFoamThick,
1247                        kcylROuter-kcylCthick,0.5*kcylZFoamlength);
1248     sCA = new TGeoPcon("ITS SSD Thermal Centeral Carbon Fiber CylinderCA",
1249                        0.0,360.0,6);
1250     sCB = new TGeoPcon("ITS SSD Thermal Centeral Stesalite CylinderCB",
1251                        0.0,360.0,6);
1252     sCA->Z(0)    = -0.5*kcylZlength;
1253     sCA->Rmin(0) = kcylRInner;
1254     sCA->Rmax(0) = kcylROuter;
1255     sCA->Z(1)    = sCA->GetZ(0) + kcylZM6;
1256     sCA->Rmin(1) = sCA->GetRmin(0);
1257     sCA->Rmax(1) = sCA->GetRmax(0);
1258     sCA->Z(2)    = -0.5*kcylZFoamlength;
1259     sCA->Rmin(2) = kcylROuter - 2.0*kcylCthick-kcylFoamThick;
1260     sCA->Rmax(2) = sCA->GetRmax(0);
1261     sCA->Z(3)    = -sCA->GetZ(2);
1262     sCA->Rmin(3) = sCA->GetRmin(2);
1263     sCA->Rmax(3) = sCA->GetRmax(2);
1264     sCA->Z(4)    = -sCA->GetZ(1);
1265     sCA->Rmin(4) = sCA->GetRmin(1);
1266     sCA->Rmax(4) = sCA->GetRmax(1);
1267     sCA->Z(5)    = -sCA->GetZ(0);
1268     sCA->Rmin(5) = sCA->GetRmin(0);
1269     sCA->Rmax(5) = sCA->GetRmax(0);
1270     //
1271     sCB->Z(0)    = sCA->GetZ(0);
1272     sCB->Rmin(0) = sCA->GetRmin(0) + kcylCthick;
1273     sCB->Rmax(0) = sCA->GetRmax(0) - kcylCthick;
1274     sCB->Z(1)    = sCA->GetZ(1);
1275     sCB->Rmin(1) = sCA->GetRmin(1) + kcylCthick;
1276     sCB->Rmax(1) = sCA->GetRmax(1) - kcylCthick;
1277     sCB->Z(2)    = sCA->GetZ(2);
1278     sCB->Rmin(2) = sCA->GetRmin(2) + kcylCthick;
1279     sCB->Rmax(2) = sCA->GetRmax(2) - kcylCthick;
1280     sCB->Z(3)    = sCA->GetZ(3);
1281     sCB->Rmin(3) = sCA->GetRmin(3) + kcylCthick;
1282     sCB->Rmax(3) = sCA->GetRmax(3) - kcylCthick;
1283     sCB->Z(4)    = sCA->GetZ(4);
1284     sCB->Rmin(4) = sCA->GetRmin(4) + kcylCthick;
1285     sCB->Rmax(4) = sCA->GetRmax(4) - kcylCthick;
1286     sCB->Z(5)    = sCA->GetZ(5);
1287     sCB->Rmin(5) = sCA->GetRmin(5) + kcylCthick;
1288     sCB->Rmax(5) = sCA->GetRmax(5) - kcylCthick;
1289     //
1290     sCD = new TGeoTube("ITS SSD Thermal Centeral Cylinder M6 screwCD",
1291                       0.0,kcylRM6,0.5*kcylZM6);
1292     sCE = new TGeoTube("ITS SSD Thermal Centeral Cylinder PinCE",
1293                       0.0,kcylRPin,0.5*kcylZPin);
1294     //
1295     if(GetDebug(1)){
1296         sCA->InspectShape();
1297         sCB->InspectShape();
1298         sCC->InspectShape();
1299         sCD->InspectShape();
1300         sCE->InspectShape();
1301     } // end if GetDegut()
1302     TGeoVolume *vCA,*vCB,*vCC,*vCD,*vCE;
1303     vCA = new TGeoVolume("ITSssdCentCylCA",sCA,medSSDcf);
1304     vCA->SetVisibility(kTRUE);
1305     vCA->SetLineColor(4); // blue
1306     vCA->SetLineWidth(1);
1307     vCA->SetFillColor(vCA->GetLineColor());
1308     vCA->SetFillStyle(4000); // 0% transparent
1309     vCB = new TGeoVolume("ITSssdCentCylCB",sCB,medSSDfs);
1310     vCB->SetVisibility(kTRUE);
1311     vCB->SetLineColor(2); // red
1312     vCB->SetLineWidth(1);
1313     vCB->SetFillColor(vCB->GetLineColor());
1314     vCB->SetFillStyle(4050); // 50% transparent
1315     vCC = new TGeoVolume("ITSssdCentCylCC",sCC,medSSDfo);
1316     vCC->SetVisibility(kTRUE);
1317     vCC->SetLineColor(3); // green
1318     vCC->SetLineWidth(1);
1319     vCC->SetFillColor(vCC->GetLineColor());
1320     vCC->SetFillStyle(4050); // 50% transparent
1321     vCD = new TGeoVolume("ITSssdCentCylCD",sCD,medSSDss);
1322     vCD->SetVisibility(kTRUE);
1323     vCD->SetLineColor(1); // black
1324     vCD->SetLineWidth(1);
1325     vCD->SetFillColor(vCD->GetLineColor());
1326     vCD->SetFillStyle(4000); // 0% transparent
1327     vCE = new TGeoVolume("ITSssdCentCylCE",sCE,medSSDss);
1328     vCE->SetVisibility(kTRUE);
1329     vCE->SetLineColor(1); // black
1330     vCE->SetLineWidth(1);
1331     vCE->SetFillColor(vCE->GetLineColor());
1332     vCE->SetFillStyle(4000); // 0% transparent
1333     // Insert Bolt and Pins in both the Cone and Cylinder at the same time.
1334     vCB->AddNode(vCC,1,0);
1335     vCA->AddNode(vCB,1,0);
1336     moth->AddNode(vCA,1,0);
1337     if(GetDebug(1)){
1338         vCA->PrintNodes();
1339         vCB->PrintNodes();
1340         vCC->PrintNodes();
1341         vCD->PrintNodes();
1342         vCE->PrintNodes();
1343     } // end if
1344     //
1345     // SSD Cone
1346     // Data from Drawings ALR 0743/2E "Supporto Globale Settore SSD" and 
1347     // ALR 0743/2A "Supporto Generale Settore SSD".
1348     //
1349     const Double_t kconThick            = 13.0*fgkmm; // Thickness of Cone.
1350     const Double_t kconCthick           = 0.75*fgkmm; // Car. finber thickness
1351     const Double_t kconRCurv0           = 10.0*fgkmm; // Radius of curvature.
1352     const Double_t kconRCurv1           = 25.0*fgkmm; // Radius of curvature.
1353     const Double_t kconT                = 39.0*fgkDegree; // angle of SSD cone.
1354     const Double_t kconZOuterRing       = 47.0*fgkmm;
1355     const Double_t kconZOuterRingMill   = kconZOuterRing-5.0*fgkmm;
1356     const Double_t kconZToCylinder      = 170.0*fgkmm;
1357     const Double_t kconZLengthMill      = 171.5*fgkmm;
1358     const Double_t kconZLength          = 176.5*fgkmm-
1359                                           (kconZOuterRing-kconZOuterRingMill);
1360     //const Double_t kconZInnerRing       = 161.5*fgkmm-
1361     //                                     (kconZOuterRing-kconZOuterRingMill);
1362     const Double_t kconZOuterRingInside = 30.25*fgkmm-
1363                                           (kconZOuterRing-kconZOuterRingMill);
1364     const Double_t kconZDisplacement    = kconZToCylinder + 0.5*kcylZlength;
1365     const Double_t kconROuterMax        = 0.5*985.0*fgkmm;
1366     const Double_t kconROuterMin        = 0.5*945.0*fgkmm;
1367     const Double_t kconRCylOuterMill    = 0.5*597.0*fgkmm;
1368     const Double_t kconRInnerMin        = 0.5*562.0*fgkmm;
1369     //const Double_t kconRCentCurv0       = 0.5*927.0*fgkmm;
1370     const Double_t kconRCentCurv1       = 0.5*593.0*fgkmm;
1371     const Double_t kconRCentCurv2       = 0.5*578.0*fgkmm;
1372     // Foam core.
1373     const Double_t kconRohacellL0       = 112.3*fgkmm;
1374     const Double_t kconRohacellL1       = 58.4*fgkmm;
1375     // Screws and pins in outer SSD cone ring
1376     const Double_t kconROutHoles        = 0.5*965.0*fgkmm;
1377     const Double_t kconRScrewM5by12     = 0.5*5.0*fgkmm;
1378     const Double_t kconLScrewM5by12     = 0.5*12.0*fgkmm;
1379     const Int_t    kconNScrewM5by12     = 2;
1380     const Double_t kconRPinO6           = 0.5*6.0*fgkmm;
1381     const Double_t kconLPinO6           = 0.5*10.0*fgkmm;
1382     const Int_t    kconNPinO6           = 3;
1383     const Int_t    kconNRailScrews      = 4;
1384     const Int_t    kconNRailPins        = 2;
1385     const Int_t    kconNmounts          = 4;
1386     const Double_t kconMountPhi0        = 9.0*fgkDegree; // degrees
1387     //
1388     const Double_t kconCableHoleROut    = 0.5*920.0*fgkmm;
1389     const Double_t kconCableHoleRinner  = 0.5*800.0*fgkmm;
1390     const Double_t kconCableHoleWidth   = 200.0*fgkmm;
1391     const Double_t kconCableHoleAngle   = 42.0*fgkDegree;
1392     //const Double_t kconCableHolePhi0    = 90.0/4.0*fgkDegree;
1393     //const Int_t    kconNCableHoles      = 8;
1394     const Double_t kconCoolHoleWidth    = 40.0*fgkmm;
1395     const Double_t kconCoolHoleHight    = 30.0*fgkmm;
1396     const Double_t kconCoolHoleRmin     = 350.0*fgkmm;
1397     //const Double_t kconCoolHolephi0     = 90.0/4.0*fgkDegree;
1398     //const Int_t    kconNCoolHoles       = 8;
1399     const Double_t kconMountHoleWidth   = 20.0*fgkmm;
1400     const Double_t kconMountHoleHight   = 20.0*fgkmm;
1401     const Double_t kconMountHoleRmin    = 317.5*fgkmm;
1402     //const Double_t kconMountHolephi0    = 0.0*fgkDegree;
1403     //const Int_t    kconNMountHoles      = 6;
1404     // SSD cone Wings with holes.
1405     const Double_t kconWingRmax         = 527.5*fgkmm;
1406     const Double_t kconWingWidth        = 70.0*fgkmm;
1407     const Double_t kconWingThick        = 10.0*fgkmm;
1408     const Double_t kconWingPhi0         = 45.0*fgkDegree;
1409     //const Int_t    kconNWings           = 4;
1410     // SSD-SDD Thermal/Mechanical cylinder mounts
1411     const Double_t kconRM6Head          = 0.5*8.0*fgkmm;
1412     const Double_t kconZM6Head          = 8.5*fgkmm;
1413     //
1414     // SSD-SDD Mounting bracket
1415     const Double_t ksupPRmin            = 0.5*539.0*fgkmm;// see SDD RoutMin
1416     const Double_t ksupPRmax            = 0.5*585.0*fgkmm;
1417     const Double_t ksupPZ               = 4.0*fgkmm;
1418     const Double_t ksupPPhi1            = (-0.5*70.*fgkmm/ksupPRmax)*fgkRadian;
1419     const Double_t ksupPPhi2            = -ksupPPhi1;
1420     //
1421     const Double_t kSinkconTc           = SinD(kconT);
1422     const Double_t kCoskconTc           = CosD(kconT);
1423     //
1424     TGeoPcon *sA0,*sB0,*sC0,*sF0,*sQ;
1425     TGeoConeSeg *sAh1,*sBh1;
1426     TGeoArb8 *sAh2,*sBh2;
1427     TGeoBBox *sAh3,*sBh3,*sAh4,*sBh4;
1428     TGeoConeSeg *sG,*sH;
1429     TGeoTubeSeg *sT;
1430     TGeoTube *sD,*sE,*sR,*sS;
1431     TGeoCompositeShape *sA,*sB,*sC,*sF;
1432     //
1433     // Lets start with the upper left outer carbon fiber surface.
1434     // Between za[2],rmaxa[2] and za[4],rmaxa[4] there is a curved section
1435     // given by rmaxa = rmaxa[2]-r*Sind(t) for 0<=t<=kconT and 
1436     // za = za[2] + r*Cosd(t) for 0<=t<=kconT. Simularly between za[1],rmina[1
1437     // and za[3],rmina[3] there is a curve section given by
1438     // rmina = rmina[1]-r*Sind(t) for 0<=t<=kconT and za = za[1]+r&Sind(t)
1439     // for t<=0<=kconT. These curves have been replaced by straight lines
1440     // between the equivelent points for simplicity.
1441     // Poly-cone Volume sA0. Top part of SSD cone Carbon Fiber.
1442     sA0 = new TGeoPcon("ITSssdSuportConeCarbonFiberSurfaceA0",0.0,360.0,15);
1443     sA0->Z(0)    = 0.0;
1444     sA0->Rmin(0) = kconROuterMin;
1445     sA0->Rmax(0) = kconROuterMax;
1446     sA0->Z(1)    = kconZOuterRingInside-kconRCurv0;
1447     sA0->Rmin(1) = sA0->GetRmin(0);
1448     sA0->Rmax(1) = sA0->GetRmax(0);
1449     sA0->Z(2)    = kconZOuterRingInside;
1450     sA0->Rmin(2) = sA0->GetRmin(1)-kconRCurv0;
1451     sA0->Rmax(2) = sA0->GetRmax(0);
1452     sA0->Z(3)    = sA0->GetZ(2);
1453     sA0->Rmin(3) = -1000; // See Below
1454     sA0->Rmax(3) = sA0->GetRmax(0);
1455     sA0->Z(4)    = kconZOuterRingMill-kconRCurv0;
1456     sA0->Rmin(4) = -1000; // See Below
1457     sA0->Rmax(4) = sA0->GetRmax(0);
1458     sA0->Z(5)    = kconZOuterRingMill;
1459     sA0->Rmin(5) = -1000; // See Below
1460     sA0->Rmax(5) = sA0->GetRmax(4) - kconRCurv0;
1461     sA0->Z(6)    = sA0->GetZ(5);
1462     sA0->Rmin(6) = -1000; // See Below
1463     sA0->Rmax(6) = -1000; // See Below
1464     sA0->Z(7)    = sA0->GetZ(6)+kconRCurv0*(1.-kCoskconTc);
1465     sA0->Rmin(7) = -1000; // See Below
1466     sA0->Rmax(7) = -1000; // See Below
1467     sA0->Z(8)    = -1000; // See Below
1468     sA0->Rmin(8) = kconRCentCurv2+kconRCurv1*kSinkconTc; // See Below
1469     sA0->Rmax(8) = -1000; // See Below
1470     sA0->Z(9)    = -1000; // See Below
1471     sA0->Rmin(9) = kconRCentCurv2;
1472     sA0->Rmax(9) = -1000; // See Below
1473     sA0->Z(10)   = -1000; // See Below
1474     sA0->Rmin(10)= kconRInnerMin;
1475     sA0->Rmax(10)= -1000; // See Below
1476     sA0->Z(11)   = kconZLengthMill-kconRCurv0*(1.0-kCoskconTc);
1477     sA0->Rmin(11)= sA0->GetRmin(10);
1478     sA0->Rmax(11)= kconRCentCurv1+kconRCurv0*kSinkconTc;
1479     sA0->Z(12)   = kconZToCylinder;
1480     sA0->Rmin(12)= sA0->GetRmin(10);
1481     sA0->Rmax(12)= -1000; // See Below
1482     sA0->Z(13)   = sA0->GetZ(12);
1483     sA0->Rmin(13)= kconRCylOuterMill;
1484     sA0->Rmax(13)= -1000; // See Below
1485     z            = kconZLengthMill;
1486     rmin         = kconRCentCurv1;
1487     rmax         = rmin;
1488     sA0->Z(14)   = -1000; // See Below
1489     sA0->Rmin(14)= sA0->GetRmin(13);
1490     sA0->Rmax(14)= sA0->GetRmin(14);
1491     // Compute values undefined above
1492     sA0->Z(14)   = Xfrom2Points(sA0->GetZ(11),sA0->GetRmax(11),z,rmax,
1493                                sA0->GetRmax(14));
1494     sA0->Z(8)    = ZFromRmaxpCone(sA0,11,90.-kconT,sA0->GetRmin(8),-kconThick);
1495     sA0->Rmax(8) = RmaxFromZpCone(sA0,11,90.-kconT,sA0->GetZ(8),0.0);
1496     sA0->Z(9)    = sA0->GetZ(8)+kconRCurv1*(1.-kCoskconTc);
1497     sA0->Z(10)   = sA0->GetZ(9);
1498     sA0->Rmin(3) = RminFromZpCone(sA0,8,90.-kconT,sA0->GetZ(3),0.0);
1499     sA0->Rmin(4) = RminFromZpCone(sA0,3,90.-kconT,sA0->GetZ(4),0.0);
1500     sA0->Rmin(5) = RminFromZpCone(sA0,3,90.-kconT,sA0->GetZ(5),0.0);
1501     sA0->Rmin(7) = RminFromZpCone(sA0,3,90.-kconT,sA0->GetZ(7),0.0);
1502     sA0->Rmax(7) = RmaxFromZpCone(sA0,11,90.-kconT,sA0->GetZ(7),0.0);
1503     sA0->Rmin(6) = sA0->GetRmin(5);
1504     sA0->Rmax(6) = RmaxFromZpCone(sA0,11,90.-kconT,sA0->GetZ(7),0.0);
1505     sA0->Rmax(9) = RmaxFromZpCone(sA0,11,90.-kconT,sA0->GetZ(9),0.0);
1506     sA0->Rmax(10)= sA0->GetRmax(9);
1507     t = TanD(270.+kconT);
1508     sA0->Rmax(12)= RmaxFrom2Points(sA0,11,14,sA0->GetZ(12));
1509     sA0->Rmax(13)= sA0->GetRmax(12);
1510     //
1511     // Poly-cone Volume B. Stesalite inside volume sA0.
1512     // Now lets define the Inserto Stesalite 4411w material volume.
1513     // Poly-cone Volume sA0. Top part of SSD cone Carbon Fiber.
1514     sB0 = new TGeoPcon("ITSssdSuportConeStaseliteB0",0.0,360.0,15);
1515     //
1516     sB0->Z(0)    = sA0->GetZ(0);
1517     sB0->Rmin(0) = sA0->GetRmin(0) + kconCthick;
1518     sB0->Rmax(0) = sA0->GetRmax(0) - kconCthick;
1519     //printf("A0#%d ",1);
1520     InsidePoint(sA0,0,1,2,kconCthick,sB0,1,kFALSE); // Rmin
1521     sB0->Rmax(1) = sB0->Rmax(0);
1522     //printf("A0#%d ",2);
1523     InsidePoint(sA0,1,2,3,kconCthick,sB0,2,kFALSE); // Rmin
1524     sB0->Rmax(2) = sB0->Rmax(0);
1525     //printf("A0#%d ",3);
1526     InsidePoint(sA0,2,3,9,kconCthick,sB0,3,kFALSE);
1527     sB0->Rmax(3) = sB0->Rmax(0);
1528     //printf("A0#%d ",4);
1529     InsidePoint(sA0,0,4,5,kconCthick,sB0,4,kTRUE); // Rmax
1530     sB0->Rmin(4) = -1000.; // see Bellow
1531     //printf("A0#%d ",5);
1532     InsidePoint(sA0,4,5,6,kconCthick,sB0,5,kTRUE); // Rmax
1533     sB0->Rmin(5) = -1000.; // see Bellow
1534     //printf("A0#%d ",6);
1535     InsidePoint(sA0,5,6,7,kconCthick,sB0,6,kTRUE); // Rmax
1536     sB0->Rmin(6) = -1000.; // see Bellow
1537     //printf("A0#%d ",7);
1538     InsidePoint(sA0,6,7,11,kconCthick,sB0,7,kTRUE); // Rmax
1539     sB0->Rmin(7) = -1000.; // see Bellow
1540     //printf("A0#%d ",8);
1541     InsidePoint(sA0,3,8,9,kconCthick,sB0,8,kFALSE); // Rmin
1542     sB0->Rmax(8) = -1000.; // see Bellow
1543     //printf("A0#%d ",9);
1544     InsidePoint(sA0,8,9,10,kconCthick,sB0,9,kFALSE); // Rmin
1545     sB0->Rmax(9) = -1000.; // see Bellow
1546     sB0->Z(10)   = sA0->GetZ(10) + kconCthick;
1547     sB0->Rmin(10)= sA0->GetRmin(10);
1548     sB0->Rmax(10)= -1000.; // see Bellow
1549     //printf("A0#%d ",11);
1550     InsidePoint(sA0,7,11,14,kconCthick,sB0,11,kTRUE); // Rmax
1551     sB0->Rmin(11)= sA0->GetRmin(10);
1552     sB0->Z(12)    = sA0->GetZ(12);
1553     sB0->Rmin(12)= sA0->GetRmin(12);
1554     sB0->Rmax(12)= -1000.; // see Bellow
1555     sB0->Z(13)   = sA0->GetZ(13);
1556     sB0->Rmin(13)= sA0->GetRmin(13);
1557     sB0->Rmax(13)= -1000.; // see Bellow
1558     sB0->Z(14)   = sA0->GetZ(14) - kconCthick;
1559     sB0->Rmin(14)= sA0->GetRmin(14);
1560     sB0->Rmax(14)= sB0->Rmin(14); // Close?
1561     sB0->Rmin(4) = RminFrom2Points(sB0,3,8,sB0->GetZ(4));
1562     sB0->Rmin(5) = RminFrom2Points(sB0,3,8,sB0->GetZ(5));
1563     sB0->Rmin(6) = sB0->GetRmin(5);
1564     sB0->Rmin(7) = RminFrom2Points(sB0,3,8,sB0->GetZ(7));
1565     sB0->Rmax(8) = RmaxFrom2Points(sB0,7,11,sB0->GetZ(8));
1566     sB0->Rmax(9) = RmaxFrom2Points(sB0,7,11,sB0->GetZ(9));
1567     sB0->Rmax(10)= sB0->GetRmax(9);
1568     sB0->Rmax(12)= RmaxFrom2Points(sB0,11,14,sB0->GetZ(12));
1569     sB0->Rmax(13)= RmaxFrom2Points(sB0,11,14,sB0->GetZ(13));
1570     //
1571     // Poly-cone Volume sC0. Foam inside volume sA0.
1572     // Now lets define the Rohacell foam material volume.
1573     sC0 = new TGeoPcon("ITSssdSuportConeRohacellC0",0.0,360.0,4);
1574     sC0->Z(1)    = sB0->GetZ(7);
1575     sC0->Rmax(1) = sB0->GetRmax(7);
1576     sC0->Rmin(1) = RminFrom2Points(sB0,3,8,sC0->GetZ(1));
1577     sC0->Rmin(0) = sC0->GetRmax(1);
1578     sC0->Rmax(0) = sC0->GetRmin(0);
1579     sC0->Z(0)    = Zfrom2MinPoints(sB0,3,8,sC0->Rmin(0));
1580     t = kconThick-2.0*kconCthick;
1581     sC0->Rmax(3) = sC0->GetRmax(0)-kCoskconTc*TMath::Sqrt(
1582                              kconRohacellL0*kconRohacellL0-t*t)+t*kSinkconTc;
1583     sC0->Rmin(3) = sC0->GetRmax(3);
1584     sC0->Z(3)    = ZFromRmaxpCone(sB0,11,90.-kconT,sC0->GetRmax(3),0.0);;
1585     sC0->Rmin(2) = sC0->GetRmin(3);
1586     sC0->Z(2)    = ZFromRminpCone(sB0,3,90.-kconT,sC0->GetRmin(2),0.0);
1587     sC0->Rmax(2) = RmaxFromZpCone(sB0,11,90.0-kconT,sC0->GetZ(2),0.0);
1588     //
1589     // Poly-cone Volume sF0.  Second Foam inside volume sA0.
1590     // Now lets define the Rohacell foam material volume.
1591     sF0 = new TGeoPcon("ITSssdSuportConeRohacellCF0",0.0,360.0,4);
1592     sF0->Z(2)    = sB0->GetZ(8);
1593     sF0->Rmin(2) = sB0->GetRmin(8);
1594     sF0->Rmax(2) = sB0->GetRmax(8);
1595     sF0->Z(0)    = sF0->GetZ(2)-kconRohacellL1*kSinkconTc;
1596     sF0->Rmin(0) = sF0->GetRmin(2)+kconRohacellL1*kCoskconTc;
1597     sF0->Rmax(0) = sF0->GetRmin(0);
1598     sF0->Z(1)    = ZFromRmaxpCone(sB0,11,90.-kconT,sF0->GetRmax(0),0.0);;
1599     sF0->Rmax(1) = sF0->GetRmax(0);
1600     sF0->Rmin(1) = RminFrom2Points(sB0,3,8,sF0->GetZ(1));
1601     sF0->Rmax(3) = sF0->GetRmin(2)+(kconThick-2.0*kconCthick)*kCoskconTc;
1602     sF0->Rmin(3) = sF0->GetRmax(3);
1603     sF0->Z(3)    = ZFromRmaxpCone(sB0,11,90.-kconT,sF0->GetRmax(3),0.0);
1604     // Holes for Cables to pass Through is created by the intersection
1605     // between a cone segment and an Arb8, One for the volume sA0 and a
1606     // larger one for the volumes sB0 and sC0, so that the surface is covered
1607     // in carbon figer (volume sA0).
1608     sAh1 = new TGeoConeSeg("ITSssdCableHoleAh1",
1609                            0.5*kconZLength,kconCableHoleRinner,
1610                            kconCableHoleROut,kconCableHoleRinner,
1611                            kconCableHoleROut,
1612                            90.-(0.5*kconCableHoleWidth/
1613                                 kconCableHoleROut)*fgkRadian,
1614                            90.+(0.5*kconCableHoleWidth/
1615                                 kconCableHoleROut)*fgkRadian);
1616     sBh1 = new TGeoConeSeg("ITSssdCableHoleBh1",0.5*kconZLength,
1617                            kconCableHoleRinner-kconCthick,
1618                            kconCableHoleROut+kconCthick,
1619                            kconCableHoleRinner-kconCthick,
1620                            kconCableHoleROut+kconCthick,
1621                            90.-(((0.5*kconCableHoleWidth+kconCthick)/
1622                                  (kconCableHoleROut+kconCthick)))*fgkRadian,
1623                            90.+(((0.5*kconCableHoleWidth+kconCthick)/
1624                                  (kconCableHoleROut+kconCthick)))*fgkRadian);
1625     x0 = sAh1->GetRmax1()*CosD(sAh1->GetPhi2());
1626     y0 = sAh1->GetRmax1()*SinD(sAh1->GetPhi2());
1627     sAh2 = new TGeoArb8("ITSssdCableHoleAh2",0.5*kconZLength);
1628     y  = sAh1->GetRmax1();
1629     x  = x0+(y-y0)/TanD(90.0+kconCableHoleAngle);
1630     sAh2->SetVertex(0,x,y);
1631     y  = sAh1->GetRmin1()*SinD(sAh1->GetPhi2());
1632     x  = x0+(y-y0)/TanD(90.0+kconCableHoleAngle);
1633     sAh2->SetVertex(3,x,y);
1634     x0 = sAh1->GetRmax1()*CosD(sAh1->GetPhi1());
1635     y0 = sAh1->GetRmax1()*SinD(sAh1->GetPhi1());
1636     y  = sAh1->GetRmax1();
1637     x  = x0+(y-y0)/TanD(90.0-kconCableHoleAngle);
1638     sAh2->SetVertex(1,x,y);
1639     y  = sAh1->GetRmin1()*SinD(sAh1->GetPhi1());
1640     x  = x0+(y-y0)/TanD(90.0-kconCableHoleAngle);
1641     sAh2->SetVertex(2,x,y);
1642     //
1643     x0 = sBh1->GetRmax1()*CosD(sBh1->GetPhi2());
1644     y0 = sBh1->GetRmax1()*SinD(sBh1->GetPhi2());
1645     sBh2 = new TGeoArb8("ITSssdCableHoleBh2",0.5*kconZLength);
1646     y  = sBh1->GetRmax1();
1647     x  = x0+(y-y0)/TanD(90.0+kconCableHoleAngle);
1648     sBh2->SetVertex(0,x,y);
1649     y  = sBh1->GetRmin1()*SinD(sBh1->GetPhi2());
1650     x  = x0+(y-y0)/TanD(90.0+kconCableHoleAngle);
1651     sBh2->SetVertex(3,x,y);
1652     x0 = sBh1->GetRmax1()*CosD(sBh1->GetPhi1());
1653     y0 = sBh1->GetRmax1()*SinD(sBh1->GetPhi1());
1654     y  = sBh1->GetRmax1();
1655     x  = x0+(y-y0)/TanD(90.0-kconCableHoleAngle);
1656     sBh2->SetVertex(1,x,y);
1657     y  = sBh1->GetRmin1()*SinD(sBh1->GetPhi1());
1658     x  = x0+(y-y0)/TanD(90.0-kconCableHoleAngle);
1659     sBh2->SetVertex(2,x,y);
1660     for(i=0;i<4;i++){ // define points at +dz
1661         sAh2->SetVertex(i+4,(sAh2->GetVertices())[2*i],
1662                            (sAh2->GetVertices())[1+2*i]);
1663         sBh2->SetVertex(i+4,(sBh2->GetVertices())[2*i],
1664                            (sBh2->GetVertices())[1+2*i]);
1665     } // end for i
1666     sAh3 = new TGeoBBox("ITSssdCoolingHoleAh3",0.5*kconCoolHoleWidth,
1667                         0.5*kconCoolHoleHight,kconZLength);
1668     sBh3 = new TGeoBBox("ITSssdCoolingHoleBh3",
1669                         0.5*kconCoolHoleWidth+kconCthick,
1670                         0.5*kconCoolHoleHight+kconCthick,kconZLength);
1671     sAh4 = new TGeoBBox("ITSssdMountingPostHoleAh4",0.5*kconMountHoleWidth,
1672                         0.5*kconMountHoleHight,0.5*kconZLength);
1673     z = sF0->GetZ(0)-sF0->GetZ(sF0->GetNz()-1);
1674     if(z<0.0) z = -z;
1675     sBh4 = new TGeoBBox("ITSssdMountingPostHoleBh4",
1676                         0.5*kconMountHoleWidth+kconCthick,
1677                         0.5*kconMountHoleHight+kconCthick,0.5*z);
1678     // SSD Cone Wings
1679     sG = new TGeoConeSeg("ITSssdWingCarbonFiberSurfaceG",
1680                          0.5*kconWingThick,kconROuterMax-kconCthick,
1681                          kconWingRmax,kconROuterMax-kconCthick,kconWingRmax,
1682                       kconWingPhi0-(0.5*kconWingWidth/kconWingRmax)*fgkRadian,
1683                       kconWingPhi0+(0.5*kconWingWidth/kconWingRmax)*fgkRadian);
1684     sH = new TGeoConeSeg("ITSssdWingStaseliteH",
1685                          0.5*kconWingThick-kconCthick,kconROuterMax-kconCthick,
1686                          kconWingRmax-kconCthick,
1687                          kconROuterMax-kconCthick,
1688                          kconWingRmax-kconCthick,
1689                          kconWingPhi0-((0.5*kconWingWidth-kconCthick)/
1690                                        (kconWingRmax-kconCthick))*fgkRadian,
1691                          kconWingPhi0+((0.5*kconWingWidth-kconCthick)/
1692                                        (kconWingRmax-kconCthick))*fgkRadian);
1693     // SDD support plate, SSD side.
1694     //Poly-cone Volume sT.
1695     sT = new TGeoTubeSeg("ITSssdsddMountingBracketT",ksupPRmin,ksupPRmax,
1696                          0.5*ksupPZ,ksupPPhi1,ksupPPhi2);
1697     //
1698     TGeoRotation *rotZ225 =new TGeoRotation("ITSssdConeZ225", 0.0,0.0, 22.5);
1699     rotZ225->RegisterYourself();
1700     TGeoRotation *rotZ675 =new TGeoRotation("ITSssdConeZ675", 0.0,0.0, 67.5);
1701     rotZ675->RegisterYourself();
1702     TGeoRotation *rotZ90  =new TGeoRotation("ITSssdConeZ90",  0.0,0.0, 90.0);
1703     rotZ90->RegisterYourself();
1704     TGeoRotation *rotZ1125=new TGeoRotation("ITSssdConeZ1125",0.0,0.0,112.5);
1705     rotZ1125->RegisterYourself();
1706     TGeoRotation *rotZ1575=new TGeoRotation("ITSssdConeZ1575",0.0,0.0,157.5);
1707     rotZ1575->RegisterYourself();
1708     TGeoRotation *rotZ180 =new TGeoRotation("ITSssdConeZ180", 0.0,0.0,180.0);
1709     rotZ180->RegisterYourself();
1710     TGeoRotation *rotZ2025=new TGeoRotation("ITSssdConeZ2025",0.0,0.0,202.5);
1711     rotZ2025->RegisterYourself();
1712     TGeoRotation *rotZ2475=new TGeoRotation("ITSssdConeZ2475",0.0,0.0,247.5);
1713     rotZ2475->RegisterYourself();
1714     TGeoRotation *rotZ270 =new TGeoRotation("ITSssdConeZ270", 0.0,0.0,270.0);
1715     rotZ270->RegisterYourself();
1716     TGeoRotation *rotZ2925=new TGeoRotation("ITSssdConeZ2925",0.0,0.0,292.5);
1717     rotZ2925->RegisterYourself();
1718     TGeoRotation *rotZ3375=new TGeoRotation("ITSssdConeZ3375",0.0,0.0,337.5);
1719     rotZ3375->RegisterYourself();
1720     //
1721     vl[0] = 0.0;vl[1] = kconCoolHoleRmin+0.5*kconCoolHoleHight;vl[2] = 0.0;
1722     rotZ225->LocalToMaster(vl,vg);
1723     TGeoCombiTrans *rotranA225  = new TGeoCombiTrans("ITSssdConeTZ225",vg[0],
1724                                                      vg[1],vg[2],rotZ225);
1725     rotranA225->RegisterYourself();
1726     rotZ675->LocalToMaster(vl,vg);
1727     TGeoCombiTrans *rotranA675  = new TGeoCombiTrans("ITSssdConeTZ675", vg[0],
1728                                                      vg[1],vg[2],rotZ675);
1729     rotranA675->RegisterYourself();
1730     rotZ1125->LocalToMaster(vl,vg);
1731     TGeoCombiTrans *rotranA1125 = new TGeoCombiTrans("ITSssdConeTZ1125",vg[0],
1732                                                      vg[1],vg[2],rotZ1125);
1733     rotranA1125->RegisterYourself();
1734     rotZ1575->LocalToMaster(vl,vg);
1735     TGeoCombiTrans *rotranA1575 = new TGeoCombiTrans("ITSssdConeTZ1575",vg[0],
1736                                                      vg[1],vg[2],rotZ1575);
1737     rotranA1575->RegisterYourself();
1738     rotZ2025->LocalToMaster(vl,vg);
1739     TGeoCombiTrans *rotranA2025 = new TGeoCombiTrans("ITSssdConeTZ2025",vg[0],
1740                                                      vg[1],vg[2],rotZ2025);
1741     rotranA2025->RegisterYourself();
1742     rotZ2475->LocalToMaster(vl,vg);
1743     TGeoCombiTrans *rotranA2475 = new TGeoCombiTrans("ITSssdConeTZ2475",vg[0],
1744                                                      vg[1],vg[2],rotZ2475);
1745     rotranA2475->RegisterYourself();
1746     rotZ2925->LocalToMaster(vl,vg);
1747     TGeoCombiTrans *rotranA2925 = new TGeoCombiTrans("ITSssdConeTZ2925",vg[0],
1748                                                      vg[1],vg[2],rotZ2925);
1749     rotranA2925->RegisterYourself();
1750     rotZ3375->LocalToMaster(vl,vg);
1751     TGeoCombiTrans *rotranA3375 = new TGeoCombiTrans("ITSssdConeTZ3375",vg[0],
1752                                                      vg[1],vg[2],rotZ3375);
1753     rotranA3375->RegisterYourself();
1754     TGeoRotation *rotZ30  = new TGeoRotation("ITSssdConeZ30", 0.0,0.0, 30.0);
1755     TGeoRotation *rotZ60  = new TGeoRotation("ITSssdConeZ60", 0.0,0.0, 60.0);
1756     //TGeoRotation *rotZ120 = new TGeoRotation("ITSssdConeZ120",0.0,0.0,120.0);
1757     TGeoRotation *rotZ150 = new TGeoRotation("ITSssdConeZ150",0.0,0.0,150.0);
1758     TGeoRotation *rotZ210 = new TGeoRotation("ITSssdConeZ210",0.0,0.0,210.0);
1759     //TGeoRotation *rotZ240 = new TGeoRotation("ITSssdConeZ240",0.0,0.0,240.0);
1760     TGeoRotation *rotZ300 = new TGeoRotation("ITSssdConeZ300",0.0,0.0,300.0);
1761     TGeoRotation *rotZ330 = new TGeoRotation("ITSssdConeZ330",0.0,0.0,330.0);
1762     vl[0] = kconMountHoleRmin+0.5*kconMountHoleHight; vl[1] = 0.0; vl[2] = 0.0;
1763     for(i=0;i<sF0->GetNz();i++) vl[2] += sF0->GetZ(i);
1764     vl[2] /= (Double_t)(sF0->GetNz());
1765     rotZ30->LocalToMaster(vl,vg);
1766     TGeoCombiTrans *rotranA30 = new TGeoCombiTrans("ITSssdConeTZ30",vg[0],
1767                                                       vg[1],vg[2],rotZ30);
1768     rotranA30->RegisterYourself();
1769     rotZ90->LocalToMaster(vl,vg);
1770     TGeoCombiTrans *rotranA90  = new TGeoCombiTrans("ITSssdConeTZ90", vg[0],
1771                                                      vg[1],vg[2],rotZ90);
1772     rotranA90->RegisterYourself();
1773     rotZ150->LocalToMaster(vl,vg);
1774     TGeoCombiTrans *rotranA150 = new TGeoCombiTrans("ITSssdConeTZ150",vg[0],
1775                                                      vg[1],vg[2],rotZ150);
1776     rotranA150->RegisterYourself();
1777     rotZ210->LocalToMaster(vl,vg);
1778     TGeoCombiTrans *rotranA210 = new TGeoCombiTrans("ITSssdConeTZ210",vg[0],
1779                                                      vg[1],vg[2],rotZ210);
1780     rotranA210->RegisterYourself();
1781     rotZ270->LocalToMaster(vl,vg);
1782     TGeoCombiTrans *rotranA270 = new TGeoCombiTrans("ITSssdConeTZ270",vg[0],
1783                                                      vg[1],vg[2],rotZ270);
1784     rotranA270->RegisterYourself();
1785     rotZ330->LocalToMaster(vl,vg);
1786     TGeoCombiTrans *rotranA330 = new TGeoCombiTrans("ITSssdConeTZ330",vg[0],
1787                                                      vg[1],vg[2],rotZ330);
1788     rotranA330->RegisterYourself();
1789     vl[0] = 0.0; vl[1] = 0.0; vl[2] = sA0->GetZ(10)+sT->GetDz();
1790     rotZ60->LocalToMaster(vl,vg);
1791     TGeoCombiTrans *rotranBrTZ60  = new TGeoCombiTrans("ITSssdConeBrTZ60",
1792                                                   vg[0],vg[1],vg[2],rotZ60);
1793     rotranBrTZ60->RegisterYourself();
1794     TGeoCombiTrans *rotranBrTZ180 = new TGeoCombiTrans("ITSssdConeBrTZ180",
1795                                                   vg[0],vg[1],vg[2],rotZ180);
1796     rotranBrTZ180->RegisterYourself();
1797     TGeoCombiTrans *rotranBrTZ300 = new TGeoCombiTrans("ITSssdConeBrTZ300",
1798                                                   vg[0],vg[1],vg[2],rotZ300);
1799     rotranBrTZ300->RegisterYourself();
1800     if(GetDebug(1)){
1801         rotZ225->Print();
1802         rotZ675->Print();
1803         rotZ90->Print();
1804         rotZ1125->Print();
1805         rotZ1575->Print();
1806         rotZ180->Print();
1807         rotZ2025->Print();
1808         rotZ2475->Print();
1809         rotZ270->Print();
1810         rotZ2925->Print();
1811         rotZ3375->Print();
1812         rotranA225->Print();
1813         rotranA675->Print();
1814         rotranA1125->Print();
1815         rotranA1575->Print();
1816         rotranA2025->Print();
1817         rotranA2475->Print();
1818         rotranA2925->Print();
1819         rotranA3375->Print();
1820         rotZ60->Print();
1821         rotZ300->Print();
1822         rotranA30->Print();
1823         rotranA90->Print();
1824         rotranA150->Print();
1825         rotranA210->Print();
1826         rotranA270->Print();
1827         rotranA330->Print();
1828         rotranBrTZ60->Print();
1829         rotranBrTZ180->Print();
1830         rotranBrTZ300->Print();
1831     } // end if GetDebug(1)
1832     sA = new TGeoCompositeShape("ITSssdSuportConeCarbonFiberSurfaceA",
1833         "(((((((((((((((((((((((((((("
1834         "ITSssdSuportConeCarbonFiberSurfaceA0 +"
1835         "ITSssdWingCarbonFiberSurfaceG) +"
1836         "ITSssdWingCarbonFiberSurfaceG:ITSssdConeZ90) +"
1837         "ITSssdWingCarbonFiberSurfaceG:ITSssdConeZ180) +"
1838         "ITSssdWingCarbonFiberSurfaceG:ITSssdConeZ270) -"
1839         "(ITSssdCableHoleAh1:ITSssdConeZ225*ITSssdCableHoleAh2:ITSssdConeZ225)) -"
1840         "(ITSssdCableHoleAh1:ITSssdConeZ675*ITSssdCableHoleAh2:ITSssdConeZ675)) -"
1841         "(ITSssdCableHoleAh1:ITSssdConeZ1125*ITSssdCableHoleAh2:ITSssdConeZ1125)) -"
1842         "(ITSssdCableHoleAh1:ITSssdConeZ1575*ITSssdCableHoleAh2:ITSssdConeZ1575)) -"
1843         "(ITSssdCableHoleAh1:ITSssdConeZ2025*ITSssdCableHoleAh2:ITSssdConeZ2025)) -"
1844         "(ITSssdCableHoleAh1:ITSssdConeZ2475*ITSssdCableHoleAh2:ITSssdConeZ2475)) -"
1845         "(ITSssdCableHoleAh1:ITSssdConeZ2925*ITSssdCableHoleAh2:ITSssdConeZ2925)) -"
1846         "(ITSssdCableHoleAh1:ITSssdConeZ3375*ITSssdCableHoleAh2:ITSssdConeZ3375)) -"
1847         "ITSssdCoolingHoleAh3:ITSssdConeTZ225) -"
1848         "ITSssdCoolingHoleAh3:ITSssdConeTZ675) -"
1849         "ITSssdCoolingHoleAh3:ITSssdConeTZ1125) -"
1850         "ITSssdCoolingHoleAh3:ITSssdConeTZ1575) -"
1851         "ITSssdCoolingHoleAh3:ITSssdConeTZ2025) -"
1852         "ITSssdCoolingHoleAh3:ITSssdConeTZ2475) -"
1853         "ITSssdCoolingHoleAh3:ITSssdConeTZ2925) -"
1854         "ITSssdCoolingHoleAh3:ITSssdConeTZ3375) -"
1855         "ITSssdMountingPostHoleAh4:ITSssdConeTZ30) -"
1856         "ITSssdMountingPostHoleAh4:ITSssdConeTZ90) -"
1857         "ITSssdMountingPostHoleAh4:ITSssdConeTZ150) -"
1858         "ITSssdMountingPostHoleAh4:ITSssdConeTZ210) -"
1859         "ITSssdMountingPostHoleAh4:ITSssdConeTZ270) -"
1860         "ITSssdMountingPostHoleAh4:ITSssdConeTZ330) -"
1861         "ITSssdsddMountingBracketT:ITSssdConeBrTZ60) -"
1862         "ITSssdsddMountingBracketT:ITSssdConeBrTZ180) -"
1863         "ITSssdsddMountingBracketT:ITSssdConeBrTZ300"
1864         );
1865     sB = new TGeoCompositeShape("ITSssdSuportConeStaseliteB",
1866         "(((((((((((((((((((((((((((("
1867         "ITSssdSuportConeStaseliteB0 +"
1868         "ITSssdWingStaseliteH) +"
1869         "ITSssdWingStaseliteH:ITSssdConeZ90) +"
1870         "ITSssdWingStaseliteH:ITSssdConeZ180) +"
1871         "ITSssdWingStaseliteH:ITSssdConeZ270) -"
1872         "(ITSssdCableHoleBh1:ITSssdConeZ225*ITSssdCableHoleBh2:ITSssdConeZ225)) -"
1873         "(ITSssdCableHoleBh1:ITSssdConeZ675*ITSssdCableHoleBh2:ITSssdConeZ675)) -"
1874         "(ITSssdCableHoleBh1:ITSssdConeZ1125*ITSssdCableHoleBh2:ITSssdConeZ1125)) -"
1875         "(ITSssdCableHoleBh1:ITSssdConeZ1575*ITSssdCableHoleBh2:ITSssdConeZ1575)) -"
1876         "(ITSssdCableHoleBh1:ITSssdConeZ2025*ITSssdCableHoleBh2:ITSssdConeZ2025)) -"
1877         "(ITSssdCableHoleBh1:ITSssdConeZ2475*ITSssdCableHoleBh2:ITSssdConeZ2475)) -"
1878         "(ITSssdCableHoleBh1:ITSssdConeZ2925*ITSssdCableHoleBh2:ITSssdConeZ2925)) -"
1879         "(ITSssdCableHoleBh1:ITSssdConeZ3375*ITSssdCableHoleBh2:ITSssdConeZ3375)) -"
1880         "ITSssdCoolingHoleBh3:ITSssdConeTZ225) -"
1881         "ITSssdCoolingHoleBh3:ITSssdConeTZ675) -"
1882         "ITSssdCoolingHoleBh3:ITSssdConeTZ1125) -"
1883         "ITSssdCoolingHoleBh3:ITSssdConeTZ1575) -"
1884         "ITSssdCoolingHoleBh3:ITSssdConeTZ2025) -"
1885         "ITSssdCoolingHoleBh3:ITSssdConeTZ2475) -"
1886         "ITSssdCoolingHoleBh3:ITSssdConeTZ2925) -"
1887         "ITSssdCoolingHoleBh3:ITSssdConeTZ3375) -"
1888         "ITSssdMountingPostHoleBh4:ITSssdConeTZ30) -"
1889         "ITSssdMountingPostHoleBh4:ITSssdConeTZ90) -"
1890         "ITSssdMountingPostHoleBh4:ITSssdConeTZ150) -"
1891         "ITSssdMountingPostHoleBh4:ITSssdConeTZ210) -"
1892         "ITSssdMountingPostHoleBh4:ITSssdConeTZ270) -"
1893         "ITSssdMountingPostHoleBh4:ITSssdConeTZ330) -"
1894         "ITSssdsddMountingBracketT:ITSssdConeBrTZ60) -"
1895         "ITSssdsddMountingBracketT:ITSssdConeBrTZ180) -"
1896         "ITSssdsddMountingBracketT:ITSssdConeBrTZ300"
1897         );
1898     sC = new TGeoCompositeShape("ITSssdSuportConeRohacellC",
1899       "((((((("
1900       "ITSssdSuportConeRohacellC0 -"
1901       "ITSssdCableHoleBh1:ITSssdConeZ225*ITSssdCableHoleBh2:ITSssdConeZ225) -"
1902       "ITSssdCableHoleBh1:ITSssdConeZ675*ITSssdCableHoleBh2:ITSssdConeZ675) -"
1903       "ITSssdCableHoleBh1:ITSssdConeZ1125*ITSssdCableHoleBh2:ITSssdConeZ1125) -"
1904       "ITSssdCableHoleBh1:ITSssdConeZ1575*ITSssdCableHoleBh2:ITSssdConeZ1575) -"
1905       "ITSssdCableHoleBh1:ITSssdConeZ2025*ITSssdCableHoleBh2:ITSssdConeZ2025) -"
1906       "ITSssdCableHoleBh1:ITSssdConeZ2475*ITSssdCableHoleBh2:ITSssdConeZ2475) -"
1907       "ITSssdCableHoleBh1:ITSssdConeZ2925*ITSssdCableHoleBh2:ITSssdConeZ2925) -"
1908       "ITSssdCableHoleBh1:ITSssdConeZ3375*ITSssdCableHoleBh2:ITSssdConeZ3375 "
1909         );
1910     sF = new TGeoCompositeShape("ITSssdSuportConeRohacellCF",
1911         "((((("
1912         "ITSssdSuportConeRohacellCF0 -"
1913         "ITSssdMountingPostHoleBh4:ITSssdConeTZ30) -"
1914         "ITSssdMountingPostHoleBh4:ITSssdConeTZ90) -"
1915         "ITSssdMountingPostHoleBh4:ITSssdConeTZ150) -"
1916         "ITSssdMountingPostHoleBh4:ITSssdConeTZ210) -"
1917         "ITSssdMountingPostHoleBh4:ITSssdConeTZ270) -"
1918         "ITSssdMountingPostHoleBh4:ITSssdConeTZ330"
1919         );
1920     //
1921     // In volume SCB, th Inserto Stesalite 4411w material volume, there
1922     // are a number of Stainless steel screw and pin studs which will be
1923     // filled with screws/studs.
1924     sD = new TGeoTube("ITS Screw+stud used to mount things to the SSD "
1925                       "support cone",
1926                       0.0,kconRScrewM5by12,kconLScrewM5by12);
1927     sE = new TGeoTube("ITS pin used to mount things to the "
1928                       "SSD support cone",0.0,kconRPinO6,kconLPinO6);
1929     // Bolt heads holding the SSD-SDD tube to the SSD cone.
1930     // Bolt -- PolyCone
1931     //Poly-cone Volume sQ.
1932     sQ = new TGeoPcon("ITS SSD Thermal sheald M6 screw headQ",0.0,360.0,4);
1933     sQ->Z(0)    = sA0->GetZ(12);
1934     sQ->Rmin(0) = 0.0;
1935     sQ->Rmax(0) = kcylRM6;
1936     sQ->Z(1)    = sA0->GetZ(10) + kconZM6Head;
1937     sQ->Rmin(1) = 0.0;
1938     sQ->Rmax(1) = kcylRM6;
1939     sQ->Z(2)    = sQ->GetZ(1);
1940     sQ->Rmin(2) = 0.0;
1941     sQ->Rmax(2) = kconRM6Head;
1942     sQ->Z(3)    = sA0->GetZ(10)+ksupPZ;
1943     sQ->Rmin(3) = 0.0;
1944     sQ->Rmax(3) = kconRM6Head;
1945     // air infront of bolt (stasolit Volume K) -- Tube
1946     sR = new TGeoTube("ITS Air in front of bolt (in stasolit)R",
1947                       sQ->GetRmin(3),sQ->GetRmax(3),0.5*(ksupPZ-kconCthick));
1948     // air infront of bolt (carbon fiber volume I) -- Tube
1949     sS = new TGeoTube("ITS Air in front of Stainless Steal Screw end, M6S",
1950                       sQ->GetRmin(3),sQ->GetRmax(3),0.5*kconCthick);
1951     //
1952     if(GetDebug(1)){
1953         sA0->InspectShape();
1954         sB0->InspectShape();
1955         sC0->InspectShape();
1956         sF0->InspectShape();
1957         sQ->InspectShape();
1958         sAh1->InspectShape();
1959         sBh1->InspectShape();
1960         sAh2->InspectShape();
1961         sBh2->InspectShape();
1962         sAh3->InspectShape();
1963         sBh3->InspectShape();
1964         sAh4->InspectShape();
1965         sBh4->InspectShape();
1966         sG->InspectShape();
1967         sH->InspectShape();
1968         sT->InspectShape();
1969         sD->InspectShape();
1970         sE->InspectShape();
1971         sR->InspectShape();
1972         sS->InspectShape();
1973         sA->InspectShape();
1974         sB->InspectShape();
1975         sC->InspectShape();
1976         sF->InspectShape();
1977     } // end if GetDebug(1)
1978     TGeoVolume *vA,*vB,*vC,*vD,*vE,*vF,*vQ,*vR,*vS,*vT;
1979     //
1980     vA = new TGeoVolume("ITSssdConeA",sA,medSSDcf); // Carbon Fiber
1981     vA->SetVisibility(kTRUE);
1982     vA->SetLineColor(4); // blue
1983     vA->SetLineWidth(1);
1984     vA->SetFillColor(vA->GetLineColor());
1985     vA->SetFillStyle(4050); // 50% transparent
1986     vB = new TGeoVolume("ITSssdConeB",sB,medSSDfs); // Staselite
1987     vB->SetVisibility(kTRUE);
1988     vB->SetLineColor(2); // red
1989     vB->SetLineWidth(1);
1990     vB->SetFillColor(vB->GetLineColor());
1991     vB->SetFillStyle(4050); // 50% transparent
1992     vC = new TGeoVolume("ITSssdConeC",sC,medSSDfo); // Rohacell
1993     vC->SetVisibility(kTRUE);
1994     vC->SetLineColor(3); // green
1995     vC->SetLineWidth(1);
1996     vC->SetFillColor(vC->GetLineColor());
1997     vC->SetFillStyle(4050); // 50% transparent
1998     vF = new TGeoVolume("ITSssdConeF",sF,medSSDfo); // Rohacell;
1999     vF->SetVisibility(kTRUE);
2000     vF->SetLineColor(3); // green
2001     vF->SetLineWidth(1);
2002     vF->SetFillColor(vF->GetLineColor());
2003     vF->SetFillStyle(4050); // 50% transparent
2004     vD = new TGeoVolume("ITSssdConeD",sD,medSSDss);
2005     vD->SetVisibility(kTRUE);
2006     vD->SetLineColor(1); // black
2007     vD->SetLineWidth(1);
2008     vD->SetFillColor(vD->GetLineColor());
2009     vD->SetFillStyle(4000); // 0% transparent
2010     vE = new TGeoVolume("ITSssdConeE",sE,medSSDss);
2011     vE->SetVisibility(kTRUE);
2012     vE->SetLineColor(1); // black
2013     vE->SetLineWidth(1);
2014     vE->SetFillColor(vE->GetLineColor());
2015     vE->SetFillStyle(4000); // 0% transparent
2016     vQ = new TGeoVolume("ITSssdConeQ",sQ,medSSDss);
2017     vQ->SetVisibility(kTRUE);
2018     vQ->SetLineColor(1); // black
2019     vQ->SetLineWidth(1);
2020     vQ->SetFillColor(vQ->GetLineColor());
2021     vQ->SetFillStyle(4000); // 0% transparent
2022     vR = new TGeoVolume("ITSssdConeR",sR,medSSDair);
2023     vR->SetVisibility(kTRUE);
2024     vR->SetLineColor(5); // yellow
2025     vR->SetLineWidth(1);
2026     vR->SetFillColor(vR->GetLineColor());
2027     vR->SetFillStyle(4090); // 90% transparent
2028     vS = new TGeoVolume("ITSssdConeS",sS,medSSDair);
2029     vS->SetVisibility(kTRUE);
2030     vS->SetLineColor(5); // yellow
2031     vS->SetLineWidth(1);
2032     vS->SetFillColor(vS->GetLineColor());
2033     vS->SetFillStyle(4090); // 90% transparent
2034     vT = new TGeoVolume("ITSssdsddMountingBracket",sT,medSSDal);
2035     vT->SetVisibility(kTRUE);
2036     vT->SetLineColor(5); // yellow
2037     vT->SetLineWidth(1);
2038     vT->SetFillColor(vT->GetLineColor());
2039     vT->SetFillStyle(4000); // 0% transparent
2040     //
2041     TGeoCombiTrans *rotran;
2042     TGeoTranslation *tran;
2043     tran = new TGeoTranslation("ITSssdConeTrans",0.0,0.0,-kconZDisplacement);
2044     TGeoRotation *rotY180 = new TGeoRotation("",0.0,180.0,0.0);
2045     TGeoCombiTrans *flip  = new TGeoCombiTrans("ITSssdConeFlip",
2046                                            0.0,0.0,kconZDisplacement,rotY180);
2047     //delete rotY180;// rot not explicity used in AddNode functions.
2048     //
2049     //
2050     //
2051     //
2052     vA->AddNode(vB,1,0);
2053     vB->AddNode(vC,1,0);
2054     vB->AddNode(vF,1,0);
2055     moth->AddNode(vA,1,tran); // RB24 side
2056     moth->AddNode(vA,2,flip); // RB26 side (Absorber)
2057     //
2058     //
2059     //
2060     // Insert Bolt and Pins in both the Cone and Cylinder at the same time.
2061     Int_t nCopyCDv=0,nCopyCEv=0,nCopyQv=0,nCopyvR=0,nCopySv=0,nCopyTv=0;
2062     Int_t nCopyvD=0,nCopyvE=0;
2063     z = sCB->GetZ(0)+sCD->GetDz(); // sCB->GetZ(0)<0!
2064     dt = (360.0/((Double_t)kcylNPin));
2065     for(i=0;i<kcylNPin;i++){
2066         t = ((Double_t)i)*dt;
2067         x = kcylRholes*CosD(t+kcylPhi0Pin);
2068         y = kcylRholes*SinD(t+kcylPhi0Pin);
2069         tran = new TGeoTranslation("",x,y,z);
2070         vCB->AddNode(vCD,++nCopyCDv,tran);
2071         tran = new TGeoTranslation("",x,y,-z);
2072         vCB->AddNode(vCD,++nCopyCDv,tran);
2073     } // end for i
2074     dt = (360.0/((Double_t)kcylNM6));
2075     for(i=0;i<kcylNM6;i++){
2076         t = ((Double_t)i)*dt;
2077         x = kcylRholes*CosD(t+kcylPhi0M6);
2078         y = kcylRholes*SinD(t+kcylPhi0M6);
2079         z = sCB->GetZ(0)+sCE->GetDz(); // sCB->GetZ()<0!
2080         tran = new TGeoTranslation("",x,y,z);
2081         vCB->AddNode(vCE,++nCopyCEv,tran);
2082         tran = new TGeoTranslation("",x,y,-z);
2083         vCB->AddNode(vCE,++nCopyCEv,tran);
2084         tran = new TGeoTranslation("",x,y,0.0);
2085         vB->AddNode(vQ,++nCopyQv,tran);
2086         if(!((t<rotranBrTZ60->GetRotation()->GetPhiRotation()+sT->GetPhi2()&&
2087              t>rotranBrTZ60->GetRotation()->GetPhiRotation()-sT->GetPhi1())||
2088             (t<rotranBrTZ180->GetRotation()->GetPhiRotation()+sT->GetPhi2()&&
2089              t>rotranBrTZ180->GetRotation()->GetPhiRotation()-sT->GetPhi1())||
2090             (t<rotranBrTZ300->GetRotation()->GetPhiRotation()+sT->GetPhi2()&&
2091              t>rotranBrTZ300->GetRotation()->GetPhiRotation()-sT->GetPhi1()))){
2092             // If not at an angle where the bracket sT is located.
2093             tran = new TGeoTranslation("",x,y,sB0->GetZ(10)-sR->GetDz());
2094             vB->AddNode(vR,++nCopyvR,tran);
2095             tran = new TGeoTranslation("",x,y,sA0->GetZ(10)-sS->GetDz());
2096             vA->AddNode(vS,++nCopySv,tran);
2097         } // end if
2098     } // end for i
2099     // Add the mounting brackets to the RB24 side only.
2100     vl[0] = 0.0;
2101     vl[1] = 0.0;
2102     vl[2] = sA0->GetZ(10)+kconZDisplacement-sT->GetDz();
2103     rotZ60->LocalToMaster(vl,vg);
2104     rotran = new TGeoCombiTrans("",vg[0],vg[1],vg[2],rotZ60);
2105     moth->AddNode(vT,++nCopyTv,rotran);
2106     rotZ180->LocalToMaster(vl,vg);
2107     rotran = new TGeoCombiTrans("",vg[0],vg[1],vg[2],rotZ180);
2108     moth->AddNode(vT,++nCopyTv,rotran);
2109     rotZ300->LocalToMaster(vl,vg);
2110     rotran = new TGeoCombiTrans("",vg[0],vg[1],vg[2],rotZ300);
2111     moth->AddNode(vT,++nCopyTv,rotran);
2112     //
2113     Double_t da[] = {-3.5,-1.5,1.5,3.5};
2114     for(i=0;i<2;i++){ // Mounting for ITS-TPC bracket or ITS-Rails
2115         t0 = 180.*((Double_t)i);
2116         for(j=-kconNScrewM5by12/2;j<=kconNScrewM5by12/2;j++)if(j!=0){
2117                     //screws per ITS-TPC brkt
2118             t = t0 + 5.0*((Double_t)j);
2119             tran = new TGeoTranslation("",kconROutHoles*CosD(t),
2120                                           kconROutHoles*SinD(t),
2121                                           sB0->GetZ(0)+sE->GetDz());
2122             vB->AddNode(vE,++nCopyvE,tran);
2123         } // end or j
2124         for(j=-kconNPinO6/2;j<=kconNPinO6/2;j++){ // pins per ITS-TPC bracket
2125             t = t0 + 3.0*((Double_t)j);
2126             tran = new TGeoTranslation("",kconROutHoles*CosD(t),
2127                                           kconROutHoles*SinD(t),
2128                                           sB0->GetZ(0)+sD->GetDz());
2129             vB->AddNode(vD,++nCopyvD,tran);
2130         } // end or j
2131         t0 = (-5.5+191.*((Double_t)i));
2132         for(j=0;j<kconNRailScrews;j++){ // screws per ITS-rail bracket
2133             t = t0+da[j];
2134             tran = new TGeoTranslation("",kconROutHoles*CosD(t),
2135                                           kconROutHoles*SinD(t),
2136                                           sB0->GetZ(0)+sE->GetDz());
2137             vB->AddNode(vE,++nCopyvE,tran);
2138         } // end or j
2139         t0 = (95.5+191.*((Double_t)i));
2140         for(j=-kconNRailPins/2;j<=kconNRailPins/2;j++)if(j!=0){ 
2141              // pins per ITS-rail bracket
2142             t = t0+(5.5*((Double_t)j));
2143             tran = new TGeoTranslation("",kconROutHoles*CosD(t),
2144                                           kconROutHoles*SinD(t),
2145                                           sB0->GetZ(0)+sD->GetDz());
2146             vB->AddNode(vD,++nCopyvD,tran);
2147         } // end or j
2148     } // end for i
2149     for(i=0;i<kconNmounts;i++){ 
2150                 // mounting points for SPD-cone+Beam-pipe support
2151         t0 = (45.0+((Double_t)i)*360./((Double_t)kconNmounts));
2152         for(j=-1;j<=1;j++)if(j!=0){ // 2 screws per bracket
2153             t = t0+((Double_t)j)*0.5*kconMountPhi0;
2154             tran = new TGeoTranslation("",kconROutHoles*CosD(t),
2155                                           kconROutHoles*SinD(t),
2156                                           sB0->GetZ(0)+sD->GetDz());
2157             vB->AddNode(vD,++nCopyvD,tran);
2158         } // end for j
2159         for(j=0;j<1;j++){ // 1 pin per bracket
2160             t = t0;
2161             tran = new TGeoTranslation("",kconROutHoles*CosD(t),
2162                                           kconROutHoles*SinD(t),
2163                                           sB0->GetZ(0)+sD->GetDz());
2164             vB->AddNode(vE,++nCopyvE,tran);
2165         } // end for j
2166     } // end for i
2167     if(GetDebug(1)){
2168         vA->PrintNodes();
2169         vB->PrintNodes();
2170         vC->PrintNodes();
2171         vD->PrintNodes();
2172         vE->PrintNodes();
2173         vF->PrintNodes();
2174         vQ->PrintNodes();
2175         vR->PrintNodes();
2176         vS->PrintNodes();
2177         vT->PrintNodes();
2178     } // end if
2179 }
2180
2181 //______________________________________________________________________
2182 void AliITSv11GeometrySupport::ServicesCableSupport(TGeoVolume *moth,
2183                                                     TGeoManager *mgr){
2184     // Define the detail ITS cable support trays on both the RB24 and 
2185     // RB26 sides..
2186     // Inputs:
2187     //   TGeoVolume  *moth  The mother volume to place this object.
2188     //   TGeoManager *mgr   A pointer to the Geo-Manager default gGeoManager
2189     // Outputs:
2190     //  none.
2191     // Return:
2192     //  none.
2193     // Based on the Drawings SSup_201A.jpg unless otherwise stated, 
2194     // Volumes A..., 
2195     TGeoMedium *medSUPcf    = 0; // SUP support cone Carbon Fiber materal nbr.
2196     TGeoMedium *medSUPfs    = 0; // SUP support cone inserto stesalite 4411w.
2197     TGeoMedium *medSUPfo    = 0; // SUP support cone foam, Rohacell 50A.
2198     TGeoMedium *medSUPss    = 0; // SUP support cone screw material,Stainless
2199     TGeoMedium *medSUPair   = 0; // SUP support cone Air
2200     TGeoMedium *medSUPal    = 0; // SUP support cone SDD mounting bracket Al
2201     TGeoMedium *medSUPwater = 0; // SUP support cone Water
2202     medSUPcf    = mgr->GetMedium("ITSssdCarbonFiber");
2203     medSUPfs    = mgr->GetMedium("ITSssdStaselite4411w");
2204     medSUPfo    = mgr->GetMedium("ITSssdRohacell50A");
2205     medSUPss    = mgr->GetMedium("ITSssdStainlessSteal");
2206     medSUPair   = mgr->GetMedium("ITSssdAir");
2207     medSUPal    = mgr->GetMedium("ITSssdAl");
2208     medSUPwater = mgr->GetMedium("ITSssdWater");
2209     //
2210     Int_t i,j,iRmin;
2211     Double_t x,y,z,t,t0,dt,di,r,l,local[3],master[3];
2212     Char_t name[100];
2213     Double_t r1,r2,m;
2214     // RB 24, Open Side.
2215     const Double_t kfrm24Z0           = 900*fgkmm;//SSup_203A.jpg
2216     const Double_t kfrm24Thss         = 5.0*fgkmm;
2217     const Double_t kfrm24Rss          = 444.5*fgkmm-kfrm24Thss; //SSup_204A.jpg
2218     const Double_t kfrm24Width        = 10.0*fgkmm;
2219     const Double_t kfrm24Hight        = 10.0*fgkmm;
2220     const Double_t kfrm24Phi0         = 15.2*fgkDegree; // SSup_602A.jpg
2221     const Double_t kfrm24Phi1         = (90.0-7.6)*fgkDegree; // SSup_802A.jpg
2222     const Double_t kfrm24ZssSection   = (415.0-10.0)*fgkmm;
2223     const Int_t    kfrm24NZsections   = 4;
2224     const Int_t    kfrm24NPhiSections = 4;
2225     const Int_t    kfrm24NPhi         = 4;
2226     // These numbers are guessed at.
2227     const Double_t kfrm24ZfracAngle   =  0.55; // frational z length to brack
2228     const Double_t kfrm24Angle        =  10.0*fgkDegree; // Guessed at
2229     //
2230     TGeoTubeSeg *sA24[kfrm24NZsections+1];
2231     TGeoArb8    *sB24[kfrm24NZsections+1];
2232     Double_t zA24[kfrm24NZsections+1];
2233     l = 4.*kfrm24ZssSection+5*kfrm24Width;
2234     j = iRmin = 0;
2235     for(i=0;i<kfrm24NZsections+1;i++){
2236         sprintf(name,"ITS sup Cable tray support frame radial section A24[%d]",
2237                 i);
2238         r1 = kfrm24Rss;
2239         if(i==0) zA24[i] = kfrm24Width;
2240         else zA24[i] = zA24[i-1] + kfrm24ZssSection + kfrm24Width;
2241         if(zA24[i]>l*kfrm24ZfracAngle){ // break, radii get larger
2242             r1 = kfrm24Rss + (zA24[i]-kfrm24ZfracAngle*l)*SinD(kfrm24Angle);
2243         } // end if
2244         r2 = r1+kfrm24Thss;
2245         sA24[i] = new TGeoTubeSeg(name,r1,r2,0.5*kfrm24Width,kfrm24Phi0,
2246                                   kfrm24Phi1);
2247         if(i>0)if(sA24[i-1]->GetRmin()==sA24[i]->GetRmin()) j = iRmin = i;
2248     } // end for i
2249     for(i=0;i<kfrm24NZsections;i++){
2250         sprintf(name,"ITS sup Cable tray support frame Z section B24[%d]",i);
2251         sB24[i] = new TGeoArb8(name,0.5*kfrm24ZssSection);
2252         sB24[i]->SetVertex(0,sA24[i]->GetRmin(),0.5*kfrm24Hight);
2253         sB24[i]->SetVertex(1,sA24[i]->GetRmax(),0.5*kfrm24Hight);
2254         sB24[i]->SetVertex(2,sA24[i]->GetRmin(),-0.5*kfrm24Hight);
2255         sB24[i]->SetVertex(3,sA24[i]->GetRmax(),-0.5*kfrm24Hight);
2256         sB24[i]->SetVertex(4,sA24[i+1]->GetRmin(),0.5*kfrm24Hight);
2257         sB24[i]->SetVertex(5,sA24[i+1]->GetRmax(),0.5*kfrm24Hight);
2258         sB24[i]->SetVertex(6,sA24[i+1]->GetRmin(),-0.5*kfrm24Hight);
2259         sB24[i]->SetVertex(7,sA24[i+1]->GetRmax(),-0.5*kfrm24Hight);
2260     } // end for i
2261     if(GetDebug(1)){
2262         for(i=0;i<kfrm24NZsections+1;i++) sA24[i]->InspectShape();
2263         for(i=0;i<kfrm24NZsections;i++)   sB24[i]->InspectShape();
2264     } // end if GetDebug(1)
2265     TGeoVolume *vA24[kfrm24NZsections+1],*vB24[kfrm24NZsections];
2266     TGeoVolumeAssembly *vM24;
2267     TGeoTranslation *tran;
2268     TGeoRotation    *rot,*rot1;
2269     TGeoCombiTrans  *tranrot;
2270     //
2271     for(i=0;i<kfrm24NZsections+1;i++){
2272         vA24[i] = 0;
2273         sprintf(name,"ITSsupFrameA24[%d]",i);
2274         vA24[i] = new TGeoVolume(name,sA24[i],medSUPss);
2275         vA24[i]->SetVisibility(kTRUE);
2276         vA24[i]->SetLineColor(1); // black
2277         vA24[i]->SetLineWidth(1);
2278         vA24[i]->SetFillColor(vA24[i]->GetLineColor());
2279         vA24[i]->SetFillStyle(4000); // 0% transparent
2280     } // end for i
2281     for(i=0;i<kfrm24NZsections;i++){
2282         vB24[i] = 0;
2283         sprintf(name,"ITSsupFrameB24[%d]",i);
2284         vB24[i] = new TGeoVolume(name,sB24[i],medSUPss);
2285         vB24[i]->SetVisibility(kTRUE);
2286         vB24[i]->SetLineColor(1); // black
2287         vB24[i]->SetLineWidth(1);
2288         vB24[i]->SetFillColor(vB24[i]->GetLineColor());
2289         vB24[i]->SetFillStyle(4000); // 0% transparent
2290     } // end for i
2291     vM24 = new TGeoVolumeAssembly("ITSsupFrameM24");
2292     //vM24->SetVisibility(kTRUE);
2293     //vM24->SetLineColor(7); // light blue
2294     //vM24->SetLineWidth(1);
2295     //vM24->SetFillColor(vM24->GetLineColor());
2296     //vM24->SetFillStyle(4090); // 90% transparent
2297     //
2298     Int_t ncopyB24[kfrm24NPhiSections];
2299     t0 = kfrm24Phi0;
2300     dt = (kfrm24Phi1-kfrm24Phi0)/((Double_t)kfrm24NPhiSections);
2301     for(i=0;i<=kfrm24NZsections;i++){
2302         z = zA24[i];
2303         tran = new TGeoTranslation("",0.0,0.0,z);
2304         vM24->AddNode(vA24[i],1,tran);
2305        if(i<kfrm24NZsections){
2306            ncopyB24[i] = 1;
2307            for(j=0;j<=kfrm24NPhiSections;j++){
2308                t = t0 + ((Double_t)j)*dt;
2309                rot = new TGeoRotation("",0.0,0.0,t);
2310                tranrot = new TGeoCombiTrans("",0.0,0.0,z+sB24[i]->GetDz(),rot);
2311                //delete rot;// rot not explicity used in AddNode functions.
2312                vM24->AddNode(vB24[i],ncopyB24[i]++,tranrot);
2313            } // end for j
2314        } // end if
2315     } // end for i
2316     tran = new TGeoTranslation("",0.0,0.0,kfrm24Z0);
2317     moth->AddNode(vM24,1,tran);
2318     for(i=1;i<kfrm24NPhi;i++){
2319         di = (Double_t) i;
2320         rot = new TGeoRotation("",0.0,0.0,90.0*di);
2321         tranrot = new TGeoCombiTrans("",0.0,0.0,kfrm24Z0,rot);
2322         //delete rot;// rot not explicity used in AddNode functions.
2323         moth->AddNode(vM24,i+1,tranrot);
2324     } // end for i
2325     if(GetDebug(1)){
2326         for(i=0;i<kfrm24NZsections+1;i++) vA24[i]->PrintNodes();
2327         for(i=0;i<kfrm24NZsections;i++) vB24[i]->PrintNodes();
2328         vM24->PrintNodes();
2329     } // end if
2330     //==================================================================
2331     // RB24 Cable Tray
2332     const Double_t kct24WidthBottom   = 44.0*fgkmm; // Serv-C_208.jpg
2333     const Double_t kct24WidthTop      = 46.0*fgkmm; // Serv-C_208.jpg
2334     const Double_t kct24Hight         = 51.0*fgkmm; // Serv-C_208.jpg
2335     const Double_t kct24AlThick       = 1.0*fgkmm; // Serv-C_208.jpg
2336     const Double_t kct24CapWidth      = 46.0*fgkmm; // Serv-C_208.jpg
2337     const Double_t kct24CapEar        = 5.0*fgkmm; // Guess
2338     const Double_t kct24Rmin          = 455.0*fgkmm; // Serv-C_203.jpg
2339     const Double_t kct24CoolSectionH  = 470.0*fgkmm-kct24Rmin;// Serv-C_203.jpg
2340     const Double_t kct24CoolCableDivEar = 2.0*fgkmm; // Guess
2341     const Int_t kct24Ntrays           = 48; // Serv-C_205.jpg
2342     //const Int_t kct24Ntubes           = 3; // Serv-C_208.jpg
2343     // Patch Pannels for RB 24 side
2344     const Double_t kft24PPHightSPDFMD = 72.0*fgkmm; // Serv-C_SPD/FMD.jpg
2345     const Double_t kft24PPHightSDDSSD = 104.0*fgkmm; // Serv-C_SDD/SSD.jpg
2346     const Double_t kft24PPlength      = 350.0*fgkmm;//Serv-C_SPD/SDD/SSD/FMD_1.jpg
2347     const Double_t kft24Theta         = 2.0*TMath::ATan2(kct24WidthBottom,
2348                                                  2.0*kct24Rmin)*fgkRadian; //
2349     const Int_t    kft24NPatchPannels = 20; //
2350     //
2351     Double_t xp[12],yp[12];
2352     TGeoPcon *sMT24;
2353     TGeoXtru *sT24,*sTs24,*sTl24,*sTt24,*sU24,*sVl24,*sVs24,*sW24;
2354     TGeoXtru *s3PP24,*s2PP24,*sV3PP24,*sV2PP24;
2355     // Outer Tray Full
2356     sT24 = new TGeoXtru(3);
2357     sT24->SetName("ITS sup Full Cable Tray for RB24 Side T24");
2358     xp[0]  = -0.5*kct24WidthBottom;
2359     yp[0]  = sA24[0]->GetRmax();
2360     yp[1]  = yp[0] + kct24Hight-kct24CapEar;
2361     xp[1]  = Xfrom2Points(xp[0],yp[0],-0.5*kct24WidthTop+kct24AlThick,
2362                           yp[0]+kct24Hight,yp[1]);
2363     yp[2]  = yp[1];
2364     xp[2]  = xp[1]-kct24AlThick;
2365     xp[3]  = -0.5*kct24CapWidth;
2366     yp[3]  = yp[0] + kct24Hight;
2367     xp[4]  = -xp[3];
2368     yp[4]  =  yp[3];
2369     xp[5]  = -xp[2];
2370     yp[5]  =  yp[2];
2371     xp[6]  = -xp[1];
2372     yp[6]  =  yp[1];
2373     xp[7]  = -xp[0];
2374     yp[7]  =  yp[0];
2375     sT24->DefinePolygon(8,xp,yp);
2376     sT24->DefineSection(0,zA24[0]-kfrm24Width,0.0,0.0,1.0);
2377     sT24->DefineSection(1,zA24[iRmin],0.0,0.0,1.0);
2378     sT24->DefineSection(2,zA24[kfrm24NZsections]+kfrm24Width,0.0,
2379                       sA24[kfrm24NZsections]->GetRmax()-sA24[0]->GetRmin());
2380     // RB 24 full tray no divider (for ALG and T0-V0 cables?)
2381     sW24 = new TGeoXtru(3);
2382     sW24->SetName("ITS sup Cable Tray No Divider for RB24 Side W24");
2383     xp[0] = sT24->GetX(0) + kct24AlThick;
2384     yp[0] = sT24->GetY(0) + kct24AlThick;
2385     yp[1] = sT24->GetY(3) - kct24AlThick;
2386     xp[1] = Xfrom2Points(sT24->GetX(0),sT24->GetY(0),sT24->GetX(1),
2387                          sT24->GetY(1),yp[1]) + kct24AlThick;
2388     xp[2] = -xp[1];
2389     yp[2] =  yp[1];
2390     xp[3] = -xp[0];
2391     yp[3] =  yp[0];
2392     sW24->DefinePolygon(4,xp,yp);
2393     for(i=0;i<sT24->GetNz();i++){
2394         sW24->DefineSection(i,sT24->GetZ(i),sT24->GetXOffset(i),
2395                             sT24->GetYOffset(i),sT24->GetScale(i));
2396     } // end for i
2397     // Outer Tray Short
2398     sTs24 = new TGeoXtru(3);
2399     sTs24->SetName("ITS sup Short Cable Tray for RB24 Side Ts24");
2400     yp[0]  = sT24->GetY(0) + kct24CoolSectionH;
2401     xp[0]  = Xfrom2Points(sT24->GetX(0),sT24->GetY(0),sT24->GetX(1),
2402                          sT24->GetY(1),yp[0]);
2403     for(i=1;i<7;i++){
2404         xp[i]  = sT24->GetX(i);
2405         yp[i]  = sT24->GetY(i);
2406     } // end for i
2407     xp[7]  = -xp[0];
2408     yp[7]  =  yp[0];
2409     sTs24->DefinePolygon(8,xp,yp);
2410     sTs24->DefineSection(0,zA24[0] -kfrm24Width+kft24PPlength);
2411     sTs24->DefineSection(1,zA24[iRmin]);
2412     sTs24->DefineSection(2,zA24[kfrm24NZsections]+kfrm24Width,
2413                          sT24->GetXOffset(2),
2414                          sT24->GetYOffset(2),sT24->GetScale(2));
2415     // Outer Tray Long
2416     sTl24 = new TGeoXtru(3);
2417     sTl24->SetName("ITS sup Long Cable Tray for RB24 Side Tl24");
2418     for(i=0;i<8;i++){
2419     xp[i]  = sTs24->GetX(i);
2420     yp[i]  = sTs24->GetY(i);
2421     } // End for i
2422     sTl24->DefinePolygon(8,xp,yp);
2423     sTl24->DefineSection(0,zA24[0]-kfrm24Width,0.0,0.0,1.0);
2424     sTl24->DefineSection(1,zA24[iRmin],0.0,0.0,1.0);
2425     sTl24->DefineSection(2,zA24[kfrm24NZsections]+kfrm24Width,0.0,
2426                      sA24[kfrm24NZsections]->GetRmax()-sA24[0]->GetRmin(),1.0);
2427     // Outer Tray for air Tubes
2428     sTt24 = new TGeoXtru(3);
2429     sTt24->SetName("ITS sup Long Air Tube Tray for RB24 Side Tt24");
2430     xp[0]  = sT24->GetX(0);
2431     yp[0]  = sT24->GetY(0);
2432     xp[1]  = sTl24->GetX(0);
2433     yp[1]  = sTl24->GetY(0);
2434     xp[2]  = -xp[1];
2435     yp[2]  =  yp[1];
2436     xp[3]  = -xp[0];
2437     yp[3]  =  yp[0];
2438     sTt24->DefinePolygon(4,xp,yp);
2439     sTt24->DefineSection(0,zA24[0]-kfrm24Width,0.0,0.0,1.0);
2440     sTt24->DefineSection(1,zA24[iRmin],0.0,0.0,1.0);
2441     sTt24->DefineSection(2,zA24[kfrm24NZsections]+kfrm24Width,0.0,
2442                          sA24[kfrm24NZsections]->GetRmax()-sA24[0]->GetRmin());
2443     // Inner opening for cooling (lower) {inside sTt24}
2444     sU24 = new TGeoXtru(3);
2445     sU24->SetName("ITS sup Cable Tray Cooling tube space RB24 Side U24");
2446     xp[0] = sTt24->GetX(0) + kct24AlThick;
2447     yp[0] = sTt24->GetY(0) + kct24AlThick;
2448     xp[1] = sTt24->GetX(1) + kct24AlThick;
2449     yp[1] = sTt24->GetY(1) - kct24AlThick;
2450     xp[2] = -xp[1];
2451     yp[2] =  yp[1];
2452     xp[3] = -xp[0];
2453     yp[3] =  yp[0];
2454     sU24->DefinePolygon(4,xp,yp);
2455     for(i=0;i<sTt24->GetNz();i++){
2456         sU24->DefineSection(i,sTt24->GetZ(i),sTt24->GetXOffset(i),
2457                             sTt24->GetYOffset(i),sTt24->GetScale(i));
2458     } // end for i
2459     // Inner opening for cables (upper) {inside sTl24}
2460     sVl24 = new TGeoXtru(3);
2461     sVl24->SetName("ITS sup Cable Tray Cable space RB24 Side Vl24");
2462     xp[0] = sTl24->GetX(0)+2.0*kct24AlThick;
2463     yp[0] = sTl24->GetY(0);
2464     yp[1] = yp[0] + kct24CoolCableDivEar;
2465     xp[1] = Xfrom2Points(sTl24->GetX(0),sTl24->GetY(0),
2466                          sTl24->GetX(1),sTl24->GetY(1),yp[1])+2.0*kct24AlThick;
2467     yp[2] = yp[1];
2468     xp[2] = xp[1] - kct24AlThick;
2469     yp[3] = sTl24->GetY(3) - kct24AlThick;
2470     xp[3] = Xfrom2Points(sTl24->GetX(0),sTl24->GetY(0),sTl24->GetX(1),
2471                          sTl24->GetY(1),yp[3]) + kct24AlThick;
2472     xp[4] = -xp[3];
2473     yp[4] =  yp[3];
2474     xp[5] = -xp[2];
2475     yp[5] =  yp[2];
2476     xp[6] = -xp[1];
2477     yp[6] =  yp[1];
2478     xp[7] = -xp[0];
2479     yp[7] =  yp[0];
2480     sVl24->DefinePolygon(8,xp,yp);
2481     for(i=0;i<sTl24->GetNz();i++){
2482         sVl24->DefineSection(i,sTl24->GetZ(i),sTl24->GetXOffset(i),
2483                             sTl24->GetYOffset(i),sTl24->GetScale(i));
2484     } // end for i
2485     // Inner opening for cables (upper) {inside sTs24}
2486     sVs24 = new TGeoXtru(3);
2487     sVs24->SetName("ITS sup Cable Tray Cable space RB24 Side Vs24");
2488     sVs24->DefinePolygon(8,xp,yp);
2489     for(i=0;i<8;i++){
2490     xp[i]  = sVl24->GetX(i);
2491     yp[i]  = sVl24->GetY(i);
2492     } // end for i
2493     for(i=0;i<sTl24->GetNz();i++){
2494         sVs24->DefineSection(i,sTs24->GetZ(i),sTs24->GetXOffset(i),
2495                             sTs24->GetYOffset(i),sTs24->GetScale(i));
2496     } // end for i
2497     //------------------------------------------------------------------
2498     // Patch Pannels on RB 24 Side
2499     rot  = new TGeoRotation("",0.0,0.0,-kft24Theta); // Gets Used later as well
2500     rot1 = new TGeoRotation("",0.0,0.0,kft24Theta);  // Gets Used later as well
2501     s3PP24 = new TGeoXtru(2);
2502     s3PP24->SetName("ITS sup 3 bay pach pannel RB24 side 3PP24");
2503     yp[5]  = sT24->GetY(7) + kct24CoolSectionH;
2504     xp[5]  = Xfrom2Points(sT24->GetX(7),sT24->GetY(7),sT24->GetX(6),
2505                           sT24->GetY(6),yp[6]);
2506     yp[6]  = sT24->GetY(0) + kct24CoolSectionH;
2507     xp[6]  =  Xfrom2Points(sT24->GetX(0),sT24->GetY(0),sT24->GetX(1),
2508                           sT24->GetY(1),yp[9]);
2509     local[0] = xp[6]; local[1] = yp[6]; local[2] = 0.0;
2510     rot1->LocalToMaster(local,master);
2511     xp[0]  = master[0];
2512     yp[0]  = master[1];
2513     local[0] = xp[6]; local[1] = yp[6] + kft24PPHightSDDSSD; local[2] = 0.0;
2514     rot1->LocalToMaster(local,master);
2515     xp[1]  = master[0];
2516     yp[1]  = master[1];
2517     xp[2]  = -xp[1];
2518     yp[2]  =  yp[1];
2519     xp[3]  = -xp[0];
2520     yp[3]  =  yp[0];
2521     local[0] = xp[6]; local[1] = yp[6]; local[2] = 0.0;
2522     rot1->MasterToLocal(local,master);
2523     xp[4]  = master[0];
2524     yp[4]  = master[1];
2525     local[0] = xp[5]; local[1] = yp[5]; local[2] = 0.0;
2526     rot1->LocalToMaster(local,master);
2527     xp[7]  = master[0];
2528     yp[7]  = master[1];
2529     s3PP24->DefinePolygon(8,xp,yp);
2530     s3PP24->DefineSection(0,0.0);
2531     s3PP24->DefineSection(1,kft24PPlength);
2532     //
2533     s2PP24 = new TGeoXtru(2);
2534     s2PP24->SetName("ITS sup 2 bay pach pannel RB24 side 2PP24");
2535     local[1] = sTl24->GetY(3); local[2] = 0.0;
2536     local[0] = Xfrom2Points(sTl24->GetX(0),sTl24->GetY(0),
2537                             sTl24->GetX(1),sTl24->GetY(1),local[1]);
2538     rot1->LocalToMaster(local,master);
2539     xp[0]  = master[0];
2540     yp[0]  = master[1];
2541     local[1] = sTl24->GetY(3) + kft24PPHightSPDFMD; local[2] = 0.0;
2542     local[0] = Xfrom2Points(sTl24->GetX(0),sTl24->GetY(0),
2543                             sTl24->GetX(1),sTl24->GetY(1),local[1]);
2544     rot1->LocalToMaster(local,master);
2545     xp[1]  = master[0];
2546     yp[1]  = master[1];
2547     yp[2]  = sTl24->GetY(4) + kft24PPHightSPDFMD;
2548     xp[2]  = Xfrom2Points(sTl24->GetX(6),sTl24->GetY(6),
2549                           sTl24->GetX(7),sTl24->GetY(7),yp[2]);
2550     yp[3]  = sTl24->GetY(7);
2551     xp[3]  = Xfrom2Points(sTl24->GetX(6),sTl24->GetY(6),
2552                           sTl24->GetX(7),sTl24->GetY(7),yp[3]);
2553     xp[4]  = sTl24->GetX(3);
2554     yp[4]  = sTl24->GetY(3);
2555     local[0] = sTl24->GetX(4);local[1] = sTl24->GetY(4); local[2] = 0.0;
2556     rot1->LocalToMaster(local,master);
2557     xp[5]  = master[0];
2558     yp[5]  = master[1];
2559     s2PP24->DefinePolygon(6,xp,yp);
2560     s2PP24->DefineSection(0,0.0);
2561     s2PP24->DefineSection(1,kft24PPlength);
2562     //
2563     sV3PP24 = new TGeoXtru(2);
2564     sV3PP24->SetName("ITS sup Patch Pannel 3 Bay inside Rb24 side V3PP24");
2565     xp[0] = s3PP24->GetX(0) + kct24AlThick;
2566     yp[0] = s3PP24->GetY(0) + kct24AlThick;
2567     local[1] = s3PP24->GetY(6) + kft24PPHightSDDSSD - kct24AlThick;local[2]=0.;
2568     local[0] = Xfrom2Points(sTl24->GetX(0),sTl24->GetY(0),
2569                            sTl24->GetX(1),sTl24->GetY(1),local[1]);
2570     rot1->LocalToMaster(local,master);
2571     xp[1] = master[0];
2572     yp[1] = master[1];
2573     xp[2] = -xp[1];
2574     yp[2] =  yp[1];
2575     xp[3] = -xp[0];
2576     yp[3] =  yp[0];
2577     xp[4] = s3PP24->GetX(4);
2578     yp[4] = s3PP24->GetY(4);
2579     xp[5] = s3PP24->GetX(5);
2580     yp[5] = s3PP24->GetY(5);
2581     xp[6] = s3PP24->GetX(6);
2582     yp[6] = s3PP24->GetY(6);
2583     xp[7] = s3PP24->GetX(7);
2584     yp[7] = s3PP24->GetY(7);
2585     sV3PP24->DefinePolygon(8,xp,yp);
2586     sV3PP24->DefineSection(0,s3PP24->GetZ(0),s3PP24->GetXOffset(0),
2587                            s3PP24->GetYOffset(0),s3PP24->GetScale(0));
2588     sV3PP24->DefineSection(1,s3PP24->GetZ(1),s3PP24->GetXOffset(1),
2589                            s3PP24->GetYOffset(1),s3PP24->GetScale(1));
2590     //
2591     sV2PP24 = new TGeoXtru(2);
2592     sV2PP24->SetName("ITS sup Patch Pannel 2 Bay inside Rb24 side V2PP24");
2593     xp[0] = s2PP24->GetX(0) + kct24AlThick;
2594     yp[0] = s2PP24->GetY(0) + kct24AlThick;
2595     local[1] = sTl24->GetY(3) + kft24PPHightSPDFMD - kct24AlThick;local[2]=0.;
2596     local[0] = Xfrom2Points(sTl24->GetX(0),sTl24->GetY(0),
2597                            sTl24->GetX(1),sTl24->GetY(1),local[1]);
2598     rot1->LocalToMaster(local,master);
2599     xp[1] = master[0];
2600     yp[1] = master[1];
2601     yp[2] = sTl24->GetY(4) + kft24PPHightSPDFMD - kct24AlThick;
2602     xp[2] = Xfrom2Points(sTl24->GetX(6),sTl24->GetY(6),
2603                            sTl24->GetX(7),sTl24->GetY(7),yp[2]);
2604     yp[3] = sTl24->GetY(4);
2605     xp[3] = Xfrom2Points(sTl24->GetX(6),sTl24->GetY(6),
2606                            sTl24->GetX(7),sTl24->GetY(7),yp[3]);;
2607     xp[4] = s2PP24->GetX(4);
2608     yp[4] = s2PP24->GetY(4);
2609     xp[5] = s2PP24->GetX(5);
2610     yp[5] = s2PP24->GetY(5);
2611     sV2PP24->DefinePolygon(6,xp,yp);
2612     sV2PP24->DefineSection(0,s2PP24->GetZ(0),s2PP24->GetXOffset(0),
2613                            s2PP24->GetYOffset(0),s2PP24->GetScale(0));
2614     sV2PP24->DefineSection(1,s2PP24->GetZ(1),s2PP24->GetXOffset(1),
2615                            s2PP24->GetYOffset(1),s2PP24->GetScale(1));
2616     // RB 24 Tray Mother Volume
2617     sMT24 = new TGeoPcon("ITS sup Cable Tray Mother Volume RB24 MT24",
2618                          0.0,360.0,5);
2619     sMT24->Z(0)    = 0.0;
2620     sMT24->Rmin(0) = sA24[0]->GetRmax();
2621     sMT24->Rmax(0) = TMath::Max(TMath::Hypot(s3PP24->GetX(1),s3PP24->GetY(1)),
2622                                 TMath::Hypot(s2PP24->GetX(1),s2PP24->GetY(1)));
2623
2624     sMT24->Z(1)    = sMT24->GetZ(0) + kft24PPlength;
2625     sMT24->Rmin(1) = sMT24->GetRmin(0);
2626     sMT24->Rmax(1) = sMT24->GetRmax(0);
2627     sMT24->Z(2)    = sMT24->GetZ(1);
2628     sMT24->Rmin(2) = sMT24->GetRmin(0);
2629     sMT24->Rmax(2) = sMT24->GetRmax(0) - kft24PPHightSPDFMD;
2630
2631     sMT24->Z(3)    = sMT24->GetZ(0) + zA24[iRmin] - zA24[0] -kfrm24Width;
2632     sMT24->Rmin(3) = sA24[iRmin]->GetRmin();
2633     sMT24->Rmax(3) = TMath::Hypot(sT24->GetX(3),sT24->GetY(3));
2634     sMT24->Z(4)    = sMT24->GetZ(0) + zA24[kfrm24NZsections] + kfrm24Width  - 
2635         zA24[0] -kfrm24Width;
2636     sMT24->Rmin(4) = sA24[kfrm24NZsections]->GetRmax();
2637     sMT24->Rmax(4) = TMath::Hypot(sT24->GetX(3)+sT24->GetXOffset(2),
2638                                   sT24->GetY(3)+sT24->GetYOffset(2));
2639     //
2640     if(GetDebug(1)){
2641         sT24->InspectShape();
2642         sW24->InspectShape();
2643         sTl24->InspectShape();
2644         sTs24->InspectShape();
2645         sTt24->InspectShape();
2646         sU24->InspectShape();
2647         sVl24->InspectShape();
2648         sVs24->InspectShape();
2649         s3PP24->InspectShape();
2650         s2PP24->InspectShape();
2651         sV3PP24->InspectShape();
2652         sV2PP24->InspectShape();
2653         sMT24->InspectShape();
2654     } // end if GetDebug(1)
2655     //
2656     TGeoVolume *vC24[kct24Ntrays],*vT24[kct24Ntrays],*vPP24[kft24NPatchPannels];
2657     TGeoVolume *vWTV024,*vW24,*vU24,*vUFMD24,*vVl24,*vVlFMD24,*vVs24;
2658     TGeoVolume *vV3PP24,*vV2PP24,*vV2PPFMD24;
2659     TGeoVolumeAssembly *vMT24;
2660     vMT24 = new TGeoVolumeAssembly("ITSsupCableTrayMotherMT24");
2661     //vMT24->SetVisibility(kTRUE);
2662     //vMT24->SetLineColor(8); // white
2663     //vMT24->SetLineWidth(1);
2664     //vMT24->SetFillColor(vMT24->GetLineColor());
2665     //vMT24->SetFillStyle(4100); // 100% transparent
2666     //
2667     vU24 = new TGeoVolume("ITSsupCableTrayLowerU24",sU24,medSUPair);
2668     vU24->SetVisibility(kTRUE);
2669     vU24->SetLineColor(7); // light blue
2670     vU24->SetLineWidth(1);
2671     vU24->SetFillColor(vU24->GetLineColor());
2672     vU24->SetFillStyle(4090); // 90% transparent
2673     vUFMD24 = new TGeoVolume("FMDsupCableTrayLowerU24",sU24,medSUPair);
2674     vUFMD24->SetVisibility(kTRUE);
2675     vUFMD24->SetLineColor(7); // light blue
2676     vUFMD24->SetLineWidth(1);
2677     vUFMD24->SetFillColor(vUFMD24->GetLineColor());
2678     vUFMD24->SetFillStyle(4090); // 90% transparent
2679     vVl24 = new TGeoVolume("ITSsupCableTrayUpperV24",sVl24,medSUPair);
2680     vVl24->SetVisibility(kTRUE);
2681     vVl24->SetLineColor(7); // light blue
2682     vVl24->SetLineWidth(1);
2683     vVl24->SetFillColor(vVl24->GetLineColor());
2684     vVl24->SetFillStyle(4090); // 90% transparent
2685     vVlFMD24 = new TGeoVolume("FMDsupCableTrayUpperVl24",sVl24,medSUPair);
2686     vVlFMD24->SetVisibility(kTRUE);
2687     vVlFMD24->SetLineColor(7); // light blue
2688     vVlFMD24->SetLineWidth(1);
2689     vVlFMD24->SetFillColor(vVlFMD24->GetLineColor());
2690     vVlFMD24->SetFillStyle(4090); // 90% transparent
2691     vVs24 = new TGeoVolume("ITSsupCableTrayUpperVs24",sVs24,medSUPair);
2692     vVs24->SetVisibility(kTRUE);
2693     vVs24->SetLineColor(7); // light blue
2694     vVs24->SetLineWidth(1);
2695     vVs24->SetFillColor(vVs24->GetLineColor());
2696     vVs24->SetFillStyle(4090); // 90% transparent
2697     vW24 = new TGeoVolume("ITSsupCableTrayUpperW24",sW24,medSUPair);
2698     vW24->SetVisibility(kTRUE);
2699     vW24->SetLineColor(7); // light blue
2700     vW24->SetLineWidth(1);
2701     vW24->SetFillColor(vW24->GetLineColor());
2702     vW24->SetFillStyle(4090); // 90% transparent
2703     //
2704     vWTV024 = new TGeoVolume("V0supCableTrayUpperWTV024",sW24,medSUPair);
2705     vWTV024->SetVisibility(kTRUE);
2706     vWTV024->SetLineColor(7); // light blue
2707     vWTV024->SetLineWidth(1);
2708     vWTV024->SetFillColor(vWTV024->GetLineColor());
2709     vWTV024->SetFillStyle(4090); // 90% transparent
2710     //
2711     vV3PP24 = new TGeoVolume("ITSsup3BayPachPannelInsideV3PP24",sV3PP24,medSUPair);
2712     vV3PP24->SetVisibility(kTRUE);
2713     vV3PP24->SetLineColor(8); // white
2714     vV3PP24->SetLineWidth(1);
2715     vV3PP24->SetFillColor(vV3PP24->GetLineColor());
2716     vV3PP24->SetFillStyle(4100); // 100% transparent
2717     vV2PP24 = new TGeoVolume("ITSsup2BayPachPannelInsideV2PP24",sV2PP24,medSUPair);
2718     vV2PP24->SetVisibility(kTRUE);
2719     vV2PP24->SetLineColor(8); // white
2720     vV2PP24->SetLineWidth(1);
2721     vV2PP24->SetFillColor(vV2PP24->GetLineColor());
2722     vV2PP24->SetFillStyle(4100); // 100% transparent
2723     vV2PPFMD24 = new TGeoVolume("FMDsup2BayPachPannelInsideV2PP24",sV2PP24,medSUPair);
2724     vV2PPFMD24->SetVisibility(kTRUE);
2725     vV2PPFMD24->SetLineColor(8); // white
2726     vV2PPFMD24->SetLineWidth(1);
2727     vV2PPFMD24->SetFillColor(vV2PPFMD24->GetLineColor());
2728     vV2PPFMD24->SetFillStyle(4100); // 100% transparent
2729     //
2730     //delete rot;
2731     //delete rot1;
2732     //
2733     Double_t tha[kct24Ntrays],thb[kft24NPatchPannels];
2734     for(i=0;i<kct24Ntrays/4;i++) {
2735         if(i==0) tha[0] = 17.0+0.5*kft24Theta;
2736         else tha[i] = tha[i-1] + kft24Theta;
2737         tha[i+  kct24Ntrays/4] =  90.0 + tha[i];
2738         tha[i+  kct24Ntrays/2] = 180.0 + tha[i];
2739         tha[i+3*kct24Ntrays/4] = 270.0 + tha[i];
2740     } // end for i
2741     if(GetDebug(1)) for(i=0;i<kct24Ntrays;i++) Info("ServicesCableSupport",
2742                                                   "tha[%d]=%f",i,tha[i]);
2743     Char_t *airName[kct24Ntrays]={"FMD0","SDD0","SSD0","SSD1","SPD0","SPD1",
2744                                   "TV00","SDD1","SDD2","SPD2","SPD3","ALG0",
2745                                   "SPD4","SPD5","SSD2","SSD3","SPD6","SPD7",
2746                                   "TV01","SDD3","SDD4","SPD8","SPD9","ALG1",
2747                                   "FMD1","SDD5","SSD4","SSD5","SPDA","SPDB",
2748                                   "TV02","SDD6","SDD7","SPDC","SPDD","ALG2",
2749                                   "SPDE","SPDF","SSD6","SSD7","SPDG","SPDH",
2750                                   "TV03","SDD8","SDD9","SPDI","SPDJ","ALG3"};
2751     Char_t *trayName[kct24Ntrays]={"FMD0","SSD0","SSD1","SSD2","SSD3","SPD0",
2752                                    "TV00","SDD0","SDD1","SDD2","SPD1","ALG0",
2753                                    "SPD2","SSD4","SSD5","SSD6","SSD7","SPD3",
2754                                    "TV01","SDD3","SDD4","SDD5","SPD4","ALG1",
2755                                    "FMD1","SSD8","SSD9","SSDA","SSDB","SPD5",
2756                                    "TV02","SDD6","SDD7","SDD8","SPD6","ALG2",
2757                                    "SPD7","SSDC","SSDD","SSDE","SSDF","SPD8",
2758                                    "TV03","SDD9","SDDA","SDDB","SPD9","ALG3"};
2759     //
2760     //Int_t ncopyW24=1,ncopyU24=1,ncopyV24=1;
2761     j = 0;
2762     for(i=0;i<kct24Ntrays;i++){
2763         if(strncmp(trayName[i],"FMD",3)==0){
2764             sprintf(name,"FMDsupCableTrayT24[%s]",trayName[i]);
2765             vT24[i] = new TGeoVolume(name,sTl24,medSUPal);
2766             vT24[i]->AddNode(vVlFMD24,1,0);
2767         }else if(strncmp(trayName[i],"TV0",3)==0){
2768             sprintf(name,"V0supCableTrayT24[%s]",trayName[i]);
2769             vT24[i] = new TGeoVolume(name,sT24,medSUPal);
2770             vT24[i]->AddNode(vWTV024,1,0);
2771         }else if(strncmp(trayName[i],"ALG",3)==0){ // ITS Alignment Channel
2772             sprintf(name,"ITSsupCableTrayT24[%s]",trayName[i]);
2773             vT24[i] = new TGeoVolume(name,sT24,medSUPal);
2774             vT24[i]->AddNode(vW24,1,0);
2775         }else  if(strncmp(trayName[i],"SPD",3)==0){ /*ITS SPD*/
2776             sprintf(name,"ITSsupCableTrayT24[%s]",trayName[i]);
2777             vT24[i] = new TGeoVolume(name,sTl24,medSUPal);
2778             vT24[i]->AddNode(vVl24,1,0);
2779         }else { /*ITS*/
2780             sprintf(name,"ITSsupCableTrayT24[%s]",trayName[i]);
2781             vT24[i] = new TGeoVolume(name,sTs24,medSUPal); /// replace solid
2782             vT24[i]->AddNode(vVs24,1,0);
2783         } // end if
2784         vT24[i]->SetVisibility(kTRUE);
2785         vT24[i]->SetLineColor(6); // purple
2786         vT24[i]->SetLineWidth(1);
2787         vT24[i]->SetFillColor(vT24[i]->GetLineColor());
2788         vT24[i]->SetFillStyle(4000); // 0% transparent
2789         rot = new TGeoRotation("",0.0,0.0,tha[i]-90.0);
2790         if(GetDebug(1)) rot->Print();
2791         vMT24->AddNode(vT24[i],1,rot);
2792         //
2793         if(strncmp(trayName[i],"FMD",3)==0){
2794             sprintf(name,"FMDsupAirTubeTrayT24[%s]",airName[i]);
2795             vC24[j] = new TGeoVolume(name,sTt24,medSUPair);
2796             vC24[j]->AddNode(vUFMD24,1,0);
2797         }else if(strncmp(trayName[i],"TV0",3)==0){
2798             continue;
2799         }else if(strncmp(trayName[i],"ALG",3)==0){
2800             continue;
2801         }else{ /*ITS*/
2802             sprintf(name,"ITSsupAirTubTrayT24[%s]",airName[i]);
2803             vC24[j] = new TGeoVolume(name,sTt24,medSUPair);
2804             vC24[j]->AddNode(vU24,1,0);
2805         } // end if
2806         vC24[j]->SetVisibility(kTRUE);
2807         vC24[j]->SetLineColor(6); // purple
2808         vC24[j]->SetLineWidth(1);
2809         vC24[j]->SetFillColor(vC24[j]->GetLineColor());
2810         vC24[j]->SetFillStyle(4000); // 0% transparent
2811         vMT24->AddNode(vC24[j++],1,rot);
2812     } // end for i
2813     for(i=0;i<kft24NPatchPannels/4;i++) {
2814         if(i==0) thb[0] = 17.0+0.5*kft24Theta;
2815         else{
2816             if(i%2) thb[i] = thb[i-1] + 3.0*kft24Theta;
2817             else thb[i] = thb[i-1] + 2.0*kft24Theta;
2818         } // end if-else
2819         thb[i+  kft24NPatchPannels/4] =  90.0 + thb[i];
2820         thb[i+  kft24NPatchPannels/2] = 180.0 + thb[i];
2821         thb[i+3*kft24NPatchPannels/4] = 270.0 + thb[i];
2822     } // end for i
2823     Char_t *pachName[kft24NPatchPannels]={"FMD0","SSD0","SPD0","SDD0","SPD1",
2824                                           "SPD2","SSD1","SPD3","SDD1","SPD4",
2825                                           "FMD1","SSD2","SPD5","SDD2","SPD6",
2826                                           "SPD7","SSD3","SPD8","SDD3","SPD9"};
2827     for(i=0;i<kft24NPatchPannels;i++){
2828         if(strncmp(pachName[i],"FMD",3)==0){
2829             sprintf(name,"FMDsupPatchPannelPP24[%s]",pachName[i]);
2830             vPP24[i] = new TGeoVolume(name,s2PP24,medSUPal);
2831             vPP24[i]->AddNode(vV2PPFMD24,1,0);
2832         }else if(strncmp(pachName[i],"SPD",3)==0){ /*ITS SPD*/
2833             sprintf(name,"ITSsupPathcPannelPP24[%s]",pachName[i]);
2834             vPP24[i] = new TGeoVolume(name,s2PP24,medSUPal);
2835             vPP24[i]->AddNode(vV2PP24,1,0);
2836         }else { /*ITS*/
2837             sprintf(name,"ITSsupPathcPannelPP24[%s]",pachName[i]);
2838             vPP24[i] = new TGeoVolume(name,s3PP24,medSUPal); /// replace solid
2839             vPP24[i]->AddNode(vV3PP24,1,0);
2840         } // end if
2841         vPP24[i]->SetVisibility(kTRUE);
2842         vPP24[i]->SetLineColor(6); // purple
2843         vPP24[i]->SetLineWidth(1);
2844         vPP24[i]->SetFillColor(vPP24[i]->GetLineColor());
2845         vPP24[i]->SetFillStyle(4000); // 0% transparent
2846         rot = new TGeoRotation("",0.0,0.0,thb[i]-90.0);
2847         if(GetDebug(1)) rot->Print();
2848         vMT24->AddNode(vPP24[i],1,rot);
2849     } // end for i
2850     tran = new TGeoTranslation("",0.0,0.0,kfrm24Z0);
2851     moth->AddNode(vMT24,1,tran);
2852     if(GetDebug(1)){
2853         for(i=0;i<kct24Ntrays;i++) vT24[i]->PrintNodes();
2854         for(i=0;i<kct24Ntrays-8;i++) vC24[i]->PrintNodes();
2855         vU24->PrintNodes();
2856         vUFMD24->PrintNodes();
2857         vVl24->PrintNodes();
2858         vVlFMD24->PrintNodes();
2859         vVs24->PrintNodes();
2860         vW24->PrintNodes();
2861         vWTV024->PrintNodes();
2862         vMT24->PrintNodes();
2863     } // end if
2864     //==================================================================
2865     //
2866     // RB 26, Muon Absober side
2867     const Double_t kfrm26Z0           = -900*fgkmm;//SSup_203A.jpg
2868     const Double_t kfrm26Thss         = 5.0*fgkmm;
2869     const Double_t kfrm26R0ss         = 444.5*fgkmm-kfrm26Thss; //SSup_204A.jpg
2870     const Double_t kfrm26R1ss         = 601.6*fgkmm-kfrm26Thss; //SSup_208A.jpg
2871     const Double_t kfrm26Width        = 10.0*fgkmm;
2872     //const Double_t kfrm26Hight       = 10.0*fgkmm;
2873     const Double_t kfrm26Phi0         = 15.2*fgkDegree; // SSup_602A.jpg
2874     const Double_t kfrm26Phi1         = (90.0-7.6)*fgkDegree; // SSup_802A.jpg
2875     const Double_t kfrm26ZssSection   = (415.0-10.0)*fgkmm;
2876     const Int_t    kfrm26NZsections   = 4;
2877     const Int_t    kfrm26NPhiSections = 4;
2878     const Int_t    kfrm26NPhi         = 4;
2879     TGeoConeSeg *sA26[kfrm26NZsections+1];//,*sM26;//Cylinderial support structure
2880     TGeoArb8     *sB26; // Cylinderial support structure
2881     /*
2882     sM26 = new TGeoConeSeg("ITS sup Cable tray support frame mother volume "
2883                           "M26",0.5*(4.*kfrm26ZssSection+5*kfrm26Width),
2884                           kfrm26R1ss,kfrm26R1ss+kfrm26Thss,
2885                           kfrm26R0ss,kfrm26R0ss+kfrm26Thss,
2886                           kfrm26Phi0,kfrm26Phi1);
2887     */
2888     m = -((kfrm26R1ss-kfrm26R0ss)/
2889          (((Double_t)kfrm26NZsections)*(kfrm26ZssSection+kfrm26Width)));
2890     for(i=0;i<kfrm26NZsections+1;i++){
2891         di = ((Double_t) i)*(kfrm26ZssSection+kfrm26Width);
2892         sprintf(name,
2893                 "ITS sup Cable tray support frame radial section A26[%d]",i);
2894         r1 = kfrm26R1ss+m*di;
2895         r2 = kfrm26R1ss+m*(di+kfrm26Width);
2896         sA26[i] = new TGeoConeSeg(name,0.5*kfrm26Width,r2,r2+kfrm26Thss,
2897                                  r1,r1+kfrm26Thss,kfrm26Phi0,kfrm26Phi1);
2898     } // end for i
2899     sB26 = new TGeoArb8("ITS sup Cable tray support frame Z section B26",
2900                        0.5*kfrm26ZssSection);
2901     r = 0.25*(sA26[0]->GetRmax1()+sA26[0]->GetRmin1()+
2902               sA26[1]->GetRmax2()+sA26[1]->GetRmin2());
2903     sB26->SetVertex(0,sA26[0]->GetRmax2()-r,+0.5*kfrm26Width);
2904     sB26->SetVertex(1,sA26[0]->GetRmax2()-r,-0.5*kfrm26Width);
2905     sB26->SetVertex(2,sA26[0]->GetRmin2()-r,-0.5*kfrm26Width);
2906     sB26->SetVertex(3,sA26[0]->GetRmin2()-r,+0.5*kfrm26Width);
2907     sB26->SetVertex(4,sA26[1]->GetRmax1()-r,+0.5*kfrm26Width);
2908     sB26->SetVertex(5,sA26[1]->GetRmax1()-r,-0.5*kfrm26Width);
2909     sB26->SetVertex(6,sA26[1]->GetRmin1()-r,-0.5*kfrm26Width);
2910     sB26->SetVertex(7,sA26[1]->GetRmin1()-r,+0.5*kfrm26Width);
2911     if(GetDebug(1)){
2912         for(i=0;i<kfrm26NZsections+1;i++) sA26[i]->InspectShape();
2913         //sM26->InspectShape();
2914         sB26->InspectShape();
2915     } // end if GetDebug(1)
2916     //
2917     TGeoVolume *vA26[kfrm26NZsections+1],*vB26;
2918     TGeoVolumeAssembly *vM26;
2919     //
2920     for(i=0;i<kfrm26NZsections+1;i++){
2921         sprintf(name,"ITSsupFrameA26[%d]",i);
2922         vA26[i] = new TGeoVolume(name,sA26[i],medSUPss);
2923         vA26[i]->SetVisibility(kTRUE);
2924         vA26[i]->SetLineColor(1); // black
2925         vA26[i]->SetLineWidth(1);
2926         vA26[i]->SetFillColor(vA26[i]->GetLineColor());
2927         vA26[i]->SetFillStyle(4000); // 0% transparent
2928     } // end for i
2929     vB26 = new TGeoVolume("ITSsupFrameB26",sB26,medSUPss);
2930     vB26->SetVisibility(kTRUE);
2931     vB26->SetLineColor(1); // black
2932     vB26->SetLineWidth(1);
2933     vB26->SetFillColor(vB26->GetLineColor());
2934     vB26->SetFillStyle(4000); // 0% transparent
2935     vM26 = new TGeoVolumeAssembly("ITSsupFrameM26");
2936     //vM26 = new TGeoVolume("ITSsupFrameM26",sM26,medSUPair);
2937     //vM26->SetVisibility(kTRUE);
2938     //vM26->SetLineColor(7); // light blue
2939     //vM26->SetLineWidth(1);
2940     //vM26->SetFillColor(vM26->GetLineColor());
2941     //vM26->SetFillStyle(4090); // 90% transparent
2942     //
2943     Int_t ncopyB26=1;
2944     t0 = kfrm26Phi0;
2945     dt = (kfrm26Phi1-kfrm26Phi0)/((Double_t)kfrm26NPhiSections);
2946     for(i=0;i<=kfrm26NZsections;i++){
2947         di = ((Double_t) i)*(kfrm26ZssSection+kfrm26Width);
2948         z = 0.5*(4.*kfrm26ZssSection+5*kfrm26Width);
2949         z = -z+sA26[i]->GetDz() + di;
2950         tran = new TGeoTranslation("",0.0,0.0,z);
2951         vM26->AddNode(vA26[i],1,tran);
2952         z = z+sB26->GetDz();
2953         if(i<kfrm26NZsections)for(j=0;j<=kfrm26NPhiSections;j++){
2954             r = 0.25*(sA26[i]->GetRmax1()+sA26[i]->GetRmin1()+
2955                       sA26[i+1]->GetRmax2()+sA26[i+1]->GetRmin2());
2956             t = t0 + ((Double_t)j)*dt;
2957             rot = new TGeoRotation("",0.0,0.0,t);
2958             y = r*SinD(t);
2959             x = r*CosD(t);
2960             tranrot = new TGeoCombiTrans("",x,y,z,rot);
2961             //delete rot; // rot not explicity used in AddNode functions.
2962             vM26->AddNode(vB26,ncopyB26++,tranrot);
2963         } // end for j
2964     } // end for i
2965     tran = new TGeoTranslation("",0.0,0.0,kfrm26Z0-0.5*(4.*kfrm26ZssSection+5*kfrm26Width));
2966     moth->AddNode(vM26,1,tran);
2967     for(i=1;i<kfrm26NPhi;i++){
2968         rot = new TGeoRotation("",0.0,0.0,90.0*((Double_t)i));
2969         tranrot = new TGeoCombiTrans(*tran,*rot);
2970         //delete rot; // rot not explicity used in AddNode functions.
2971         moth->AddNode(vM26,i+1,tranrot);
2972     } // end for i
2973     if(GetDebug(1)){
2974         for(i=0;i<kfrm26NZsections+1;i++) vA26[i]->PrintNodes();
2975         vB26->PrintNodes();
2976         vM26->PrintNodes();
2977     } // end if
2978 }