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