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