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