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