]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITSv11GeometrySDD.cxx
From P. Gonzales: Adding Dalitz task, updates accordingly
[u/mrichter/AliRoot.git] / ITS / AliITSv11GeometrySDD.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
17 //*************************************************************************
18 //
19 // SDD geometry, based on ROOT geometrical modeler
20 //
21 //
22 // This geometry has no dependence with aliroot, you can run it with root
23 // only, provided that the AliITSv11GeomCable classes are also compiled
24 //
25 // Ludovic Gaudichet                                   gaudichet@to.infn.it
26 //*************************************************************************
27
28
29 // $Id$
30
31
32 // General Root includes
33 #include <TMath.h>
34
35 // Root Geometry includes
36 #include <TGeoManager.h>
37 #include <TGeoVolume.h>
38 #include <TGeoCone.h>
39 #include <TGeoTube.h>
40 #include <TGeoTrd1.h>
41 #include <TGeoArb8.h>
42 #include <TGeoCompositeShape.h>
43 #include <TGeoMatrix.h>
44 #include <TGeoNode.h>
45 #include <TGeoPcon.h>
46 #include <TGeoTorus.h>
47
48 #include "AliITSgeom.h"
49 #include "AliITSgeomSDD.h"
50 #include "AliITSv11GeometrySDD.h"
51 #include "AliITSv11GeomCableFlat.h"
52 #include "AliITSv11GeomCableRound.h"
53
54 const char*    AliITSv11GeometrySDD::fgSDDsensitiveVolName3 = "ITSsddSensitivL3";
55 const char*    AliITSv11GeometrySDD::fgSDDsensitiveVolName4 = "ITSsddSensitivL4";
56 const Double_t AliITSv11GeometrySDD::fgkSegmentLength     = 37.2*2*fgkmm;
57 const Double_t AliITSv11GeometrySDD::fgkLadderWidth       = 50.0*fgkmm;
58 const Double_t AliITSv11GeometrySDD::fgkLadderHeight      = 30.0*fgkmm;
59 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDW    =  3.5*fgkmm;
60 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH    =  3.*fgkmm;
61
62 const Double_t AliITSv11GeometrySDD::fgkLadderBeamRadius  =  0.6*fgkmm;
63 const Double_t AliITSv11GeometrySDD::fgkLadderLa          =  3.*fgkmm;
64 const Double_t AliITSv11GeometrySDD::fgkLadderHa          =  0.721979*fgkmm;
65 const Double_t AliITSv11GeometrySDD::fgkLadderLb          =  3.7*fgkmm;
66 const Double_t AliITSv11GeometrySDD::fgkLadderHb          =  0.890428*fgkmm;
67 const Double_t AliITSv11GeometrySDD::fgkLadderl           =  0.25*fgkmm;
68
69 const Double_t AliITSv11GeometrySDD::fgkBottomBeamAngle   = 56.5;
70 const Double_t AliITSv11GeometrySDD::fgkBeamSidePhi       = 65;
71
72 const Double_t AliITSv11GeometrySDD::fgkLadWaferSep       = 2*fgkmm;
73 const Double_t AliITSv11GeometrySDD::fgkPinSuppWidth      = 2.5*fgkmm;
74 const Double_t AliITSv11GeometrySDD::fgkPinSuppHeight     = 2.*fgkmm;
75 const Double_t AliITSv11GeometrySDD::fgkPinSuppRmax       = 2.5/2.*fgkmm;
76 const Double_t AliITSv11GeometrySDD::fgkPinR              = 1.5/2.*fgkmm;
77 const Double_t AliITSv11GeometrySDD::fgkPinSuppLength     = 5.*fgkmm;
78 const Double_t AliITSv11GeometrySDD::fgkPinSuppThickness  = 0.5*fgkmm;
79 const Double_t AliITSv11GeometrySDD::fgkPinSuppConeAngle  = 4;
80 const Double_t AliITSv11GeometrySDD::fgkPinDXminOnSensor  = (39./2.)*fgkmm;
81 const Double_t AliITSv11GeometrySDD::fgkPinPinDDXOnSensor = 3*fgkmm;
82 const Double_t AliITSv11GeometrySDD::fgkPinDYOnSensor     = (52.5/2.)*fgkmm;
83
84 // parameters from ALR-0752/3
85 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHeight    =  3.2*fgkmm;  
86 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppMaxLength = 14*fgkmm;
87 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthExt  =  0.4*fgkmm;
88 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthIn   =  0.65*fgkmm;
89 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHoleDiam  =  2*fgkmm;
90 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppFulWidth  =  5.15*fgkmm;
91 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppTongW     =  0.8*fgkmm; 
92 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAngle     = 22.5;
93 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppSlitL     =  4.9*fgkmm;
94 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAxeDist   =  3.05*fgkmm;
95 const Double_t AliITSv11GeometrySDD::fgkCoolPipeInnerDiam     =  1.84*fgkmm;
96 const Double_t AliITSv11GeometrySDD::fgkCoolPipeOuterDiam     =  2.*fgkmm;
97
98 const Double_t AliITSv11GeometrySDD::fgkBTBthick           =  0.25 *fgkmm;
99 const Double_t AliITSv11GeometrySDD::fgkBTBlength          = 55. *fgkmm;
100 const Double_t AliITSv11GeometrySDD::fgkBTBwidth           = 18*fgkmm;
101 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBottom   =  4*fgkmm;
102 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase     =  1.2*fgkmm;
103 const Double_t AliITSv11GeometrySDD::fgkRadiusAminBTB      =  1. *fgkmm;
104 const Double_t AliITSv11GeometrySDD::fgkRadiusBminBTB      =  0.53 *fgkmm;
105 const Double_t AliITSv11GeometrySDD::fgkBTBHoleLength      = 15 *fgkmm;
106 const Double_t AliITSv11GeometrySDD::fgkBTBHolewidth       =  6 *fgkmm;
107 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefX        = 10 *fgkmm;
108 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefY        =  6.5 *fgkmm;
109
110 const Double_t AliITSv11GeometrySDD::fgkLay3Rmin           = 145.*fgkmm;
111 const Double_t AliITSv11GeometrySDD::fgkLay3Rmax           = 200.*fgkmm;
112 const Double_t AliITSv11GeometrySDD::fgkLay3Length         = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
113 const Double_t AliITSv11GeometrySDD::fgkLay3LadderLength   = 524.*fgkmm;
114 const Double_t AliITSv11GeometrySDD::fgkLay3DetShortRadius = 146.0*fgkmm;
115 const Double_t AliITSv11GeometrySDD::fgkLay3DetLongRadius  = 152.0*fgkmm;
116 const Double_t AliITSv11GeometrySDD::fgkLay3LaddTopCornerEnd = 15.6*fgkmm;
117 const Int_t    AliITSv11GeometrySDD::fgkLay3Ndet           =  6;
118 const Int_t    AliITSv11GeometrySDD::fgkLay3Nladd          = 14;
119 const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH  =  7.5*fgkmm;
120
121 const Double_t AliITSv11GeometrySDD::fgkLay4Rmin           = 234.8*fgkmm;
122 const Double_t AliITSv11GeometrySDD::fgkLay4Rmax           = 286.*fgkmm;
123 const Double_t AliITSv11GeometrySDD::fgkLay4Length         = (671.+0.)*fgkmm;    // ladder+supporting rings (length of the virtual tube)
124 const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength   = 671.*fgkmm;
125 const Double_t AliITSv11GeometrySDD::fgkLay4DetShortRadius = 235.0*fgkmm;
126 const Double_t AliITSv11GeometrySDD::fgkLay4DetLongRadius  = 240.5*fgkmm;
127 const Double_t AliITSv11GeometrySDD::fgkLay4LaddTopCornerEnd = 15.6*fgkmm;
128 const Int_t    AliITSv11GeometrySDD::fgkLay4Ndet           = 8;
129 const Int_t    AliITSv11GeometrySDD::fgkLay4Nladd          = 22;
130 const Double_t AliITSv11GeometrySDD::fgkLay4CoolPipeSuppH  = 7.5*fgkmm;
131
132 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay3 = fgkLay3DetShortRadius;
133 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay4 = fgkLay4DetShortRadius;
134 const Double_t AliITSv11GeometrySDD::fgkDistEndLaddCardsLadd = 0.*fgkmm;
135
136 //hybrid 
137 const Double_t AliITSv11GeometrySDD::fgkHybridAngle       = 46;           // approx !!!
138 // Origine taken at the hybrid corner :
139 const Double_t AliITSv11GeometrySDD::fgkHybridLength      = 65*fgkmm;
140 const Double_t AliITSv11GeometrySDD::fgkHybridWidth       = 41*fgkmm;
141 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleRad     = 1.05*fgkmm;
142 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleZ       = 2.5*fgkmm;
143 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleX       = fgkHybridWidth-23.599*fgkmm;
144
145 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleDZ    =   9.698*fgkmm; 
146 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHolePasDX =  10.754*fgkmm; 
147 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleAmbDX =   9.122*fgkmm;
148   // center of ships to the border
149 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ4    = fgkHybridLength-(4.654      )*fgkmm-fgkHybFLlowHoleDZ/2;
150 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ3    = fgkHybridLength-(4.654+15.  )*fgkmm-fgkHybFLlowHoleDZ/2;
151 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ2    = fgkHybridLength-(4.654+15.*2)*fgkmm-fgkHybFLlowHoleDZ/2;
152 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ1    = fgkHybridLength-(4.654+15.*3)*fgkmm-fgkHybFLlowHoleDZ/2;
153 const Double_t AliITSv11GeometrySDD::fgkHybFLlowPasX      = fgkHybridWidth-32.775*fgkmm;       
154 const Double_t AliITSv11GeometrySDD::fgkHybFLlowAmbX      = fgkHybridWidth-20.791*fgkmm;
155 const Double_t AliITSv11GeometrySDD::fgkHybChipsDZ        =  9.221*fgkmm; 
156 const Double_t AliITSv11GeometrySDD::fgkHybPascalDX       = 10.245*fgkmm; 
157 const Double_t AliITSv11GeometrySDD::fgkHybAmbraDX        =  8.51*fgkmm; 
158 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperWidth   = 15.012*fgkmm;
159 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperLength  = 59.878*fgkmm;
160 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAlDZ    = 11.183*fgkmm;
161 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAldx    =  2.307*fgkmm;
162
163 const Double_t AliITSv11GeometrySDD::fgkmu = 1*fgkmicron; // 1*fgkmicron; // can be increase for checking thin objects
164 const Double_t AliITSv11GeometrySDD::fgkHybridThBridgeThick =  0.25*fgkmm;               // ???
165 const Double_t AliITSv11GeometrySDD::fgkHybAlThick         =  30*fgkmu;
166 const Double_t AliITSv11GeometrySDD::fgkHybUpThick         =  20*fgkmu;
167 const Double_t AliITSv11GeometrySDD::fgkHybGlueScrnThick   =  50*fgkmu;           // ??? ?????
168 const Double_t AliITSv11GeometrySDD::fgkHybGlueLowThick    =  90*fgkmu;
169 const Double_t AliITSv11GeometrySDD::fgkHybGlueUpThick     =  90*fgkmu;           // sur ?????
170 const Double_t AliITSv11GeometrySDD::fgkHybAlCCThick       =  12*fgkmu;
171 const Double_t AliITSv11GeometrySDD::fgkHybUpCCThick       =  12*fgkmu;
172 const Double_t AliITSv11GeometrySDD::fgkHybChipThick       = 150*fgkmu;
173 const Double_t AliITSv11GeometrySDD::fgkHybGlueAgThick     =  50*fgkmu;          // ??? ????
174 const Double_t AliITSv11GeometrySDD::fgkHybUnderNiThick    =  20*fgkmu;          // ??? ????
175 const Int_t    AliITSv11GeometrySDD::fgkNHybSMD = 25;
176 const Double_t AliITSv11GeometrySDD::fgkHybSMDposX[fgkNHybSMD]     = 
177           {2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,21.40*fgkmm,
178            2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
179            2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,17.09*fgkmm,21.40*fgkmm,
180            2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
181            1.63*fgkmm,5.22*fgkmm,13.59*fgkmm,21.40*fgkmm};
182 const Double_t AliITSv11GeometrySDD::fgkHybSMDposZ[fgkNHybSMD]     = 
183          { 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm,
184            17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,
185            32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,
186            47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,
187            62.68*fgkmm,62.06*fgkmm,62.06*fgkmm,62.06*fgkmm};
188 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleW      =   0.954*fgkmm;
189 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleL      =   0.47 *fgkmm;
190 const Double_t AliITSv11GeometrySDD::fgkHybSMDendW         =   1.132*fgkmm;
191 const Double_t AliITSv11GeometrySDD::fgkHybSMDendL         =   0.925*fgkmm;
192 const Double_t AliITSv11GeometrySDD::fgkHybSMDheight       = 400.*fgkmu;          // ??? ????!!!!!!!
193
194 const Double_t AliITSv11GeometrySDD::fgkWaferThickness     = 300.*fgkmu;
195 const Double_t AliITSv11GeometrySDD::fgkWaferWidth         =  72.5 *fgkmm;
196 const Double_t AliITSv11GeometrySDD::fgkWaferLength        =  87.6 *fgkmm;
197 const Double_t AliITSv11GeometrySDD::fgkWaferThickSens     = 299.8*fgkmu;
198 const Double_t AliITSv11GeometrySDD::fgkWaferWidthSens     =  70.17*fgkmm;
199 // 256 anodes times 294 microns of pitch
200 const Double_t AliITSv11GeometrySDD::fgkWaferLengthSens    =  256*294*fgkmicron;
201
202 const Double_t AliITSv11GeometrySDD::fgkDigitCablWidth     = 18.4*fgkmm;
203 const Double_t AliITSv11GeometrySDD::fgkDigitCablAlThick   = (30+30*8./10.)*fgkmicron; // will probably change
204 const Double_t AliITSv11GeometrySDD::fgkDigitCablPolyThick = (20+12)*fgkmicron;        // will probably change
205
206 const Double_t AliITSv11GeometrySDD::fgkWaHVcableAlThick   = 30*2./10.*fgkmu;  // will probably change // Al ratio is random !!!
207 const Double_t AliITSv11GeometrySDD::fgkWaHVcablePolyThick = 175*fgkmu;        // will probably change
208 const Double_t AliITSv11GeometrySDD::fgkWaHVcableLength    = 67.08*fgkmm;
209 const Double_t AliITSv11GeometrySDD::fgkWaHVcableWitdh     = 17.4*fgkmm;              //  check !!!
210 const Double_t AliITSv11GeometrySDD::fgkWaHVcableDW        = 5.24*fgkmm; //5.24*fgkmm;//  check !!!
211
212 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLX      =   5.  *fgkmm; 
213 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLZ      =   5.  *fgkmm; 
214 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLY      = 150.  *fgkmu;
215 const Double_t AliITSv11GeometrySDD::fgkGlassDXOnSensor    =  26.28*fgkmm;             //  check !!!
216 const Double_t AliITSv11GeometrySDD::fgkGlassDZOnSensor    =  22.50*fgkmm;             //  check !!!
217
218 const Double_t AliITSv11GeometrySDD::fgkTransitHVAlThick    = 30*2./10.*fgkmu; //  check // will probably change //Al ratio is random
219 const Double_t AliITSv11GeometrySDD::fgkTransitHVPolyThick  = 100*fgkmu;       //  check  // will probably change
220 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLX     =  71.46*fgkmm;           //  check !!!
221 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLZ     =  21.3*fgkmm;
222 const Double_t AliITSv11GeometrySDD::fgkTransitHVBondingLZ  =   3.6*fgkmm;
223 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailLength =  27*fgkmm;              // ???, not yet fixed ...
224 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailWidth  =  26*fgkmm;
225 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailXpos   =   8*fgkmm;    //8*fgkmm          // ???, a mesurer !!!
226 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLZ     =  10.34*fgkmm;
227 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLeftZ  =   4.11*fgkmm;
228 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideRightZ =   3.5*fgkmm;           // ???, a mesurer !!!
229
230 const Double_t AliITSv11GeometrySDD::fgkLongHVcablePolyThick= (20+30+125+30+20+30+125+30+20)*fgkmu; //  check  // will probably change
231 const Double_t AliITSv11GeometrySDD::fgkLongHVcableAlThick  = (30+30*2/10+30)*fgkmu;                //  check  // will probably change
232 const Double_t AliITSv11GeometrySDD::fgkLongHVcableSeparation = 600*fgkmicron;
233
234 const Double_t AliITSv11GeometrySDD::fgkRubyDX              =  14.*fgkmm;
235 const Double_t AliITSv11GeometrySDD::fgkRubyZladd3          = 250*fgkmm;
236 const Double_t AliITSv11GeometrySDD::fgkRubyZladd4          = 325*fgkmm;
237
238 // the stesalite ladder foot at its end
239 const Double_t AliITSv11GeometrySDD::fgkLadFootX         = 60.*fgkmm;
240 const Double_t AliITSv11GeometrySDD::fgkLadFootZ         = 20.*fgkmm;
241 const Double_t AliITSv11GeometrySDD::fgkLadFootY         =  8.*fgkmm;
242 const Double_t AliITSv11GeometrySDD::fgkLadFootMiddleY    =  4.5*fgkmm;
243 const Double_t AliITSv11GeometrySDD::fgkLadBox1X         = 23.*fgkmm;
244 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintX  =  6.*fgkmm;
245 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintY  =  1.*fgkmm;
246 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintBorder = 4.*fgkmm;
247 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleZ     =  8.*fgkmm;
248 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleX     =  9.*fgkmm;
249 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleY     =  6.5*fgkmm;
250 const Double_t AliITSv11GeometrySDD::fgkRubyCageAxisShift =  0.5*fgkmm;
251 const Double_t AliITSv11GeometrySDD::fgkScrewM4diam       =  4.*fgkmm;
252
253 const Double_t AliITSv11GeometrySDD::fgkRubyScrewShiftToCenterY = 0.1;
254 const Double_t AliITSv11GeometrySDD::fgkRubyHoleDiam            = 0.5;
255
256 // the U cooling pipe and its heat exchanger in end-ladder cards system
257 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay3 = 138*fgkmm;
258 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay4 = 150*fgkmm;
259 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUwidth      =  59*fgkmm;
260 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeRadius      =   5*fgkmm;
261 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeInnerDiam   =   2.8*fgkmm;
262 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeOuterDiam   =   3.*fgkmm;
263 //--- The al body of the cooling syst.of the heat exchanger :
264 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay3    = 112.*fgkmm;   //
265 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay4    = 125.*fgkmm;   //
266 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmX        =   4.75*fgkmm; // the arms of the U cooling tube
267 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmY        =   6.8*fgkmm;
268 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDY    =   1.03*fgkmm; // shift in Y of the arms from the axis
269 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDX    =   0.125*fgkmm;// shift in X of the arms from the axis
270 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZpos     =   8.9*fgkmm;  // 
271
272 // LV card :
273 const Double_t AliITSv11GeometrySDD::fgkLVcardX     = 26.525*fgkmm;
274 const Double_t AliITSv11GeometrySDD::fgkLVcardY     = 44.95*fgkmm;
275 const Double_t AliITSv11GeometrySDD::fgkLVcardZ     = 1.*fgkmm; // all except Cu layer   //???
276 const Double_t AliITSv11GeometrySDD::fgkLVcardCuZ   = 0.1*fgkmm;   //???
277
278 const Double_t AliITSv11GeometrySDD::fgkLVChip0X    = 16.525*fgkmm;
279 const Double_t AliITSv11GeometrySDD::fgkLVChip0Y    = 10.8*fgkmm;
280 const Double_t AliITSv11GeometrySDD::fgkLVChip0Z    =  3.5*fgkmm; // all except si layer   //???
281 const Double_t AliITSv11GeometrySDD::fgkLVChip0SiZ  =  0.2*fgkmm; //???????????????????????????????????????????????????
282 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosX = 13.*fgkmm; //19.95*fgkmm;  ???
283 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosY = 10.3*fgkmm;
284
285 const Double_t AliITSv11GeometrySDD::fgkLVChip1X    = 6.00*fgkmm;
286 const Double_t AliITSv11GeometrySDD::fgkLVChip1Y    = 6.00*fgkmm;
287 const Double_t AliITSv11GeometrySDD::fgkLVChip1Z    = 1*fgkmm;  // ???
288 const Double_t AliITSv11GeometrySDD::fgkLVChip1SiZ  = 0.2*fgkmm;  // ???
289 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosX = 18.*fgkmm;
290 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosY = 27.6*fgkmm;
291
292 const Double_t AliITSv11GeometrySDD::fgkLVChip2X    = 6.00*fgkmm;
293 const Double_t AliITSv11GeometrySDD::fgkLVChip2Y    = 6.00*fgkmm;
294 const Double_t AliITSv11GeometrySDD::fgkLVChip2Z    = 1*fgkmm;    // ???
295 const Double_t AliITSv11GeometrySDD::fgkLVChip2SiZ  = 0.2*fgkmm;  //???
296 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosX = 18.0*fgkmm;
297 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosY = 39.0*fgkmm;
298
299 const Double_t AliITSv11GeometrySDD::fgkLVChip3X    = 4.01*fgkmm;
300 const Double_t AliITSv11GeometrySDD::fgkLVChip3Y    = 4.01*fgkmm;
301 const Double_t AliITSv11GeometrySDD::fgkLVChip3Z    = 1*fgkmm; // ???
302 const Double_t AliITSv11GeometrySDD::fgkLVChip3SiZ  = 0.2*fgkmm;
303 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosX = 20.7*fgkmm;
304 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosY = 21.4*fgkmm;
305
306 const Double_t AliITSv11GeometrySDD::fgkLVcoolX1    = 17.25*fgkmm;
307 const Double_t AliITSv11GeometrySDD::fgkLVcoolY1    =  8.7*fgkmm;
308 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ1    =  1.*fgkmm;
309
310 const Double_t AliITSv11GeometrySDD::fgkLVcoolX2    =  3.5*fgkmm;
311 const Double_t AliITSv11GeometrySDD::fgkLVcoolY2    =  8.7*fgkmm;
312 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ2    =  2.3*fgkmm;
313
314 const Double_t AliITSv11GeometrySDD::fgkLVcoolX3    =  4.75*fgkmm;
315 const Double_t AliITSv11GeometrySDD::fgkLVcoolY3    =  3.1*fgkmm; //+0.1=glue
316 const Double_t AliITSv11GeometrySDD::fgkLVcoolPosY  = 6.5*fgkmm;
317
318 // HV card :
319 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramX    = 54.01*fgkmm;
320 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramY    = 40.89*fgkmm;
321 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramZ    =  0.7*fgkmm;  // ???
322
323 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1X    =   6.8*fgkmm;
324 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Z    =   1.*fgkmm;  // ???
325 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Ymid =   4.1*fgkmm;
326 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Yend =   0.95*fgkmm; // doesn't take into account the soldering
327 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosX =  13.1*fgkmm;
328 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosY =  14.5*fgkmm;
329
330 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2X    =   6.8*fgkmm;
331 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Z    =   1.*fgkmm;  // ???
332 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Ymid =   2.9*fgkmm;
333 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Yend =   0.95*fgkmm;
334 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosX = -12.6*fgkmm;
335 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosY =  16.54*fgkmm;
336
337 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xmid =   3.0*fgkmm;
338 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xend =   0.91*fgkmm;
339 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Z    =   2.*fgkmm;      // ???
340 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Y    =   3.43*fgkmm;
341
342 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX1 =  14.6*fgkmm;
343 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX2 =   7.2*fgkmm;
344 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX3 =   2.52*fgkmm;
345 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX4 =  -4.96*fgkmm;
346 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX5 = -13.82*fgkmm;
347 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY1 =   6.27*fgkmm;
348 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY2 =   0.7*fgkmm;
349 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY3 =   9.1*fgkmm;
350
351 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1X     =  14.*fgkmm;
352 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Y     =   9.5*fgkmm;
353 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Z     =   2.*fgkmm;
354 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2X     =  14.25*fgkmm;
355 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Y     =   3.5*fgkmm;
356 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Z     =   4.5*fgkmm;
357 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3X     =   4.5*fgkmm;
358 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Y     =   3.5*fgkmm;
359 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Z     =   7.2*fgkmm;
360 const Double_t AliITSv11GeometrySDD::fgkHVCardCoolDY     =   6.*fgkmm;
361
362 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX1     = 19.5*fgkmm;
363 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY1     =  2*fgkmm;
364 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX2     = 35.*fgkmm;
365 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY2     =  3.9*fgkmm;
366 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ      = 17.*fgkmm;
367 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppAngle  = 45;
368 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX3     =  4.5*fgkmm;
369 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY3     =  3.*fgkmm;
370 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ3     = 12.*fgkmm;
371 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppTopLen = 8.65*fgkmm;
372
373 // screws fixing boards to the end-ladder on the U tube
374 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadR   = 1.85*fgkmm;
375 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadH   = 1.5*fgkmm;
376 const Double_t AliITSv11GeometrySDD::fgkLittleScrewR       = 0.7*fgkmm;
377 const Double_t AliITSv11GeometrySDD::fgkShiftLittleScrewLV = 3*fgkmm;     // ???
378 const Double_t AliITSv11GeometrySDD::fgkLittleLVScrewHeadR = 1.2*fgkmm;   // ???
379
380 // CARLOS board
381 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX1          = (25.50+28.50)*fgkmm; // length (first part of Carlos card)
382 const Double_t AliITSv11GeometrySDD::fgkCarlosCardY1          =    1.6*fgkmm;        // thickness
383 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ1          =   40.8*fgkmm;        // width 
384 const Double_t AliITSv11GeometrySDD::fgkCarlosCardCuY         =    0.1*fgkmm;   // thickness of Cu layer (strips)
385 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX2          =   25.50*fgkmm;  // length (2nd part of Carlos card)
386 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ2          =    8.20*fgkmm;  // width 
387
388 const Double_t AliITSv11GeometrySDD::fgkCarlosCardChipSiThick =   0.1*fgkmm;  // ??? idem for all chips ???
389 const Double_t AliITSv11GeometrySDD::fgkCarlosCardShift       =   9*fgkmm;   // ??? shift in z w.r.t. heat bridge 
390
391 // size and position of various chips on carlos end-ladder board
392 const Double_t AliITSv11GeometrySDD::fgkCarlosU1X             =  13*fgkmm;
393 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Y             =   1.68*fgkmm; 
394 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Z             =  13*fgkmm;
395 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posX          =  18.4*fgkmm;
396 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posZ          =  -7.2*fgkmm;
397
398 const Double_t AliITSv11GeometrySDD::fgkCarlosU2X             =  13.75*fgkmm;
399 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Y             =   1.60*fgkmm; 
400 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Z             =  13.85*fgkmm;
401 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posX          =  -0.375*fgkmm;
402 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posZ          =  -9.725*fgkmm;
403
404 const Double_t AliITSv11GeometrySDD::fgkCarlosU3X             =   5*fgkmm;
405 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Y             =   1.*fgkmm;
406 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Z             =   5*fgkmm; 
407 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posX          =   6.4*fgkmm;
408 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posZ          =   9.9*fgkmm;
409
410 // U4 like U3  
411 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posX          = -12*fgkmm;
412 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posZ          =   3.6*fgkmm;
413
414 const Double_t AliITSv11GeometrySDD::fgkCarlosU17X            =  16*fgkmm;
415 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Y            =   3.5*fgkmm; 
416 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Z            =  10.9*fgkmm;
417 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posX         = -17.84*fgkmm;
418 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posZ         = -10.95*fgkmm;
419
420 const Double_t AliITSv11GeometrySDD::fgkCarlosU35X            =   4*fgkmm;
421 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Y            =   1.*fgkmm; 
422 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Z            =   4*fgkmm;
423 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posX         = -21.6*fgkmm;
424 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posZ         =   2.3*fgkmm;
425
426 const Double_t AliITSv11GeometrySDD::fgkCarlosU36X            =   6*fgkmm;
427 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Y            =   1.*fgkmm; 
428 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Z            =   6*fgkmm;
429 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posX         = -21.6*fgkmm;
430 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posZ         =   9.6*fgkmm;
431   
432 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1X            =   8*fgkmm;
433 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Y            =   1.7*fgkmm; // look thicker than design number (0.7) ! ??? 
434 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Z            =   3.7*fgkmm;
435 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posX         = -12*fgkmm;
436 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posZ         =  10.6*fgkmm;
437
438 // distance from the heat bridge center to the card center :
439 const Double_t AliITSv11GeometrySDD::fgkCarlosCard2HeatBridge = fgkCarlosSuppY2/2+fgkCarlosCardY1/2+fgkCarlosU1Y+0.1*fgkmm;
440
441 // some pieces at the end of the carbon fiber ladder
442  const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay3Len   = 467.*fgkmm;  // ???
443  const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay4Len   = 616.*fgkmm;  // ???
444  const Double_t AliITSv11GeometrySDD::fgkHVguideX1         =  42.5*fgkmm;
445  const Double_t AliITSv11GeometrySDD::fgkHVguideY1         =   7.*fgkmm;
446  const Double_t AliITSv11GeometrySDD::fgkHVguideZ1         =  10.*fgkmm;
447  const Double_t AliITSv11GeometrySDD::fgkHVguideZ2         =   6.*fgkmm;
448  const Double_t AliITSv11GeometrySDD::fgkHVguideDX         =  -8.5*fgkmm;
449  const Double_t AliITSv11GeometrySDD::fgkHVguideSuppFullZ  = 37.5*fgkmm;
450
451 // Cooling connector between phynox and plastic cooling water tubes
452 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeRmin = 1 *fgkmm;
453 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR1   = 2.5*fgkmm; // ???
454 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL1   = 3.*fgkmm;  // ???
455 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR2   = 3.5*fgkmm;  // ???
456 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL2   = 2.*fgkmm;  // ???
457 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR3   = 3.*fgkmm;  // ???
458 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL3   = 5 *fgkmm;  // ???
459
460
461 // parameters for coding SDD cables on SDD and SSD cones
462 const Double_t AliITSv11GeometrySDD::fgkSectionCuPerMod = 3*2*0.006 + 3*2*0.0005 + 2*0.002;
463 //                                             copper :     LV     +  signal  +  HV(HV ???)
464 const Double_t AliITSv11GeometrySDD::fgkSectionPlastPerMod = (TMath::Pi()*(3*0.36*0.36/4 + 3*0.21*0.21/4 + 2*0.115*0.115/4) 
465                                                               - fgkSectionCuPerMod);
466
467 const Double_t AliITSv11GeometrySDD::fgkSectionGlassPerMod = 3*0.006; // ???
468 const Double_t AliITSv11GeometrySDD::fgkSectionCoolPolyuEL = 0.4672;
469 const Double_t AliITSv11GeometrySDD::fgkSectionCoolWaterEL = 0.3496;
470 const Double_t AliITSv11GeometrySDD::fgkEndLadderEarthCableR = 0.5*fgkmm;
471 // (sections are given in cm square)
472 const Double_t AliITSv11GeometrySDD::fgkCableBendRatio = 1.3; // ??? this factor account for the bending of cables
473
474 const Double_t AliITSv11GeometrySDD::fgkConeSDDr1 = 11.87574*fgkcm;
475 const Double_t AliITSv11GeometrySDD::fgkConeSDDr2 = 26.07574*fgkcm;
476 const Double_t AliITSv11GeometrySDD::fgkConeSDDz1 =  3.36066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
477 const Double_t AliITSv11GeometrySDD::fgkConeSDDz2 = 17.56066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
478 // These last parameters come from cone's code and define the slope
479 // and position of the SDD cone end.  For some unknown reason, this doesn't
480 // allow to stick on the SDD cone. This has to be checked when a correct
481 // version of the cone is available ... For now 'm applying some approximative
482 // corrections
483
484 const Double_t AliITSv11GeometrySDD::fgkSDDCableR1    = 16*fgkcm; // ??? // part 1 of "cable cone"
485 const Double_t AliITSv11GeometrySDD::fgkSDDCableR2    = 23*fgkcm; // ??? // part 1/2 of "cable cone"
486 const Double_t AliITSv11GeometrySDD::fgkSDDCableR3    = 26*fgkcm; // ??? // part 2 of "cable cone"
487
488 const Double_t AliITSv11GeometrySDD::fgkSDDCableDZint =  3.5*fgkcm;
489 const Double_t AliITSv11GeometrySDD::fgkSDDCableR5    =  37*fgkcm; // third part of "cable cone"
490 const Double_t AliITSv11GeometrySDD::fgkSDDCableZ5    =  65*fgkcm; // third part of "cable cone"
491
492
493
494
495
496
497
498 ClassImp(AliITSv11GeometrySDD)
499
500 //________________________________________________________________________
501 AliITSv11GeometrySDD::AliITSv11GeometrySDD(): 
502   AliITSv11Geometry(),
503   fPinSupport(0),
504   fCoolPipeSupportL(0),
505   fCoolPipeSupportR(0),
506   fSDDsensor3(0),
507   fSDDsensor4(0),
508   fBaseThermalBridge(0),
509   fHybrid(0),
510   fLadderFoot(0),
511   fCardLVR(0),
512   fCardLVL(0),
513   fCardHV(0),
514   fCardCarlos(0),
515   fRaccordoL(0),
516   fDigitCableLay3A(0),
517   fDigitCableLay3B(0),
518   fDigitCableLay4A(0),
519   fDigitCableLay4B(0),
520   fMotherVol(0),
521   fAddHybrids(kTRUE), 
522   fAddSensors(kTRUE),
523   fAddHVcables(kTRUE),
524   fAddCables(kTRUE), 
525   fAddCoolingSyst(kTRUE),
526   fCoolingOn(kTRUE),
527   fAddOnlyLadder3min(-1),
528   fAddOnlyLadder3max(-1),
529   fAddOnlyLadder4min(-1),
530   fAddOnlyLadder4max(-1),
531   fColorCarbonFiber(4),
532   fColorRyton(5),
533   fColorPhynox(7),
534   fColorSilicon(3),
535   fColorAl(7),
536   fColorPolyhamide(5),
537   fColorGlass(2),
538   fColorSMD(12),
539   fColorSMDweld(17),
540   fColorStesalite(20),
541   fLay3LadderUnderSegDH(0),
542   fLay4LadderUnderSegDH(0),
543   fLay3LaddShortRadius(0),
544   fLay3LaddLongRadius(0),
545   fLay4LaddShortRadius(0),
546   fLay4LaddLongRadius(0)
547 {
548   //
549   // Standard constructor
550   //
551   SetParameters();
552 }
553
554
555 //________________________________________________________________________
556 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
557   AliITSv11Geometry(debug),
558   fPinSupport(0),
559   fCoolPipeSupportL(0),
560   fCoolPipeSupportR(0),
561   fSDDsensor3(0),
562   fSDDsensor4(0),
563   fBaseThermalBridge(0),
564   fHybrid(0),
565   fLadderFoot(0),
566   fCardLVR(0),
567   fCardLVL(0),
568   fCardHV(0),
569   fCardCarlos(0),
570   fRaccordoL(0),
571   fDigitCableLay3A(0),
572   fDigitCableLay3B(0),
573   fDigitCableLay4A(0),
574   fDigitCableLay4B(0),
575   fMotherVol(0),
576   fAddHybrids(kTRUE), 
577   fAddSensors(kTRUE),
578   fAddHVcables(kTRUE),
579   fAddCables(kTRUE), 
580   fAddCoolingSyst(kTRUE),
581   fCoolingOn(kTRUE),
582   fAddOnlyLadder3min(-1),
583   fAddOnlyLadder3max(-1),
584   fAddOnlyLadder4min(-1),
585   fAddOnlyLadder4max(-1),
586   fColorCarbonFiber(4),
587   fColorRyton(5),
588   fColorPhynox(7),
589   fColorSilicon(3),
590   fColorAl(7),
591   fColorPolyhamide(5),
592   fColorGlass(2),
593   fColorSMD(12),
594   fColorSMDweld(17),
595   fColorStesalite(20),
596   fLay3LadderUnderSegDH(0),
597   fLay4LadderUnderSegDH(0),
598   fLay3LaddShortRadius(0),
599   fLay3LaddLongRadius(0),
600   fLay4LaddShortRadius(0),
601   fLay4LaddLongRadius(0)
602 {
603   //
604   // Constructor setting debugging level
605   //
606   SetParameters();
607 }
608
609 //________________________________________________________________________
610 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
611   AliITSv11Geometry(s.GetDebug()),
612   fPinSupport(s.fPinSupport),
613   fCoolPipeSupportL(s.fCoolPipeSupportL),
614   fCoolPipeSupportR(s.fCoolPipeSupportR),
615   fSDDsensor3(s.fSDDsensor3),
616   fSDDsensor4(s.fSDDsensor4),
617   fBaseThermalBridge(s.fBaseThermalBridge),
618   fHybrid(s.fHybrid),
619   fLadderFoot(s.fLadderFoot),
620   fCardLVR(s.fCardLVR),
621   fCardLVL(s.fCardLVL),
622   fCardHV(s.fCardHV),
623   fCardCarlos(s.fCardCarlos),
624   fRaccordoL(s.fRaccordoL),
625   fDigitCableLay3A(s.fDigitCableLay3A),
626   fDigitCableLay3B(s.fDigitCableLay3B),
627   fDigitCableLay4A(s.fDigitCableLay4A),
628   fDigitCableLay4B(s.fDigitCableLay4B),
629   fMotherVol(s.fMotherVol),
630   fAddHybrids(s.fAddHybrids), 
631   fAddSensors(s.fAddSensors),
632   fAddHVcables(s.fAddHVcables),
633   fAddCables(s.fAddCables), 
634   fAddCoolingSyst(s.fAddCoolingSyst),
635   fCoolingOn(s.fCoolingOn),
636   fAddOnlyLadder3min(s.fAddOnlyLadder3min),
637   fAddOnlyLadder3max(s.fAddOnlyLadder3max),
638   fAddOnlyLadder4min(s.fAddOnlyLadder4min),
639   fAddOnlyLadder4max(s.fAddOnlyLadder4max),
640   fColorCarbonFiber(s.fColorCarbonFiber),
641   fColorRyton(s.fColorRyton),
642   fColorPhynox(s.fColorPhynox),
643   fColorSilicon(s.fColorSilicon),
644   fColorAl(s.fColorAl),
645   fColorPolyhamide(s.fColorPolyhamide),
646   fColorGlass(s.fColorGlass),
647   fColorSMD(s.fColorSMD),
648   fColorSMDweld(s.fColorSMDweld),
649   fColorStesalite(s.fColorStesalite),
650   fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
651   fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
652   fLay3LaddShortRadius(s.fLay3LaddShortRadius),
653   fLay3LaddLongRadius(s.fLay3LaddLongRadius),
654   fLay4LaddShortRadius(s.fLay4LaddShortRadius),
655   fLay4LaddLongRadius(s.fLay4LaddLongRadius)
656 {
657   //     Copy Constructor
658   // do only a "shallow copy" ...
659   SetParameters();
660 }
661
662 //________________________________________________________________________
663 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
664 operator=(const AliITSv11GeometrySDD &s) {
665   //     Assignment operator
666   if(&s == this) return *this;
667   fMotherVol = s.fMotherVol;
668   fAddHybrids = s.fAddHybrids;
669   fAddSensors = s.fAddSensors;
670   fAddHVcables = s.fAddHVcables;
671   fAddCables = s.fAddCables;
672   fAddCoolingSyst = s.fAddCoolingSyst;
673   fCoolingOn = s.fCoolingOn;
674   fAddOnlyLadder3min = s.fAddOnlyLadder3min;
675   fAddOnlyLadder3max = s.fAddOnlyLadder3max;
676   fAddOnlyLadder4min = s.fAddOnlyLadder4min;
677   fAddOnlyLadder4max = s.fAddOnlyLadder4max;
678   return *this;
679 }
680
681 //________________________________________________________________________
682 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
683   // Look like a destructor
684   // Smell like a destructor
685   // And actually is the destructor
686   if (fDigitCableLay3A) delete [] fDigitCableLay3A;
687   if (fDigitCableLay3B) delete [] fDigitCableLay3B;
688   if (fDigitCableLay4A) delete [] fDigitCableLay4A;
689   if (fDigitCableLay4B) delete [] fDigitCableLay4B;
690 }
691
692 //________________________________________________________________________
693 void AliITSv11GeometrySDD::SetParameters() {
694   //
695   // Define display colors and the non constant geometry parameters
696   //
697
698   Double_t detLadderDist = 8*fgkmm; 
699
700   fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
701   fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
702
703   // radius from the center to the CF ladder :
704   fLay3LaddShortRadius = (fgkLay3DetShortRadius
705                           + fgkLadWaferSep+2*fgkWaferThickness
706                           + detLadderDist); 
707   fLay3LaddLongRadius  = (fgkLay3DetLongRadius
708                           + fgkLadWaferSep+2*fgkWaferThickness
709                           + detLadderDist); 
710   fLay4LaddShortRadius = (fgkLay4DetShortRadius
711                           + fgkLadWaferSep+2*fgkWaferThickness
712                           + detLadderDist); 
713   fLay4LaddLongRadius  = (fgkLay4DetLongRadius
714                           + fgkLadWaferSep+2*fgkWaferThickness
715                           + detLadderDist); 
716
717   fLay3sensorZPos[0]= (  35.8+72.4+75.8 )*fgkmm;
718   fLay3sensorZPos[1]= (  35.8+72.4      )*fgkmm;
719   fLay3sensorZPos[2]= (  35.8           )*fgkmm;
720   fLay3sensorZPos[3]= ( -37.9           )*fgkmm;
721   fLay3sensorZPos[4]= ( -37.9-74.9      )*fgkmm;
722   fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
723
724   fLay4sensorZPos[0] = (  38.5+73.2+75.4+71.6 )*fgkmm;
725   fLay4sensorZPos[1] = (  38.5+73.2+75.4      )*fgkmm;
726   fLay4sensorZPos[2] = (  38.5+73.2           )*fgkmm;
727   fLay4sensorZPos[3] = (  38.5                )*fgkmm;
728   fLay4sensorZPos[4] = ( -35.6                )*fgkmm;
729   fLay4sensorZPos[5] = ( -35.6-74.8           )*fgkmm;
730   fLay4sensorZPos[6] = ( -35.6-74.8-72.4      )*fgkmm;
731   fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76.  )*fgkmm;
732 }
733
734
735 //________________________________________________________________________
736 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
737   //
738   // Called to get a medium, checks that it exists.
739   // If not, prints an error and returns 0
740   //
741
742   char ch[30];
743   sprintf(ch, "ITS_%s",mediumName);
744   TGeoMedium* medium =  gGeoManager->GetMedium(ch);
745   if (! medium)
746     printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
747   return medium;
748 }
749
750
751 //________________________________________________________________________
752 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
753   // Get the actual number of ladder in layer 3
754   if ( (fAddOnlyLadder3min<0) ||
755        (fAddOnlyLadder3min >= fgkLay3Nladd) ||
756        (fAddOnlyLadder3max<0) ||
757        (fAddOnlyLadder3max >= fgkLay3Nladd) )
758     return fgkLay3Nladd;
759   else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
760 }
761
762
763 //________________________________________________________________________
764 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
765   // Get the actual number of ladder in layer 4
766   if ( (fAddOnlyLadder4min<0) ||
767        (fAddOnlyLadder4min >= fgkLay4Nladd) ||
768        (fAddOnlyLadder4max<0) ||
769        (fAddOnlyLadder4max >= fgkLay4Nladd) )
770     return fgkLay4Nladd;
771   else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
772 }
773
774
775 //________________________________________________________________________
776 void AliITSv11GeometrySDD::CreateBasicObjects() {
777   //
778   // Create basics objets which will be assembled together
779   // in Layer3 and Layer4 functions
780   //
781
782
783   fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
784   fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
785   fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
786   fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
787
788   fPinSupport = CreatePinSupport();
789   fCoolPipeSupportL = CreateCoolPipeSupportL();
790   fCoolPipeSupportR = CreateCoolPipeSupportR();
791   CreateSDDsensor();
792   fBaseThermalBridge = CreateBaseThermalBridge();
793   fHybrid = CreateHybrid(0);
794
795   TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
796   TGeoMedium *polyhamideSDD   = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
797   TGeoMedium *alSDD           = GetMedium("AL$"); //ITSal
798   TGeoMedium *stainless       = GetMedium("INOX$"); // for screws, what is the material ???????????
799   TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
800   TGeoMedium *raccordMedium   = GetMedium("INOX$");  // ??? material of raccordo ???
801
802   //********************************************************************
803   // pieces of the carbon fiber structure
804   //********************************************************************
805   Double_t dy             = fgkLadderSegBoxDH/2;
806   Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
807   Double_t halfTheta      = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
808   Double_t alpha          = TMath::Pi()*3./4. - halfTheta/2.;
809   Double_t beta           = (TMath::Pi() - 2.*halfTheta)/4.;
810   Double_t dYTranslation  = (fgkLadderHeight/2.
811                              -0.5*fgkLadderWidth*TMath::Tan(beta)
812                              -fgkLadderBeamRadius);
813   Double_t distCenterSideDown =  0.5*fgkLadderWidth/TMath::Cos(beta);
814
815   //--- the top V of the Carbon Fiber Ladder (segment)
816   TGeoArb8 *cfLaddTop1 = CreateLadderSide( "CFladdTopCornerVol1shape",
817                                            fgkSegmentLength/2., halfTheta, 
818                           -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
819   TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
820                                   cfLaddTop1,carbonFiberLadderStruct);
821   TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerVol2shape",
822                                            fgkSegmentLength/2., halfTheta,
823                            1, fgkLadderLa, fgkLadderHa, fgkLadderl);
824   TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
825                                   cfLaddTop2, carbonFiberLadderStruct);
826   cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
827   cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
828   TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
829
830   //--- the 2 side V
831   TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerVol1shape",
832                                             fgkSegmentLength/2., beta, -1,
833                                             fgkLadderLb, fgkLadderHb, fgkLadderl);
834   TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
835                                    cfLaddSide1,carbonFiberLadderStruct);
836   TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerVol2shape",
837                                             fgkSegmentLength/2., beta, 1,
838                                             fgkLadderLb, fgkLadderHb, fgkLadderl);
839   TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
840                                    cfLaddSide2,carbonFiberLadderStruct);
841   cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
842   cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
843   TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
844                                              alpha*TMath::RadToDeg());
845   AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
846   TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
847                                              -alpha*TMath::RadToDeg());
848   AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
849
850   //--- The beams
851   // Beams on the sides
852   Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
853            TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
854   //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
855   Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
856                         ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
857                         + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
858   TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
859                                            0, 180);
860   TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
861                              carbonFiberLadderStruct);
862   sideBeam->SetLineColor(fColorCarbonFiber);
863
864   //Euler rotation : about Z, then new X, then new Z
865   TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
866                                             -beamPhiPrime*TMath::RadToDeg(),-90);
867   TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
868                                             beamPhiPrime*TMath::RadToDeg(), -90);
869   TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
870                                             beamPhiPrime*TMath::RadToDeg(), -90);
871   TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
872                                             -beamPhiPrime*TMath::RadToDeg(),-90);
873
874   TGeoCombiTrans *beamTransf[8];
875   beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
876                                       TMath::Tan(halfTheta),
877                                       fgkLadderBeamRadius/2. - dy,
878                                       -3*fgkSegmentLength/8, beamRot1);
879
880   beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
881                                       TMath::Tan(halfTheta),
882                                       fgkLadderBeamRadius/2. - dy,
883                                       -3*fgkSegmentLength/8, beamRot1);
884   AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
885
886   beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
887                                      TMath::Tan(halfTheta),
888                                      fgkLadderBeamRadius/2. - dy,
889                                      -fgkSegmentLength/8, beamRot2);
890
891   beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
892                                      TMath::Tan(halfTheta),
893                                      fgkLadderBeamRadius/2. - dy,
894                                      -fgkSegmentLength/8, beamRot2);
895   AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
896
897   beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
898                                      TMath::Tan(halfTheta),
899                                      fgkLadderBeamRadius/2. - dy,
900                                      -3*fgkSegmentLength/8, beamRot3);
901
902   beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
903                                      TMath::Tan(halfTheta),
904                                      fgkLadderBeamRadius/2. - dy,
905                                      -3*fgkSegmentLength/8, beamRot3);
906   AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
907
908   beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
909   TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
910   beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
911   TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
912
913   //--- Beams of the bottom
914   TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
915                                  fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
916   TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
917                                    bottomBeam1, carbonFiberLadderStruct);
918   bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
919   TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
920                                  fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
921   TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
922                                bottomBeam2, carbonFiberLadderStruct);
923   bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
924   TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
925                              0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
926                              - fgkLadderLb/3, 0, 180);
927   TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
928                                    bottomBeam3, carbonFiberLadderStruct);
929   bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
930   //bottomBeam3Vol->SetLineColor(2);
931   TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90,  90);
932   TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
933
934   TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
935     (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
936   TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
937                                       -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
938                                       -fgkSegmentLength/2, bottomBeamRot1);
939   TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
940                                       -(fgkLadderHeight/2 - fgkLadderBeamRadius)
941                                       - dy, fgkSegmentLength/2, bottomBeamRot2);
942   // be careful for beams #3: when "reading" from -z to +z and 
943   // from the bottom of the ladder, it should draw a Lambda, and not a V
944   TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
945   TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
946   TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
947     (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
948   TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
949     (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
950
951   fLaddSegCommonVol[0] = cfLaddTopVol1;  fLaddSegCommonTr[0] = trTop1;
952   fLaddSegCommonVol[1] = cfLaddTopVol2;  fLaddSegCommonTr[1] = trTop1;
953   fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
954   fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
955   fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
956   fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
957   fLaddSegCommonVol[6] = sideBeam;       fLaddSegCommonTr[6] = beamTransf[0];
958   fLaddSegCommonVol[7] = sideBeam;       fLaddSegCommonTr[7] = beamTransf[1];
959   fLaddSegCommonVol[8] = sideBeam;       fLaddSegCommonTr[8] = beamTransf[2];
960   fLaddSegCommonVol[9] = sideBeam;       fLaddSegCommonTr[9] = beamTransf[3];
961   fLaddSegCommonVol[10]= sideBeam;       fLaddSegCommonTr[10]= beamTransf[4];
962   fLaddSegCommonVol[11]= sideBeam;       fLaddSegCommonTr[11]= beamTransf[5];
963   fLaddSegCommonVol[12]= sideBeam;       fLaddSegCommonTr[12]= beamTransf[6];
964   fLaddSegCommonVol[13]= sideBeam;       fLaddSegCommonTr[13]= beamTransf[7];
965   fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
966   fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
967   fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
968   fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
969   fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
970
971  
972   //********************************************************************
973   // cables
974   //********************************************************************
975   char cableName[30];
976   for (Int_t i=0; i<fgkLay3Ndet; i++) {
977     sprintf(cableName, "digitCableLay3A_%i",i);
978     fDigitCableLay3A[i].SetName(cableName);
979     fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
980     fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
981     fDigitCableLay3A[i].SetNLayers(2);
982     fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
983                                   fColorPolyhamide);
984     fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
985     sprintf(cableName, "digitCableLay3B_%i",i);
986     fDigitCableLay3B[i].SetName(cableName);
987     fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
988     fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
989     fDigitCableLay3B[i].SetNLayers(2);
990     fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
991                                   fColorPolyhamide);
992     fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
993   };
994   for (Int_t i=0; i<fgkLay4Ndet; i++) {
995     sprintf(cableName, "digitCableLay4A_%i",i);
996     fDigitCableLay4A[i].SetName(cableName);
997     fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
998     fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
999     fDigitCableLay4A[i].SetNLayers(2);
1000     fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1001                                   fColorPolyhamide);
1002     fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1003     sprintf(cableName, "digitCableLay4B_%i",i);
1004     fDigitCableLay4B[i].SetName(cableName);
1005     fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
1006     fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1007     fDigitCableLay4B[i].SetNLayers(2);
1008     fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1009                                   fColorPolyhamide);
1010     fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1011   };
1012                                         // Well, those digit cables could also include the analog cables
1013                                         // which have the same width and the same path, at least in the ladder.
1014                                         // It will gain some computing ressources (less volumes) and some
1015                                         // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1016                                         // The only thing to do is to change the names and put the correct total
1017                                         // thicknesses
1018
1019   // some transformations and volumes used in several places
1020   fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1021                                   0, -fgkCarlosSuppAngle, 0);
1022
1023   TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1024                                            fgkLittleScrewHeadH/2);
1025   fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1026                                  littleScrewHead, stainless);
1027   fCommonVol[0]->SetLineColor(kGray);
1028
1029   fLadderFoot = CreateLadderFoot();
1030   CreateLVCard();
1031   fCardHV     = CreateHVCard(0);
1032   fCardCarlos = CreateCarlosCard(0);
1033
1034   //==================
1035   // link beteen phynox and plastic cooling tubes
1036   //==================
1037
1038   fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1039   Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1040   TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1041   TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1042   vwaterRac->SetLineColor(kBlue);
1043
1044   TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1045                                     fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1046   TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1047                                     fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1048   TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1049                                     fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1050   TGeoVolume *  vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1051   TGeoVolume *  vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1052   TGeoVolume *  vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1053   vtube1Rac->SetLineColor(kGray);
1054   vtube2Rac->SetLineColor(kGray);
1055   vtube3Rac->SetLineColor(kGray);
1056
1057   TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1058                                                     -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1059   TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1060                                (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1061   TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1062                                     (-fullRacLen/2+fgkConnectorCoolTubeL1+
1063                                      fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1064   fRaccordoL->AddNode(vwaterRac, 1,0);
1065   fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1066   fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1067   fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1068 }
1069
1070
1071 //________________________________________________________________________
1072 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1073   //
1074   // a debugging function for checking some possible overlaps
1075   //
1076   if (fSDDsensor3)        fSDDsensor3->CheckOverlaps(precision);
1077   if (fSDDsensor4)        fSDDsensor4->CheckOverlaps(precision);
1078   if (fHybrid)            fHybrid->CheckOverlaps(precision);
1079 }
1080
1081
1082 //________________________________________________________________________
1083 TGeoCombiTrans *AliITSv11GeometrySDD::
1084 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1085                  Bool_t planeSym) {
1086     //
1087     // return the TGeoCombiTrans which make a translation in y and z
1088     // and a rotation in phi in the global coord system
1089     // If planeSym = true, the rotation places the object symetrically
1090     // (with respect to the transverse plane) to its position in the
1091     // case planeSym = false
1092     //
1093
1094     TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1095     TGeoRotation r1("",0.,0.,dphi);
1096     TGeoRotation r2("",90, 180, -90-dphi);
1097
1098     TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1099     combiTrans1->SetTranslation(t1);
1100     if (planeSym) combiTrans1->SetRotation(r1);
1101     else  combiTrans1->SetRotation(r2);
1102     return combiTrans1;
1103 }
1104
1105
1106 //________________________________________________________________________
1107 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1108                                                        Double_t dx,
1109                                                        Double_t dy,
1110                                                        Double_t dz) const{
1111   // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1112   const Double_t *vect = ct->GetTranslation();
1113   Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1114   ct->SetTranslation(newVect);
1115 }
1116
1117
1118 //________________________________________________________________________
1119 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1120 // for code developpment and debugging purposes
1121
1122   if (! fSDDsensor3) CreateBasicObjects();
1123
1124   //  moth->AddNode(fPinSupport, 1, 0);
1125   //  moth->AddNode(fCoolPipeSupportL, 1, 0);
1126   //  moth->AddNode(fSDDsensor3, 1, 0);
1127   //  moth->AddNode(fSDDsensor4, 1, 0);
1128   //  moth->AddNode(fBaseThermalBridge, 1, 0);
1129   //  moth->AddNode(fHybrid,100,0);
1130   //  moth->AddNode(fLadderFoot,1,0);
1131   //moth->AddNode(fCardLVL,1,0);
1132   //moth->AddNode(fCardLVR,1,0);
1133
1134    TGeoVolume* seg = CreateLadderSegment( 3, 0);
1135    moth->AddNode(seg, 1, 0);
1136
1137 //   TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1138 //   moth->AddNode(lay3Ladder, 1, 0);
1139
1140 //   TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1141 //   moth->AddNode(lay3Detectors, 1, 0);
1142
1143 //   TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1144 //   moth->AddNode(lay3Detectors, 1, 0);
1145
1146
1147 //   TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1148 //   moth->AddNode(endLadder, 1, 0);
1149
1150 //   TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1151 //   moth->AddNode(highVCard, 1, 0);
1152
1153 //   TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1154 //   moth->AddNode(supportRing, 1, 0);
1155
1156 //   TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1157 //   moth->AddNode(endLadderCards, 1, 0);
1158
1159 //   TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1160 //   moth->AddNode(carlosCard, 1, 0);
1161
1162
1163
1164   /*
1165   //==================================
1166   //--- test of flat cable curvature
1167   //==================================
1168
1169   double angle = 90;
1170   AliITSv11GeomCableFlat cable("test", 3, 0.3);
1171   cable.SetNLayers(1);
1172   cable.SetNLayers(2);
1173   cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1174   cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1175   cable.SetInitialNode(endLadderCards);
1176
1177   Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1178
1179   p1[0] = -3;
1180   p1[1] = 1;
1181   p1[2] = 10;
1182
1183   p2[0] = 0;
1184   p2[1] = 1;
1185   p2[2] = 10;
1186   cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1187   cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1188   cable.CreateAndInsertBoxCableSegment(1,angle);
1189
1190   Double_t p3[3], p4[3];
1191
1192   p3[0] = 2;
1193   p3[1] = 3;
1194   p3[2] = 10;
1195   cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1196   cable.CreateAndInsertCableCylSegment(2,angle);
1197
1198   p4[0] = 2;
1199   p4[1] = 6;
1200   p4[2] = 10;
1201   cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1202   cable.CreateAndInsertCableSegment(3,angle);
1203   */
1204 }
1205
1206
1207 //________________________________________________________________________
1208 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1209   //
1210   // Insert the layer 3 in the mother volume. This is a virtual volume
1211   // containing ladders of layer 3 and the supporting rings
1212   //
1213
1214   if (! moth) {
1215     printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1216     return;
1217   };
1218
1219   TGeoMedium *airSDD = GetMedium("SDD AIR$");
1220
1221   fMotherVol = moth;
1222   if (! fSDDsensor3) CreateBasicObjects();
1223   
1224   //====================================
1225   // First we create the central barrel
1226   //====================================
1227
1228   TGeoVolumeAssembly *lay3Ladder    = CreateLadder(3);
1229   TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1230   TGeoVolumeAssembly *lay3Ladd2Det  = CreateDetectorsAssemblyLadd2();
1231   //TGeoVolume *lay3Detectors = CreateDetectors(3);
1232   TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1233                                      fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1234   TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1235                                              virtualLayer3Shape, airSDD);
1236
1237   Double_t dPhi = 360./fgkLay3Nladd;
1238   Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1239   // Placing virtual ladder and detectors volumes following
1240   // ladder ordering convention
1241   char rotName[30];
1242   Int_t iLaddMin = 0;
1243   Int_t iLaddMax = fgkLay3Nladd;
1244   if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1245     iLaddMin = fAddOnlyLadder3min;
1246     iLaddMax = fAddOnlyLadder3max+1;
1247   };
1248
1249   for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1250
1251     Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1252     sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1253     Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1254     if (iLadd%2 != 0)
1255       minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1256     minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1257     TGeoCombiTrans *ctLadd;
1258     //=============================================================
1259     //
1260     //   Special modification  for ladder 2 of layer 3:
1261     //   It has been inverted (pi rotation around y axis)
1262     //
1263     //=============================================================
1264     if (iLadd != 2)
1265       ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1266                                 0, ladderPhi, kTRUE);
1267     else
1268       ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1269                                 0, ladderPhi, kFALSE);
1270     virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1271     ///////////////////////////////////////////////////
1272     sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1273     Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1274     if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1275     minRadiusDetBox += detectorsThick/2;
1276     TGeoCombiTrans *ctDet;
1277     ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1278                              0, ladderPhi, kTRUE);
1279
1280     if (iLadd != 2)
1281       virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1282     else
1283       virtualLayer3->AddNode(lay3Ladd2Det , iLadd, ctDet);
1284
1285     ///////////////////////////////////////////////////
1286   }
1287
1288   /*
1289   //====================================
1290   // Then the forward rapidity pieces
1291   // (cooling, Carlos, LV, HV ...)
1292   //====================================
1293
1294   Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm;  // this has to be tune
1295   Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1296   Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1297
1298   TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1299   TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1300                                                 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1301                                                 fgkForwardLay3Length/2.);
1302
1303 //   TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1304 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1305 //   virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1306
1307
1308   TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1309                                                   virtualForward3Shape, airSDD);
1310   TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1311                                                   virtualForward3Shape, airSDD);
1312 //   TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1313 //   TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1314
1315   TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1316                                           fgkLay3Length/2+fgkForwardLay3Length/2);
1317   TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1318                                           -fgkLay3Length/2-fgkForwardLay3Length/2);
1319
1320   for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1321
1322     Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1323     Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1324     if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1325     minRadiusDetBox += detectorsThick/2;
1326
1327     sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1328
1329     TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1330                                    -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1331     TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1332                                    fgkForwardLay3Length/2, ladderPhi, kFALSE);
1333
1334     virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1335     virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1336   }
1337
1338   */
1339
1340
1341   if(GetDebug(1)) {
1342     virtualLayer3->CheckOverlaps(0.01);
1343     //virtualForward3Pos->CheckOverlaps(0.01);
1344     //virtualForward3Neg->CheckOverlaps(0.01);
1345   }
1346
1347   virtualLayer3->SetVisibility(kFALSE);
1348   //virtualForward3Pos->SetVisibility(kFALSE);
1349   //virtualForward3Neg->SetVisibility(kFALSE);
1350
1351
1352   moth->AddNode(virtualLayer3, 1, 0);
1353   //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1354   //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1355 }
1356
1357
1358 // //________________________________________________________________________
1359 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1360 //   //
1361 //   // Insert the forward pieces of layer 3 in the mother volume. 
1362 //   // (cooling, Carlos, LV, HV ...)
1363 //   //
1364
1365 //   if (! moth) {
1366 //     printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1367 //     return;
1368 //   };
1369
1370 //   TGeoMedium *airSDD = GetMedium("SDD AIR$");
1371
1372 //   if (! fSDDsensor3) CreateBasicObjects();
1373
1374 //   Double_t dPhi = 360./fgkLay3Nladd;
1375 //   Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1376 //   Int_t iLaddMin = 0;
1377 //   Int_t iLaddMax = fgkLay3Nladd;
1378 //   if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1379 //     iLaddMin = fAddOnlyLadder3min;
1380 //     iLaddMax = fAddOnlyLadder3max+1;
1381 //   };
1382 //   char rotName[30];
1383
1384
1385 //   //=================
1386
1387 //   Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm;  // this has to be tune
1388 //   Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1389 //   Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1390
1391 //   TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1392 //   TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1393 //                                              fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1394 //                                              fgkForwardLay3Length/2.);
1395
1396 // //   TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1397 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1398 // //   virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1399
1400
1401 //   TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1402 //                                                virtualForward3Shape, airSDD);
1403 //   TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1404 //                                                virtualForward3Shape, airSDD);
1405 // //   TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1406 // //   TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1407
1408 //   TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1409 //                                        fgkLay3Length/2+fgkForwardLay3Length/2);
1410 //   TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1411 //                                        -fgkLay3Length/2-fgkForwardLay3Length/2);
1412
1413 //   for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1414
1415 //     Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1416 //     Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1417 //     if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1418 //     minRadiusDetBox += detectorsThick/2;
1419
1420 //     sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1421
1422 //     TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1423 //                                 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1424 //     TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1425 //                                 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1426
1427 //     virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1428 //     virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1429 //   }
1430
1431 //   if(GetDebug(1)) {
1432 //     virtualForward3Pos->CheckOverlaps(0.01);
1433 //     virtualForward3Neg->CheckOverlaps(0.01);
1434 //   }
1435
1436 //   virtualForward3Pos->SetVisibility(kFALSE);
1437 //   virtualForward3Neg->SetVisibility(kFALSE);
1438
1439 //   moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1440 //   moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1441 // }
1442
1443
1444
1445 //________________________________________________________________________
1446 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1447   //
1448   // Insert the end-ladder of layer 3 in the mother volume. 
1449   // (cooling, Carlos, LV, HV ...)
1450   //
1451
1452   if (! moth) {
1453     printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1454     return;
1455   };
1456
1457   if (! fSDDsensor3) CreateBasicObjects();
1458
1459   Int_t iLaddMin = 0;
1460   Int_t iLaddMax = fgkLay3Nladd;
1461   if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1462     iLaddMin = fAddOnlyLadder3min;
1463     iLaddMax = fAddOnlyLadder3max+1;
1464   };
1465
1466   TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1467   TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1468
1469   char rotName[30];
1470   Double_t dPhi = 360./fgkLay3Nladd;
1471   TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1472
1473   for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1474
1475     Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1476     Double_t dR = 0;
1477     if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1478
1479     sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1480
1481     TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1482                                     fgkLay3Length/2, ladderPhi, kTRUE);
1483     TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1484                                    -fgkLay3Length/2, ladderPhi, kFALSE);
1485
1486     virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1487     virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1488   }
1489
1490   if(GetDebug(1)) {
1491     virtualForward3Pos->CheckOverlaps(0.01);
1492     virtualForward3Neg->CheckOverlaps(0.01);
1493   }
1494
1495   // 180deg Y rotation to compensate the cancellation of ITSD volume
1496   // (idortm[199] in AliITSv11Hybrid : z--->  -z;   x ---> -x;   y ---> y)
1497   TGeoRotation *y180 = new TGeoRotation();
1498   y180->SetAngles( 90.,180., 90., 90.,180.,  0.);
1499   moth->AddNode(virtualForward3Pos, 1, y180);
1500   moth->AddNode(virtualForward3Neg, 1, y180);
1501 }
1502
1503 //________________________________________________________________________
1504 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1505   //
1506   // Insert the layer 4 in the mother volume. This is a virtual volume
1507   // containing ladders of layer 4 and the supporting rings
1508   //
1509
1510   if (! moth) {
1511     printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1512     return;
1513   };
1514
1515   fMotherVol = moth;
1516
1517   if (! fSDDsensor3) CreateBasicObjects();
1518
1519   TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1520                                     fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1521   TGeoMedium *airSDD = GetMedium("SDD AIR$");
1522   TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1523                                              virtualLayer4Shape, airSDD);
1524
1525   //====================================
1526   // First we create the central barrel
1527   //====================================
1528
1529    TGeoVolumeAssembly *lay4Ladder    = CreateLadder(4);
1530   //TGeoVolume *lay4Detectors = CreateDetectors(4);
1531   TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1532
1533   Double_t dPhi = 360./fgkLay4Nladd;
1534   Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1535
1536   // placing virtual ladder and detectors volumes following ladder 
1537   // ordering convention
1538   char rotName[20];
1539   Int_t iLaddMin = 0;
1540   Int_t iLaddMax = fgkLay4Nladd;
1541   if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1542     iLaddMin = fAddOnlyLadder4min;
1543     iLaddMax = fAddOnlyLadder4max+1;
1544   }
1545   for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1546
1547     Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1548     sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1549     Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1550     if (iLadd%2 != 0)
1551       minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1552     minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1553     TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1554                                               0, ladderPhi, kTRUE);
1555     virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1556     ///////////////////////////////////////////////////
1557     sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1558     Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1559     if (iLadd%2 != 0)
1560       minRadiusDetBox = fgkLay4DetLongRadius;
1561     minRadiusDetBox += detBoxThickness/2;
1562     TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1563                                              0, ladderPhi, kTRUE);
1564     virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1565     ///////////////////////////////////////////////////
1566   }
1567
1568   /*
1569   //====================================
1570   // Then the pieces at forward rapidity
1571   // (cooling, Carlos, LV, HV ...)
1572   //====================================
1573
1574   Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm;  // this has to be tuned
1575   Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1576   Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1577
1578   TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1579   TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1580                                                 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1581                                                 fgkForwardLay4Length/2.);
1582   TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1583                                                   virtualForward4Shape, airSDD);
1584   TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1585                                                   virtualForward4Shape, airSDD);
1586 //   TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1587 //   TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1588
1589   TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1590                                           fgkLay4Length/2+fgkForwardLay4Length/2);
1591   TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1592                                           -fgkLay4Length/2-fgkForwardLay4Length/2);
1593
1594   for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1595
1596     Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1597     Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1598     if (iLadd%2 != 0)
1599       minRadiusDetBox = fgkLay4DetLongRadius;
1600     minRadiusDetBox += detBoxThickness/2;
1601
1602     sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1603
1604     TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1605                                    -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1606     TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1607                                     fgkForwardLay4Length/2, ladderPhi, kFALSE);
1608     virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1609     virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1610   }
1611   */
1612
1613   if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1614
1615   virtualLayer4->SetVisibility(kFALSE);
1616   //virtualForward4Pos->SetVisibility(kFALSE);
1617   //virtualForward4Neg->SetVisibility(kFALSE);
1618
1619   moth->AddNode(virtualLayer4,1,0);
1620   //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1621   //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1622 }
1623
1624
1625 // //________________________________________________________________________
1626 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1627 //   //
1628 //   // Insert the layer 4 in the mother volume. This is a virtual volume
1629 //   // containing ladders of layer 4 and the supporting rings
1630 //   // (cooling, Carlos, LV, HV ...)
1631 //   //
1632
1633 //   if (! moth) {
1634 //     printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1635 //     return;
1636 //   };
1637
1638 //   TGeoMedium *airSDD = GetMedium("SDD AIR$");
1639
1640 //   if (! fSDDsensor3) CreateBasicObjects();
1641
1642 //   Double_t dPhi = 360./fgkLay4Nladd;
1643 //   Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1644
1645 //   // placing virtual ladder and detectors volumes following ladder 
1646 //   // ordering convention
1647 //   char rotName[20];
1648 //   Int_t iLaddMin = 0;
1649 //   Int_t iLaddMax = fgkLay4Nladd;
1650 //   if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1651 //     iLaddMin = fAddOnlyLadder4min;
1652 //     iLaddMax = fAddOnlyLadder4max+1;
1653 //   }
1654
1655 //   //=================
1656 //   Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm;  // this has to be tuned
1657 //   Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1658 //   Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1659
1660 //   TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1661 //   TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1662 //                                              fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1663 //                                              fgkForwardLay4Length/2.);
1664 //   TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1665 //                                                virtualForward4Shape, airSDD);
1666 //   TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1667 //                                                virtualForward4Shape, airSDD);
1668 // //   TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1669 // //   TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1670
1671 //   TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1672 //                                        fgkLay4Length/2+fgkForwardLay4Length/2);
1673 //   TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1674 //                                        -fgkLay4Length/2-fgkForwardLay4Length/2);
1675
1676 //   for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1677
1678 //     Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1679 //     Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1680 //     if (iLadd%2 != 0)
1681 //       minRadiusDetBox = fgkLay4DetLongRadius;
1682 //     minRadiusDetBox += detBoxThickness/2;
1683
1684 //     sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1685
1686 //     TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1687 //                                 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1688 //     TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1689 //                                  fgkForwardLay4Length/2, ladderPhi, kFALSE);
1690 //     virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1691 //     virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1692 //   }
1693
1694 //   virtualForward4Pos->SetVisibility(kFALSE);
1695 //   virtualForward4Neg->SetVisibility(kFALSE);
1696
1697 //   moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1698 //   moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1699 // }
1700
1701
1702 //________________________________________________________________________
1703 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1704   //
1705   // Insert the end-ladder of layer 4 in the mother volume.
1706   // (cooling, Carlos, LV, HV ...)
1707   //
1708
1709   if (! moth) {
1710     printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1711     return;
1712   };
1713
1714   if (! fSDDsensor3) CreateBasicObjects();
1715
1716   // placing virtual ladder and detectors volumes following ladder 
1717   // ordering convention
1718   Int_t iLaddMin = 0;
1719   Int_t iLaddMax = fgkLay4Nladd;
1720   if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1721     iLaddMin = fAddOnlyLadder4min;
1722     iLaddMax = fAddOnlyLadder4max+1;
1723   }
1724
1725   TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1726   TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1727
1728   char rotName[30];
1729   Double_t dPhi = 360./fgkLay4Nladd;
1730   TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1731
1732   for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1733
1734     Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1735     Double_t dR = 0;
1736     if (iLadd%2 != 0)
1737       dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1738
1739     sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1740
1741     TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1742                                    fgkLay4Length/2, ladderPhi, kTRUE);
1743     TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1744                                    -fgkLay4Length/2, ladderPhi, kFALSE);
1745     virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1746     virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1747   }
1748
1749   // 180deg Y rotation to compensate the cancellation of ITSD volume
1750   // (idortm[199] in AliITSv11Hybrid : z--->  -z;   x ---> -x;   y ---> y)
1751   TGeoRotation *y180 = new TGeoRotation();
1752   y180->SetAngles( 90.,180., 90., 90.,180.,  0.);
1753   moth->AddNode(virtualForward4Pos, 1, y180);
1754   moth->AddNode(virtualForward4Neg, 1, y180);
1755 }
1756
1757
1758 //________________________________________________________________________
1759 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1760   //
1761   // return an assembly volume containing the CF ladder
1762   //
1763
1764   Int_t    nDetectors   = fgkLay3Ndet;
1765   Double_t ladderLength = fgkLay3LadderLength;
1766   Double_t underSegDH   = fLay3LadderUnderSegDH;
1767   Double_t *sensorZPos  = fLay3sensorZPos;
1768   AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1769   AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1770
1771   if (iLay==3) {}
1772   else if (iLay==4) {
1773     nDetectors   = fgkLay4Ndet;
1774     ladderLength = fgkLay4LadderLength;
1775     digitCableA  = fDigitCableLay4A;
1776     digitCableB  = fDigitCableLay4B;
1777     underSegDH   = fLay4LadderUnderSegDH;
1778     sensorZPos   = fLay4sensorZPos;
1779   }
1780   else {
1781     printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1782   };
1783   Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1784   TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1785   
1786   // placing virtual ladder segment following detector ordering convention
1787   //=======================================================================
1788   char transName[30];
1789
1790   // adding segment this way to create cable points in the correct order ...
1791   for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1792
1793     //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1794     TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1795     sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1796     Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment) 
1797                           + fgkSegmentLength/2;
1798     TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1799                                                  underSegDH/2,segmentPos);
1800     ////
1801     virtualLadder->AddNode(laddSegment, iSegment, segTr);
1802   };
1803   for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1804
1805     TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1806     //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1807     sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1808     Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment) 
1809                           + fgkSegmentLength/2;
1810     TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1811                                                  underSegDH/2,segmentPos);
1812     ////
1813     virtualLadder->AddNode(laddSegment, iSegment, segTr);
1814   };
1815
1816   // putting virtual volume corresponding to the end of ladder
1817   //=======================================================================
1818   TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1819   Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1820   TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1821                                    fgkSegmentLength*(nDetectors/2)+endLength/2.);
1822   // Euler rotation : about Z, then new X, then new Z
1823   TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1824   TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1825                   -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1826   virtualLadder->AddNode(endLadder, 1, endTrZPos);
1827   virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1828
1829   // creating and inserting cable segments
1830   //   (check points are placed while creating segments)
1831   //=======================================================================
1832   if (fAddCables)
1833   for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1834     
1835     digitCableA[iSegment].SetInitialNode(virtualLadder);
1836     digitCableB[iSegment].SetInitialNode(virtualLadder);
1837     
1838     for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1839       Double_t rotation = 0;
1840       if (iPt>1) {
1841         rotation = 90-fgkHybridAngle; 
1842         digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1843       } else
1844         digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1845
1846     };
1847     
1848     for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1849       Double_t rotation = 0;
1850       if (iPt>1) {
1851         rotation = fgkHybridAngle-90; 
1852         digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1853       } else
1854         digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1855     };
1856   };
1857   
1858   // HV cable
1859   //=======================================================================
1860   if (fAddHVcables) {
1861     TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");  //ITSsddKAPTON_POLYCH2
1862     TGeoMedium *alSDD         = GetMedium("AL$");   //ITSal
1863
1864   AliITSv11GeomCableFlat cableHV[fgkLay4Ndet];  // temp !!!
1865   char cableHVname[30];
1866   for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1867     sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1868     cableHV[iSegment].SetName(cableHVname);
1869     cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1870     cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1871     cableHV[iSegment].SetNLayers(2);
1872     cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1873                                fColorPolyhamide);
1874     cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1875     cableHV[iSegment].SetInitialNode(virtualLadder);
1876   };
1877   Double_t x1[3], x2[3], x3[3],
1878            vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1879
1880   x1[0] = -fgkTransitHVtailXpos;
1881   x2[0] = -fgkTransitHVtailXpos;
1882   x3[0] = -fgkTransitHVtailXpos;
1883   for (Int_t iSegment  = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1884     Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1885                                *fgkLongHVcableSeparation;
1886     // adjust where HV long cable starts in Y
1887     // useful if you want to let some space for alignment
1888     x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1889     x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1890             - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1891     x3[1] = x2[1];
1892     x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1893     x2[2] =  x1[2]+5*fgkmm;
1894     x3[2] = ladderLength/2-endLength;
1895     cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1896     cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1897     cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1898
1899     //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1900     cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1901     //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1902     cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1903   };
1904
1905   vYZ[2] = -1;
1906   x1[0] = fgkTransitHVtailXpos;
1907   x2[0] = fgkTransitHVtailXpos;
1908   x3[0] = fgkTransitHVtailXpos;
1909
1910   for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) { 
1911     Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1912                                *fgkLongHVcableSeparation;
1913     x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1914     x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1915             - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1916     x3[1] = x2[1];
1917     x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1918     x2[2] =  x1[2]-5*fgkmm;
1919     x3[2] = -ladderLength/2+endLength;
1920     cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1921     cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1922     cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1923
1924     cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1925     cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1926   };
1927   };
1928
1929   //**********************************
1930   if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1931   return virtualLadder;
1932 }
1933
1934
1935 //________________________________________________________________________
1936 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(const char *name,
1937                          Double_t dz, Double_t angle, Double_t xSign,
1938                          Double_t L, Double_t H, Double_t l) {
1939     // Create one half of the V shape corner of CF ladder
1940   
1941     TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1942     cfLaddSide->SetName(name);
1943
1944     // Points must be in clockwise order
1945     cfLaddSide->SetVertex(0, 0,  0);
1946     cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1947                           -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1948     cfLaddSide->SetVertex(4, 0,  0);
1949     cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1950                           -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1951     if (xSign < 0) {
1952      cfLaddSide->SetVertex(1, 0, -H);
1953      cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1954      cfLaddSide->SetVertex(5, 0, -H);
1955      cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1956     } else {
1957      cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1958      cfLaddSide->SetVertex(3, 0, -H);
1959      cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1960      cfLaddSide->SetVertex(7, 0, -H);
1961     }
1962     return cfLaddSide;
1963 }
1964
1965
1966 //________________________________________________________________________
1967 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1968   //
1969   // return a box containing the front-end hybrid
1970   //
1971
1972   Double_t roundHoleX       = -fgkHybridWidth/2+fgkHybRndHoleX;
1973
1974   Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1975   Double_t lowFLTotalThick  = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1976 //   Double_t upFLTotalThick   = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1977   Double_t chipsCCTotThick  = fgkHybUnderNiThick+fgkHybGlueAgThick
1978                               +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1979   Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1980 //   Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1981 //                        + upFLTotalThick + ccUpLayerTotThick);
1982   Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1983                           +fgkHybSMDheight);
1984   Double_t lowLayerYmin     = -volumeThick/2+fgkHybridThBridgeThick
1985                               +screenTotalThick;
1986   Double_t flUpThick        = fgkHybGlueUpThick+fgkHybUpThick;
1987
1988   //**************************************************** media :
1989   TGeoMedium *airSDD                  = GetMedium("SDD AIR$");
1990   TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1991   TGeoMedium *alSDD                   = GetMedium("AL$"); //ITSal
1992   TGeoMedium *alSDD80p100             = GetMedium("AL$");                 // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1993   TGeoMedium *alSDD50p100             = GetMedium("AL$");                 // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1994   TGeoMedium *polyhamideSDD           = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1995   TGeoMedium *niSDD                   = GetMedium("COPPER$");                // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1996   TGeoMedium *glueAG                  = GetMedium("SDDKAPTON (POLYCH2)$");  // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1997   TGeoMedium *siliconSDD              = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1998   TGeoMedium *medSMD                  = GetMedium("SDD X7R capacitors$");      //  SDDX7Rcapacitors   TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1999   TGeoMedium *medSMDweld              = GetMedium("SDD X7R capacitors$");      //  SDDX7Rcapacitors  TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2000
2001   //**************************************************** main volume :
2002   TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
2003                                      (fgkHybridLength)/2);
2004   TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
2005                                       airSDD);
2006  
2007   TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
2008                                            fgkHybridThBridgeThick/2,
2009                                            fgkHybridLength/2);
2010
2011   //**************************************************** Thermal bridge :
2012   TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
2013                                               sThermalBridge,
2014                                               carbonFiberLadderStruct);
2015   vThermalBridge->SetLineColor(fColorCarbonFiber);
2016   TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
2017                                     +fgkHybridThBridgeThick/2, 0);
2018   hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
2019
2020   //**************************************************** Screen layer :
2021   TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
2022                                           fgkHybAlThick/2, fgkHybridLength/2);
2023   //here the upedex and glue layers are both assumed to be polyimide
2024   TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
2025                                               fgkHybridWidth/2,
2026                                      (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2027                                               fgkHybridLength/2);
2028   TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2029                                       (screenTotalThick+lowFLTotalThick)/2);
2030
2031   TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2032    -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2033
2034   TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2035    -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2036    +fgkHybAlThick/2, 0);
2037
2038   TGeoTranslation hybHolePos1Tr(roundHoleX,
2039    -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2040                                 -fgkHybridLength/2+fgkHybRndHoleZ);
2041   TGeoTranslation hybHolePos2Tr(roundHoleX, 
2042    -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2043                                 fgkHybridLength/2-fgkHybRndHoleZ);
2044
2045   TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2046   TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2047   hybHolePos1->SetName("hybHolePos1");
2048   TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2049   hybHolePos2->SetName("hybHolePos2");
2050
2051   upGlueScreenTr->RegisterYourself();
2052   alScreenTr->RegisterYourself();
2053   hybHolePos1->RegisterYourself();
2054   hybHolePos2->RegisterYourself();
2055   delete rotHole;
2056
2057   TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2058                       "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2059                       "+sRoundHole:hybHolePos2)");
2060   TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2061   vScreenAl->SetLineColor(fColorAl);
2062   TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2063         "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2064         "+sRoundHole:hybHolePos2)");
2065   TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2066                                              sScreenUpGlue,polyhamideSDD);
2067   vScreenUpGlue->SetLineColor(fColorPolyhamide);
2068
2069   hybrid->AddNode(vScreenUpGlue, 1, 0);
2070   hybrid->AddNode(vScreenAl, 1, 0);
2071
2072   //****************************************************  FL low layer :
2073   Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2074   Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2075
2076   //here the upedex and glue layers are both assumed to be polyimide
2077   TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2078                                       (fgkHybGlueLowThick+fgkHybUpThick)/2,
2079                                        sideWidth1/2);
2080   TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2081                                   fgkHybAlThick/2, sideWidth1/2);
2082  
2083   TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2084                               lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2085                                               -(fgkHybridLength-sideWidth1)/2);
2086   TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2087                     lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2088                                               -(fgkHybridLength-sideWidth1)/2);
2089   upGlueBarTr1->RegisterYourself();
2090   alBarTr1->RegisterYourself();
2091
2092   TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2093                      "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2094   TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2095                       "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2096   TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2097                                               sLowUpGlueBar1, polyhamideSDD);
2098   TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2099                                           sLowAlBar1, alSDD);
2100   vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2101   vLowAlBar1->SetLineColor(fColorAl);
2102   hybrid->AddNode(vLowUpGlueBar1,1,0);
2103   hybrid->AddNode(vLowAlBar1,1,0);
2104
2105   //---
2106   //here the upedex and glue layers are both assumed to be polyimide
2107   TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2108                                        (fgkHybGlueLowThick+fgkHybUpThick)/2,
2109                                        sideWidth2/2);
2110   TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2111                                    fgkHybAlThick/2, sideWidth2/2);
2112
2113  TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2114                               lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2115                                                (fgkHybridLength-sideWidth2)/2);
2116   TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2117                     lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2118                                                (fgkHybridLength-sideWidth2)/2);
2119   upGlueBarTr2->RegisterYourself();
2120   alBarTr2->RegisterYourself();
2121
2122   TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2123                      "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2124   TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2125                       "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2126   TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2127                                               polyhamideSDD);
2128   TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2129                                           alSDD);
2130   vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2131   vLowAlBar2->SetLineColor(fColorAl);
2132   hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2133   hybrid->AddNode(vLowAlBar2, 1, 0);
2134
2135   if(GetDebug(3)) { // Remove compiler warning.
2136     sAlScreenLayer->InspectShape();
2137     sUpGlueScreenLayer->InspectShape();
2138     sRoundHole->InspectShape();
2139     sUpGlueBar1->InspectShape();
2140     sUpGlueBar2->InspectShape();
2141     sAlBar1->InspectShape();
2142     sAlBar2->InspectShape();
2143   };
2144   //---
2145   //using class AliITSv11GeomCableFlat to add 2-layer segments ... 
2146   Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2147   AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2148                                        lowFLTotalThick);
2149   lowFLpiece.SetNLayers(2);
2150   lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2151                        fColorPolyhamide);
2152   lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2153   // alSDD at 80% : mostly to take into account strips of piece 3
2154
2155   Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2156                      lowLayerYmin + lowFLTotalThick/2,
2157                      -fgkHybridLength/2 + sideWidth1 };
2158   Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2159   Double_t vZ[3] = {0,0,1};
2160   lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2161   lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2162   lowFLpiece.SetInitialNode(hybrid);
2163   lowFLpiece.CreateAndInsertBoxCableSegment(1);
2164   lowFLpiece.ResetPoints();
2165
2166   Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2167                          -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2168
2169   lowFLpiece.SetWidth(piece2width);
2170   lowFLpiece.SetName("lowFLpiece2");
2171   x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2172   x2[0] = x1[0];
2173   lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2174   lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2175   lowFLpiece.CreateAndInsertBoxCableSegment(1);
2176   lowFLpiece.ResetPoints();
2177
2178   Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX 
2179                          - fgkHybFLlowHoleAmbDX/2;
2180
2181   lowFLpiece.SetWidth(piece3width);
2182   lowFLpiece.SetName("lowFLpiece3");
2183   x1[0] = fgkHybridWidth/2-piece3width/2;
2184   x2[0] = x1[0];
2185   lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2186   lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2187   lowFLpiece.CreateAndInsertBoxCableSegment(1);
2188
2189   Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2190                         fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2191   Double_t vX[3] = {1,0,0};
2192   for (Int_t i=0; i<3; i++) {
2193     char ch[20];
2194     sprintf(ch, "lowFLpieceA%i", i+4);
2195     lowFLpiece.SetName(ch);
2196     lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2197
2198     lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2199     x1[0] = -fgkHybridWidth/2 + piece1width;
2200     x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2201     Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2202     x1[2] = zPiece; x2[2] = zPiece; 
2203     lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2204     lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2205     lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2206     lowFLpiece.ResetPoints();
2207
2208     sprintf(ch, "lowFLpieceB%i", i+4);
2209     lowFLpiece.SetName(ch);
2210     x1[0] = fgkHybridWidth/2 - piece3width;
2211     x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2212     lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2213     lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2214     lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2215   };
2216   
2217   //**************************************************** chips+CC:
2218   AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2219   chip.SetInitialNode(hybrid);
2220   chip.SetNLayers(5);
2221   chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2222   chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2223   chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2224   chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2225                 fColorPolyhamide);
2226   chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2227   // Here the tho CC (low+up) are merged
2228   // In fact, the last layer has a smaller surface of Al -> I put 80%
2229   
2230   x1[1] = lowLayerYmin + chipsCCTotThick/2;
2231   x2[1] = x1[1];
2232   char ch[20];
2233
2234   for (Int_t i=0; i<4; i++) {
2235     sprintf(ch, "pascalCC%i", i);
2236     chip.SetName(ch);
2237     x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2238     x2[0] = x1[0] + fgkHybPascalDX;
2239     x1[2] =  zChips[i] - fgkHybridLength/2;
2240     x2[2] = x1[2];
2241     chip.AddCheckPoint( hybrid, 0, x1, vX );
2242     chip.AddCheckPoint( hybrid, 1, x2, vX );
2243     chip.CreateAndInsertBoxCableSegment(1,-90);
2244     chip.ResetPoints();
2245
2246     sprintf(ch, "ambraCC%i", i);
2247     chip.SetName(ch);
2248     x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2249     x2[0] = x1[0] + fgkHybAmbraDX;
2250     chip.AddCheckPoint( hybrid, 0, x1, vX );
2251     chip.AddCheckPoint( hybrid, 1, x2, vX );
2252     chip.CreateAndInsertBoxCableSegment(1,-90);
2253     chip.ResetPoints();
2254   };
2255
2256   //**************************************************** CC outside chips:
2257   // I don't think there is a second aluminium layer here ...
2258   for (Int_t i = 0; i<4; i++) {
2259     sprintf(ch, "ccLayerA%i", i);
2260
2261     AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2262     ccLayer1.SetInitialNode(hybrid);
2263     ccLayer1.SetNLayers(2);
2264     ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2265     ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2266     // Al at ~50%
2267
2268     x1[0] = -fgkHybridWidth/2;
2269     x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2270     x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2271             + fgkHybChipThick + ccUpLayerTotThick/2;
2272     x2[1] = x1[1];
2273     x1[2] = zChips[i] - fgkHybridLength/2;
2274     x2[2] = x1[2];
2275     ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2276     ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2277     ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2278
2279     sprintf(ch, "ccLayerB%i", i);
2280     AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2281     ccLayer2.SetInitialNode(hybrid);
2282     ccLayer2.SetNLayers(2);
2283     ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2284     ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2285      // Al at ~50%
2286
2287     x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2288     x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2289     ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2290     ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2291     ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2292     ccLayer2.ResetPoints();
2293     sprintf(ch, "ccLayerC%i", i);
2294     ccLayer2.SetName(ch);
2295     x1[0] =  -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2296     x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2297     x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2298              + ccUpLayerTotThick/2;
2299     x2[1] = x1[1];
2300
2301     ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2302     ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2303     ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2304   };
2305
2306   //**************************************************** FL UP:
2307   // (last Al layer will be a special triangular shape)
2308   TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2309                               fgkHybFLUpperWidth/2, flUpThick/2,
2310                               fgkHybFLUpperLength/2);
2311   TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2312                                     sFLupPolyhamide, polyhamideSDD);
2313   vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2314   TGeoTranslation *trFLupPolyhamide = 
2315     new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2316                         lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2317
2318   hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2319
2320   TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2321   aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2322   aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2323   aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2324   aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2325   aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2326   aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2327   aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2328   aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2329   TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2330   // Al at ~50%
2331
2332   vAluStrip->SetLineColor(fColorAl);
2333   //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2334   TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2335
2336   Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2337                           +flUpThick+fgkHybAlThick/2;
2338   TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2339                                     fgkHybridWidth/2,yRotAluStrip,
2340                     fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2341   TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2342   AddTranslationToCombiTrans(aluStripTr2,0,0,
2343                              fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2344   TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2345   AddTranslationToCombiTrans(aluStripTr3,0,0,
2346                              fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2347   TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2348   AddTranslationToCombiTrans(aluStripTr4,0,0,
2349                              fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2350
2351   hybrid->AddNode(vAluStrip, 1, aluStripTr1); 
2352   hybrid->AddNode(vAluStrip, 2, aluStripTr2); 
2353   hybrid->AddNode(vAluStrip, 3, aluStripTr3); 
2354   hybrid->AddNode(vAluStrip, 4, aluStripTr4); 
2355   //**************************************************** SMD:
2356   TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2357                                   fgkHybSMDmiddleL/2+fgkHybSMDendL,
2358                                   fgkHybSMDheight/2,fgkHybSMDendW/2);
2359   TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2360
2361   TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2362                                fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2363                                         fgkHybSMDmiddleW/2);
2364   TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2365                                             hybSMDmiddle,medSMD);
2366   vHybSMDmiddle->SetLineColor(fColorSMD);
2367   TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2368                             fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2369   TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2370                                           hybSMDend,medSMDweld);
2371   vHybSMDend->SetLineColor(fColorSMDweld);
2372   TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2373                                        (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2374   TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2375                                        -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2376   vHybSMD->AddNode(vHybSMDmiddle,1,0);
2377   vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2378   vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2379   for (Int_t i=0; i<fgkNHybSMD; i++) {
2380     TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2381                                  -fgkHybridWidth/2+fgkHybSMDposX[i],
2382                                  lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2383                                  -fgkHybridLength/2+fgkHybSMDposZ[i]);
2384     hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2385   };
2386
2387   if (iLRSide == 0) {
2388   };
2389
2390   if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2391   hybrid->SetVisibility(kFALSE);
2392   return hybrid;
2393 }
2394
2395 //________________________________________________________________________
2396 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2397   //
2398   // Return a TGeoVolume* containing a segment of a ladder.
2399   //
2400
2401   TGeoMedium *phynoxSDD       = GetMedium("INOX$");
2402   TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2403   TGeoMedium *airSDD          = GetMedium("SDD AIR$");
2404
2405   Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder 
2406   Double_t segmentLength = fgkSegmentLength;
2407   Double_t spaceBetweenCables = 500*fgkmicron;
2408   
2409   //*****************************************
2410   // Set parameters according to (iLay,iSeg):
2411   //*****************************************
2412   Int_t nDetectors          = fgkLay3Ndet;
2413   Double_t coolPipeSuppH    = fgkLay3CoolPipeSuppH;
2414   Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2415                               (fgkSegmentLength*fgkLay3Ndet/2. - 
2416                                fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2417  // sensorCenterZPos = z in segment local coord syst.
2418
2419   AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2420   AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2421
2422   if (iLay==3) {
2423   } else if (iLay==4) {
2424     nDetectors = fgkLay4Ndet;
2425     coolPipeSuppH = fgkLay4CoolPipeSuppH;
2426     sensorCenterZPos = fLay4sensorZPos[iSeg]-
2427                        (fgkSegmentLength*fgkLay4Ndet/2. -
2428                         fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2429     digitCableA = fDigitCableLay4A;
2430     digitCableB = fDigitCableLay4B;     
2431   } else
2432     printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2433
2434  
2435   Double_t cableSideSign = -1;
2436   if (iSeg<nDetectors/2) cableSideSign = 1;
2437   Double_t spaceForCables = spaceBetweenCables*
2438            (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2439            +0.1*fgkmicron;
2440   // gives [0-1-2-2-1-0]*spaceBetweenCables
2441   // or  [0-1-2-3-3-2-1-0]*spaceBetweenCables
2442   Int_t iUpdateCableMin;
2443   Int_t iUpdateCableMax;
2444   if (cableSideSign==-1) {
2445     iUpdateCableMin = nDetectors/2;
2446     iUpdateCableMax = iSeg-1;
2447   } else {
2448     iUpdateCableMin = iSeg+1;
2449     iUpdateCableMax = nDetectors/2-1;
2450   };
2451
2452   if(GetDebug(1)){
2453     cout << "Segment ("<< iLay <<',' << iSeg 
2454          << ") : sensor z shift in local segment coord.=" 
2455          << sensorCenterZPos << endl;
2456   };
2457
2458   //****************************
2459   // The segment volume
2460   //****************************
2461
2462   // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2463   // likely slows down the transport of particles through the geometry
2464  
2465   //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2466
2467   TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2468                                   fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2469                                   fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2470                                   segmentLength/2);
2471   
2472   TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2473                                           segBox, airSDD);
2474   virtualSeg->SetVisibility(kFALSE);
2475
2476   //******************************
2477   // Carbon fiber structure :
2478   //******************************
2479
2480    virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2481   Int_t volumeIndex = 1;
2482   for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2483     if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2484       volumeIndex++;
2485     else
2486       volumeIndex = 1;
2487     virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2488                  fLaddSegCommonTr[i]);
2489   };
2490
2491   //**********************************
2492   // Pine support of the sensors :
2493   //**********************************
2494   TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2495   TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2496
2497   // The use of the following constructor type allow to use rotPS1 and rotPS2
2498   // (and not copy them) therefore we gain some memory
2499   TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2500                                 - fgkLadderHeight/2.-tDY
2501                                 + fgkPinSuppHeight/2.,
2502                                 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2503
2504   TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2505                                 - fgkLadderHeight/2.-tDY
2506                                 + fgkPinSuppHeight/2.,
2507                                 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2508   AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2509
2510   TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2511                                 - fgkLadderHeight/2.-tDY
2512                                 + fgkPinSuppHeight/2.,
2513                                 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2514   AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2515
2516   TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2517                                 - fgkLadderHeight/2.-tDY
2518                                 + fgkPinSuppHeight/2.,
2519                                 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2520   AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2521
2522   TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2523                                  - fgkLadderHeight/2. - tDY
2524                                  + fgkPinSuppHeight/2.,
2525                                  sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2526
2527   TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2528                                  - fgkLadderHeight/2. - tDY
2529                                  + fgkPinSuppHeight/2.,
2530                                  sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2531   AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2532
2533   TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2534                                  - fgkLadderHeight/2. - tDY
2535                                  + fgkPinSuppHeight/2.,
2536                                  sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2537   AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2538
2539   TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2540                                  - fgkLadderHeight/2. - tDY
2541                                  + fgkPinSuppHeight/2.,
2542                                  sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2543   AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2544   
2545   virtualSeg->AddNode(fPinSupport, 1, transPS1);
2546   virtualSeg->AddNode(fPinSupport, 2, transPS2);
2547   virtualSeg->AddNode(fPinSupport, 3, transPS3);
2548   virtualSeg->AddNode(fPinSupport, 4, transPS4);
2549   virtualSeg->AddNode(fPinSupport, 5, transPS5);
2550   virtualSeg->AddNode(fPinSupport, 6, transPS6);
2551   virtualSeg->AddNode(fPinSupport, 7, transPS7);
2552   virtualSeg->AddNode(fPinSupport, 8, transPS8);
2553
2554   TGeoMedium *pinMed   = GetMedium("SDDKAPTON (POLYCH2)$");  // medium ???
2555   Double_t fgkPinHeight = 4.5*fgkmm;
2556   TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2557                                 fgkPinHeight/2.);
2558   TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2559
2560   TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2561                                 - fgkLadderHeight/2.-tDY
2562                                 + fgkPinHeight/2.,
2563                                 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2564   AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2565   virtualSeg->AddNode(pineV, 1, transPS2b);
2566
2567   TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2568                                  - fgkLadderHeight/2. - tDY
2569                                  + fgkPinHeight/2.,
2570                                  sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2571   AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2572   virtualSeg->AddNode(pineV, 2, transPS6b);
2573
2574  
2575   TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2576                                 - fgkLadderHeight/2.-tDY
2577                                 + fgkPinHeight/2.,
2578                                 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2579   AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2580   virtualSeg->AddNode(pineV, 3, transPS4b);
2581
2582   TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2583                                  - fgkLadderHeight/2. - tDY
2584                                  + fgkPinHeight/2.,
2585                                  sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2586   AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2587   virtualSeg->AddNode(pineV, 4, transPS8b);
2588
2589
2590   //******************************
2591   // Cooling pipe supports :
2592   //******************************
2593   Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2594   Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2595   Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2596                                fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2597   
2598   Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2599                            (triangleHeight+triangleCPaxeDist/
2600                             TMath::Sin(halfTheta)-coolPipeSuppH);
2601   if (fAddCoolingSyst) {
2602   TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90,  90);
2603   TGeoRotation *rotCPS1 = new TGeoRotation("",  halfTheta*TMath::RadToDeg(), -90, -90);
2604   TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2605                                   -fgkLadderHeight/2. - tDY
2606                                   +coolPipeSuppH+fgkLadderBeamRadius,
2607                                   -segmentLength/2., rotCPS1);
2608
2609   TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2610                                   -fgkLadderHeight/2. - tDY
2611                                   +coolPipeSuppH+fgkLadderBeamRadius,
2612                                   -segmentLength/2., rotCPS1);
2613   AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2614   
2615   TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2616                                   -fgkLadderHeight/2.- tDY
2617                                   +coolPipeSuppH+fgkLadderBeamRadius,
2618                                   segmentLength/2., rotCPS2);
2619
2620   TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2621                                   -fgkLadderHeight/2.- tDY
2622                                   +coolPipeSuppH+fgkLadderBeamRadius,
2623                                   segmentLength/2., rotCPS2);
2624   AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2625   
2626   virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2627   virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2628   virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2629   virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2630   };
2631   
2632   //************************
2633   // Cooling pipes :
2634   //************************
2635   TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2636                                  -fgkLadderHeight/2. - tDY +
2637                                  fgkLadderBeamRadius+coolPipeSuppH, 0);
2638   TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2639                                  -fgkLadderHeight/2.- tDY +
2640                                   fgkLadderBeamRadius+coolPipeSuppH, 0);
2641
2642   if (fAddCoolingSyst) {
2643     TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2644                                                fgkCoolPipeOuterDiam/2,
2645                                                segmentLength/2);
2646     TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2647                                           segmentLength/2);
2648     
2649     TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2650                                              coolingPipeShape, phynoxSDD );
2651     coolingPipe->SetLineColor(fColorPhynox);
2652     TGeoVolume *cooler = new  TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2653                                          coolerMediumSDD );
2654     
2655     
2656     virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2657     virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2658     if (fCoolingOn) {
2659       virtualSeg->AddNode(cooler, 1, pipeTr1);
2660       virtualSeg->AddNode(cooler, 2, pipeTr2);
2661     };
2662   };
2663
2664   //**********************************
2665   // Bases of hybrid thermal bridges
2666   //**********************************
2667   Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2668                            // approx !!! not clear on 0752/14-A
2669   if (fAddCoolingSyst) {
2670   TGeoRotation rotHybrid1("", 0,   0, -90 - fgkHybridAngle);
2671   TGeoRotation rotHybrid2("", 0 ,180,  90 - fgkHybridAngle);
2672   TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2673   TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2674   
2675   virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2676   virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2677   };
2678
2679   //*************************
2680   // the 2 hybrids :
2681   //*************************
2682   Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2683   Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2684   
2685   Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle) 
2686                          - shiftHyb*SinD(fgkHybridAngle) );
2687   Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2688                          + shiftHyb*CosD(fgkHybridAngle) );
2689   if (fAddHybrids) {
2690     TGeoRotation rotHybrid3("", 0,   0,  90. - fgkHybridAngle);
2691     TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2692     TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2693     TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2694     AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2695     AddTranslationToCombiTrans( hybTr2,  hybrVolX, hybrVolY, 0);
2696     
2697     virtualSeg->AddNode(fHybrid, 1, hybTr1);
2698     virtualSeg->AddNode(fHybrid, 2, hybTr2);
2699   };
2700
2701   //***********
2702   // cables
2703   //***********
2704   if (fAddCables) {
2705   // Starting from this segment
2706   Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2707   Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2708   Double_t posDigitCableAlongHyb = shiftHyb+ hybDx 
2709                                    - digitCableA->GetWidth()/2;
2710   Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2711                                        - digitCableA->GetThickness()/2;
2712
2713   Double_t digitCableX = ( coolPipeSuppL
2714                            + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2715                            - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2716   Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2717                            + fgkLadderBeamRadius+coolPipeSuppH
2718                            + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2719                            + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2720
2721
2722   Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2723                                    digitCableY, cableSideSign*hybDz };
2724   Double_t digitCableCenterA1[3] = { 
2725            -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2726            digitCableY+spaceForCables*SinD(fgkHybridAngle),
2727            cableSideSign*segmentLength/2 };
2728
2729   Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2730                                    digitCableY,cableSideSign*hybDz};
2731   Double_t digitCableCenterB1[3]={ 
2732            cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2733            digitCableY+spaceForCables*SinD(fgkHybridAngle),
2734            cableSideSign*segmentLength/2 };
2735
2736   Double_t vZ[3] = {0,0,1};
2737   digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2738   digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2739   digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2740   digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2741
2742   // Updating the other cables
2743   for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2744
2745     Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2746     Double_t coord[3];
2747     digitCableA[iCable].GetPoint( 1, coord);
2748     digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2749     digitCableB[iCable].GetPoint( 1, coord);
2750     digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2751   };
2752   };
2753
2754   //**********************************
2755   if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2756   return virtualSeg;
2757 }
2758
2759
2760 //________________________________________________________________________
2761 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2762 //
2763 // Create a pine support and its pine
2764 // axis of rotation is the cone axis, center in its middle
2765 //
2766     TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?
2767
2768     TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2769                                   0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2770                                   fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2771     TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2772                                   fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2773     TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2774                                   fgkPinSuppHeight/2.+0.00001);
2775     // 0.00001 is for seing the actual hole (avoid viewer artefact)
2776
2777     if(GetDebug(3)){// Remove compiler warning.
2778         cone->InspectShape();
2779         tong->InspectShape();
2780         hole->InspectShape();
2781     };
2782
2783     TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2784                    fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2785     tongTrans->RegisterYourself();
2786     TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2787                "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2788                "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2789
2790     TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2791                                             rytonSDD);
2792     pinSupport->SetLineColor(fColorRyton);
2793
2794     return pinSupport;
2795 }
2796
2797
2798 //________________________________________________________________________
2799 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2800 //
2801 // Create half of the cooling pipe support (ALR-0752/3)
2802 //
2803
2804   Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2805   
2806   TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2807   side1->SetName("ITSsddCPSside1");
2808   side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2809   side1->SetVertex( 1, 0,  fgkCoolPipeSuppWidthExt/2.);
2810   side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2811                        fgkCoolPipeSuppWidthExt/2.);
2812   side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX,
2813                        -fgkCoolPipeSuppWidthExt/2.);
2814   side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2815   side1->SetVertex( 5, 0,  fgkCoolPipeSuppWidthExt/2.);
2816   side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2817                        fgkCoolPipeSuppWidthExt/2.);
2818   side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2.,
2819                        -fgkCoolPipeSuppWidthExt/2.);
2820
2821   TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2822                                  - fgkCoolPipeSuppAxeDist
2823                                  + fgkCoolPipeSuppWidthExt/2., 0);
2824   side1Tr->RegisterYourself();
2825   TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2826                                  - fgkCoolPipeSuppAxeDist
2827                                  + fgkCoolPipeSuppWidthExt*3/2.
2828                                  + fgkCoolPipeSuppWidthIn,0);
2829   side2Tr->RegisterYourself();
2830   
2831   TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2832                          (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2833                          fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2834   TGeoTranslation *middleTr = 
2835     new TGeoTranslation("ITSsddCPStr3",
2836                         (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2837                         -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2838                         +fgkCoolPipeSuppWidthIn/2., 0);
2839   middleTr->RegisterYourself();
2840   
2841   TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2842                                   fgkCoolPipeSuppTongW/4.,
2843                                   (fgkCoolPipeSuppFulWidth
2844                                    - 2*fgkCoolPipeSuppWidthExt
2845                                    - fgkCoolPipeSuppWidthIn)/2,
2846                                   fgkCoolPipeSuppHeight/2.);
2847   
2848   TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2849                                   fgkCoolPipeSuppTongW/4.,
2850                                   - fgkCoolPipeSuppAxeDist
2851                                   + fgkCoolPipeSuppFulWidth
2852                                   - axeBox->GetDY(), 0);
2853   axeBoxTr->RegisterYourself();
2854
2855   TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2856                                fgkCoolPipeSuppTongW/4.);
2857
2858   TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2859   TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2860                                  fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2861   axeTrans->RegisterYourself();
2862   //delete axeRot; // make the code crash, no idea of why !!!
2863
2864   if(GetDebug(3)){
2865     middle->InspectShape();
2866     axe->InspectShape();
2867   };
2868
2869   TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2870   
2871   TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2872                                         "ITSsddCoolPipeSuppShapeL",
2873                                         "ITSsddCPSmiddle:ITSsddCPStr3"
2874                                         "+ITSsddCPSside1:ITSsddCPStr1"
2875                                         "+ITSsddCPSside1:ITSsddCPStr2"
2876                                         "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2877                                         "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2878   TGeoVolume *coolPipeSupp = new  TGeoVolume("ITSsddCoolPipeSupportL",
2879                                              coolPipeSuppShape, rytonSDD);
2880
2881   coolPipeSupp->SetLineColor(fColorRyton);
2882
2883   return coolPipeSupp;
2884 }
2885
2886
2887 //________________________________________________________________________
2888 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2889 //
2890 //Create half of the cooling pipe support (ALR-0752/3)
2891 //
2892
2893   Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2894   
2895   TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2896   side1->SetName("ITSsddCPSside1R");
2897   side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2898   side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2899                        -fgkCoolPipeSuppWidthExt/2.);
2900   side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2901                        fgkCoolPipeSuppWidthExt/2.);
2902   side1->SetVertex( 3, 0,  fgkCoolPipeSuppWidthExt/2.);
2903   side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2904   side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2905                        -fgkCoolPipeSuppWidthExt/2.);
2906   side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2907                        fgkCoolPipeSuppWidthExt/2.);
2908   side1->SetVertex( 7, 0,  fgkCoolPipeSuppWidthExt/2.);
2909
2910   TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2911                                  - fgkCoolPipeSuppAxeDist
2912                                  + fgkCoolPipeSuppWidthExt/2., 0);
2913   side1Tr->RegisterYourself();
2914   TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2915                                  - fgkCoolPipeSuppAxeDist
2916                                  + fgkCoolPipeSuppWidthExt*3/2.
2917                                  + fgkCoolPipeSuppWidthIn, 0);
2918   side2Tr->RegisterYourself();
2919   
2920   TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2921                                   (fgkCoolPipeSuppMaxLength/2.
2922                                    - fgkCoolPipeSuppSlitL)/2.,
2923                                   fgkCoolPipeSuppWidthIn/2., 
2924                                   fgkCoolPipeSuppHeight/2.);
2925   TGeoTranslation *middleTr = 
2926     new TGeoTranslation("ITSsddCPStr3R",
2927                         -( fgkCoolPipeSuppMaxLength/2.
2928                            -fgkCoolPipeSuppSlitL)/2.,
2929                         -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2930                         + fgkCoolPipeSuppWidthIn/2.,0);
2931   middleTr->RegisterYourself();
2932   
2933   TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2934                                   fgkCoolPipeSuppTongW/4.,
2935                                   (fgkCoolPipeSuppFulWidth
2936                                    - 2*fgkCoolPipeSuppWidthExt
2937                                    - fgkCoolPipeSuppWidthIn)/2,
2938                                   fgkCoolPipeSuppHeight/2.);
2939   
2940   TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2941                                   - fgkCoolPipeSuppTongW/4.,
2942                                   - fgkCoolPipeSuppAxeDist
2943                                   + fgkCoolPipeSuppFulWidth
2944                                   - axeBox->GetDY(),0);
2945   axeBoxTr->RegisterYourself();
2946
2947   TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2948                                fgkCoolPipeSuppTongW/4.);
2949
2950   TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2951   TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2952                                                 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2953   axeTrans->RegisterYourself();
2954   //delete axeRot;
2955
2956   if(GetDebug(3)){
2957     middle->InspectShape();
2958     axe->InspectShape();
2959   };
2960   
2961   TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2962                                       "ITSsddCoolPipeSuppShapeR",
2963                                       "ITSsddCPSmiddleR:ITSsddCPStr3R"
2964                                       "+ITSsddCPSside1R:ITSsddCPStr1R"
2965                                       "+ITSsddCPSside1R:ITSsddCPStr2R"
2966                                       "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2967                                       "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2968   
2969   TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2970   TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2971                                              coolPipeSuppShape, rytonSDD);
2972   coolPipeSupp->SetLineColor(fColorRyton);
2973
2974   return coolPipeSupp;
2975 }
2976
2977 //________________________________________________________________________
2978 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2979   //
2980   // based on ALR 0752/8
2981   //
2982
2983   Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2984
2985   Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2986                         - (fgkRadiusAminBTB+fgkBTBthick);
2987   TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2988                                   fgkBTBthick/2., fgkBTBlength/2.);
2989   TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2990                                  fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2991                                  -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2992   base1Tr->RegisterYourself();
2993
2994   Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2995                         - fgkRadiusBminBTB;
2996   TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2997                                   fgkBTBthick/2., fgkBTBlength/2.);
2998   TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2999                                  fgkBTBaxisAtoBottom - base2width/2.,
3000                                  -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
3001   base2Tr->RegisterYourself();
3002
3003   TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
3004                                  fgkBTBthick/2., dy/2., fgkBTBlength/2.);
3005   TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
3006                                  -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
3007   TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
3008                                  fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
3009   sideTr1->RegisterYourself();
3010   sideTr2->RegisterYourself();
3011
3012   TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
3013                                  fgkBTBthick/2., fgkBTBHoleLength/2.);
3014   TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
3015                                  - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3016                                  - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3017                                  fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
3018   TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
3019                                  - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3020                                  - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3021                                  - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
3022   holeTr1->RegisterYourself();
3023   holeTr2->RegisterYourself();
3024
3025   Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
3026   TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3027                                            fgkRadiusAminBTB, radiusAmaxBTB,
3028                                            fgkBTBlength/2., 0., 180.);
3029   TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3030                            fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3031                            fgkBTBlength/2., 270., 360.);
3032   TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3033                                   -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3034                                   -dy, 0);
3035   roundTr1->RegisterYourself();
3036
3037   TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3038                            fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3039                            fgkBTBlength/2., 180., 270.);
3040   TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3041                                   (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3042                                   -dy, 0);
3043   roundTr2->RegisterYourself();
3044
3045   TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3046                                       "ITSsddBaseThermalBridgeShape",
3047                                       "ITSsddBTBbase1:ITSsddBTBtr1"
3048                                       "+ ITSsddBTBbase2:ITSsddBTBtr2"
3049                                       "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3050                                       "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3051                                       "+ ITSsddBTBside:ITSsddBTBsideTr1"
3052                                       "+ ITSsddBTBside:ITSsddBTBsideTr2"
3053                                       "- ITSsddBTBhole:ITSsddBTBholeTr1"
3054                                       "- ITSsddBTBhole:ITSsddBTBholeTr2"
3055                                       "+ ITSsddBTBmainAxis");
3056
3057     if(GetDebug(3)){// Remove compiler warning.
3058         base1->InspectShape();
3059         base2->InspectShape();
3060         side->InspectShape();
3061         hole->InspectShape();
3062         mainAxis->InspectShape();
3063         round1->InspectShape();
3064         round2->InspectShape();
3065     };
3066
3067   TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3068   TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3069                                                    sBaseThermalBridge,
3070                                                    carbonFiberLadderStruct);
3071
3072   vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3073   return vBaseThermalBridge;
3074 }
3075
3076
3077 //________________________________________________________________________
3078 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3079   //
3080   // Return an assembly containing a end of a CF ladder.
3081   //
3082
3083   TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3084   TGeoMedium *stesalite       = GetMedium("G10FR4$");
3085   TGeoMedium *phynoxSDD       = GetMedium("INOX$");
3086   TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3087
3088   Double_t length        = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3089   Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3090   Double_t underSegDH    = fLay3LadderUnderSegDH;
3091   Double_t footDZ    = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3092   // footDZ is also where to place the ruby's center in local Z
3093   Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3094
3095   if (iLay==3) {
3096   } else if (iLay==4) {
3097     length         = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3098     coolPipeSuppH  = fgkLay4CoolPipeSuppH;
3099     underSegDH     = fLay4LadderUnderSegDH;
3100     footDZ         = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3101     coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3102   } else {
3103     printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3104     return 0;
3105   };
3106     
3107   Double_t tDY = (- fgkLadderSegBoxDH/2       //space left on top of the ladder
3108                   + underSegDH/2);          //space under ladder segment
3109         // here tDY is not the same as for the segment because the end ladder
3110         // does not have a space under it, inside the general ladder volume.
3111   Double_t segmentLength   = fgkSegmentLength;
3112   Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3113
3114   TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3115   
3116   //**********************************
3117   // coding real matter :
3118   //**********************************
3119   Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3120   Double_t halfTheta   = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3121   Double_t beta        = (TMath::Pi()-2.*halfTheta)/4.;
3122   Double_t alpha       = TMath::Pi()*3./4. - halfTheta/2.;
3123   
3124   //--- The 3 V shape corners of the Carbon Fiber Ladder
3125   //--- the top V
3126   TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape",
3127                                           topCornerLength/2., halfTheta, -1,
3128                                           fgkLadderLa, fgkLadderHa, fgkLadderl);
3129   TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1",
3130                                   cfLaddTop1,carbonFiberLadderStruct);
3131   cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3132   TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape",
3133                                            topCornerLength/2., halfTheta, 1,
3134                                            fgkLadderLa, fgkLadderHa, fgkLadderl);
3135   TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3136                                   cfLaddTop2,carbonFiberLadderStruct);
3137   cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3138   TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3139                                                 -(length-topCornerLength)/2.);
3140   virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3141   virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3142
3143   //--- the 2 side V
3144   TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape",
3145                                             length/2., beta, -1,
3146                                             fgkLadderLb, fgkLadderHb, fgkLadderl);
3147   TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3148                                    cfLaddSide1,carbonFiberLadderStruct);
3149   cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3150   TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape",
3151                                             length/2., beta, 1,
3152                                             fgkLadderLb, fgkLadderHb, fgkLadderl);
3153   TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3154                                    cfLaddSide2,carbonFiberLadderStruct);
3155   cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3156   Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3157                              TMath::Tan(beta) - fgkLadderBeamRadius );
3158   
3159   // because center of the triangle doesn't correspond to virtual vol. center
3160   Double_t distCenterSideDown =  0.5*fgkLadderWidth/TMath::Cos(beta);
3161   TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3162                                              alpha*TMath::RadToDeg());
3163   AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3164   TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0, 
3165                                              -alpha*TMath::RadToDeg());
3166   AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3167   virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3168   virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3169   virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3170   virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3171   
3172   //--- The beams
3173   // Beams on the sides
3174   Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3175                   TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3176
3177   //Euler rotation : about Z, then new X, then new Z
3178   TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3179                         -beamPhiPrime*TMath::RadToDeg(), -90);
3180   TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3181                         beamPhiPrime*TMath::RadToDeg(), -90);
3182   TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3183                         beamPhiPrime*TMath::RadToDeg(), -90);
3184   TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3185                         -beamPhiPrime*TMath::RadToDeg(), -90);
3186   TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3187                                                    TMath::Tan(halfTheta),
3188                                               fgkLadderBeamRadius/2. + tDY,
3189                                  -length/2 + segmentLength/8, beamRot1);
3190   TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3191                                                     TMath::Tan(halfTheta),
3192                                                  fgkLadderBeamRadius/2.+tDY,
3193                                 -length/2 + 3*segmentLength/8, beamRot2);
3194   TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3195                                                    TMath::Tan(halfTheta),
3196                                                 fgkLadderBeamRadius/2.+tDY,
3197                                  -length/2 + segmentLength/8, beamRot3);
3198   TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3199                                                    TMath::Tan(halfTheta),
3200                                               fgkLadderBeamRadius/2. + tDY,
3201                                  -length/2+3*segmentLength/8, beamRot4);
3202
3203   virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3204   virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3205   virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3206   virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3207
3208   //--- Beams of the bottom
3209   TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3210
3211   /* Not there actually
3212   TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3213                                  fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3214   TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3215                                    bottomBeam1, carbonFiberLadderStruct);
3216   bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3217
3218   TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3219                             -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3220                             -length/2+fgkSegmentLength/2, bottomBeamRot1);
3221   virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3222 */
3223   TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3224                                  fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3225   TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3226                                    bottomBeam2, carbonFiberLadderStruct);
3227   bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3228   TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3229      -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3230   virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3231
3232   //**********************************
3233   //the cooling pipe supports
3234   Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3235                                fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3236
3237   Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3238                            (triangleHeight+triangleCPaxeDist/
3239                             TMath::Sin(halfTheta)-coolPipeSuppH);
3240   
3241   if (fAddCoolingSyst) {
3242     TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3243     TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3244     TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3245                                                    -fgkLadderHeight/2.+ tDY +
3246                                                    coolPipeSuppH+fgkLadderBeamRadius,
3247                                                    -length/2., rotCPS1);
3248     TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3249                                                    -fgkLadderHeight/2.+ tDY +
3250                                                    coolPipeSuppH+fgkLadderBeamRadius,
3251                                                    -length/2., rotCPS2);
3252     
3253     virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3254     virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3255   };
3256
3257   //**********************************
3258   //--- The stesalite foot of the ladder
3259
3260   Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3261                     - fgkLadFootY/2+fgkLadFingerPrintY;
3262
3263   TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3264   virtualEnd->AddNode(fLadderFoot, 1, footTr);
3265
3266   //=====================================
3267   //--- cooling pipe
3268
3269   if (fAddCoolingSyst) {
3270
3271     TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3272                                        -fgkLadderHeight/2.+ tDY +
3273                                        coolPipeSuppH + fgkLadderBeamRadius,
3274                                        -length/2.+coolPipeEndLen/2.);
3275     TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3276                                    -fgkLadderHeight/2. + tDY +
3277                                     fgkLadderBeamRadius + coolPipeSuppH,
3278                                     -length/2.+coolPipeEndLen/2.);
3279
3280     TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3281                                                fgkCoolPipeOuterDiam/2,
3282                                                coolPipeEndLen/2);
3283     TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3284                                           coolPipeEndLen/2);
3285     
3286     TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3287                                              coolingPipeShape, phynoxSDD );
3288     coolingPipe->SetLineColor(fColorPhynox);
3289     TGeoVolume *cooler = new  TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3290                                          coolerMediumSDD );
3291
3292     virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3293     virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3294     if (fCoolingOn) {
3295       virtualEnd->AddNode(cooler, 1, pipeTr1);
3296       virtualEnd->AddNode(cooler, 2, pipeTr2);
3297     };
3298   };
3299
3300   //=====================================
3301   //--- HV cable guide
3302
3303
3304   TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3305                                       fgkHVguideY1/2,fgkHVguideZ1/2);
3306   TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3307
3308   TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3309      -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3310      footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3311   virtualEnd->AddNode(guideHV, 1, guideHVtr);
3312
3313   //=====================================
3314   //--- raccordo
3315   Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3316   TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3317                                                      -fgkLadderHeight/2.+ tDY +
3318                                                      coolPipeSuppH+fgkLadderBeamRadius,
3319                                             -length/2.+coolPipeEndLen+raccordFullLen/2);
3320   TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3321                                                      -fgkLadderHeight/2.+ tDY +
3322                                                      coolPipeSuppH+fgkLadderBeamRadius,
3323                                             -length/2.+coolPipeEndLen+raccordFullLen/2);
3324
3325   virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3326   virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3327
3328   if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3329
3330   return virtualEnd;
3331 }
3332
3333 //________________________________________________________________________
3334 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3335
3336   //--- The stesalite foot of the ladder
3337   // Are missing :
3338   // The 2 screw holes on the left part
3339   // the small holes at each corner of the ruby cage (diam 2mm)
3340   // the really small level difference of 0.3mm on the bottom
3341
3342
3343   TGeoMedium *stesalite = GetMedium("G10FR4$");
3344
3345   TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3346
3347   Double_t epsilon = 2e-10;
3348   TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3349                                        fgkLadFootZ/2);
3350   TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3351                                                        fgkLadFootX/2-fgkLadBox1X/2,0,0);
3352   TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3353                                           fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3354
3355   TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3356                             fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3357                             fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3358                             0);
3359
3360   TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3361                                         fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3362
3363   TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3364                                  fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3365                                  fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3366
3367   double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3368   TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3369                             rubyScrewHoleLen/2);
3370
3371   TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3372   TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3373                                     fgkLadFootX/2-rubyScrewHoleLen/2,
3374                                     -fgkRubyScrewShiftToCenterY, 0, rot9090);
3375
3376   Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3377   TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3378                                     rubyHoleLen/2);
3379
3380   TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3381   TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3382                                    -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3383
3384   ladFootBox1Tr->RegisterYourself();
3385   ladFingerPrintTr->RegisterYourself();
3386   rubyCageHoleTr->RegisterYourself();
3387   rubyScrewHoleTr->RegisterYourself();
3388   rubyHoleTr->RegisterYourself();
3389
3390   TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3391               "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3392               "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3393               "+rubyHole:rubyHoleTr)");
3394   TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3395                                               footRightPart,stesalite);
3396   vFootRightPart->SetLineColor(fColorStesalite);
3397  
3398   virtualFoot->AddNode(vFootRightPart, 1, 0);
3399
3400
3401   //--- This was the right part of the foot, now let's do the middle
3402   //--- and the right parts
3403
3404   Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3405   TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3406                                       fgkLadFootZ/2);
3407   TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3408                                    fgkLadFootX/2-fgkLadBox1X-middleX/2,
3409                                    fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3410
3411   TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3412   vFootMiddle->SetLineColor(fColorStesalite);
3413   virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3414   
3415   //--
3416   TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3417                                              (fgkLadFootY-fgkLadFingerPrintY)/2,
3418                                              fgkLadFootZ/2);
3419   TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3420                                    -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3421                                    -fgkLadFingerPrintY/2, 0);
3422   TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3423                                                   stesalite);
3424   vFootLeftLadFinger->SetLineColor(fColorStesalite);
3425   virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3426
3427   //--
3428   TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3429                                     fgkLadFootY/2,
3430                                     fgkLadFootZ/2);
3431   TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3432                                    -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3433                                     0, 0);
3434   TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3435   vFootLeft->SetLineColor(fColorStesalite);
3436   virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3437
3438   if(GetDebug(3)){ // Remove compiler warning.
3439     ladFingerPrint->InspectShape();
3440     ladFootBox1->InspectShape();
3441     rubyCageHole->InspectShape();
3442     rubyScrewHole->InspectShape();
3443     rubyHole->InspectShape();
3444   }
3445
3446   return virtualFoot;
3447 }
3448
3449 //________________________________________________________________________
3450 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3451   //
3452   // return an assembly containing the CARLOS end-ladder board
3453   // and the heat bridge
3454   //
3455
3456   (void) iLay;
3457   TGeoMedium *glassFiber  = GetMedium("SDD SI CHIP$");// glassFiber   TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3458   TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3459   TGeoMedium *plastiChip  = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3460   TGeoMedium *copper      = GetMedium("COPPER$"); 
3461   TGeoMedium *alCu12SDD   = GetMedium("INOX$"); // ITSsddAlCu12,  to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3462   TGeoMedium *stainless   = GetMedium("INOX$"); // for screws, what is the material ???????????
3463
3464   //=========================================
3465   // cooling support of the Carlos card (HeatBridge):
3466   TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3467
3468   TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3469                                            fgkCarlosSuppZ/2);
3470   TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3471                                            fgkCarlosSuppZ/2);
3472   TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3473                                                 supCarlosBoard1, alCu12SDD);
3474   TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3475                                                 supCarlosBoard2, alCu12SDD);
3476   vSupCarlosBoard1->SetLineColor(4);
3477   vSupCarlosBoard2->SetLineColor(4);
3478
3479
3480   Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3481   // shift of the main planes in the direction of their width 
3482   // the center is fixed at the center of the 2 small fixing arms on each sides.
3483   //shiftGlob=0.5;
3484
3485   shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3486   shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3487   Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3488   Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3489
3490   TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3491                                  (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3492                                                        +shiftGlobZ);
3493
3494   TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3495                                                      shiftGlobY,
3496                                                      shiftGlobZ);
3497
3498   assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3499   assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3500
3501   //=========================================
3502   // fixing arm of the cooling support :
3503   TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3504                                            fgkCarlosSuppZ3/2);
3505   TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3506                                                 supCarlosBoard3, alCu12SDD);
3507   vSupCarlosBoard3->SetLineColor(4);
3508
3509   // screw inside :
3510   TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3511                                        fgkCarlosSuppY3/2);
3512   TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3513                                             littleScrew, stainless);
3514   TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3515   TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3516                                                 fgkLittleScrewHeadR-0.07, rotScrew);
3517   TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3518                                                 fgkLittleScrewHeadR+0.07, rotScrew);
3519   vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3520   vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3521
3522   TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3523                                                  0, fgkCarlosSuppAngle, 0);
3524   TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3525                                  fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3526   TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3527                                  fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3528   assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3529   assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3530
3531
3532   //=========================================
3533   // screws fixing the board on the U tube
3534   Double_t aaa = fgkCarlosSuppY3; // ???
3535   //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3536   Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3537   Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) - 
3538                        bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3539   Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) + 
3540                        bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3541
3542   TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];   
3543
3544   TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3545                               fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3546                               screw1y,screw1z, CarlosSuppRot);
3547
3548   TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3549                               fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3550                               screw1z,screw1y, CarlosSuppRot);
3551
3552   TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3553                               fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3554                               screw1y,screw1z, CarlosSuppRot);
3555
3556   TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3557                               fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3558                               screw1z,screw1y, CarlosSuppRot);
3559
3560   assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3561   assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3562   assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3563   assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3564
3565   //=========================================
3566   // board
3567   Double_t p1[3], p2[3], vX[3] = {1,0,0};
3568   AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3569   card1.SetNLayers(2);
3570   card1.SetLayer(0, fgkCarlosCardCuY, copper,     kOrange); // index, thickness, material, color
3571   card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY,   glassFiber, 30);
3572   card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3573   p1[0] = -fgkCarlosCardX1/2;
3574   p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3575   p1[2] = fgkCarlosCardShift;
3576   p2[0] = fgkCarlosCardX1/2;
3577   p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3578   p2[2] = fgkCarlosCardShift;
3579   card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3580   card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3581   card1.CreateAndInsertBoxCableSegment(1,90);
3582
3583   AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3584   card2.SetNLayers(2);
3585   card2.SetLayer(0, fgkCarlosCardCuY, copper,     kOrange); // index, thickness, material, color
3586   card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY,   glassFiber, 30);
3587   card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3588
3589   p1[0] = -fgkCarlosCardX1/2;
3590   p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3591   p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3592
3593   p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3594   p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3595   p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3596   card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3597   card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3598   card2.CreateAndInsertBoxCableSegment(1,90);
3599
3600   //=========================================
3601   // some chips on the board 
3602
3603   AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3604   u1.SetNLayers(2);
3605   u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3606   u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3607   u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3608
3609   p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3610   p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3611   p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3612
3613   p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3614   p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3615   p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3616   u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3617   u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3618   u1.CreateAndInsertBoxCableSegment(1,90);
3619
3620   //---
3621   AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3622   u2.SetNLayers(2);
3623   u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3624   u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3625   u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3626
3627   p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3628   p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3629   p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3630
3631   p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3632   p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3633   p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3634   u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3635   u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3636   u2.CreateAndInsertBoxCableSegment(1,90);
3637
3638   //---
3639   AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3640   u3.SetNLayers(2);
3641   u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3642   u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3643   u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3644
3645   Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3646   p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3647   p1[1] = u3Y;
3648   p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3649
3650   p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3651   p2[1] = u3Y;
3652   p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3653   u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3654   u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3655   TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3656
3657   //--- U4 is like U3 (?)
3658   TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3659   u4Trans->RotateX(90);
3660   u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3661                           fgkCarlosCardShift + fgkCarlosU4posZ);
3662   assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3663                                                  
3664   //---
3665   AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3666   u17.SetNLayers(2);
3667   u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3668   u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3669   u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3670
3671   p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3672   p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3673   p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3674
3675   p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3676   p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3677   p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3678   u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3679   u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3680   u17.CreateAndInsertBoxCableSegment(1,90);
3681
3682   //---
3683   AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3684   u35.SetNLayers(2);
3685   u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3686   u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3687   u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3688
3689   p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3690   p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3691   p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3692
3693   p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3694   p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3695   p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3696   u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3697   u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3698   u35.CreateAndInsertBoxCableSegment(1,90);
3699
3700   //---
3701   AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3702   u36.SetNLayers(2);
3703   u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3704   u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3705   u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3706
3707   p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3708   p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3709   p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3710
3711   p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3712   p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3713   p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3714   u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3715   u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3716   u36.CreateAndInsertBoxCableSegment(1,90);
3717
3718   //--- QZ1
3719   AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3720   qz1.SetNLayers(2);
3721   qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3722   qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3723   qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3724
3725   p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3726   p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3727   p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3728
3729   p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3730   p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3731   p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3732   qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3733   qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3734   qz1.CreateAndInsertBoxCableSegment(1,90);
3735
3736   return assemblySupCarlos;
3737 }
3738
3739 //________________________________________________________________________
3740 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3741   // 
3742   // Creates the assemblies containing the LV cards (left and right)
3743   //
3744
3745   TGeoMedium *glassFiber  = GetMedium("SDD SI CHIP$");// glassFiber   TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3746   TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3747   TGeoMedium *plastiChip  = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3748   TGeoMedium *copper      = GetMedium("COPPER$"); 
3749   TGeoMedium *alCu12SDD   = GetMedium("INOX$"); // ITSsddAlCu12,  to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3750   TGeoMedium *stainless   = GetMedium("INOX$"); // for screws, what is the material ???????????
3751
3752   fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3753   fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3754
3755   // we are going to use flat cable class to create multilayer box,
3756   // then we can use the pointers to created volumes to place them elsewhere  
3757   Double_t p1[3], p2[3], vX[3] = {1,0,0};
3758
3759   Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3760   AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3761   cardLV.SetNLayers(2);
3762   cardLV.SetLayer(0, fgkLVcardCuZ, copper,     30); // index, thickness, material, color
3763   cardLV.SetLayer(1, fgkLVcardZ,   glassFiber, 30);
3764   cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3765   p1[0] = 0;
3766   p1[1] = fgkLVcardY/2;
3767   p1[2] = 0;
3768   p2[0] = fgkLVcardX;
3769   p2[1] = fgkLVcardY/2;
3770   p2[2] = 0;
3771   cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3772   cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3773   TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3774   TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3775   TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3776   fCardLVR->AddNode(boxVol, 1, trCard);
3777
3778   Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3779   AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3780   chipO.SetNLayers(2);
3781   chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3782   chipO.SetLayer(1, fgkLVChip0Z,   plastiChip, 12);
3783   chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3784   p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3785   p1[1] = fgkLVChip0PosY;
3786   p1[2] = carLVfullThick/2 + chip0fullThick/2;
3787
3788   p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3789   p2[1] = fgkLVChip0PosY;
3790   p2[2] = carLVfullThick/2 + chip0fullThick/2;
3791   chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3792   chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3793   boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3794   trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3795                                fgkLVChip0PosY,
3796                                carLVfullThick/2+chip0fullThick/2, rotAdd);
3797   fCardLVR->AddNode(boxVol, 1, trCard);
3798
3799   // put also this chip on the other side of the card
3800   trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3801                                fgkLVChip0PosY,
3802                                -carLVfullThick/2-chip0fullThick/2, rotAdd);
3803   fCardLVL->AddNode(boxVol, 2, trCard);
3804   trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3805                                fgkLVChip0PosY,
3806                                -carLVfullThick/2-chip0fullThick/2, rotAdd);
3807   fCardLVR->AddNode(boxVol, 2, trCard);
3808
3809   Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3810   AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3811   chip1.SetNLayers(2);
3812   chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3813   chip1.SetLayer(1, fgkLVChip1Z,   plastiChip, 12);
3814   chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3815   p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3816   p1[1] = fgkLVChip1PosY;
3817   p1[2] = carLVfullThick/2 + chip1fullThick/2;
3818
3819   p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3820   p2[1] = fgkLVChip1PosY;
3821   p2[2] = carLVfullThick/2 + chip1fullThick/2;
3822   chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3823   chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3824   boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3825   trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3826                                fgkLVChip1PosY,
3827                                carLVfullThick/2 + chip1fullThick/2, rotAdd);
3828   fCardLVR->AddNode(boxVol, 1, trCard);
3829
3830   Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3831   AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3832   chip2.SetNLayers(2);
3833   chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3834   chip2.SetLayer(1, fgkLVChip2Z,   plastiChip, 12);
3835   chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3836   p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3837   p1[1] = fgkLVChip2PosY;
3838   p1[2] = carLVfullThick/2 + chip2fullThick/2;
3839   p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3840   p2[1] = fgkLVChip2PosY;
3841   p2[2] = carLVfullThick/2 + chip2fullThick/2;
3842   chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3843   chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3844   boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3845   trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3846                                fgkLVChip2PosY,
3847                                carLVfullThick/2 + chip2fullThick/2, rotAdd);
3848   fCardLVR->AddNode(boxVol, 1, trCard);
3849
3850   Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3851   AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3852   chip3.SetNLayers(2);
3853   chip3.SetLayer(0, fgkLVChip3Z,   plastiChip, 12);
3854   chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3855   chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3856   p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3857   p1[1] = fgkLVChip3PosY;
3858   p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3859   p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3860   p2[1] = fgkLVChip3PosY;
3861   p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3862   chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3863   chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3864   boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3865   trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3866                                fgkLVChip3PosY,
3867                                -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3868   fCardLVR->AddNode(boxVol, 1, trCard);
3869
3870   // the Al pieces for heat exchange :
3871   TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3872                            fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3873
3874   TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3875                                         (fgkLVcoolX1/2+fgkLVcoolX2),
3876                                         fgkLVcoolPosY+fgkLVcoolY1/2,
3877                           carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3878   TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3879                                          (fgkLVcoolX1/2+fgkLVcoolX2),
3880                                          fgkLVcoolPosY+fgkLVcoolY1/2,
3881                           -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3882
3883   TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3884                                              alCu12SDD);
3885   vAlLVcooling1->SetLineColor(2);
3886
3887   //--
3888   TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3889                                  fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3890   TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3891                                                         (fgkLVcoolX2/2),
3892                                         fgkLVcoolPosY+fgkLVcoolY1/2,
3893                      carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3894   TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3895                                                          (fgkLVcoolX2/2),
3896                                         fgkLVcoolPosY+fgkLVcoolY1/2,
3897                    -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3898
3899   TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3900                                              alCu12SDD);
3901   vAlLVcooling2->SetLineColor(2);
3902
3903   //--
3904   Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3905                           +fgkLVcoolZ1*2.);
3906   TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3907                            fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3908   TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3909                                                         (-fgkLVcoolX3/2),
3910                                         fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3911                                         0);
3912   TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3913   vAlLVcooling3->SetLineColor(2);
3914
3915   //=== screw fixing th LV card to the U cooling tube :
3916   TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3917                                        fgkLVcoolY3/2);
3918   TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3919                                             littleScrew, stainless);
3920   TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3921
3922   TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3923                                                rotScrew);
3924   vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3925
3926   TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3927                                            0, fgkLittleLVScrewHeadR,
3928                                            fgkLittleScrewHeadH/2);
3929   TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3930                                                 littleScrewHead, stainless);
3931   vLittleScrewHead->SetLineColor(kGray);
3932   TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3933                                                      fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3934                                                      fgkShiftLittleScrewLV,
3935                                                      rotScrew);
3936   fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3937
3938   TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3939                                                      fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3940                                                      fgkShiftLittleScrewLV,
3941                                                      rotScrew);
3942   fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3943
3944   // adding the cooling pieces to the left card
3945   fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3946   fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3947   fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3948   fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3949   fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3950
3951   TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3952                                          -(fgkLVcoolX1/2+fgkLVcoolX2),
3953                                          fgkLVcoolPosY+fgkLVcoolY1/2,
3954                                      carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3955   TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3956                                           -(fgkLVcoolX1/2+fgkLVcoolX2),
3957                                           fgkLVcoolPosY+fgkLVcoolY1/2,
3958                                      -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3959   TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3960                                                          -(fgkLVcoolX2/2),
3961                                          fgkLVcoolPosY+fgkLVcoolY1/2,
3962                      carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3963   TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3964                                                           -(fgkLVcoolX2/2),
3965                                         fgkLVcoolPosY+fgkLVcoolY1/2,
3966                    -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3967
3968   TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3969                                         fgkLVcoolX3/2,
3970                                         fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3971                                         0);
3972   // and to the right card
3973   fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3974   fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3975   fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3976   fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3977   fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3978
3979   return kTRUE;
3980 }
3981
3982 //________________________________________________________________________
3983 TGeoVolumeAssembly*  AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3984   // 
3985   // return an assembly containing the HV card
3986   //
3987   iLay = iLay;
3988
3989   TGeoMedium *ceramic          = GetMedium("CERAMICS$"); // ceramicHVcard
3990   TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$");      //    TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3991   TGeoMedium *medSMDcapaEnd    = GetMedium("SDD X7R capacitors$");      // SDDX7RcapacitorsSDD   TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3992   TGeoMedium *stainless        = GetMedium("INOX$");       // ITSspdStainlesSteal ???????????
3993   TGeoMedium *plastic          = GetMedium("SDDKAPTON (POLYCH2)$");  // ITS_ITSsddKAPTON_POLYCH2 ???????????
3994   TGeoMedium *alCu12SDD       = GetMedium("INOX$"); // ITSsddAlCu12  : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3995
3996   TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3997
3998   //====================================
3999   //--- the card itself
4000   TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
4001                                        fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
4002   TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
4003   vCeramicCard->SetLineColor(38);// or 9 blue slightly dark 
4004
4005   highVCard->AddNode(vCeramicCard, 1, 0);
4006
4007
4008   //====================================
4009   //--- capacitors
4010
4011   // capa1
4012   TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
4013                                        fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
4014   TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
4015                                             medSMDcapaMiddle);
4016
4017   TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
4018                                     fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
4019   TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
4020                                          medSMDcapaEnd);
4021   vCapa1End->SetLineColor(18);// grey silver
4022   TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
4023                                      (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4024   TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
4025                                      -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4026
4027   TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
4028                                     fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
4029                                     -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4030
4031   TGeoVolumeAssembly *capa1  = new TGeoVolumeAssembly("cardHVCapa1");
4032   capa1->AddNode(vCapa1Middle, 1,0);
4033   capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4034   capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4035
4036   highVCard->AddNode(capa1, 1, capa1PosTr);
4037
4038   // capa2
4039   TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4040                                        fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4041   TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4042                                             medSMDcapaMiddle);
4043
4044   TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4045                                     fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4046   TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4047                                          medSMDcapaEnd);
4048   vCapa2End->SetLineColor(18);// grey silver
4049   TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4050                                      (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4051   TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4052                                      -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4053
4054   TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4055                                     fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4056                                     -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4057
4058   TGeoVolumeAssembly *capa2  = new TGeoVolumeAssembly("cardHVCapa2");
4059   capa2->AddNode(vCapa2Middle, 1,0);
4060   capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4061   capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4062
4063   highVCard->AddNode(capa2, 1, capa2PosTr);
4064
4065   // capa3
4066   TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4067                                        fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4068   TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4069                                             medSMDcapaMiddle);
4070
4071   TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4072                                     fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4073   TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4074                                          medSMDcapaEnd);
4075   vCapa3End->SetLineColor(18);// grey silver
4076
4077   TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4078                                  (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4079   TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4080                                  -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4081
4082   TGeoVolumeAssembly *capa3  = new TGeoVolumeAssembly("cardHVCapa3");
4083   capa3->AddNode(vCapa3Middle, 1,0);
4084   capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4085   capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4086
4087   TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4088                                     fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4089                                     -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4090
4091   TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4092                                     fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4093                                     -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4094
4095   TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4096                                     fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4097                                     -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4098
4099   TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4100                                     fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4101                                     -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4102
4103   TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4104                                     fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4105                                     -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4106
4107   highVCard->AddNode(capa3, 1, capa3PosTr1);
4108   highVCard->AddNode(capa3, 2, capa3PosTr2);
4109   highVCard->AddNode(capa3, 3, capa3PosTr3);
4110   highVCard->AddNode(capa3, 4, capa3PosTr4);
4111   highVCard->AddNode(capa3, 5, capa3PosTr5);
4112
4113   //====================================
4114   //--- connexions to LV card
4115
4116   Double_t fgkConnexLVHVdiam1 =  0.8*fgkmm;
4117   Double_t fgkConnexLVHVdiam2 =  2*fgkmm;
4118   Double_t fgkConnexLVHVlen   =  6.2*fgkmm;
4119   Double_t fgkConnexLVHVx     =  3*fgkmm;
4120   Double_t fgkConnexLVHVy1    =  8*fgkmm;
4121   Double_t fgkConnexLVHVdy    =  2.5*fgkmm;
4122
4123   TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4124                                   fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4125   TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4126                                              fgkConnexLVHVdiam1/2,
4127                                              fgkConnexLVHVdiam2/2,
4128                                              fgkConnexLVHVlen/2);
4129   TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4130                                                 connexLVHVmetal, stainless);
4131   TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4132                                                 connexLVHVplastic, plastic);
4133   vConnexLVHVmetal->SetLineColor(10);// white
4134   vConnexLVHVplast->SetLineColor(12);  // dark grey
4135
4136   TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4137   connexion->AddNode(vConnexLVHVmetal, 1, 0);
4138   connexion->AddNode(vConnexLVHVplast, 1, 0);
4139
4140   TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4141                                        -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4142   TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4143                                        -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4144
4145   TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4146                                         fgkConnexLVHVy1+fgkConnexLVHVdy,
4147                                        -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4148   TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4149                                         fgkConnexLVHVy1+fgkConnexLVHVdy,
4150                                        -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4151
4152   TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4153                                         fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4154                                        -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4155   TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4156                                         fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4157                                        -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4158
4159   TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4160                                         fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4161                                        -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4162   TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4163                                         fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4164                                        -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4165
4166   highVCard->AddNode(connexion, 1, trConnexion1);
4167   highVCard->AddNode(connexion, 2, trConnexion2);
4168   highVCard->AddNode(connexion, 3, trConnexion3);
4169   highVCard->AddNode(connexion, 4, trConnexion4);
4170   highVCard->AddNode(connexion, 5, trConnexion5);
4171   highVCard->AddNode(connexion, 6, trConnexion6);
4172   highVCard->AddNode(connexion, 7, trConnexion7);
4173   highVCard->AddNode(connexion, 8, trConnexion8);
4174
4175   //====================================
4176   //--- cooling pieces
4177
4178   TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4179                                        fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4180
4181
4182   TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4183                                        fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4184
4185   TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4186                                        fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4187
4188   TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4189                                             alCu12SDD);
4190   TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4191                                             alCu12SDD);
4192   TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4193                                             alCu12SDD);
4194   // This last volume contains the screw used for fixing
4195   // the card to the cooling tube ...
4196   TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4197                                          fgkHVCardCool3Y/2);
4198   TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4199                                               littleScrewHV, stainless);
4200
4201   TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4202   vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4203
4204   vCardHVcool1->SetLineColor(2); //red
4205   vCardHVcool2->SetLineColor(2); //red
4206   vCardHVcool3->SetLineColor(2); //red
4207
4208   TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4209                                              fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4210                                              -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4211                                              fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4212   TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4213                                             -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4214                                              -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4215                                              fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4216
4217   highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4218   highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4219
4220   TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4221                                   fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4222                                              -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4223                                              fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4224
4225   TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4226                                  -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4227                                              -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4228                                              fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4229
4230   highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4231   highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4232
4233   TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4234                  fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4235                                              -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4236                                  fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4237
4238   TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4239                 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4240                                              -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4241                                  fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4242
4243   highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4244   highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4245
4246   //====================================
4247   //--- screws
4248   TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4249                  fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4250                                  -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4251                                  fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4252                                                     rotScrewHead);
4253   TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4254                 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4255                                  -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4256                                  fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4257                                                     rotScrewHead);
4258
4259   highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4260   highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4261
4262   return highVCard;
4263 }
4264
4265
4266 //________________________________________________________________________
4267 TGeoVolumeAssembly*  AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4268 // 
4269 // return an assembly containing the LV, HV and Carlos cards of one ladder
4270 // and their cooling system 
4271 //
4272
4273   TGeoMedium *alCu12SDD       = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4274   TGeoMedium *phynoxSDD       = GetMedium("INOX$");
4275   TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4276
4277   TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4278
4279   //=*********************************
4280   //--- The rounded pipe for the end ladder card coooling
4281
4282   Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4283   Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4284   Int_t    nCards = 3;
4285
4286   if (iLay==4) {
4287     endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4288     endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4289     nCards = 4;
4290   }
4291
4292   AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4293   endLadderPipe.SetNLayers(2); 
4294   endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4295   endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4296
4297   Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4298   // of the U colling pipe in its center
4299
4300   Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4301   Double_t vectA[3]  = {0,0,1};
4302
4303   Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4304   Double_t vectB[3]  = {0,0,1};
4305
4306   Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4307   Double_t vectC[3]  = {1,0,0};
4308
4309   Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4310   Double_t vectD[3]  = {-1,0,0};
4311
4312   Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4313   Double_t vectE[3]  = {0,0,-1};
4314
4315   Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4316   Double_t vectF[3]  = {0,0,-1};
4317
4318   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4319   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4320   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4321   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4322   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4323   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4324
4325   endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4326   //endLadderPipe.CreateAndInsertCableSegment( 1);
4327   endLadderPipe.CreateAndInsertTubeSegment( 1);
4328   //endLadderPipe.CreateAndInsertCableSegment( 2);
4329   endLadderPipe.CreateAndInsertTorusSegment( 2);
4330   //endLadderPipe.CreateAndInsertCableSegment( 3);
4331   endLadderPipe.CreateAndInsertTubeSegment( 3);
4332   //endLadderPipe.CreateAndInsertCableSegment( 4);
4333   endLadderPipe.CreateAndInsertTorusSegment( 4);
4334   //endLadderPipe.CreateAndInsertCableSegment( 5);
4335   endLadderPipe.CreateAndInsertTubeSegment( 5);
4336
4337   TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4338                                          fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4339   TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4340                                     fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4341
4342   TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4343                                                             - fgkEndLadPipeArmBoxDX,
4344                                                              fgkEndLadPipeArmBoxDY,0);
4345   TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4346                                                             fgkEndLadPipeArmBoxDX,
4347                                                             fgkEndLadPipeArmBoxDY,0);
4348   endLadPipeArmBoxDY1->RegisterYourself();
4349   endLadPipeArmBoxDY2->RegisterYourself();
4350
4351   if(GetDebug(3)) { // Remove compiler warning.
4352     endLadPipeArmBox->InspectShape();
4353     endLadPipeArmTube->InspectShape();
4354   }
4355
4356   TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4357                                            "endLadPipeArmBox:endLadPipeArmBoxDY1"
4358                                            "- endLadPipeArmTube");
4359   TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4360                                            "endLadPipeArmBox:endLadPipeArmBoxDY2"
4361                                            "- endLadPipeArmTube");
4362
4363   TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4364                                                endLadPipeArm1, alCu12SDD);
4365   TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4366                                                endLadPipeArm2, alCu12SDD);
4367   vEndLadPipeArm1->SetLineColor(2);
4368   vEndLadPipeArm2->SetLineColor(2);
4369
4370   Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4371                    +fgkEndLadPipeArmZpos);
4372
4373   TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4374                                           -fgkEndLadPipeUwidth/2,0,armZ);
4375   TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4376                                            fgkEndLadPipeUwidth/2,0,armZ);
4377
4378   endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4379   endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4380
4381   //=*********************************
4382   //--- LV cards
4383   TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4384   TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4385
4386   Double_t spaceBetweenCards = 0.2*fgkmm; 
4387
4388   Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4389                            +fgkEndLadPipeArmBoxDX);
4390   Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4391                            +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4392
4393   Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4394                           +fgkLVcoolZ1*2.);
4395
4396   Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4397                           +coolUzPos+1.25*fgkmm;
4398   // Position in z of the first LVB with respect to the start of the cooling
4399   // rectangular arm, coming  (from inside of the ladder)
4400   // The cards are added one after the other
4401
4402   for (Int_t iCard=0; iCard<nCards; iCard++) {
4403
4404     Double_t cardLVzShift = firstLVCardZ + 
4405       Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4406
4407     TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4408                                              cardLVyShift, cardLVzShift);
4409     TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4410                                              cardLVyShift, cardLVzShift);
4411
4412     endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4413     endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4414   }
4415
4416   //=*********************************
4417   //--- HV cards
4418   TGeoVolumeAssembly *cardHV = fCardHV;
4419
4420   Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y 
4421                        + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4422
4423   Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4424                                 -(fgkHVCardCeramZ)/2); 
4425
4426   for (Int_t iCard=0; iCard<nCards; iCard++) {
4427
4428     Double_t fact = iCard*2.+1.;
4429     Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4430                          + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4431     TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4432     endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4433   }
4434
4435   //=*********************************
4436   //--- Carlos card
4437
4438   TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4439 //   TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4440 //                                               0, -fgkCarlosSuppAngle, 0);
4441
4442   Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4443   Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4444                                fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4445   // position in z of the first Carlos board, coming  from inside of the ladder
4446
4447   Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 + 
4448                            fgkEndLadPipeArmBoxDY);
4449
4450   for (Int_t iCard=0; iCard<nCards; iCard++) {
4451
4452     Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4453                             iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4454     TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4455                                                    (TGeoRotation*) fCommonTr[0]);
4456
4457     endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4458   }
4459
4460   return endLadderCards;
4461 }
4462
4463
4464 //________________________________________________________________________
4465 TGeoVolume*  AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4466 // 
4467 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4468 // and their cooling system 
4469 // This is the code actually used for the end ladder cards
4470 //
4471
4472   TGeoMedium *alCu12SDD       = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4473   TGeoMedium *phynoxSDD       = GetMedium("INOX$");
4474   TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4475   TGeoMedium *copper          = GetMedium("COPPER$");
4476   TGeoMedium *plastic         = GetMedium("SDDKAPTON (POLYCH2)$");  // ???
4477   TGeoMedium *airSDD          = GetMedium("SDD AIR$");
4478   TGeoMedium *opticalFiber    = GetMedium("SDD OPTICFIB$");
4479   TGeoMedium *polyurethane    = GetMedium("POLYURETHANE$");
4480
4481   Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4482   Double_t endLadPipeArmZ    = fgkEndLadPipeArmZLay3;
4483   Int_t    nCards = 3;
4484   Double_t rREF   = fgkEndLaddCardsShortRadiusLay3;
4485   Double_t deltaZcables = 0;
4486   // reference radius corresponding to local y=0
4487
4488   if (iLay==4) {
4489     endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4490     endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4491     nCards = 4;
4492     rREF = fgkEndLaddCardsShortRadiusLay4;
4493     deltaZcables = 2.8*fgkmm;
4494   }
4495
4496   Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4497                            +fgkEndLadPipeArmBoxDX);
4498   Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4499                            +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4500
4501   Double_t rMin   = rREF + cardLVyShift;
4502   // (The LV card is defining rMin because it is the lower object)
4503
4504   Double_t thickTotCable = 0.5;
4505
4506   //==================================
4507   //--- The Pcon container
4508
4509   // minimum angle of the Pcon :
4510   Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4511                      (rREF-fgkEndLadPipeArmY/2) );
4512   Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4513   Double_t phi0 = 90-dphi/2;
4514   Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4515                                                         // of the U colling pipe in its center
4516   Double_t zMax = endLadPipeUlength+coolUzPos;
4517   Double_t rMax = rMin + fgkLVcardY;
4518   rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4519   Double_t cablesRadius  = rMax-0.5;
4520
4521   TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4522    //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4523   // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4524   containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4525   containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4526   containerShape->DefineSection(2,  fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4527   containerShape->DefineSection(3,  endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4528   containerShape->DefineSection(4,  endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4529   containerShape->DefineSection(5,  zMax, rREF-1.*fgkmm, rMax);
4530   // the following is quite dirty but works for the moment ...
4531   containerShape->DefineSection(6,  zMax,  rREF+fgkCarlosCardZ1/2, rMax);
4532   containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4533
4534   // The next parameters define the shape of the Pcon at its end and where cables
4535   // are escaping...
4536   Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4537   Double_t cableSectionR2 = rMax;
4538   Double_t cableSectionZ1 = zMax + 23.6*fgkmm + 3.0*fgkcm + deltaZcables;
4539   Double_t cableSectionZ2 = zMax + 23.6*fgkmm + 4.0*fgkcm + deltaZcables;
4540   // Those numbers are to be fixed to stick the maximum to the SDD cone
4541   // (hardcoded numbers are ugly, but it's easier to find where to stop)
4542
4543   containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4544   containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4545
4546   TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4547   //endLadderCards->SetVisibility(kFALSE);
4548
4549   //=*********************************
4550   //--- The rounded pipe for the end ladder card cooling
4551
4552   AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4553   endLadderPipe.SetNLayers(2); 
4554   endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4555   endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4556
4557   Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4558   Double_t vectA[3]  = {0,0,1};
4559
4560   Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4561   Double_t vectB[3]  = {0,0,1};
4562
4563   Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4564   Double_t vectC[3]  = {1,0,0};
4565
4566   Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4567   Double_t vectD[3]  = {-1,0,0};
4568
4569   Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4570   Double_t vectE[3]  = {0,0,-1};
4571
4572   Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4573   Double_t vectF[3]  = {0,0,-1};
4574
4575   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4576   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4577   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4578   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4579   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4580   endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4581
4582   endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4583   //endLadderPipe.CreateAndInsertCableSegment( 1);
4584   endLadderPipe.CreateAndInsertTubeSegment( 1);
4585   //endLadderPipe.CreateAndInsertCableSegment( 2);
4586   endLadderPipe.CreateAndInsertTorusSegment( 2);
4587   //endLadderPipe.CreateAndInsertCableSegment( 3);
4588   endLadderPipe.CreateAndInsertTubeSegment( 3);
4589   //endLadderPipe.CreateAndInsertCableSegment( 4);
4590   endLadderPipe.CreateAndInsertTorusSegment( 4);
4591   //endLadderPipe.CreateAndInsertCableSegment( 5);
4592   endLadderPipe.CreateAndInsertTubeSegment( 5);
4593
4594   TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4595                                          fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4596   TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4597                                     fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4598
4599   TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4600                                                             - fgkEndLadPipeArmBoxDX,
4601                                                              fgkEndLadPipeArmBoxDY,0);
4602   TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4603                                                             fgkEndLadPipeArmBoxDX,
4604                                                             fgkEndLadPipeArmBoxDY,0);
4605   endLadPipeArmBoxDY1->RegisterYourself();
4606   endLadPipeArmBoxDY2->RegisterYourself();
4607
4608   if(GetDebug(3)) { // Remove compiler warning.
4609     endLadPipeArmBox->InspectShape();
4610     endLadPipeArmTube->InspectShape();
4611   }
4612
4613   TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4614                                            "endLadPipeArmBox:endLadPipeArmBoxDY1"
4615                                            "- endLadPipeArmTube");
4616   TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4617                                            "endLadPipeArmBox:endLadPipeArmBoxDY2"
4618                                            "- endLadPipeArmTube");
4619
4620   TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4621                                                endLadPipeArm1, alCu12SDD);
4622   TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4623                                                endLadPipeArm2, alCu12SDD);
4624   vEndLadPipeArm1->SetLineColor(2);
4625   vEndLadPipeArm2->SetLineColor(2);
4626
4627   Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4628                    +fgkEndLadPipeArmZpos);
4629
4630   TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4631                                           -fgkEndLadPipeUwidth/2,rREF,armZ);
4632   TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4633                                            fgkEndLadPipeUwidth/2,rREF,armZ);
4634
4635   endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4636   endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4637
4638   //=*********************************
4639   //--- LV cards
4640   TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4641   TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4642
4643   Double_t spaceBetweenCards = 0.2*fgkmm; 
4644
4645
4646   Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4647                           +fgkLVcoolZ1*2.);
4648
4649   Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4650                           +coolUzPos+1.25*fgkmm;
4651   // Position in z of the first LVB with respect to the start of the cooling
4652   // rectangular arm, coming  (from inside of the ladder)
4653   // The cards are added one after the other
4654
4655   for (Int_t iCard=0; iCard<nCards; iCard++) {
4656
4657     Double_t cardLVzShift = firstLVCardZ + 
4658       Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4659
4660     TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4661                                              cardLVyShift+rREF, cardLVzShift);
4662     TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4663                                              cardLVyShift+rREF, cardLVzShift);
4664
4665     endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4666     endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4667   }
4668
4669   //=*********************************
4670   //--- HV cards
4671   TGeoVolumeAssembly *cardHV = fCardHV;
4672
4673   Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4674                        + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4675   // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4676
4677   Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4678                                 -(fgkHVCardCeramZ)/2); 
4679
4680   for (Int_t iCard=0; iCard<nCards; iCard++) {
4681
4682     Double_t fact = iCard*2.+1.;
4683     Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4684                          + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4685     TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4686     endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4687   }
4688
4689   //=*********************************
4690   //--- Carlos card
4691
4692   TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4693 //   TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4694 //                                               0, -fgkCarlosSuppAngle, 0);
4695
4696   Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4697   Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4698                                fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4699   // position in z of the first Carlos board, coming  from inside of the ladder
4700
4701   Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 + 
4702                            fgkEndLadPipeArmBoxDY);
4703
4704   for (Int_t iCard=0; iCard<nCards; iCard++) {
4705
4706     Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4707                             iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4708     TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4709                                                    (TGeoRotation*) fCommonTr[0]);
4710
4711     endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4712   }
4713
4714
4715   //=*********************************
4716   //--- Cables
4717
4718
4719   Double_t sectionV   = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4720                          + fgkSectionGlassPerMod)*nCards
4721                          + fgkSectionCoolPolyuEL + fgkSectionCoolWaterEL;
4722   // We fix thickness, then width is calculated accordingly
4723   Double_t width      = sectionV/thickTotCable;
4724   Double_t thickCu    = thickTotCable*fgkSectionCuPerMod
4725             / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4726   Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4727             / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4728   Double_t thickGlass = thickTotCable*fgkSectionGlassPerMod
4729             / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4730
4731   Double_t thickCoolPolyu = thickTotCable*fgkSectionCoolPolyuEL
4732             / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4733   Double_t thickCoolWater = thickTotCable*fgkSectionCoolWaterEL
4734             / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4735
4736   AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4737   cable.SetNLayers(5);
4738   cable.SetLayer(0, thickCu, copper, kRed);
4739   cable.SetLayer(1, thickPlast, plastic, kYellow);
4740   cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4741   cable.SetLayer(3, thickCoolPolyu, polyurethane, kGray);
4742   cable.SetLayer(4, thickCoolWater, coolerMediumSDD, kBlue);
4743
4744   Double_t zVect[3]={0,0,1};
4745   Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4746                        +spaceBetweenCarlsoCards)/2 + 2.9;
4747   // the 2.9cm is for taking into account carlos card angle...
4748
4749   Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4750                                 cableSectionR2,cableSectionZ1,cableSectionZ2);
4751
4752   Double_t pos1[3] = {0, cablesRadius, xMinCable};
4753   Double_t pos2[3] = {0, cablesRadius, zEndCable};
4754   cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4755   cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4756   cable.SetInitialNode(endLadderCards);
4757   cable.CreateAndInsertCableSegment(1);
4758
4759   // The earth cable
4760   TGeoTorus *earthShape = new TGeoTorus(rMax-fgkEndLadderEarthCableR,
4761                                         0., fgkEndLadderEarthCableR,
4762                                         phi0, dphi); // same as containerShape
4763
4764   TGeoVolume *earthCable = new TGeoVolume("SDDcableEndLadderEarthCable",
4765                                           earthShape, copper);
4766
4767   endLadderCards->AddNode(earthCable, 1,
4768                         new TGeoTranslation(0, 0, fgkDistEndLaddCardsLadd+1));
4769
4770   return endLadderCards;
4771 }
4772
4773 //________________________________________________________________________
4774 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4775 //
4776 // return an assembly of the support rings, attaching the ladders to the cone 
4777 //
4778
4779
4780   iLay = iLay;
4781
4782   TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4783   TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4784  
4785
4786   //**********************************
4787   // ruby cage
4788
4789   Double_t fgkRubyCageX          = 9*fgkmm;
4790   Double_t fgkRubyCageY          = 5.5*fgkmm;
4791   Double_t fgkRubyCageZ          = 8*fgkmm;
4792   Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4793   Double_t fgkRubyCageHoleDX     = 2.*fgkmm;
4794   Double_t fgkRubyCageVIntern    = 5.42*fgkmm;
4795   Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4796   Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4797
4798   TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4799                                        fgkRubyCageZ/2);
4800
4801   Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4802
4803   // pieces common to both square and V cages
4804   TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4805                                     fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4806
4807   TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4808                                      fgkRubyCageHoleDX/2+epsilon);
4809
4810   TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4811   TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4812                                     fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4813                                    -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4814   trScrewHole->RegisterYourself();
4815
4816   TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4817                                 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4818   TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4819                                          fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4820                                         -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4821   trScrewHoleFoot->RegisterYourself();
4822
4823
4824   // pieces which differ
4825   Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4826
4827   TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4828                                      fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4829
4830   TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4831                          fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4832   trRubyCageVInternBox->RegisterYourself();
4833
4834   TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4835                                      fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4836                                                   fgkRubyCageInternSide/4);
4837
4838   TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4839         fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4840                                                                 +epsilon,0,0, rotV );
4841   trRubyCageVInternTriangl->RegisterYourself();
4842
4843   //---
4844   TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4845                                            "rubyCageBox-(rubyCageInternBox"
4846                                  "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4847
4848   TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4849                                                rubyCageSquare, stainless);
4850   vRubyCageSquare->SetLineColor(10);
4851   
4852   TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4853                                  "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4854                                  "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4855                                  "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4856   TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4857   vRubyCageV->SetLineColor(10);
4858
4859   if(GetDebug(3)) { // Remove compiler warning.
4860     rubyCageBox->InspectShape();
4861     rubyCageInternBox->InspectShape();
4862     screwHole->InspectShape();
4863     screwHoleFoot->InspectShape();
4864     rubyCageVInternBox->InspectShape();
4865     rubyCageVInternTriangl->InspectShape();
4866   }
4867
4868   supportRing->AddNode(vRubyCageSquare, 0, 0);
4869   //supportRing->AddNode(vRubyCageV, 0, 0);
4870   return supportRing;
4871 }
4872
4873
4874
4875 //________________________________________________________________________
4876 void AliITSv11GeometrySDD::CreateSDDsensor() {
4877 //
4878 // return a box containing the SDD sensor
4879 //
4880
4881   TGeoMedium *airSDD         = GetMedium("SDD AIR$");
4882   TGeoMedium *siliconSDD     = GetMedium("SDD SI insensitive$");  // ITSsddSi
4883   TGeoMedium *siliconSDDsens = GetMedium("SI$");                  // ITSsddSi
4884   TGeoMedium *alSDD          = GetMedium("AL$");                  // ITSal
4885   TGeoMedium *polyhamideSDD  = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4886   TGeoMedium *glassSDD       = GetMedium("SDD SI insensitive$");  //  To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4887
4888
4889   Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4890   Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4891   // width : in the beam direction !
4892
4893   Double_t sensoxBoxLength = ( fgkWaferLength +
4894                                2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4895   // Makes life easier to include the space for the WA HV cable on both sides 
4896   Double_t sensoxBoxThick = fgkWaferThickness +
4897                             2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4898
4899 //   cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4900 //   cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4901
4902   TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4903                       fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4904
4905   fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4906   fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4907
4908
4909   //****************************
4910   // silicon wafer
4911   //****************************
4912   if (fAddSensors) {
4913     // we need 2 different sensor objects, because they have to have different names
4914     // This is required for the step manager
4915
4916     TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4917                                fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4918
4919
4920     TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4921     wafer3->SetLineColor(fColorSilicon);
4922     TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4923                         fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4924     TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4925     sensVol3->SetLineColor(fColorSilicon+5);
4926     wafer3->AddNode(sensVol3, 1, 0);
4927     fSDDsensor3->AddNode(wafer3, 1, 0);
4928
4929     TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4930     wafer4->SetLineColor(fColorSilicon);
4931     TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4932                         fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4933     TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4934     sensVol4->SetLineColor(fColorSilicon+5);
4935     wafer4->AddNode(sensVol4, 1, 0);
4936     fSDDsensor4->AddNode(wafer4, 1, 0);
4937   };
4938   
4939   //****************************
4940   // glass
4941   //****************************
4942   TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4943                                  fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4944   TGeoVolume *vGlass  = new  TGeoVolume("ITSsddGlass",glass, glassSDD);
4945   vGlass->SetLineColor(fColorGlass);
4946   TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4947                                   fgkWaferThickness/2+fgkSensorGlassLY/2,
4948                                   fgkGlassDZOnSensor);
4949   TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4950                                   fgkWaferThickness/2+fgkSensorGlassLY/2,
4951                                   fgkGlassDZOnSensor);
4952   TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4953                                   fgkWaferThickness/2+fgkSensorGlassLY/2,
4954                                   -fgkGlassDZOnSensor);
4955   TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4956                                   fgkWaferThickness/2+fgkSensorGlassLY/2,
4957                                   -fgkGlassDZOnSensor);
4958   fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4959   fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4960   fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4961   fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4962
4963   fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4964   fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4965   fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4966   fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4967
4968   //****************************
4969   // Wrap-around cable
4970   //****************************
4971   if (fAddHVcables) {
4972   AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4973                                       fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4974   waHVCable.SetNLayers(2);
4975   waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4976   waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4977   waHVCable.SetInitialNode(fSDDsensor3);
4978
4979   Double_t x1[3], x2[3], vX[3] = {1,0,0};
4980   x1[0] = -fgkWaHVcableLength/2;
4981   x2[0] = -x1[0];
4982   x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4983   x2[1] = x1[1];
4984   x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4985   x2[2] = x1[2];
4986
4987   waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4988   waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4989   TGeoCombiTrans *ctSegment = 0;
4990   TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4991   fSDDsensor4->AddNode(segment, 1, ctSegment);
4992
4993   x1[1] = -x1[1];
4994   x2[1] = x1[1];
4995   waHVCable.SetName("ITSsddWaHVCableD");
4996   waHVCable.ResetPoints();
4997   waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4998   waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4999   segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
5000   fSDDsensor4->AddNode(segment, 1, ctSegment);
5001
5002   AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
5003                                            rWraping);
5004   waHVCableFold.SetPhi(180,360);
5005   waHVCableFold.SetNLayers(2);
5006   waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
5007                          polyhamideSDD, fColorPolyhamide);
5008   waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
5009   waHVCableFold.SetInitialNode(fSDDsensor3);
5010   x1[1] = 0;
5011   x2[1] = 0;
5012   x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
5013   x2[2] = x1[2];
5014   waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5015   waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5016   segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
5017   fSDDsensor4->AddNode(segment, 1, ctSegment);
5018
5019
5020   //****************************
5021   // transition cable
5022   //****************************
5023   Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
5024                          fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
5025                         /(2.*fgkTransitHVHeadLZ);
5026   Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
5027                                 headRadius-fgkTransitHVHeadLZ)
5028                    *TMath::RadToDeg();
5029
5030   TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
5031                                           fgkTransitHVPolyThick/2,
5032                                           90-theta,90+theta);
5033   headPoly->SetName("headPoly");
5034   TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
5035                                     -fgkTransitHVPolyThick/2);
5036   headPolyTr->SetName("headPolyTr");
5037   headPolyTr->RegisterYourself();
5038
5039   TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
5040                                         fgkTransitHVAlThick/2,
5041                                         90-theta,90+theta);
5042   headAl->SetName("headAl");
5043   TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
5044                                   -fgkTransitHVPolyThick
5045                                   -fgkTransitHVAlThick/2);
5046   headAlTr->SetName("headAlTr");
5047   headAlTr->RegisterYourself();
5048
5049   TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
5050                                  (headRadius-fgkTransitHVHeadLZ)/2,
5051                        (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
5052   cache->SetName("cache");
5053
5054   TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5055                                 (headRadius-fgkTransitHVHeadLZ)/2,
5056                                  -(fgkTransitHVPolyThick
5057                                    +fgkTransitHVAlThick)/2);
5058   headCacheTr->SetName("cacheTr");
5059   headCacheTr->RegisterYourself();
5060
5061   TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5062                       "headPoly:headPolyTr-cache:cacheTr");
5063   TGeoVolume *vHeadPolyComp = new TGeoVolume(
5064               "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5065   vHeadPolyComp->SetLineColor(fColorPolyhamide);
5066   TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5067                                        "headAl:headAlTr-cache:cacheTr");
5068   TGeoVolume *vHeadAlComp = new TGeoVolume(
5069               "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5070   vHeadAlComp->SetLineColor(fColorAl);
5071
5072
5073 //   TGeoRotation rotHead("",0,90,0);
5074 //   TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5075 //                -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5076 //                                               &rotHead);
5077   TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5078   TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5079                   -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5080                                                  rotHead);
5081
5082   fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5083   fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5084   fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5085   fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5086
5087   //---
5088   AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5089                                         fgkTransitHVBondingLZ,
5090                             fgkTransitHVPolyThick+fgkTransitHVAlThick);
5091   transitHVCable.SetNLayers(2);
5092   transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5093                           fColorPolyhamide);
5094   transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5095   transitHVCable.SetInitialNode(fSDDsensor3);
5096
5097   x1[0] = -fgkTransitHVHeadLX/2;
5098   x2[0] = -x1[0];
5099   x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5100   x2[1] = x1[1];
5101   x1[2] = 0;
5102   x2[2] = 0;
5103   transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5104   transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5105   segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5106   fSDDsensor4->AddNode(segment, 1, ctSegment);
5107
5108   transitHVCable.ResetPoints();
5109   transitHVCable.SetName("ITSsddHVtransitTail");
5110   transitHVCable.SetWidth(fgkTransitHVtailWidth);
5111   x1[0] = fgkTransitHVtailXpos;
5112   x2[0] = fgkTransitHVtailXpos;
5113   x1[2] = -fgkTransitHVBondingLZ/2;
5114   x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5115   Double_t vZ[3] = {0,0,1};
5116   transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5117   transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5118   segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5119   fSDDsensor4->AddNode(segment, 1, ctSegment);
5120
5121   //---
5122   TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5123   sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5124   sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5125                       fgkTransitHVsideLZ);
5126   sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5127   sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5128   sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5129   sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5130                       fgkTransitHVsideLZ);
5131   sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5132   sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5133
5134   TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5135   sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5136   sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5137                         fgkTransitHVsideLZ);
5138   sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5139   sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5140   sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5141   sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5142                         fgkTransitHVsideLZ);
5143   sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5144   sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5145
5146   // sideRight is not there actually
5147 //   TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5148 //   sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5149 //   sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5150 //                     fgkTransitHVsideLZ);
5151 //   sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5152 //   sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5153 //   sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5154 //   sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5155 //                     fgkTransitHVsideLZ);
5156 //   sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5157 //   sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5158
5159 //   TGeoRotation rotSide("",0,-90,0);
5160 //   TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5161 //                              (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5162 //                              -fgkTransitHVBondingLZ/2,&rotSide);
5163 //   TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5164 //                             (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5165 //                             -fgkTransitHVBondingLZ/2, &rotSide);
5166 //   TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5167 //                fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5168 //                -fgkTransitHVBondingLZ/2, &rotSide);
5169   TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5170 //   TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5171 //                              (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5172 //                              -fgkTransitHVBondingLZ/2,rotSide);
5173   TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5174                                (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5175                                -fgkTransitHVBondingLZ/2, rotSide);
5176   TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5177                   fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5178                   -fgkTransitHVBondingLZ/2, rotSide);
5179
5180   TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5181                                          sideLeft,polyhamideSDD);
5182   vSideLeft->SetLineColor(fColorPolyhamide);
5183   TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5184                                            sideLeftAl,alSDD);
5185   vSideLeftAl->SetLineColor(fColorAl);
5186
5187 //   TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5188 //                                        sideRight,polyhamideSDD);
5189 //   vSideRight->SetLineColor(fColorPolyhamide);
5190
5191   fSDDsensor3->AddNode(vSideLeft,   1, sideLeftTr);
5192   fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5193 //   fSDDsensor3->AddNode(vSideRight,  1, sideRightTr);
5194
5195   fSDDsensor4->AddNode(vSideLeft,   1, sideLeftTr);
5196   fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5197 //   fSDDsensor4->AddNode(vSideRight,  1, sideRightTr);
5198   };
5199
5200   //****************************
5201   if(GetDebug(1)) {
5202     fSDDsensor3->CheckOverlaps(0.01);
5203     fSDDsensor4->CheckOverlaps(0.01);
5204   }
5205
5206   fSDDsensor3->SetVisibility(kFALSE);
5207   fSDDsensor4->SetVisibility(kFALSE);
5208 }
5209
5210 /*
5211 //________________________________________________________________________
5212 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5213   //
5214   // return a box volume containing the detectors
5215   //
5216
5217   TGeoMedium *airSDD = GetMedium("SDD AIR$");
5218
5219   Int_t    nDetectors   = fgkLay3Ndet;
5220   Double_t ladderLength = fgkLay3LadderLength;
5221   Double_t *sensorZPos  = fLay3sensorZPos;
5222   
5223   if (iLay==3) {}
5224   else if (iLay==4) {
5225     nDetectors   = fgkLay4Ndet;
5226     ladderLength = fgkLay4LadderLength;
5227     sensorZPos   = fLay4sensorZPos;
5228   } else {
5229     printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5230   };
5231
5232   char name[30];
5233   Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5234                             2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5235   
5236   sprintf(name,"ITSsddDetBox%i",iLay);
5237   TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5238                          ladderLength*((nDetectors-0.5)/nDetectors)/2);
5239   TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5240  
5241     for (Int_t i=0; i<nDetectors; i++) {
5242         Double_t localZ = sensorZPos[i];
5243         Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5244         if (iLay==3) if (i%2!=0) localY = -localY;
5245         if (iLay==4) if (i%2==0) localY = -localY;
5246         sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5247
5248         if (i >= nDetectors/2) {
5249           TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5250           sensorPos->SetName(name);
5251           virtualDet->AddNode(fSDDsensor, i, sensorPos);
5252         }
5253         else {
5254           TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5255           TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5256                                                  localZ, rotSensor);
5257           sensorPos->SetName(name);
5258           virtualDet->AddNode(fSDDsensor, i, sensorPos);
5259         };
5260     }
5261
5262     if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5263     virtualDet->SetVisibility(kFALSE);
5264     return virtualDet;
5265 }
5266 */
5267
5268 //________________________________________________________________________
5269 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5270 //
5271 // return a box volume containing the detectors
5272 //
5273   
5274   Int_t    nDetectors   = fgkLay3Ndet;
5275   Double_t ladderLength = fgkLay3LadderLength;
5276   Double_t *sensorZPos  = fLay3sensorZPos;
5277   TGeoVolume *sensorSDD = fSDDsensor3;
5278
5279   if (iLay==3) {}
5280   else if (iLay==4) {
5281     nDetectors   = fgkLay4Ndet;
5282     ladderLength = fgkLay4LadderLength;
5283     sensorZPos   = fLay4sensorZPos;
5284     sensorSDD    = fSDDsensor4;
5285   } else {
5286     printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5287   };
5288
5289   char name[30];
5290   sprintf(name,"ITSsddDetBox%i",iLay);
5291   
5292   TGeoVolumeAssembly  *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5293
5294   for (Int_t i=0; i<nDetectors; i++) {
5295     Double_t localZ = sensorZPos[i];
5296     Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5297     if (iLay==3) if (i%2!=0) localY = -localY;
5298     if (iLay==4) if (i%2==0) localY = -localY;
5299     sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5300  
5301     if (i >= nDetectors/2) {
5302       TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5303       sensorPos->SetName(name);
5304       virtualDet->AddNode(sensorSDD, i, sensorPos);
5305     }
5306     else {
5307       TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5308       TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5309                                                      localZ, rotSensor);
5310       sensorPos->SetName(name);
5311       virtualDet->AddNode(sensorSDD, i, sensorPos);
5312     };
5313   }
5314   
5315   if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5316   return virtualDet;
5317 }
5318
5319
5320 //________________________________________________________________________
5321 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssemblyLadd2() {
5322 //
5323 // return a box volume containing the detectors
5324 // Special case for Layer 3 Ladder 2 which is rotated (cannot simply
5325 // rotate the standard volume, because the module numbering would be wrong)
5326 // M.Sitta 25 Nov 2009
5327 //
5328   
5329   Int_t    nDetectors   = fgkLay3Ndet;
5330   Double_t *sensorZPos  = fLay3sensorZPos;
5331   TGeoVolume *sensorSDD = fSDDsensor3;
5332
5333   char name[30];
5334   sprintf(name,"ITSsddDetBoxLadd2");
5335   
5336   TGeoVolumeAssembly  *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5337
5338   for (Int_t i=0; i<nDetectors; i++) {
5339     Double_t localZ = (-1.)*sensorZPos[nDetectors-1-i];
5340     Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5341     if (i%2==0) localY = -localY;
5342     sprintf(name, "ITSsddLayLadd2SensorPos%i", i);
5343  
5344     if (i >= nDetectors/2) {
5345       TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5346       sensorPos->SetName(name);
5347       virtualDet->AddNode(sensorSDD, i, sensorPos);
5348     }
5349     else {
5350       TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5351       TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5352                                                      localZ, rotSensor);
5353       sensorPos->SetName(name);
5354       virtualDet->AddNode(sensorSDD, i, sensorPos);
5355     };
5356   }
5357   
5358   if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5359   return virtualDet;
5360 }
5361
5362
5363 //________________________________________________________________________
5364 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5365                                                  Int_t startMod) {
5366 //
5367 // export the geometry in a AliITSgeom object
5368 // Obsolete
5369 //
5370
5371   if (! geom) {
5372     printf("error:Try to fill null (AliITSgeom *) object");
5373     return kFALSE;
5374   };
5375   if (! fMotherVol) {
5376     printf("error:Try to set sensor geometry while geometry is not defined\n");
5377     return kFALSE;
5378   };
5379
5380   const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5381                             fgkWaferLengthSens/2.};
5382   if(!(geom->IsShapeDefined(kSDD)))
5383     geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5384
5385   char layerName[30];
5386   char ladderName[30];
5387   char sensorName[30];
5388   char senstivName[30];
5389   const Int_t kNLay = 2;
5390   const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5391   const Int_t kNDet[kNLay]  = {fgkLay3Ndet,  fgkLay4Ndet};
5392
5393   if (GetDebug(1))
5394     printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5395
5396   Int_t firstSDDmod = startMod;
5397   for (Int_t iLay=0; iLay<kNLay; iLay++) {
5398     /////////////////////////////////////////
5399     sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5400     TGeoNode *layNode = fMotherVol->GetNode(layerName);
5401     if (layNode) {
5402       if (GetDebug(1)) printf("%s\n",layNode->GetName());
5403       TGeoVolume *layVolume = layNode->GetVolume();
5404       TGeoHMatrix layMatrix(*layNode->GetMatrix());
5405
5406       for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5407         /////////////////////////////////////////
5408         sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5409         TGeoNode *laddNode = layVolume->GetNode(ladderName);
5410         if (laddNode) {
5411           if (GetDebug(1)) printf("|   %s\n",laddNode->GetName());
5412           TGeoVolume *laddVolume = laddNode->GetVolume();
5413           TGeoHMatrix laddMatrix(layMatrix);
5414           laddMatrix.Multiply(laddNode->GetMatrix());
5415
5416           for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5417             /////////////////////////////////////////
5418             sprintf(sensorName, "ITSsddSensor_%i",iDet);
5419             TGeoNode *detNode = laddVolume->GetNode(sensorName);
5420             if (detNode) {
5421               if (GetDebug(1)) printf("|   |   %s\n",detNode->GetName());
5422               TGeoVolume *detVolume = detNode->GetVolume();
5423               TGeoHMatrix detMatrix(laddMatrix);
5424               detMatrix.Multiply(detNode->GetMatrix());
5425
5426               TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5427               if (wafNode) {
5428                 TGeoVolume *wafVolume = wafNode->GetVolume();
5429                 TGeoHMatrix wafMatrix(detMatrix);
5430                 detMatrix.Multiply(wafNode->GetMatrix());
5431                 //--------------------------------------------------------
5432                 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5433                 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5434               if (sensitivNode) {
5435                 TGeoHMatrix sensMatrix(wafMatrix);
5436                 sensMatrix.Multiply(sensitivNode->GetMatrix());
5437
5438                 // Sticking to the convention for local wafer coordinate
5439                 // in AliITSgeom :
5440                 if (iDet >= kNDet[iLay]/2) {
5441                   //              TGeoRotation rotY("",0,180,0);
5442                   TGeoRotation rotY("",-180,-180,0);
5443                   sensMatrix.Multiply(&rotY);
5444                 };
5445                 // Creating the matrix in AliITSgeom for
5446                 // this sensitive volume :
5447                 Double_t *trans = sensMatrix.GetTranslation();
5448                 Double_t *r     = sensMatrix.GetRotationMatrix();
5449                 Double_t rot[10] = {r[0],r[1],r[2],
5450                                     r[3],r[4],r[5],
5451                                     r[6],r[7],r[8], 1.0};
5452                 //rot[9]!=0.0 => not a unity matrix
5453                 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5454                                   kSDD,trans,rot);
5455                 // iLadd+1, iDet+1 because ladd. and det. start at +1
5456                 // elsewhere
5457                 startMod++;
5458
5459               } else
5460                 printf("Error (ExportSensorGeometry) %s not found !\n",
5461                        senstivName);
5462               } else
5463                 printf("Error (ExportSensorGeometry) %s not found !\n",
5464                        "ITSsddWafer_1");
5465             } else
5466               printf("Error (ExportSensorGeometry) %s not found !\n",
5467                      sensorName);
5468           };
5469         } else 
5470           printf("Error (ExportSensorGeometry) %s not found !\n",
5471                  ladderName);
5472       };  
5473     } else
5474       printf("Error (ExportSensorGeometry) %s not found !\n",
5475              layerName);
5476   };
5477
5478   return (startMod-firstSDDmod);
5479 }
5480
5481
5482 //________________________________________________________________________
5483 Int_t AliITSv11GeometrySDD::
5484 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5485 //
5486 // Function which gives the layer, ladder and det.
5487 // index of the current volume. To be used in
5488 // AliITS::StepManager()
5489   //
5490
5491   if (gGeoManager->GetLevel()<3) return kFALSE;
5492   // Get the det index :
5493   TGeoNode *node = gGeoManager->GetMother(2);
5494   if (!node) return kFALSE;
5495   det = node->GetNumber()+1;
5496
5497   // Get the ladder index :
5498   node = gGeoManager->GetMother(3);
5499   if (!node) return kFALSE;
5500   ladd = node->GetNumber()+1;
5501
5502  // Get the layer index :
5503   if (node->GetNdaughters()==fgkLay3Ndet)
5504     lay = 3;            // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5505   else lay = 4;
5506
5507   return kTRUE;
5508 }
5509
5510
5511 //________________________________________________________________________
5512 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5513                                                        Double_t r2max, Double_t z2,
5514                                                        Double_t section, Int_t nDiv)
5515 {
5516   // Creates a cone along z where the section is approximately constant
5517   // with z. This is for simulation of cables, because a cone with a constant
5518   // radius difference would show a quantity of matter increasing with z...
5519   // The max radius of the created Pcon is evolving linearly, the min radius
5520   // is calculated at several steps (nDiv).
5521   // z2 > z1 (required by the Pcon)
5522
5523   TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5524   
5525   Double_t dr = (r2max-r1max)/nDiv;
5526   Double_t dz = (z2-z1)/nDiv;
5527   Double_t r1minI, r2minI, r1maxI, r2maxI;
5528   Double_t z1I, z2I;
5529
5530   Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5531   Double_t cosAlpha = (z2-z1)/lZ;
5532
5533   r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5534   myPcon->DefineSection(0, z1, r1minI, r1max);
5535
5536   for (Int_t i=0; i<nDiv; i++) {
5537     
5538     z1I = z1 + i*dz;
5539     z2I = z1I + dz;
5540     r1maxI = r1max + i*dr;
5541     r2maxI = r1maxI + dr;
5542
5543     r2minI =  TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5544     myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5545   }
5546   return myPcon;
5547 }
5548
5549
5550 //________________________________________________________________________
5551 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2, 
5552                                         Double_t refZ1, Double_t refZ2) {
5553   // just a helping function
5554   return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5555 }
5556
5557 //________________________________________________________________________
5558 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5559                                                         Int_t nLay3, Int_t nLay4,
5560                                                         Double_t r1, Double_t z1,
5561                                                         Double_t r2, Double_t z2) {
5562   
5563   // Create some cables portions from SDD modules grouped
5564   // and attached at the border of the SSD cone
5565
5566   TGeoMedium *copper     = GetMedium("COPPER$");
5567   TGeoMedium *plastic    = GetMedium("SDDKAPTON (POLYCH2)$");
5568   TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5569
5570   char titleCable[30];
5571   sprintf(titleCable,"cableSDDport%i",(Int_t)angle);
5572
5573   //---
5574   Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5575   Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5576   Double_t width     = section/thickness;
5577   Double_t thickCu   = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5578                                                      +fgkSectionGlassPerMod);
5579
5580   Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5581                                                          +fgkSectionGlassPerMod);
5582
5583   Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5584                                                          +fgkSectionGlassPerMod);
5585
5586   Double_t hypothenus   = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5587   Double_t cosAlpha     = (z2-z1)/hypothenus;
5588   Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5589   Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5590   angle *= TMath::DegToRad();
5591   Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5592   Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5593   Double_t pos1[3] = {x1,y1,z1};
5594   Double_t pos2[3] = {x2,y2,z2};
5595   Double_t zVect[3] = {0,0,1};
5596
5597   AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5598   cable.SetNLayers(3);
5599   cable.SetLayer(0, thickPlast, plastic, kYellow);
5600   cable.SetLayer(1, thickCu, copper, kRed);
5601   cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5602
5603   cable.AddCheckPoint( mother, 0, pos1, zVect );
5604   cable.AddCheckPoint( mother, 1, pos2, zVect );
5605   cable.SetInitialNode(mother);
5606   cable.CreateAndInsertCableSegment(1);
5607
5608   return kTRUE;
5609 }
5610
5611
5612
5613 //________________________________________________________________________
5614 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth)
5615 {
5616 //
5617 // Creates and inserts the SDD cables running on SDD and SSD cones
5618 //
5619 // Input:
5620 //         moth : the TGeoVolume owing the volume structure
5621 // Output:
5622 //
5623 // Created:         ???       Ludovic Gaudichet
5624 // Updated:      15 Mar 2008  Mario Sitta
5625 // Updated:      14 Apr 2008  Mario Sitta            Overlap fixes
5626 // Updated:      09 May 2008  Mario Sitta            SSD overlap fixes
5627 //
5628
5629   TGeoMedium *copper       = GetMedium("COPPER$");
5630   TGeoMedium *plastic      = GetMedium("SDDKAPTON (POLYCH2)$");
5631   TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5632   TGeoMedium *airSDD       = GetMedium("SDD AIR$");
5633
5634
5635   //==================================
5636   //  
5637   //==================================
5638
5639   Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5640   Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5641
5642   Double_t sectionLay3Cu      = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5643   Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5644   Double_t sectionLay3Glass   = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5645
5646   Double_t sectionLay4Cu      = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5647   Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5648   Double_t sectionLay4Glass   = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5649
5650   // Do not use hardcoded numbers, get them from real shapes - M.S. 15/03/08
5651   TGeoVolume *sddCone = gGeoManager->GetVolume("SDDCarbonFiberCone");
5652   TGeoPcon *sddConeShape = (TGeoPcon*)sddCone->GetShape();
5653
5654   TGeoVolume *sddCylinder = gGeoManager->GetVolume("SDDCarbonFiberCylinder");
5655   TGeoTube *sddCylinderShape = (TGeoTube*)sddCylinder->GetShape();
5656
5657   // (were fgkConeSDDr1, fgkConeSDDr2, fgkConeSDDz1, fgkConeSDDz2 hardcoded)
5658   Double_t coneSDDr1 = sddConeShape->GetRmin(5);
5659   Double_t coneSDDr2 = sddConeShape->GetRmin(3);
5660
5661   Double_t coneSDDz1 = sddConeShape->GetZ(9) - sddConeShape->GetZ(5) +
5662                        sddCylinderShape->GetDz();
5663   Double_t coneSDDz2 = sddConeShape->GetZ(9) - sddConeShape->GetZ(3) +
5664                        sddCylinderShape->GetDz();
5665
5666   // Calculate z1, z2 thanks to R1 and R2
5667   Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, coneSDDr1, coneSDDr2,
5668                                                 coneSDDz1, coneSDDz2);
5669   Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, coneSDDr1, coneSDDr2,
5670                                                 coneSDDz1, coneSDDz2);
5671   Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, coneSDDr1, coneSDDr2,
5672                                                 coneSDDz1, coneSDDz2);
5673
5674   TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5675
5676   //==================================
5677   //  first set of cones : cables from layer 3
5678   //==================================
5679
5680   TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5681                                               fgkSDDCableR2, sddCableZ2,
5682                   sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5683
5684   TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5685   pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0),
5686                                                pcon1all->GetRmax(0));
5687
5688   Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5689   pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax,
5690                                                pcon1all->GetRmax(1));
5691
5692   TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container",
5693                                                pcon1container, airSDD);
5694   vpcon1container->SetVisibility(kFALSE);
5695
5696   TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5697                                                 fgkSDDCableR2, sddCableZ2,
5698                                                 sectionLay3Plastic, 3);
5699
5700   TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast",
5701                                            pcon1plast, plastic);
5702   vpcon1plast->SetLineColor(kYellow);
5703   vpcon1container->AddNode(vpcon1plast, 0);
5704
5705   Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5706   TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5707                                              fgkSDDCableR2 - dr1a, sddCableZ2,
5708                                              sectionLay3Cu, 3);
5709
5710   TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu",
5711                                         pcon1Cu, copper);
5712   vpcon1Cu->SetLineColor(kRed);
5713   vpcon1container->AddNode(vpcon1Cu, 0);
5714
5715   Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5716   TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5717                                                 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5718                                                 sectionLay3Glass, 3);
5719
5720   TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass",
5721                                            pcon1glass, opticalFiber);
5722   vpcon1glass->SetLineColor(kGreen);
5723   vpcon1container->AddNode(vpcon1glass, 0);
5724
5725   moth->AddNode(vpcon1container, 1);
5726   moth->AddNode(vpcon1container, 2, rotCableSDD);
5727
5728   //==================================
5729   //  2nd set of cones : cables from layer 3 and layer 4
5730   //==================================
5731
5732   TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5733                                               fgkSDDCableR3, sddCableZ3,
5734                                       sectionLay3Plastic+sectionLay4Plastic+
5735                                       sectionLay3Cu+sectionLay4Cu+
5736                                       sectionLay3Glass+sectionLay4Glass, 1);
5737
5738   TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5739   pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0),
5740                                                pcon2all->GetRmax(0));
5741
5742   drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5743   pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax,
5744                                                pcon2all->GetRmax(1));
5745
5746
5747   TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container",
5748                                                pcon2container, airSDD);
5749   vpcon2container->SetVisibility(kFALSE);
5750
5751   TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5752                                                 fgkSDDCableR3, sddCableZ3,
5753                                                 sectionLay3Plastic+
5754                                                 sectionLay4Plastic, 3);
5755
5756   TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast",
5757                                            pcon2plast, plastic);
5758   vpcon2plast->SetLineColor(kYellow);
5759   vpcon2container->AddNode(vpcon2plast, 0);
5760
5761   Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5762   TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5763                                              fgkSDDCableR3 - dr2a, sddCableZ3,
5764                                              sectionLay3Cu+sectionLay4Cu, 3);
5765
5766   TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu",
5767                                         pcon2Cu, copper);
5768   vpcon2Cu->SetLineColor(kRed);
5769   vpcon2container->AddNode(vpcon2Cu, 0);
5770
5771   Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5772   TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5773                                                 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5774                                                 sectionLay3Glass+
5775                                                 sectionLay4Glass, 3);
5776
5777   TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass",
5778                                            pcon2glass, opticalFiber);
5779   vpcon2glass->SetLineColor(kGreen);
5780   vpcon2container->AddNode(vpcon2glass, 0);
5781
5782   moth->AddNode(vpcon2container, 1);
5783   moth->AddNode(vpcon2container, 2, rotCableSDD);
5784
5785   //==================================
5786   //  intermediate cylinder
5787   //==================================
5788
5789   // (was fgkSDDCableDZint hardcoded)
5790   Double_t sddCableDZint = (sddConeShape->GetZ(9) - sddConeShape->GetZ(0) +
5791                             sddCylinderShape->GetDz()) - sddCableZ3;
5792
5793   TGeoTube *interCyl = new TGeoTube("sddCableInterCyl",
5794                                     pcon2container->GetRmin(1),
5795                                     pcon2container->GetRmax(1),
5796                                     sddCableDZint/2);
5797
5798   TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",
5799                                          interCyl, airSDD);
5800   vInterCyl->SetVisibility(kFALSE);
5801
5802   Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5803   Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast - 
5804                         (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5805
5806   TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5807                                          rmaxCylPlast, sddCableDZint/2);
5808
5809   TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast",
5810                                               interCylPlast, plastic);
5811   vInterCylPlast->SetLineColor(kYellow);
5812   vInterCyl->AddNode(vInterCylPlast, 0);
5813
5814   Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5815   Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu - 
5816                        (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5817
5818   TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5819                                       rmaxCylCu, sddCableDZint/2);
5820
5821   TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu",
5822                                            interCylCu, copper);
5823   vInterCylCu->SetLineColor(kRed);
5824   vInterCyl->AddNode(vInterCylCu, 0);
5825
5826   Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5827   Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass - 
5828                           (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5829
5830   TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5831                                          rmaxCylGlass, sddCableDZint/2);
5832
5833   TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",
5834                                               interCylGlass,opticalFiber);
5835   vInterCylGlass->SetLineColor(kGreen);
5836   vInterCyl->AddNode(vInterCylGlass, 0);
5837
5838   moth->AddNode(vInterCyl, 1, new TGeoTranslation(0, 0,
5839                               sddCableZ3+sddCableDZint/2));
5840   moth->AddNode(vInterCyl, 2, new TGeoTranslation(0, 0,
5841                              -sddCableZ3-sddCableDZint/2));
5842
5843   //==================================
5844   // cable cone on the SSD cone
5845   //==================================
5846
5847   Double_t sddCableR4 = rmaxCylPlast;
5848   Double_t sddCableZ4 = sddCableZ3 + sddCableDZint;
5849
5850   TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5851                                               fgkSDDCableR5, fgkSDDCableZ5,
5852                                               sectionLay3Plastic+
5853                                               sectionLay4Plastic+
5854                                               sectionLay3Cu+sectionLay4Cu+
5855                                               sectionLay3Glass+sectionLay4Glass, 1);
5856
5857   TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5858   pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0),
5859                                                pcon3all->GetRmax(0));
5860
5861   drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5862   pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax,
5863                                                pcon3all->GetRmax(1));
5864
5865
5866   TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container",
5867                                                pcon3container, airSDD);
5868   vpcon3container->SetVisibility(kFALSE);
5869
5870   TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5871                                                 fgkSDDCableR5, fgkSDDCableZ5,
5872                                                 sectionLay3Plastic+
5873                                                 sectionLay4Plastic, 3);
5874
5875   TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast",
5876                                            pcon3plast, plastic);
5877   vpcon3plast->SetLineColor(kYellow);
5878   vpcon3container->AddNode(vpcon3plast, 0);
5879
5880   Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5881   TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5882                                              fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5883                                              sectionLay3Cu+sectionLay4Cu, 3);
5884
5885   TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu",
5886                                         pcon3Cu, copper);
5887   vpcon3Cu->SetLineColor(kRed);
5888   vpcon3container->AddNode(vpcon3Cu, 0);
5889
5890   Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5891   TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5892                                                 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5893                                                 sectionLay3Glass+sectionLay4Glass, 3);
5894
5895   TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass",
5896                                            pcon3glass,opticalFiber);
5897   vpcon3glass->SetLineColor(kGreen);
5898   vpcon3container->AddNode(vpcon3glass, 0);
5899
5900   moth->AddNode(vpcon3container, 1);
5901   moth->AddNode(vpcon3container, 2, rotCableSDD);
5902
5903   //==================================
5904   // cables that are grouped at the end of SSD cones
5905   //==================================
5906
5907 //  Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
5908 //  Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
5909   Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
5910   Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
5911
5912   TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5913
5914   // Add some hardcoded shifts to avoid overlaps with SSD pathc panels
5915   CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
5916                               fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5917
5918   CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
5919                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5920
5921   CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5922                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5923
5924   CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5925                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5926
5927   CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
5928                               fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5929
5930   CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
5931                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5932
5933   CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5934                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5935
5936   CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5937                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5938
5939   CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
5940                               fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5941
5942   CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
5943                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5944
5945   CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
5946                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5947
5948   CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
5949                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5950
5951   CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
5952                               fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5953
5954   moth->AddNode(endConeSDDCable, 1, 0);
5955
5956   TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5957   reflect->ReflectZ(kTRUE);
5958   moth->AddNode(endConeSDDCable, 2, reflect);
5959
5960
5961   return;
5962 }