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