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