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