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