1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 //*************************************************************************
19 // SDD geometry, based on ROOT geometrical modeler
22 // This geometry has no dependence with aliroot, you can run it with root
23 // only, provided that the AliITSv11GeomCable classes are also compiled
25 // Ludovic Gaudichet gaudichet@to.infn.it
26 //*************************************************************************
32 // General Root includes
35 // Root Geometry includes
36 #include <TGeoManager.h>
37 #include <TGeoVolume.h>
42 #include <TGeoCompositeShape.h>
43 #include <TGeoMatrix.h>
46 #include <TGeoTorus.h>
48 #include "AliITSgeom.h"
49 #include "AliITSgeomSDD.h"
50 #include "AliITSv11GeometrySDD.h"
51 #include "AliITSv11GeomCableFlat.h"
52 #include "AliITSv11GeomCableRound.h"
54 const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName3 = "ITSsddSensitivL3";
55 const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName4 = "ITSsddSensitivL4";
56 const Double_t AliITSv11GeometrySDD::fgkSegmentLength = 37.2*2*fgkmm;
57 const Double_t AliITSv11GeometrySDD::fgkLadderWidth = 50.0*fgkmm;
58 const Double_t AliITSv11GeometrySDD::fgkLadderHeight = 30.0*fgkmm;
59 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDW = 3.5*fgkmm;
60 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH = 3.*fgkmm;
62 const Double_t AliITSv11GeometrySDD::fgkLadderBeamRadius = 0.6*fgkmm;
63 const Double_t AliITSv11GeometrySDD::fgkLadderLa = 3.*fgkmm;
64 const Double_t AliITSv11GeometrySDD::fgkLadderHa = 0.721979*fgkmm;
65 const Double_t AliITSv11GeometrySDD::fgkLadderLb = 3.7*fgkmm;
66 const Double_t AliITSv11GeometrySDD::fgkLadderHb = 0.890428*fgkmm;
67 const Double_t AliITSv11GeometrySDD::fgkLadderl = 0.25*fgkmm;
69 const Double_t AliITSv11GeometrySDD::fgkBottomBeamAngle = 56.5;
70 const Double_t AliITSv11GeometrySDD::fgkBeamSidePhi = 65;
72 const Double_t AliITSv11GeometrySDD::fgkLadWaferSep = 2*fgkmm;
73 const Double_t AliITSv11GeometrySDD::fgkPinSuppWidth = 2.5*fgkmm;
74 const Double_t AliITSv11GeometrySDD::fgkPinSuppHeight = 2.*fgkmm;
75 const Double_t AliITSv11GeometrySDD::fgkPinSuppRmax = 2.5/2.*fgkmm;
76 const Double_t AliITSv11GeometrySDD::fgkPinR = 1.5/2.*fgkmm;
77 const Double_t AliITSv11GeometrySDD::fgkPinSuppLength = 5.*fgkmm;
78 const Double_t AliITSv11GeometrySDD::fgkPinSuppThickness = 0.5*fgkmm;
79 const Double_t AliITSv11GeometrySDD::fgkPinSuppConeAngle = 4;
80 const Double_t AliITSv11GeometrySDD::fgkPinDXminOnSensor = (39./2.)*fgkmm;
81 const Double_t AliITSv11GeometrySDD::fgkPinPinDDXOnSensor = 3*fgkmm;
82 const Double_t AliITSv11GeometrySDD::fgkPinDYOnSensor = (52.5/2.)*fgkmm;
84 // parameters from ALR-0752/3
85 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHeight = 3.2*fgkmm;
86 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppMaxLength = 14*fgkmm;
87 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthExt = 0.4*fgkmm;
88 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthIn = 0.65*fgkmm;
89 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHoleDiam = 2*fgkmm;
90 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppFulWidth = 5.15*fgkmm;
91 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppTongW = 0.8*fgkmm;
92 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAngle = 22.5;
93 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppSlitL = 4.9*fgkmm;
94 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAxeDist = 3.05*fgkmm;
95 const Double_t AliITSv11GeometrySDD::fgkCoolPipeInnerDiam = 1.84*fgkmm;
96 const Double_t AliITSv11GeometrySDD::fgkCoolPipeOuterDiam = 2.*fgkmm;
98 const Double_t AliITSv11GeometrySDD::fgkBTBthick = 0.25 *fgkmm;
99 const Double_t AliITSv11GeometrySDD::fgkBTBlength = 55. *fgkmm;
100 const Double_t AliITSv11GeometrySDD::fgkBTBwidth = 18*fgkmm;
101 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBottom = 4*fgkmm;
102 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase = 1.2*fgkmm;
103 const Double_t AliITSv11GeometrySDD::fgkRadiusAminBTB = 1. *fgkmm;
104 const Double_t AliITSv11GeometrySDD::fgkRadiusBminBTB = 0.53 *fgkmm;
105 const Double_t AliITSv11GeometrySDD::fgkBTBHoleLength = 15 *fgkmm;
106 const Double_t AliITSv11GeometrySDD::fgkBTBHolewidth = 6 *fgkmm;
107 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefX = 10 *fgkmm;
108 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefY = 6.5 *fgkmm;
110 const Double_t AliITSv11GeometrySDD::fgkLay3Rmin = 145.*fgkmm;
111 const Double_t AliITSv11GeometrySDD::fgkLay3Rmax = 200.*fgkmm;
112 const Double_t AliITSv11GeometrySDD::fgkLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
113 const Double_t AliITSv11GeometrySDD::fgkLay3LadderLength = 524.*fgkmm;
114 const Double_t AliITSv11GeometrySDD::fgkLay3DetShortRadius = 146.0*fgkmm;
115 const Double_t AliITSv11GeometrySDD::fgkLay3DetLongRadius = 152.0*fgkmm;
116 const Double_t AliITSv11GeometrySDD::fgkLay3LaddTopCornerEnd = 15.6*fgkmm;
117 const Int_t AliITSv11GeometrySDD::fgkLay3Ndet = 6;
118 const Int_t AliITSv11GeometrySDD::fgkLay3Nladd = 14;
119 const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH = 7.5*fgkmm;
121 const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 234.8*fgkmm;
122 const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 286.*fgkmm;
123 const Double_t AliITSv11GeometrySDD::fgkLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
124 const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength = 671.*fgkmm;
125 const Double_t AliITSv11GeometrySDD::fgkLay4DetShortRadius = 235.0*fgkmm;
126 const Double_t AliITSv11GeometrySDD::fgkLay4DetLongRadius = 240.5*fgkmm;
127 const Double_t AliITSv11GeometrySDD::fgkLay4LaddTopCornerEnd = 15.6*fgkmm;
128 const Int_t AliITSv11GeometrySDD::fgkLay4Ndet = 8;
129 const Int_t AliITSv11GeometrySDD::fgkLay4Nladd = 22;
130 const Double_t AliITSv11GeometrySDD::fgkLay4CoolPipeSuppH = 7.5*fgkmm;
132 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay3 = fgkLay3DetShortRadius;
133 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay4 = fgkLay4DetShortRadius;
134 const Double_t AliITSv11GeometrySDD::fgkDistEndLaddCardsLadd = 0.*fgkmm;
137 const Double_t AliITSv11GeometrySDD::fgkHybridAngle = 46; // approx !!!
138 // Origine taken at the hybrid corner :
139 const Double_t AliITSv11GeometrySDD::fgkHybridLength = 65*fgkmm;
140 const Double_t AliITSv11GeometrySDD::fgkHybridWidth = 41*fgkmm;
141 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleRad = 1.05*fgkmm;
142 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleZ = 2.5*fgkmm;
143 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleX = fgkHybridWidth-23.599*fgkmm;
145 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleDZ = 9.698*fgkmm;
146 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHolePasDX = 10.754*fgkmm;
147 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleAmbDX = 9.122*fgkmm;
148 // center of ships to the border
149 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ4 = fgkHybridLength-(4.654 )*fgkmm-fgkHybFLlowHoleDZ/2;
150 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ3 = fgkHybridLength-(4.654+15. )*fgkmm-fgkHybFLlowHoleDZ/2;
151 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ2 = fgkHybridLength-(4.654+15.*2)*fgkmm-fgkHybFLlowHoleDZ/2;
152 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ1 = fgkHybridLength-(4.654+15.*3)*fgkmm-fgkHybFLlowHoleDZ/2;
153 const Double_t AliITSv11GeometrySDD::fgkHybFLlowPasX = fgkHybridWidth-32.775*fgkmm;
154 const Double_t AliITSv11GeometrySDD::fgkHybFLlowAmbX = fgkHybridWidth-20.791*fgkmm;
155 const Double_t AliITSv11GeometrySDD::fgkHybChipsDZ = 9.221*fgkmm;
156 const Double_t AliITSv11GeometrySDD::fgkHybPascalDX = 10.245*fgkmm;
157 const Double_t AliITSv11GeometrySDD::fgkHybAmbraDX = 8.51*fgkmm;
158 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperWidth = 15.012*fgkmm;
159 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperLength = 59.878*fgkmm;
160 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAlDZ = 11.183*fgkmm;
161 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAldx = 2.307*fgkmm;
163 const Double_t AliITSv11GeometrySDD::fgkmu = 1*fgkmicron; // 1*fgkmicron; // can be increase for checking thin objects
164 const Double_t AliITSv11GeometrySDD::fgkHybridThBridgeThick = 0.25*fgkmm; // ???
165 const Double_t AliITSv11GeometrySDD::fgkHybAlThick = 30*fgkmu;
166 const Double_t AliITSv11GeometrySDD::fgkHybUpThick = 20*fgkmu;
167 const Double_t AliITSv11GeometrySDD::fgkHybGlueScrnThick = 50*fgkmu; // ??? ?????
168 const Double_t AliITSv11GeometrySDD::fgkHybGlueLowThick = 90*fgkmu;
169 const Double_t AliITSv11GeometrySDD::fgkHybGlueUpThick = 90*fgkmu; // sur ?????
170 const Double_t AliITSv11GeometrySDD::fgkHybAlCCThick = 12*fgkmu;
171 const Double_t AliITSv11GeometrySDD::fgkHybUpCCThick = 12*fgkmu;
172 const Double_t AliITSv11GeometrySDD::fgkHybChipThick = 150*fgkmu;
173 const Double_t AliITSv11GeometrySDD::fgkHybGlueAgThick = 50*fgkmu; // ??? ????
174 const Double_t AliITSv11GeometrySDD::fgkHybUnderNiThick = 20*fgkmu; // ??? ????
175 const Int_t AliITSv11GeometrySDD::fgkNHybSMD = 25;
176 const Double_t AliITSv11GeometrySDD::fgkHybSMDposX[fgkNHybSMD] =
177 {2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,21.40*fgkmm,
178 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
179 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,17.09*fgkmm,21.40*fgkmm,
180 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
181 1.63*fgkmm,5.22*fgkmm,13.59*fgkmm,21.40*fgkmm};
182 const Double_t AliITSv11GeometrySDD::fgkHybSMDposZ[fgkNHybSMD] =
183 { 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm,
184 17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,
185 32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,
186 47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,
187 62.68*fgkmm,62.06*fgkmm,62.06*fgkmm,62.06*fgkmm};
188 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleW = 0.954*fgkmm;
189 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleL = 0.47 *fgkmm;
190 const Double_t AliITSv11GeometrySDD::fgkHybSMDendW = 1.132*fgkmm;
191 const Double_t AliITSv11GeometrySDD::fgkHybSMDendL = 0.925*fgkmm;
192 const Double_t AliITSv11GeometrySDD::fgkHybSMDheight = 400.*fgkmu; // ??? ????!!!!!!!
194 const Double_t AliITSv11GeometrySDD::fgkWaferThickness = 300.*fgkmu;
195 const Double_t AliITSv11GeometrySDD::fgkWaferWidth = 72.5 *fgkmm;
196 const Double_t AliITSv11GeometrySDD::fgkWaferLength = 87.6 *fgkmm;
197 const Double_t AliITSv11GeometrySDD::fgkWaferThickSens = 299.8*fgkmu;
198 const Double_t AliITSv11GeometrySDD::fgkWaferWidthSens = 70.17*fgkmm;
199 // 256 anodes times 294 microns of pitch
200 const Double_t AliITSv11GeometrySDD::fgkWaferLengthSens = 256*294*fgkmicron;
202 const Double_t AliITSv11GeometrySDD::fgkDigitCablWidth = 18.4*fgkmm;
203 const Double_t AliITSv11GeometrySDD::fgkDigitCablAlThick = (30+30*8./10.)*fgkmicron; // will probably change
204 const Double_t AliITSv11GeometrySDD::fgkDigitCablPolyThick = (20+12)*fgkmicron; // will probably change
206 const Double_t AliITSv11GeometrySDD::fgkWaHVcableAlThick = 30*2./10.*fgkmu; // will probably change // Al ratio is random !!!
207 const Double_t AliITSv11GeometrySDD::fgkWaHVcablePolyThick = 175*fgkmu; // will probably change
208 const Double_t AliITSv11GeometrySDD::fgkWaHVcableLength = 67.08*fgkmm;
209 const Double_t AliITSv11GeometrySDD::fgkWaHVcableWitdh = 17.4*fgkmm; // check !!!
210 const Double_t AliITSv11GeometrySDD::fgkWaHVcableDW = 5.24*fgkmm; //5.24*fgkmm;// check !!!
212 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLX = 5. *fgkmm;
213 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLZ = 5. *fgkmm;
214 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLY = 150. *fgkmu;
215 const Double_t AliITSv11GeometrySDD::fgkGlassDXOnSensor = 26.28*fgkmm; // check !!!
216 const Double_t AliITSv11GeometrySDD::fgkGlassDZOnSensor = 22.50*fgkmm; // check !!!
218 const Double_t AliITSv11GeometrySDD::fgkTransitHVAlThick = 30*2./10.*fgkmu; // check // will probably change //Al ratio is random
219 const Double_t AliITSv11GeometrySDD::fgkTransitHVPolyThick = 100*fgkmu; // check // will probably change
220 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLX = 71.46*fgkmm; // check !!!
221 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLZ = 21.3*fgkmm;
222 const Double_t AliITSv11GeometrySDD::fgkTransitHVBondingLZ = 3.6*fgkmm;
223 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailLength = 27*fgkmm; // ???, not yet fixed ...
224 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailWidth = 26*fgkmm;
225 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailXpos = 8*fgkmm; //8*fgkmm // ???, a mesurer !!!
226 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLZ = 10.34*fgkmm;
227 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLeftZ = 4.11*fgkmm;
228 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideRightZ = 3.5*fgkmm; // ???, a mesurer !!!
230 const Double_t AliITSv11GeometrySDD::fgkLongHVcablePolyThick= (20+30+125+30+20+30+125+30+20)*fgkmu; // check // will probably change
231 const Double_t AliITSv11GeometrySDD::fgkLongHVcableAlThick = (30+30*2/10+30)*fgkmu; // check // will probably change
232 const Double_t AliITSv11GeometrySDD::fgkLongHVcableSeparation = 600*fgkmicron;
234 const Double_t AliITSv11GeometrySDD::fgkRubyDX = 14.*fgkmm;
235 const Double_t AliITSv11GeometrySDD::fgkRubyZladd3 = 250*fgkmm;
236 const Double_t AliITSv11GeometrySDD::fgkRubyZladd4 = 325*fgkmm;
238 // the stesalite ladder foot at its end
239 const Double_t AliITSv11GeometrySDD::fgkLadFootX = 60.*fgkmm;
240 const Double_t AliITSv11GeometrySDD::fgkLadFootZ = 20.*fgkmm;
241 const Double_t AliITSv11GeometrySDD::fgkLadFootY = 8.*fgkmm;
242 const Double_t AliITSv11GeometrySDD::fgkLadFootMiddleY = 4.5*fgkmm;
243 const Double_t AliITSv11GeometrySDD::fgkLadBox1X = 23.*fgkmm;
244 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintX = 6.*fgkmm;
245 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintY = 1.*fgkmm;
246 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintBorder = 4.*fgkmm;
247 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleZ = 8.*fgkmm;
248 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleX = 9.*fgkmm;
249 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleY = 6.5*fgkmm;
250 const Double_t AliITSv11GeometrySDD::fgkRubyCageAxisShift = 0.5*fgkmm;
251 const Double_t AliITSv11GeometrySDD::fgkScrewM4diam = 4.*fgkmm;
253 const Double_t AliITSv11GeometrySDD::fgkRubyScrewShiftToCenterY = 0.1;
254 const Double_t AliITSv11GeometrySDD::fgkRubyHoleDiam = 0.5;
256 // the U cooling pipe and its heat exchanger in end-ladder cards system
257 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay3 = 138*fgkmm;
258 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay4 = 150*fgkmm;
259 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUwidth = 59*fgkmm;
260 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeRadius = 5*fgkmm;
261 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeInnerDiam = 2.8*fgkmm;
262 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeOuterDiam = 3.*fgkmm;
263 //--- The al body of the cooling syst.of the heat exchanger :
264 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay3 = 112.*fgkmm; //
265 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay4 = 125.*fgkmm; //
266 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmX = 4.75*fgkmm; // the arms of the U cooling tube
267 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmY = 6.8*fgkmm;
268 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDY = 1.03*fgkmm; // shift in Y of the arms from the axis
269 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDX = 0.125*fgkmm;// shift in X of the arms from the axis
270 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZpos = 8.9*fgkmm; //
273 const Double_t AliITSv11GeometrySDD::fgkLVcardX = 26.525*fgkmm;
274 const Double_t AliITSv11GeometrySDD::fgkLVcardY = 44.95*fgkmm;
275 const Double_t AliITSv11GeometrySDD::fgkLVcardZ = 1.*fgkmm; // all except Cu layer //???
276 const Double_t AliITSv11GeometrySDD::fgkLVcardCuZ = 0.1*fgkmm; //???
278 const Double_t AliITSv11GeometrySDD::fgkLVChip0X = 16.525*fgkmm;
279 const Double_t AliITSv11GeometrySDD::fgkLVChip0Y = 10.8*fgkmm;
280 const Double_t AliITSv11GeometrySDD::fgkLVChip0Z = 3.5*fgkmm; // all except si layer //???
281 const Double_t AliITSv11GeometrySDD::fgkLVChip0SiZ = 0.2*fgkmm; //???????????????????????????????????????????????????
282 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosX = 13.*fgkmm; //19.95*fgkmm; ???
283 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosY = 10.3*fgkmm;
285 const Double_t AliITSv11GeometrySDD::fgkLVChip1X = 6.00*fgkmm;
286 const Double_t AliITSv11GeometrySDD::fgkLVChip1Y = 6.00*fgkmm;
287 const Double_t AliITSv11GeometrySDD::fgkLVChip1Z = 1*fgkmm; // ???
288 const Double_t AliITSv11GeometrySDD::fgkLVChip1SiZ = 0.2*fgkmm; // ???
289 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosX = 18.*fgkmm;
290 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosY = 27.6*fgkmm;
292 const Double_t AliITSv11GeometrySDD::fgkLVChip2X = 6.00*fgkmm;
293 const Double_t AliITSv11GeometrySDD::fgkLVChip2Y = 6.00*fgkmm;
294 const Double_t AliITSv11GeometrySDD::fgkLVChip2Z = 1*fgkmm; // ???
295 const Double_t AliITSv11GeometrySDD::fgkLVChip2SiZ = 0.2*fgkmm; //???
296 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosX = 18.0*fgkmm;
297 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosY = 39.0*fgkmm;
299 const Double_t AliITSv11GeometrySDD::fgkLVChip3X = 4.01*fgkmm;
300 const Double_t AliITSv11GeometrySDD::fgkLVChip3Y = 4.01*fgkmm;
301 const Double_t AliITSv11GeometrySDD::fgkLVChip3Z = 1*fgkmm; // ???
302 const Double_t AliITSv11GeometrySDD::fgkLVChip3SiZ = 0.2*fgkmm;
303 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosX = 20.7*fgkmm;
304 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosY = 21.4*fgkmm;
306 const Double_t AliITSv11GeometrySDD::fgkLVcoolX1 = 17.25*fgkmm;
307 const Double_t AliITSv11GeometrySDD::fgkLVcoolY1 = 8.7*fgkmm;
308 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ1 = 1.*fgkmm;
310 const Double_t AliITSv11GeometrySDD::fgkLVcoolX2 = 3.5*fgkmm;
311 const Double_t AliITSv11GeometrySDD::fgkLVcoolY2 = 8.7*fgkmm;
312 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ2 = 2.3*fgkmm;
314 const Double_t AliITSv11GeometrySDD::fgkLVcoolX3 = 4.75*fgkmm;
315 const Double_t AliITSv11GeometrySDD::fgkLVcoolY3 = 3.1*fgkmm; //+0.1=glue
316 const Double_t AliITSv11GeometrySDD::fgkLVcoolPosY = 6.5*fgkmm;
319 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramX = 54.01*fgkmm;
320 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramY = 40.89*fgkmm;
321 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramZ = 0.7*fgkmm; // ???
323 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1X = 6.8*fgkmm;
324 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Z = 1.*fgkmm; // ???
325 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Ymid = 4.1*fgkmm;
326 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Yend = 0.95*fgkmm; // doesn't take into account the soldering
327 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosX = 13.1*fgkmm;
328 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosY = 14.5*fgkmm;
330 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2X = 6.8*fgkmm;
331 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Z = 1.*fgkmm; // ???
332 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Ymid = 2.9*fgkmm;
333 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Yend = 0.95*fgkmm;
334 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosX = -12.6*fgkmm;
335 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosY = 16.54*fgkmm;
337 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xmid = 3.0*fgkmm;
338 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xend = 0.91*fgkmm;
339 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Z = 2.*fgkmm; // ???
340 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Y = 3.43*fgkmm;
342 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX1 = 14.6*fgkmm;
343 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX2 = 7.2*fgkmm;
344 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX3 = 2.52*fgkmm;
345 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX4 = -4.96*fgkmm;
346 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX5 = -13.82*fgkmm;
347 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY1 = 6.27*fgkmm;
348 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY2 = 0.7*fgkmm;
349 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY3 = 9.1*fgkmm;
351 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1X = 14.*fgkmm;
352 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Y = 9.5*fgkmm;
353 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Z = 2.*fgkmm;
354 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2X = 14.25*fgkmm;
355 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Y = 3.5*fgkmm;
356 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Z = 4.5*fgkmm;
357 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3X = 4.5*fgkmm;
358 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Y = 3.5*fgkmm;
359 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Z = 7.2*fgkmm;
360 const Double_t AliITSv11GeometrySDD::fgkHVCardCoolDY = 6.*fgkmm;
362 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX1 = 19.5*fgkmm;
363 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY1 = 2*fgkmm;
364 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX2 = 35.*fgkmm;
365 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY2 = 3.9*fgkmm;
366 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ = 17.*fgkmm;
367 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppAngle = 45;
368 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX3 = 4.5*fgkmm;
369 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY3 = 3.*fgkmm;
370 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ3 = 12.*fgkmm;
371 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppTopLen = 8.65*fgkmm;
373 // screws fixing boards to the end-ladder on the U tube
374 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadR = 1.85*fgkmm;
375 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadH = 1.5*fgkmm;
376 const Double_t AliITSv11GeometrySDD::fgkLittleScrewR = 0.7*fgkmm;
377 const Double_t AliITSv11GeometrySDD::fgkShiftLittleScrewLV = 3*fgkmm; // ???
378 const Double_t AliITSv11GeometrySDD::fgkLittleLVScrewHeadR = 1.2*fgkmm; // ???
381 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX1 = (25.50+28.50)*fgkmm; // length (first part of Carlos card)
382 const Double_t AliITSv11GeometrySDD::fgkCarlosCardY1 = 1.6*fgkmm; // thickness
383 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ1 = 40.8*fgkmm; // width
384 const Double_t AliITSv11GeometrySDD::fgkCarlosCardCuY = 0.1*fgkmm; // thickness of Cu layer (strips)
385 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX2 = 25.50*fgkmm; // length (2nd part of Carlos card)
386 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ2 = 8.20*fgkmm; // width
388 const Double_t AliITSv11GeometrySDD::fgkCarlosCardChipSiThick = 0.1*fgkmm; // ??? idem for all chips ???
389 const Double_t AliITSv11GeometrySDD::fgkCarlosCardShift = 9*fgkmm; // ??? shift in z w.r.t. heat bridge
391 // size and position of various chips on carlos end-ladder board
392 const Double_t AliITSv11GeometrySDD::fgkCarlosU1X = 13*fgkmm;
393 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Y = 1.68*fgkmm;
394 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Z = 13*fgkmm;
395 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posX = 18.4*fgkmm;
396 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posZ = -7.2*fgkmm;
398 const Double_t AliITSv11GeometrySDD::fgkCarlosU2X = 13.75*fgkmm;
399 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Y = 1.60*fgkmm;
400 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Z = 13.85*fgkmm;
401 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posX = -0.375*fgkmm;
402 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posZ = -9.725*fgkmm;
404 const Double_t AliITSv11GeometrySDD::fgkCarlosU3X = 5*fgkmm;
405 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Y = 1.*fgkmm;
406 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Z = 5*fgkmm;
407 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posX = 6.4*fgkmm;
408 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posZ = 9.9*fgkmm;
411 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posX = -12*fgkmm;
412 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posZ = 3.6*fgkmm;
414 const Double_t AliITSv11GeometrySDD::fgkCarlosU17X = 16*fgkmm;
415 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Y = 3.5*fgkmm;
416 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Z = 10.9*fgkmm;
417 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posX = -17.84*fgkmm;
418 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posZ = -10.95*fgkmm;
420 const Double_t AliITSv11GeometrySDD::fgkCarlosU35X = 4*fgkmm;
421 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Y = 1.*fgkmm;
422 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Z = 4*fgkmm;
423 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posX = -21.6*fgkmm;
424 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posZ = 2.3*fgkmm;
426 const Double_t AliITSv11GeometrySDD::fgkCarlosU36X = 6*fgkmm;
427 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Y = 1.*fgkmm;
428 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Z = 6*fgkmm;
429 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posX = -21.6*fgkmm;
430 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posZ = 9.6*fgkmm;
432 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1X = 8*fgkmm;
433 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Y = 1.7*fgkmm; // look thicker than design number (0.7) ! ???
434 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Z = 3.7*fgkmm;
435 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posX = -12*fgkmm;
436 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posZ = 10.6*fgkmm;
438 // distance from the heat bridge center to the card center :
439 const Double_t AliITSv11GeometrySDD::fgkCarlosCard2HeatBridge = fgkCarlosSuppY2/2+fgkCarlosCardY1/2+fgkCarlosU1Y+0.1*fgkmm;
441 // some pieces at the end of the carbon fiber ladder
442 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay3Len = 467.*fgkmm; // ???
443 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay4Len = 616.*fgkmm; // ???
444 const Double_t AliITSv11GeometrySDD::fgkHVguideX1 = 42.5*fgkmm;
445 const Double_t AliITSv11GeometrySDD::fgkHVguideY1 = 7.*fgkmm;
446 const Double_t AliITSv11GeometrySDD::fgkHVguideZ1 = 10.*fgkmm;
447 const Double_t AliITSv11GeometrySDD::fgkHVguideZ2 = 6.*fgkmm;
448 const Double_t AliITSv11GeometrySDD::fgkHVguideDX = -8.5*fgkmm;
449 const Double_t AliITSv11GeometrySDD::fgkHVguideSuppFullZ = 37.5*fgkmm;
451 // Cooling connector between phynox and plastic cooling water tubes
452 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeRmin = 1 *fgkmm;
453 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR1 = 2.5*fgkmm; // ???
454 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL1 = 3.*fgkmm; // ???
455 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR2 = 3.5*fgkmm; // ???
456 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL2 = 2.*fgkmm; // ???
457 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR3 = 3.*fgkmm; // ???
458 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL3 = 5 *fgkmm; // ???
461 // parameters for coding SDD cables on SDD and SSD cones
462 const Double_t AliITSv11GeometrySDD::fgkSectionCuPerMod = 3*2*0.006 + 3*2*0.0005 + 2*0.002;
463 // copper : LV + signal + HV(HV ???)
464 const Double_t AliITSv11GeometrySDD::fgkSectionPlastPerMod = (TMath::Pi()*(3*0.36*0.36/4 + 3*0.21*0.21/4 + 2*0.115*0.115/4)
465 - fgkSectionCuPerMod);
467 const Double_t AliITSv11GeometrySDD::fgkSectionGlassPerMod = 3*0.006; // ???
468 const Double_t AliITSv11GeometrySDD::fgkSectionCoolPolyuEL = 0.4672;
469 const Double_t AliITSv11GeometrySDD::fgkSectionCoolWaterEL = 0.3496;
470 const Double_t AliITSv11GeometrySDD::fgkEndLadderEarthCableR = 0.5*fgkmm;
471 // (sections are given in cm square)
472 const Double_t AliITSv11GeometrySDD::fgkCableBendRatio = 1.3; // ??? this factor account for the bending of cables
474 const Double_t AliITSv11GeometrySDD::fgkConeSDDr1 = 11.87574*fgkcm;
475 const Double_t AliITSv11GeometrySDD::fgkConeSDDr2 = 26.07574*fgkcm;
476 const Double_t AliITSv11GeometrySDD::fgkConeSDDz1 = 3.36066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
477 const Double_t AliITSv11GeometrySDD::fgkConeSDDz2 = 17.56066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
478 // These last parameters come from cone's code and define the slope
479 // and position of the SDD cone end. For some unknown reason, this doesn't
480 // allow to stick on the SDD cone. This has to be checked when a correct
481 // version of the cone is available ... For now 'm applying some approximative
484 const Double_t AliITSv11GeometrySDD::fgkSDDCableR1 = 16*fgkcm; // ??? // part 1 of "cable cone"
485 const Double_t AliITSv11GeometrySDD::fgkSDDCableR2 = 23*fgkcm; // ??? // part 1/2 of "cable cone"
486 const Double_t AliITSv11GeometrySDD::fgkSDDCableR3 = 26*fgkcm; // ??? // part 2 of "cable cone"
488 const Double_t AliITSv11GeometrySDD::fgkSDDCableDZint = 3.5*fgkcm;
489 const Double_t AliITSv11GeometrySDD::fgkSDDCableR5 = 37*fgkcm; // third part of "cable cone"
490 const Double_t AliITSv11GeometrySDD::fgkSDDCableZ5 = 65*fgkcm; // third part of "cable cone"
498 ClassImp(AliITSv11GeometrySDD)
500 //________________________________________________________________________
501 AliITSv11GeometrySDD::AliITSv11GeometrySDD():
504 fCoolPipeSupportL(0),
505 fCoolPipeSupportR(0),
508 fBaseThermalBridge(0),
525 fAddCoolingSyst(kTRUE),
527 fAddOnlyLadder3min(-1),
528 fAddOnlyLadder3max(-1),
529 fAddOnlyLadder4min(-1),
530 fAddOnlyLadder4max(-1),
531 fColorCarbonFiber(4),
541 fLay3LadderUnderSegDH(0),
542 fLay4LadderUnderSegDH(0),
543 fLay3LaddShortRadius(0),
544 fLay3LaddLongRadius(0),
545 fLay4LaddShortRadius(0),
546 fLay4LaddLongRadius(0)
549 // Standard constructor
555 //________________________________________________________________________
556 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
557 AliITSv11Geometry(debug),
559 fCoolPipeSupportL(0),
560 fCoolPipeSupportR(0),
563 fBaseThermalBridge(0),
580 fAddCoolingSyst(kTRUE),
582 fAddOnlyLadder3min(-1),
583 fAddOnlyLadder3max(-1),
584 fAddOnlyLadder4min(-1),
585 fAddOnlyLadder4max(-1),
586 fColorCarbonFiber(4),
596 fLay3LadderUnderSegDH(0),
597 fLay4LadderUnderSegDH(0),
598 fLay3LaddShortRadius(0),
599 fLay3LaddLongRadius(0),
600 fLay4LaddShortRadius(0),
601 fLay4LaddLongRadius(0)
604 // Constructor setting debugging level
609 //________________________________________________________________________
610 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
611 AliITSv11Geometry(s.GetDebug()),
612 fPinSupport(s.fPinSupport),
613 fCoolPipeSupportL(s.fCoolPipeSupportL),
614 fCoolPipeSupportR(s.fCoolPipeSupportR),
615 fSDDsensor3(s.fSDDsensor3),
616 fSDDsensor4(s.fSDDsensor4),
617 fBaseThermalBridge(s.fBaseThermalBridge),
619 fLadderFoot(s.fLadderFoot),
620 fCardLVR(s.fCardLVR),
621 fCardLVL(s.fCardLVL),
623 fCardCarlos(s.fCardCarlos),
624 fRaccordoL(s.fRaccordoL),
625 fDigitCableLay3A(s.fDigitCableLay3A),
626 fDigitCableLay3B(s.fDigitCableLay3B),
627 fDigitCableLay4A(s.fDigitCableLay4A),
628 fDigitCableLay4B(s.fDigitCableLay4B),
629 fMotherVol(s.fMotherVol),
630 fAddHybrids(s.fAddHybrids),
631 fAddSensors(s.fAddSensors),
632 fAddHVcables(s.fAddHVcables),
633 fAddCables(s.fAddCables),
634 fAddCoolingSyst(s.fAddCoolingSyst),
635 fCoolingOn(s.fCoolingOn),
636 fAddOnlyLadder3min(s.fAddOnlyLadder3min),
637 fAddOnlyLadder3max(s.fAddOnlyLadder3max),
638 fAddOnlyLadder4min(s.fAddOnlyLadder4min),
639 fAddOnlyLadder4max(s.fAddOnlyLadder4max),
640 fColorCarbonFiber(s.fColorCarbonFiber),
641 fColorRyton(s.fColorRyton),
642 fColorPhynox(s.fColorPhynox),
643 fColorSilicon(s.fColorSilicon),
644 fColorAl(s.fColorAl),
645 fColorPolyhamide(s.fColorPolyhamide),
646 fColorGlass(s.fColorGlass),
647 fColorSMD(s.fColorSMD),
648 fColorSMDweld(s.fColorSMDweld),
649 fColorStesalite(s.fColorStesalite),
650 fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
651 fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
652 fLay3LaddShortRadius(s.fLay3LaddShortRadius),
653 fLay3LaddLongRadius(s.fLay3LaddLongRadius),
654 fLay4LaddShortRadius(s.fLay4LaddShortRadius),
655 fLay4LaddLongRadius(s.fLay4LaddLongRadius)
658 // do only a "shallow copy" ...
662 //________________________________________________________________________
663 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
664 operator=(const AliITSv11GeometrySDD &s) {
665 // Assignment operator
666 if(&s == this) return *this;
667 fMotherVol = s.fMotherVol;
668 fAddHybrids = s.fAddHybrids;
669 fAddSensors = s.fAddSensors;
670 fAddHVcables = s.fAddHVcables;
671 fAddCables = s.fAddCables;
672 fAddCoolingSyst = s.fAddCoolingSyst;
673 fCoolingOn = s.fCoolingOn;
674 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
675 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
676 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
677 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
681 //________________________________________________________________________
682 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
683 // Look like a destructor
684 // Smell like a destructor
685 // And actually is the destructor
686 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
687 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
688 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
689 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
692 //________________________________________________________________________
693 void AliITSv11GeometrySDD::SetParameters() {
695 // Define display colors and the non constant geometry parameters
698 Double_t detLadderDist = 8*fgkmm;
700 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
701 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
703 // radius from the center to the CF ladder :
704 fLay3LaddShortRadius = (fgkLay3DetShortRadius
705 + fgkLadWaferSep+2*fgkWaferThickness
707 fLay3LaddLongRadius = (fgkLay3DetLongRadius
708 + fgkLadWaferSep+2*fgkWaferThickness
710 fLay4LaddShortRadius = (fgkLay4DetShortRadius
711 + fgkLadWaferSep+2*fgkWaferThickness
713 fLay4LaddLongRadius = (fgkLay4DetLongRadius
714 + fgkLadWaferSep+2*fgkWaferThickness
717 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
718 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
719 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
720 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
721 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
722 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
724 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
725 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
726 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
727 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
728 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
729 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
730 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
731 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
735 //________________________________________________________________________
736 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
738 // Called to get a medium, checks that it exists.
739 // If not, prints an error and returns 0
743 sprintf(ch, "ITS_%s",mediumName);
744 TGeoMedium* medium = gGeoManager->GetMedium(ch);
746 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
751 //________________________________________________________________________
752 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
753 // Get the actual number of ladder in layer 3
754 if ( (fAddOnlyLadder3min<0) ||
755 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
756 (fAddOnlyLadder3max<0) ||
757 (fAddOnlyLadder3max >= fgkLay3Nladd) )
759 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
763 //________________________________________________________________________
764 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
765 // Get the actual number of ladder in layer 4
766 if ( (fAddOnlyLadder4min<0) ||
767 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
768 (fAddOnlyLadder4max<0) ||
769 (fAddOnlyLadder4max >= fgkLay4Nladd) )
771 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
775 //________________________________________________________________________
776 void AliITSv11GeometrySDD::CreateBasicObjects() {
778 // Create basics objets which will be assembled together
779 // in Layer3 and Layer4 functions
783 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
784 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
785 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
786 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
788 fPinSupport = CreatePinSupport();
789 fCoolPipeSupportL = CreateCoolPipeSupportL();
790 fCoolPipeSupportR = CreateCoolPipeSupportR();
792 fBaseThermalBridge = CreateBaseThermalBridge();
793 fHybrid = CreateHybrid(0);
795 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
796 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
797 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
798 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
799 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
800 TGeoMedium *raccordMedium = GetMedium("INOX$"); // ??? material of raccordo ???
802 //********************************************************************
803 // pieces of the carbon fiber structure
804 //********************************************************************
805 Double_t dy = fgkLadderSegBoxDH/2;
806 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
807 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
808 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
809 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
810 Double_t dYTranslation = (fgkLadderHeight/2.
811 -0.5*fgkLadderWidth*TMath::Tan(beta)
812 -fgkLadderBeamRadius);
813 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
815 //--- the top V of the Carbon Fiber Ladder (segment)
816 TGeoArb8 *cfLaddTop1 = CreateLadderSide( "CFladdTopCornerVol1shape",
817 fgkSegmentLength/2., halfTheta,
818 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
819 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
820 cfLaddTop1,carbonFiberLadderStruct);
821 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerVol2shape",
822 fgkSegmentLength/2., halfTheta,
823 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
824 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
825 cfLaddTop2, carbonFiberLadderStruct);
826 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
827 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
828 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
831 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerVol1shape",
832 fgkSegmentLength/2., beta, -1,
833 fgkLadderLb, fgkLadderHb, fgkLadderl);
834 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
835 cfLaddSide1,carbonFiberLadderStruct);
836 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerVol2shape",
837 fgkSegmentLength/2., beta, 1,
838 fgkLadderLb, fgkLadderHb, fgkLadderl);
839 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
840 cfLaddSide2,carbonFiberLadderStruct);
841 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
842 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
843 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
844 alpha*TMath::RadToDeg());
845 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
846 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
847 -alpha*TMath::RadToDeg());
848 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
851 // Beams on the sides
852 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
853 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
854 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
855 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
856 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
857 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
858 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
860 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
861 carbonFiberLadderStruct);
862 sideBeam->SetLineColor(fColorCarbonFiber);
864 //Euler rotation : about Z, then new X, then new Z
865 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
866 -beamPhiPrime*TMath::RadToDeg(),-90);
867 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
868 beamPhiPrime*TMath::RadToDeg(), -90);
869 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
870 beamPhiPrime*TMath::RadToDeg(), -90);
871 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
872 -beamPhiPrime*TMath::RadToDeg(),-90);
874 TGeoCombiTrans *beamTransf[8];
875 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
876 TMath::Tan(halfTheta),
877 fgkLadderBeamRadius/2. - dy,
878 -3*fgkSegmentLength/8, beamRot1);
880 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
881 TMath::Tan(halfTheta),
882 fgkLadderBeamRadius/2. - dy,
883 -3*fgkSegmentLength/8, beamRot1);
884 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
886 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
887 TMath::Tan(halfTheta),
888 fgkLadderBeamRadius/2. - dy,
889 -fgkSegmentLength/8, beamRot2);
891 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
892 TMath::Tan(halfTheta),
893 fgkLadderBeamRadius/2. - dy,
894 -fgkSegmentLength/8, beamRot2);
895 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
897 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
898 TMath::Tan(halfTheta),
899 fgkLadderBeamRadius/2. - dy,
900 -3*fgkSegmentLength/8, beamRot3);
902 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
903 TMath::Tan(halfTheta),
904 fgkLadderBeamRadius/2. - dy,
905 -3*fgkSegmentLength/8, beamRot3);
906 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
908 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
909 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
910 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
911 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
913 //--- Beams of the bottom
914 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
915 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
916 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
917 bottomBeam1, carbonFiberLadderStruct);
918 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
919 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
920 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
921 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
922 bottomBeam2, carbonFiberLadderStruct);
923 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
924 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
925 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
926 - fgkLadderLb/3, 0, 180);
927 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
928 bottomBeam3, carbonFiberLadderStruct);
929 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
930 //bottomBeam3Vol->SetLineColor(2);
931 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
932 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
934 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
935 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
936 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
937 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
938 -fgkSegmentLength/2, bottomBeamRot1);
939 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
940 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
941 - dy, fgkSegmentLength/2, bottomBeamRot2);
942 // be careful for beams #3: when "reading" from -z to +z and
943 // from the bottom of the ladder, it should draw a Lambda, and not a V
944 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
945 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
946 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
947 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
948 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
949 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
951 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
952 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
953 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
954 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
955 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
956 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
957 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
958 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
959 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
960 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
961 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
962 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
963 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
964 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
965 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
966 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
967 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
968 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
969 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
972 //********************************************************************
974 //********************************************************************
976 for (Int_t i=0; i<fgkLay3Ndet; i++) {
977 sprintf(cableName, "digitCableLay3A_%i",i);
978 fDigitCableLay3A[i].SetName(cableName);
979 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
980 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
981 fDigitCableLay3A[i].SetNLayers(2);
982 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
984 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
985 sprintf(cableName, "digitCableLay3B_%i",i);
986 fDigitCableLay3B[i].SetName(cableName);
987 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
988 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
989 fDigitCableLay3B[i].SetNLayers(2);
990 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
992 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
994 for (Int_t i=0; i<fgkLay4Ndet; i++) {
995 sprintf(cableName, "digitCableLay4A_%i",i);
996 fDigitCableLay4A[i].SetName(cableName);
997 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
998 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
999 fDigitCableLay4A[i].SetNLayers(2);
1000 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1002 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1003 sprintf(cableName, "digitCableLay4B_%i",i);
1004 fDigitCableLay4B[i].SetName(cableName);
1005 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
1006 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1007 fDigitCableLay4B[i].SetNLayers(2);
1008 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1010 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1012 // Well, those digit cables could also include the analog cables
1013 // which have the same width and the same path, at least in the ladder.
1014 // It will gain some computing ressources (less volumes) and some
1015 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1016 // The only thing to do is to change the names and put the correct total
1019 // some transformations and volumes used in several places
1020 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1021 0, -fgkCarlosSuppAngle, 0);
1023 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1024 fgkLittleScrewHeadH/2);
1025 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1026 littleScrewHead, stainless);
1027 fCommonVol[0]->SetLineColor(kGray);
1029 fLadderFoot = CreateLadderFoot();
1031 fCardHV = CreateHVCard(0);
1032 fCardCarlos = CreateCarlosCard(0);
1034 //==================
1035 // link beteen phynox and plastic cooling tubes
1036 //==================
1038 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1039 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1040 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1041 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1042 vwaterRac->SetLineColor(kBlue);
1044 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1045 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1046 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1047 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1048 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1049 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1050 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1051 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1052 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1053 vtube1Rac->SetLineColor(kGray);
1054 vtube2Rac->SetLineColor(kGray);
1055 vtube3Rac->SetLineColor(kGray);
1057 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1058 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1059 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1060 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1061 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1062 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1063 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1064 fRaccordoL->AddNode(vwaterRac, 1,0);
1065 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1066 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1067 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1071 //________________________________________________________________________
1072 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1074 // a debugging function for checking some possible overlaps
1076 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1077 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1078 if (fHybrid) fHybrid->CheckOverlaps(precision);
1082 //________________________________________________________________________
1083 TGeoCombiTrans *AliITSv11GeometrySDD::
1084 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1087 // return the TGeoCombiTrans which make a translation in y and z
1088 // and a rotation in phi in the global coord system
1089 // If planeSym = true, the rotation places the object symetrically
1090 // (with respect to the transverse plane) to its position in the
1091 // case planeSym = false
1094 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1095 TGeoRotation r1("",0.,0.,dphi);
1096 TGeoRotation r2("",90, 180, -90-dphi);
1098 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1099 combiTrans1->SetTranslation(t1);
1100 if (planeSym) combiTrans1->SetRotation(r1);
1101 else combiTrans1->SetRotation(r2);
1106 //________________________________________________________________________
1107 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1111 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1112 const Double_t *vect = ct->GetTranslation();
1113 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1114 ct->SetTranslation(newVect);
1118 //________________________________________________________________________
1119 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1120 // for code developpment and debugging purposes
1122 if (! fSDDsensor3) CreateBasicObjects();
1124 // moth->AddNode(fPinSupport, 1, 0);
1125 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1126 // moth->AddNode(fSDDsensor3, 1, 0);
1127 // moth->AddNode(fSDDsensor4, 1, 0);
1128 // moth->AddNode(fBaseThermalBridge, 1, 0);
1129 // moth->AddNode(fHybrid,100,0);
1130 // moth->AddNode(fLadderFoot,1,0);
1131 //moth->AddNode(fCardLVL,1,0);
1132 //moth->AddNode(fCardLVR,1,0);
1134 TGeoVolume* seg = CreateLadderSegment( 3, 0);
1135 moth->AddNode(seg, 1, 0);
1137 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1138 // moth->AddNode(lay3Ladder, 1, 0);
1140 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1141 // moth->AddNode(lay3Detectors, 1, 0);
1143 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1144 // moth->AddNode(lay3Detectors, 1, 0);
1147 // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1148 // moth->AddNode(endLadder, 1, 0);
1150 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1151 // moth->AddNode(highVCard, 1, 0);
1153 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1154 // moth->AddNode(supportRing, 1, 0);
1156 // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1157 // moth->AddNode(endLadderCards, 1, 0);
1159 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1160 // moth->AddNode(carlosCard, 1, 0);
1165 //==================================
1166 //--- test of flat cable curvature
1167 //==================================
1170 AliITSv11GeomCableFlat cable("test", 3, 0.3);
1171 cable.SetNLayers(1);
1172 cable.SetNLayers(2);
1173 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1174 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1175 cable.SetInitialNode(endLadderCards);
1177 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1186 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1187 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1188 cable.CreateAndInsertBoxCableSegment(1,angle);
1190 Double_t p3[3], p4[3];
1195 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1196 cable.CreateAndInsertCableCylSegment(2,angle);
1201 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1202 cable.CreateAndInsertCableSegment(3,angle);
1207 //________________________________________________________________________
1208 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1210 // Insert the layer 3 in the mother volume. This is a virtual volume
1211 // containing ladders of layer 3 and the supporting rings
1215 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1219 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1222 if (! fSDDsensor3) CreateBasicObjects();
1224 //====================================
1225 // First we create the central barrel
1226 //====================================
1228 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1229 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1230 TGeoVolumeAssembly *lay3Ladd2Det = CreateDetectorsAssemblyLadd2();
1231 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1232 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1233 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1234 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1235 virtualLayer3Shape, airSDD);
1237 Double_t dPhi = 360./fgkLay3Nladd;
1238 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1239 // Placing virtual ladder and detectors volumes following
1240 // ladder ordering convention
1243 Int_t iLaddMax = fgkLay3Nladd;
1244 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1245 iLaddMin = fAddOnlyLadder3min;
1246 iLaddMax = fAddOnlyLadder3max+1;
1249 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1251 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1252 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1253 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1255 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1256 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1257 TGeoCombiTrans *ctLadd;
1258 //=============================================================
1260 // Special modification for ladder 2 of layer 3:
1261 // It has been inverted (pi rotation around y axis)
1263 //=============================================================
1265 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1266 0, ladderPhi, kTRUE);
1268 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1269 0, ladderPhi, kFALSE);
1270 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1271 ///////////////////////////////////////////////////
1272 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1273 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1274 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1275 minRadiusDetBox += detectorsThick/2;
1276 TGeoCombiTrans *ctDet;
1277 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1278 0, ladderPhi, kTRUE);
1281 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1283 virtualLayer3->AddNode(lay3Ladd2Det , iLadd, ctDet);
1285 ///////////////////////////////////////////////////
1289 //====================================
1290 // Then the forward rapidity pieces
1291 // (cooling, Carlos, LV, HV ...)
1292 //====================================
1294 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1295 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1296 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1298 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1299 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1300 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1301 fgkForwardLay3Length/2.);
1303 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1304 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1305 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1308 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1309 virtualForward3Shape, airSDD);
1310 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1311 virtualForward3Shape, airSDD);
1312 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1313 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1315 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1316 fgkLay3Length/2+fgkForwardLay3Length/2);
1317 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1318 -fgkLay3Length/2-fgkForwardLay3Length/2);
1320 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1322 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1323 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1324 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1325 minRadiusDetBox += detectorsThick/2;
1327 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1329 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1330 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1331 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1332 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1334 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1335 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1342 virtualLayer3->CheckOverlaps(0.01);
1343 //virtualForward3Pos->CheckOverlaps(0.01);
1344 //virtualForward3Neg->CheckOverlaps(0.01);
1347 virtualLayer3->SetVisibility(kFALSE);
1348 //virtualForward3Pos->SetVisibility(kFALSE);
1349 //virtualForward3Neg->SetVisibility(kFALSE);
1352 moth->AddNode(virtualLayer3, 1, 0);
1353 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1354 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1358 // //________________________________________________________________________
1359 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1361 // // Insert the forward pieces of layer 3 in the mother volume.
1362 // // (cooling, Carlos, LV, HV ...)
1366 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1370 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1372 // if (! fSDDsensor3) CreateBasicObjects();
1374 // Double_t dPhi = 360./fgkLay3Nladd;
1375 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1376 // Int_t iLaddMin = 0;
1377 // Int_t iLaddMax = fgkLay3Nladd;
1378 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1379 // iLaddMin = fAddOnlyLadder3min;
1380 // iLaddMax = fAddOnlyLadder3max+1;
1382 // char rotName[30];
1385 // //=================
1387 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1388 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1389 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1391 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1392 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1393 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1394 // fgkForwardLay3Length/2.);
1396 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1397 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1398 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1401 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1402 // virtualForward3Shape, airSDD);
1403 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1404 // virtualForward3Shape, airSDD);
1405 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1406 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1408 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1409 // fgkLay3Length/2+fgkForwardLay3Length/2);
1410 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1411 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1413 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1415 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1416 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1417 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1418 // minRadiusDetBox += detectorsThick/2;
1420 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1422 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1423 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1424 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1425 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1427 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1428 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1431 // if(GetDebug(1)) {
1432 // virtualForward3Pos->CheckOverlaps(0.01);
1433 // virtualForward3Neg->CheckOverlaps(0.01);
1436 // virtualForward3Pos->SetVisibility(kFALSE);
1437 // virtualForward3Neg->SetVisibility(kFALSE);
1439 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1440 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1445 //________________________________________________________________________
1446 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1448 // Insert the end-ladder of layer 3 in the mother volume.
1449 // (cooling, Carlos, LV, HV ...)
1453 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1457 if (! fSDDsensor3) CreateBasicObjects();
1460 Int_t iLaddMax = fgkLay3Nladd;
1461 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1462 iLaddMin = fAddOnlyLadder3min;
1463 iLaddMax = fAddOnlyLadder3max+1;
1466 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1467 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1470 Double_t dPhi = 360./fgkLay3Nladd;
1471 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1473 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1475 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1477 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1479 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1481 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1482 fgkLay3Length/2, ladderPhi, kTRUE);
1483 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1484 -fgkLay3Length/2, ladderPhi, kFALSE);
1486 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1487 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1491 virtualForward3Pos->CheckOverlaps(0.01);
1492 virtualForward3Neg->CheckOverlaps(0.01);
1495 // 180deg Y rotation to compensate the cancellation of ITSD volume
1496 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1497 TGeoRotation *y180 = new TGeoRotation();
1498 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1499 moth->AddNode(virtualForward3Pos, 1, y180);
1500 moth->AddNode(virtualForward3Neg, 1, y180);
1503 //________________________________________________________________________
1504 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1506 // Insert the layer 4 in the mother volume. This is a virtual volume
1507 // containing ladders of layer 4 and the supporting rings
1511 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1517 if (! fSDDsensor3) CreateBasicObjects();
1519 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1520 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1521 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1522 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1523 virtualLayer4Shape, airSDD);
1525 //====================================
1526 // First we create the central barrel
1527 //====================================
1529 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1530 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1531 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1533 Double_t dPhi = 360./fgkLay4Nladd;
1534 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1536 // placing virtual ladder and detectors volumes following ladder
1537 // ordering convention
1540 Int_t iLaddMax = fgkLay4Nladd;
1541 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1542 iLaddMin = fAddOnlyLadder4min;
1543 iLaddMax = fAddOnlyLadder4max+1;
1545 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1547 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1548 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1549 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1551 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1552 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1553 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1554 0, ladderPhi, kTRUE);
1555 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1556 ///////////////////////////////////////////////////
1557 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1558 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1560 minRadiusDetBox = fgkLay4DetLongRadius;
1561 minRadiusDetBox += detBoxThickness/2;
1562 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1563 0, ladderPhi, kTRUE);
1564 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1565 ///////////////////////////////////////////////////
1569 //====================================
1570 // Then the pieces at forward rapidity
1571 // (cooling, Carlos, LV, HV ...)
1572 //====================================
1574 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1575 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1576 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1578 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1579 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1580 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1581 fgkForwardLay4Length/2.);
1582 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1583 virtualForward4Shape, airSDD);
1584 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1585 virtualForward4Shape, airSDD);
1586 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1587 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1589 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1590 fgkLay4Length/2+fgkForwardLay4Length/2);
1591 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1592 -fgkLay4Length/2-fgkForwardLay4Length/2);
1594 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1596 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1597 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1599 minRadiusDetBox = fgkLay4DetLongRadius;
1600 minRadiusDetBox += detBoxThickness/2;
1602 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1604 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1605 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1606 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1607 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1608 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1609 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1613 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1615 virtualLayer4->SetVisibility(kFALSE);
1616 //virtualForward4Pos->SetVisibility(kFALSE);
1617 //virtualForward4Neg->SetVisibility(kFALSE);
1619 moth->AddNode(virtualLayer4,1,0);
1620 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1621 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1625 // //________________________________________________________________________
1626 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1628 // // Insert the layer 4 in the mother volume. This is a virtual volume
1629 // // containing ladders of layer 4 and the supporting rings
1630 // // (cooling, Carlos, LV, HV ...)
1634 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1638 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1640 // if (! fSDDsensor3) CreateBasicObjects();
1642 // Double_t dPhi = 360./fgkLay4Nladd;
1643 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1645 // // placing virtual ladder and detectors volumes following ladder
1646 // // ordering convention
1647 // char rotName[20];
1648 // Int_t iLaddMin = 0;
1649 // Int_t iLaddMax = fgkLay4Nladd;
1650 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1651 // iLaddMin = fAddOnlyLadder4min;
1652 // iLaddMax = fAddOnlyLadder4max+1;
1655 // //=================
1656 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1657 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1658 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1660 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1661 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1662 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1663 // fgkForwardLay4Length/2.);
1664 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1665 // virtualForward4Shape, airSDD);
1666 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1667 // virtualForward4Shape, airSDD);
1668 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1669 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1671 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1672 // fgkLay4Length/2+fgkForwardLay4Length/2);
1673 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1674 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1676 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1678 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1679 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1680 // if (iLadd%2 != 0)
1681 // minRadiusDetBox = fgkLay4DetLongRadius;
1682 // minRadiusDetBox += detBoxThickness/2;
1684 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1686 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1687 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1688 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1689 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1690 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1691 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1694 // virtualForward4Pos->SetVisibility(kFALSE);
1695 // virtualForward4Neg->SetVisibility(kFALSE);
1697 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1698 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1702 //________________________________________________________________________
1703 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1705 // Insert the end-ladder of layer 4 in the mother volume.
1706 // (cooling, Carlos, LV, HV ...)
1710 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1714 if (! fSDDsensor3) CreateBasicObjects();
1716 // placing virtual ladder and detectors volumes following ladder
1717 // ordering convention
1719 Int_t iLaddMax = fgkLay4Nladd;
1720 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1721 iLaddMin = fAddOnlyLadder4min;
1722 iLaddMax = fAddOnlyLadder4max+1;
1725 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1726 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1729 Double_t dPhi = 360./fgkLay4Nladd;
1730 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1732 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1734 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1737 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1739 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1741 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1742 fgkLay4Length/2, ladderPhi, kTRUE);
1743 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1744 -fgkLay4Length/2, ladderPhi, kFALSE);
1745 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1746 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1749 // 180deg Y rotation to compensate the cancellation of ITSD volume
1750 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1751 TGeoRotation *y180 = new TGeoRotation();
1752 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1753 moth->AddNode(virtualForward4Pos, 1, y180);
1754 moth->AddNode(virtualForward4Neg, 1, y180);
1758 //________________________________________________________________________
1759 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1761 // return an assembly volume containing the CF ladder
1764 Int_t nDetectors = fgkLay3Ndet;
1765 Double_t ladderLength = fgkLay3LadderLength;
1766 Double_t underSegDH = fLay3LadderUnderSegDH;
1767 Double_t *sensorZPos = fLay3sensorZPos;
1768 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1769 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1773 nDetectors = fgkLay4Ndet;
1774 ladderLength = fgkLay4LadderLength;
1775 digitCableA = fDigitCableLay4A;
1776 digitCableB = fDigitCableLay4B;
1777 underSegDH = fLay4LadderUnderSegDH;
1778 sensorZPos = fLay4sensorZPos;
1781 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1783 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1784 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1786 // placing virtual ladder segment following detector ordering convention
1787 //=======================================================================
1790 // adding segment this way to create cable points in the correct order ...
1791 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1793 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1794 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1795 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1796 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1797 + fgkSegmentLength/2;
1798 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1799 underSegDH/2,segmentPos);
1801 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1803 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1805 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1806 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1807 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1808 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1809 + fgkSegmentLength/2;
1810 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1811 underSegDH/2,segmentPos);
1813 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1816 // putting virtual volume corresponding to the end of ladder
1817 //=======================================================================
1818 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1819 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1820 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1821 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1822 // Euler rotation : about Z, then new X, then new Z
1823 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1824 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1825 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1826 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1827 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1829 // creating and inserting cable segments
1830 // (check points are placed while creating segments)
1831 //=======================================================================
1833 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1835 digitCableA[iSegment].SetInitialNode(virtualLadder);
1836 digitCableB[iSegment].SetInitialNode(virtualLadder);
1838 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1839 Double_t rotation = 0;
1841 rotation = 90-fgkHybridAngle;
1842 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1844 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1848 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1849 Double_t rotation = 0;
1851 rotation = fgkHybridAngle-90;
1852 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1854 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1859 //=======================================================================
1861 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1862 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1864 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1865 char cableHVname[30];
1866 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1867 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1868 cableHV[iSegment].SetName(cableHVname);
1869 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1870 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1871 cableHV[iSegment].SetNLayers(2);
1872 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1874 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1875 cableHV[iSegment].SetInitialNode(virtualLadder);
1877 Double_t x1[3], x2[3], x3[3],
1878 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1880 x1[0] = -fgkTransitHVtailXpos;
1881 x2[0] = -fgkTransitHVtailXpos;
1882 x3[0] = -fgkTransitHVtailXpos;
1883 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1884 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1885 *fgkLongHVcableSeparation;
1886 // adjust where HV long cable starts in Y
1887 // useful if you want to let some space for alignment
1888 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1889 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1890 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1892 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1893 x2[2] = x1[2]+5*fgkmm;
1894 x3[2] = ladderLength/2-endLength;
1895 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1896 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1897 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1899 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1900 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1901 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1902 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1906 x1[0] = fgkTransitHVtailXpos;
1907 x2[0] = fgkTransitHVtailXpos;
1908 x3[0] = fgkTransitHVtailXpos;
1910 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1911 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1912 *fgkLongHVcableSeparation;
1913 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1914 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1915 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1917 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1918 x2[2] = x1[2]-5*fgkmm;
1919 x3[2] = -ladderLength/2+endLength;
1920 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1921 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1922 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1924 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1925 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1929 //**********************************
1930 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1931 return virtualLadder;
1935 //________________________________________________________________________
1936 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(const char *name,
1937 Double_t dz, Double_t angle, Double_t xSign,
1938 Double_t L, Double_t H, Double_t l) {
1939 // Create one half of the V shape corner of CF ladder
1941 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1942 cfLaddSide->SetName(name);
1944 // Points must be in clockwise order
1945 cfLaddSide->SetVertex(0, 0, 0);
1946 cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1947 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1948 cfLaddSide->SetVertex(4, 0, 0);
1949 cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1950 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1952 cfLaddSide->SetVertex(1, 0, -H);
1953 cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1954 cfLaddSide->SetVertex(5, 0, -H);
1955 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1957 cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1958 cfLaddSide->SetVertex(3, 0, -H);
1959 cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1960 cfLaddSide->SetVertex(7, 0, -H);
1966 //________________________________________________________________________
1967 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1969 // return a box containing the front-end hybrid
1972 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1974 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1975 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1976 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1977 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1978 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1979 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1980 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1981 // + upFLTotalThick + ccUpLayerTotThick);
1982 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1984 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1986 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1988 //**************************************************** media :
1989 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1990 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1991 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1992 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1993 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1994 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1995 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1996 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1997 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1998 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1999 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2001 //**************************************************** main volume :
2002 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
2003 (fgkHybridLength)/2);
2004 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
2007 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
2008 fgkHybridThBridgeThick/2,
2011 //**************************************************** Thermal bridge :
2012 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
2014 carbonFiberLadderStruct);
2015 vThermalBridge->SetLineColor(fColorCarbonFiber);
2016 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
2017 +fgkHybridThBridgeThick/2, 0);
2018 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
2020 //**************************************************** Screen layer :
2021 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
2022 fgkHybAlThick/2, fgkHybridLength/2);
2023 //here the upedex and glue layers are both assumed to be polyimide
2024 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
2026 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2028 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2029 (screenTotalThick+lowFLTotalThick)/2);
2031 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2032 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2034 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2035 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2036 +fgkHybAlThick/2, 0);
2038 TGeoTranslation hybHolePos1Tr(roundHoleX,
2039 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2040 -fgkHybridLength/2+fgkHybRndHoleZ);
2041 TGeoTranslation hybHolePos2Tr(roundHoleX,
2042 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2043 fgkHybridLength/2-fgkHybRndHoleZ);
2045 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2046 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2047 hybHolePos1->SetName("hybHolePos1");
2048 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2049 hybHolePos2->SetName("hybHolePos2");
2051 upGlueScreenTr->RegisterYourself();
2052 alScreenTr->RegisterYourself();
2053 hybHolePos1->RegisterYourself();
2054 hybHolePos2->RegisterYourself();
2057 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2058 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2059 "+sRoundHole:hybHolePos2)");
2060 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2061 vScreenAl->SetLineColor(fColorAl);
2062 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2063 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2064 "+sRoundHole:hybHolePos2)");
2065 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2066 sScreenUpGlue,polyhamideSDD);
2067 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2069 hybrid->AddNode(vScreenUpGlue, 1, 0);
2070 hybrid->AddNode(vScreenAl, 1, 0);
2072 //**************************************************** FL low layer :
2073 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2074 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2076 //here the upedex and glue layers are both assumed to be polyimide
2077 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2078 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2080 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2081 fgkHybAlThick/2, sideWidth1/2);
2083 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2084 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2085 -(fgkHybridLength-sideWidth1)/2);
2086 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2087 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2088 -(fgkHybridLength-sideWidth1)/2);
2089 upGlueBarTr1->RegisterYourself();
2090 alBarTr1->RegisterYourself();
2092 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2093 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2094 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2095 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2096 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2097 sLowUpGlueBar1, polyhamideSDD);
2098 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2100 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2101 vLowAlBar1->SetLineColor(fColorAl);
2102 hybrid->AddNode(vLowUpGlueBar1,1,0);
2103 hybrid->AddNode(vLowAlBar1,1,0);
2106 //here the upedex and glue layers are both assumed to be polyimide
2107 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2108 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2110 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2111 fgkHybAlThick/2, sideWidth2/2);
2113 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2114 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2115 (fgkHybridLength-sideWidth2)/2);
2116 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2117 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2118 (fgkHybridLength-sideWidth2)/2);
2119 upGlueBarTr2->RegisterYourself();
2120 alBarTr2->RegisterYourself();
2122 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2123 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2124 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2125 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2126 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2128 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2130 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2131 vLowAlBar2->SetLineColor(fColorAl);
2132 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2133 hybrid->AddNode(vLowAlBar2, 1, 0);
2135 if(GetDebug(3)) { // Remove compiler warning.
2136 sAlScreenLayer->InspectShape();
2137 sUpGlueScreenLayer->InspectShape();
2138 sRoundHole->InspectShape();
2139 sUpGlueBar1->InspectShape();
2140 sUpGlueBar2->InspectShape();
2141 sAlBar1->InspectShape();
2142 sAlBar2->InspectShape();
2145 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2146 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2147 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2149 lowFLpiece.SetNLayers(2);
2150 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2152 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2153 // alSDD at 80% : mostly to take into account strips of piece 3
2155 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2156 lowLayerYmin + lowFLTotalThick/2,
2157 -fgkHybridLength/2 + sideWidth1 };
2158 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2159 Double_t vZ[3] = {0,0,1};
2160 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2161 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2162 lowFLpiece.SetInitialNode(hybrid);
2163 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2164 lowFLpiece.ResetPoints();
2166 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2167 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2169 lowFLpiece.SetWidth(piece2width);
2170 lowFLpiece.SetName("lowFLpiece2");
2171 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2173 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2174 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2175 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2176 lowFLpiece.ResetPoints();
2178 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2179 - fgkHybFLlowHoleAmbDX/2;
2181 lowFLpiece.SetWidth(piece3width);
2182 lowFLpiece.SetName("lowFLpiece3");
2183 x1[0] = fgkHybridWidth/2-piece3width/2;
2185 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2186 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2187 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2189 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2190 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2191 Double_t vX[3] = {1,0,0};
2192 for (Int_t i=0; i<3; i++) {
2194 sprintf(ch, "lowFLpieceA%i", i+4);
2195 lowFLpiece.SetName(ch);
2196 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2198 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2199 x1[0] = -fgkHybridWidth/2 + piece1width;
2200 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2201 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2202 x1[2] = zPiece; x2[2] = zPiece;
2203 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2204 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2205 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2206 lowFLpiece.ResetPoints();
2208 sprintf(ch, "lowFLpieceB%i", i+4);
2209 lowFLpiece.SetName(ch);
2210 x1[0] = fgkHybridWidth/2 - piece3width;
2211 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2212 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2213 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2214 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2217 //**************************************************** chips+CC:
2218 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2219 chip.SetInitialNode(hybrid);
2221 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2222 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2223 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2224 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2226 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2227 // Here the tho CC (low+up) are merged
2228 // In fact, the last layer has a smaller surface of Al -> I put 80%
2230 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2234 for (Int_t i=0; i<4; i++) {
2235 sprintf(ch, "pascalCC%i", i);
2237 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2238 x2[0] = x1[0] + fgkHybPascalDX;
2239 x1[2] = zChips[i] - fgkHybridLength/2;
2241 chip.AddCheckPoint( hybrid, 0, x1, vX );
2242 chip.AddCheckPoint( hybrid, 1, x2, vX );
2243 chip.CreateAndInsertBoxCableSegment(1,-90);
2246 sprintf(ch, "ambraCC%i", i);
2248 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2249 x2[0] = x1[0] + fgkHybAmbraDX;
2250 chip.AddCheckPoint( hybrid, 0, x1, vX );
2251 chip.AddCheckPoint( hybrid, 1, x2, vX );
2252 chip.CreateAndInsertBoxCableSegment(1,-90);
2256 //**************************************************** CC outside chips:
2257 // I don't think there is a second aluminium layer here ...
2258 for (Int_t i = 0; i<4; i++) {
2259 sprintf(ch, "ccLayerA%i", i);
2261 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2262 ccLayer1.SetInitialNode(hybrid);
2263 ccLayer1.SetNLayers(2);
2264 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2265 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2268 x1[0] = -fgkHybridWidth/2;
2269 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2270 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2271 + fgkHybChipThick + ccUpLayerTotThick/2;
2273 x1[2] = zChips[i] - fgkHybridLength/2;
2275 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2276 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2277 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2279 sprintf(ch, "ccLayerB%i", i);
2280 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2281 ccLayer2.SetInitialNode(hybrid);
2282 ccLayer2.SetNLayers(2);
2283 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2284 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2287 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2288 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2289 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2290 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2291 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2292 ccLayer2.ResetPoints();
2293 sprintf(ch, "ccLayerC%i", i);
2294 ccLayer2.SetName(ch);
2295 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2296 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2297 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2298 + ccUpLayerTotThick/2;
2301 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2302 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2303 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2306 //**************************************************** FL UP:
2307 // (last Al layer will be a special triangular shape)
2308 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2309 fgkHybFLUpperWidth/2, flUpThick/2,
2310 fgkHybFLUpperLength/2);
2311 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2312 sFLupPolyhamide, polyhamideSDD);
2313 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2314 TGeoTranslation *trFLupPolyhamide =
2315 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2316 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2318 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2320 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2321 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2322 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2323 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2324 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2325 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2326 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2327 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2328 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2329 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2332 vAluStrip->SetLineColor(fColorAl);
2333 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2334 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2336 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2337 +flUpThick+fgkHybAlThick/2;
2338 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2339 fgkHybridWidth/2,yRotAluStrip,
2340 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2341 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2342 AddTranslationToCombiTrans(aluStripTr2,0,0,
2343 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2344 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2345 AddTranslationToCombiTrans(aluStripTr3,0,0,
2346 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2347 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2348 AddTranslationToCombiTrans(aluStripTr4,0,0,
2349 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2351 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2352 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2353 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2354 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2355 //**************************************************** SMD:
2356 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2357 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2358 fgkHybSMDheight/2,fgkHybSMDendW/2);
2359 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2361 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2362 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2363 fgkHybSMDmiddleW/2);
2364 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2365 hybSMDmiddle,medSMD);
2366 vHybSMDmiddle->SetLineColor(fColorSMD);
2367 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2368 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2369 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2370 hybSMDend,medSMDweld);
2371 vHybSMDend->SetLineColor(fColorSMDweld);
2372 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2373 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2374 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2375 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2376 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2377 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2378 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2379 for (Int_t i=0; i<fgkNHybSMD; i++) {
2380 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2381 -fgkHybridWidth/2+fgkHybSMDposX[i],
2382 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2383 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2384 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2390 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2391 hybrid->SetVisibility(kFALSE);
2395 //________________________________________________________________________
2396 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2398 // Return a TGeoVolume* containing a segment of a ladder.
2401 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2402 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2403 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2405 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2406 Double_t segmentLength = fgkSegmentLength;
2407 Double_t spaceBetweenCables = 500*fgkmicron;
2409 //*****************************************
2410 // Set parameters according to (iLay,iSeg):
2411 //*****************************************
2412 Int_t nDetectors = fgkLay3Ndet;
2413 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2414 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2415 (fgkSegmentLength*fgkLay3Ndet/2. -
2416 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2417 // sensorCenterZPos = z in segment local coord syst.
2419 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2420 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2423 } else if (iLay==4) {
2424 nDetectors = fgkLay4Ndet;
2425 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2426 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2427 (fgkSegmentLength*fgkLay4Ndet/2. -
2428 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2429 digitCableA = fDigitCableLay4A;
2430 digitCableB = fDigitCableLay4B;
2432 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2435 Double_t cableSideSign = -1;
2436 if (iSeg<nDetectors/2) cableSideSign = 1;
2437 Double_t spaceForCables = spaceBetweenCables*
2438 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2440 // gives [0-1-2-2-1-0]*spaceBetweenCables
2441 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2442 Int_t iUpdateCableMin;
2443 Int_t iUpdateCableMax;
2444 if (cableSideSign==-1) {
2445 iUpdateCableMin = nDetectors/2;
2446 iUpdateCableMax = iSeg-1;
2448 iUpdateCableMin = iSeg+1;
2449 iUpdateCableMax = nDetectors/2-1;
2453 cout << "Segment ("<< iLay <<',' << iSeg
2454 << ") : sensor z shift in local segment coord.="
2455 << sensorCenterZPos << endl;
2458 //****************************
2459 // The segment volume
2460 //****************************
2462 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2463 // likely slows down the transport of particles through the geometry
2465 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2467 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2468 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2469 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2472 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2474 virtualSeg->SetVisibility(kFALSE);
2476 //******************************
2477 // Carbon fiber structure :
2478 //******************************
2480 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2481 Int_t volumeIndex = 1;
2482 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2483 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2487 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2488 fLaddSegCommonTr[i]);
2491 //**********************************
2492 // Pine support of the sensors :
2493 //**********************************
2494 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2495 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2497 // The use of the following constructor type allow to use rotPS1 and rotPS2
2498 // (and not copy them) therefore we gain some memory
2499 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2500 - fgkLadderHeight/2.-tDY
2501 + fgkPinSuppHeight/2.,
2502 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2504 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2505 - fgkLadderHeight/2.-tDY
2506 + fgkPinSuppHeight/2.,
2507 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2508 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2510 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2511 - fgkLadderHeight/2.-tDY
2512 + fgkPinSuppHeight/2.,
2513 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2514 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2516 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2517 - fgkLadderHeight/2.-tDY
2518 + fgkPinSuppHeight/2.,
2519 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2520 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2522 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2523 - fgkLadderHeight/2. - tDY
2524 + fgkPinSuppHeight/2.,
2525 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2527 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2528 - fgkLadderHeight/2. - tDY
2529 + fgkPinSuppHeight/2.,
2530 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2531 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2533 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2534 - fgkLadderHeight/2. - tDY
2535 + fgkPinSuppHeight/2.,
2536 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2537 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2539 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2540 - fgkLadderHeight/2. - tDY
2541 + fgkPinSuppHeight/2.,
2542 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2543 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2545 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2546 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2547 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2548 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2549 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2550 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2551 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2552 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2554 TGeoMedium *pinMed = GetMedium("SDDKAPTON (POLYCH2)$"); // medium ???
2555 Double_t fgkPinHeight = 4.5*fgkmm;
2556 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2558 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2560 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2561 - fgkLadderHeight/2.-tDY
2563 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2564 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2565 virtualSeg->AddNode(pineV, 1, transPS2b);
2567 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2568 - fgkLadderHeight/2. - tDY
2570 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2571 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2572 virtualSeg->AddNode(pineV, 2, transPS6b);
2575 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2576 - fgkLadderHeight/2.-tDY
2578 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2579 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2580 virtualSeg->AddNode(pineV, 3, transPS4b);
2582 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2583 - fgkLadderHeight/2. - tDY
2585 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2586 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2587 virtualSeg->AddNode(pineV, 4, transPS8b);
2590 //******************************
2591 // Cooling pipe supports :
2592 //******************************
2593 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2594 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2595 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2596 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2598 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2599 (triangleHeight+triangleCPaxeDist/
2600 TMath::Sin(halfTheta)-coolPipeSuppH);
2601 if (fAddCoolingSyst) {
2602 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2603 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2604 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2605 -fgkLadderHeight/2. - tDY
2606 +coolPipeSuppH+fgkLadderBeamRadius,
2607 -segmentLength/2., rotCPS1);
2609 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2610 -fgkLadderHeight/2. - tDY
2611 +coolPipeSuppH+fgkLadderBeamRadius,
2612 -segmentLength/2., rotCPS1);
2613 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2615 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2616 -fgkLadderHeight/2.- tDY
2617 +coolPipeSuppH+fgkLadderBeamRadius,
2618 segmentLength/2., rotCPS2);
2620 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2621 -fgkLadderHeight/2.- tDY
2622 +coolPipeSuppH+fgkLadderBeamRadius,
2623 segmentLength/2., rotCPS2);
2624 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2626 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2627 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2628 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2629 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2632 //************************
2634 //************************
2635 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2636 -fgkLadderHeight/2. - tDY +
2637 fgkLadderBeamRadius+coolPipeSuppH, 0);
2638 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2639 -fgkLadderHeight/2.- tDY +
2640 fgkLadderBeamRadius+coolPipeSuppH, 0);
2642 if (fAddCoolingSyst) {
2643 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2644 fgkCoolPipeOuterDiam/2,
2646 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2649 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2650 coolingPipeShape, phynoxSDD );
2651 coolingPipe->SetLineColor(fColorPhynox);
2652 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2656 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2657 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2659 virtualSeg->AddNode(cooler, 1, pipeTr1);
2660 virtualSeg->AddNode(cooler, 2, pipeTr2);
2664 //**********************************
2665 // Bases of hybrid thermal bridges
2666 //**********************************
2667 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2668 // approx !!! not clear on 0752/14-A
2669 if (fAddCoolingSyst) {
2670 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2671 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2672 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2673 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2675 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2676 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2679 //*************************
2681 //*************************
2682 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2683 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2685 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2686 - shiftHyb*SinD(fgkHybridAngle) );
2687 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2688 + shiftHyb*CosD(fgkHybridAngle) );
2690 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2691 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2692 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2693 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2694 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2695 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2697 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2698 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2705 // Starting from this segment
2706 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2707 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2708 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2709 - digitCableA->GetWidth()/2;
2710 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2711 - digitCableA->GetThickness()/2;
2713 Double_t digitCableX = ( coolPipeSuppL
2714 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2715 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2716 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2717 + fgkLadderBeamRadius+coolPipeSuppH
2718 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2719 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2722 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2723 digitCableY, cableSideSign*hybDz };
2724 Double_t digitCableCenterA1[3] = {
2725 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2726 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2727 cableSideSign*segmentLength/2 };
2729 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2730 digitCableY,cableSideSign*hybDz};
2731 Double_t digitCableCenterB1[3]={
2732 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2733 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2734 cableSideSign*segmentLength/2 };
2736 Double_t vZ[3] = {0,0,1};
2737 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2738 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2739 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2740 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2742 // Updating the other cables
2743 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2745 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2747 digitCableA[iCable].GetPoint( 1, coord);
2748 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2749 digitCableB[iCable].GetPoint( 1, coord);
2750 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2754 //**********************************
2755 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2760 //________________________________________________________________________
2761 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2763 // Create a pine support and its pine
2764 // axis of rotation is the cone axis, center in its middle
2766 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?
2768 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2769 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2770 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2771 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2772 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2773 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2774 fgkPinSuppHeight/2.+0.00001);
2775 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2777 if(GetDebug(3)){// Remove compiler warning.
2778 cone->InspectShape();
2779 tong->InspectShape();
2780 hole->InspectShape();
2783 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2784 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2785 tongTrans->RegisterYourself();
2786 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2787 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2788 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2790 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2792 pinSupport->SetLineColor(fColorRyton);
2798 //________________________________________________________________________
2799 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2801 // Create half of the cooling pipe support (ALR-0752/3)
2804 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2806 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2807 side1->SetName("ITSsddCPSside1");
2808 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2809 side1->SetVertex( 1, 0, fgkCoolPipeSuppWidthExt/2.);
2810 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2811 fgkCoolPipeSuppWidthExt/2.);
2812 side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX,
2813 -fgkCoolPipeSuppWidthExt/2.);
2814 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2815 side1->SetVertex( 5, 0, fgkCoolPipeSuppWidthExt/2.);
2816 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2817 fgkCoolPipeSuppWidthExt/2.);
2818 side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2.,
2819 -fgkCoolPipeSuppWidthExt/2.);
2821 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2822 - fgkCoolPipeSuppAxeDist
2823 + fgkCoolPipeSuppWidthExt/2., 0);
2824 side1Tr->RegisterYourself();
2825 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2826 - fgkCoolPipeSuppAxeDist
2827 + fgkCoolPipeSuppWidthExt*3/2.
2828 + fgkCoolPipeSuppWidthIn,0);
2829 side2Tr->RegisterYourself();
2831 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2832 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2833 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2834 TGeoTranslation *middleTr =
2835 new TGeoTranslation("ITSsddCPStr3",
2836 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2837 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2838 +fgkCoolPipeSuppWidthIn/2., 0);
2839 middleTr->RegisterYourself();
2841 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2842 fgkCoolPipeSuppTongW/4.,
2843 (fgkCoolPipeSuppFulWidth
2844 - 2*fgkCoolPipeSuppWidthExt
2845 - fgkCoolPipeSuppWidthIn)/2,
2846 fgkCoolPipeSuppHeight/2.);
2848 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2849 fgkCoolPipeSuppTongW/4.,
2850 - fgkCoolPipeSuppAxeDist
2851 + fgkCoolPipeSuppFulWidth
2852 - axeBox->GetDY(), 0);
2853 axeBoxTr->RegisterYourself();
2855 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2856 fgkCoolPipeSuppTongW/4.);
2858 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2859 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2860 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2861 axeTrans->RegisterYourself();
2862 //delete axeRot; // make the code crash, no idea of why !!!
2865 middle->InspectShape();
2866 axe->InspectShape();
2869 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2871 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2872 "ITSsddCoolPipeSuppShapeL",
2873 "ITSsddCPSmiddle:ITSsddCPStr3"
2874 "+ITSsddCPSside1:ITSsddCPStr1"
2875 "+ITSsddCPSside1:ITSsddCPStr2"
2876 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2877 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2878 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2879 coolPipeSuppShape, rytonSDD);
2881 coolPipeSupp->SetLineColor(fColorRyton);
2883 return coolPipeSupp;
2887 //________________________________________________________________________
2888 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2890 //Create half of the cooling pipe support (ALR-0752/3)
2893 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2895 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2896 side1->SetName("ITSsddCPSside1R");
2897 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2898 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2899 -fgkCoolPipeSuppWidthExt/2.);
2900 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2901 fgkCoolPipeSuppWidthExt/2.);
2902 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2903 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2904 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2905 -fgkCoolPipeSuppWidthExt/2.);
2906 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2907 fgkCoolPipeSuppWidthExt/2.);
2908 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2910 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2911 - fgkCoolPipeSuppAxeDist
2912 + fgkCoolPipeSuppWidthExt/2., 0);
2913 side1Tr->RegisterYourself();
2914 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2915 - fgkCoolPipeSuppAxeDist
2916 + fgkCoolPipeSuppWidthExt*3/2.
2917 + fgkCoolPipeSuppWidthIn, 0);
2918 side2Tr->RegisterYourself();
2920 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2921 (fgkCoolPipeSuppMaxLength/2.
2922 - fgkCoolPipeSuppSlitL)/2.,
2923 fgkCoolPipeSuppWidthIn/2.,
2924 fgkCoolPipeSuppHeight/2.);
2925 TGeoTranslation *middleTr =
2926 new TGeoTranslation("ITSsddCPStr3R",
2927 -( fgkCoolPipeSuppMaxLength/2.
2928 -fgkCoolPipeSuppSlitL)/2.,
2929 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2930 + fgkCoolPipeSuppWidthIn/2.,0);
2931 middleTr->RegisterYourself();
2933 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2934 fgkCoolPipeSuppTongW/4.,
2935 (fgkCoolPipeSuppFulWidth
2936 - 2*fgkCoolPipeSuppWidthExt
2937 - fgkCoolPipeSuppWidthIn)/2,
2938 fgkCoolPipeSuppHeight/2.);
2940 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2941 - fgkCoolPipeSuppTongW/4.,
2942 - fgkCoolPipeSuppAxeDist
2943 + fgkCoolPipeSuppFulWidth
2944 - axeBox->GetDY(),0);
2945 axeBoxTr->RegisterYourself();
2947 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2948 fgkCoolPipeSuppTongW/4.);
2950 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2951 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2952 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2953 axeTrans->RegisterYourself();
2957 middle->InspectShape();
2958 axe->InspectShape();
2961 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2962 "ITSsddCoolPipeSuppShapeR",
2963 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2964 "+ITSsddCPSside1R:ITSsddCPStr1R"
2965 "+ITSsddCPSside1R:ITSsddCPStr2R"
2966 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2967 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2969 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2970 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2971 coolPipeSuppShape, rytonSDD);
2972 coolPipeSupp->SetLineColor(fColorRyton);
2974 return coolPipeSupp;
2977 //________________________________________________________________________
2978 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2980 // based on ALR 0752/8
2983 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2985 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2986 - (fgkRadiusAminBTB+fgkBTBthick);
2987 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2988 fgkBTBthick/2., fgkBTBlength/2.);
2989 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2990 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2991 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2992 base1Tr->RegisterYourself();
2994 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2996 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2997 fgkBTBthick/2., fgkBTBlength/2.);
2998 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2999 fgkBTBaxisAtoBottom - base2width/2.,
3000 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
3001 base2Tr->RegisterYourself();
3003 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
3004 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
3005 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
3006 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
3007 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
3008 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
3009 sideTr1->RegisterYourself();
3010 sideTr2->RegisterYourself();
3012 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
3013 fgkBTBthick/2., fgkBTBHoleLength/2.);
3014 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
3015 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3016 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3017 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
3018 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
3019 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3020 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3021 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
3022 holeTr1->RegisterYourself();
3023 holeTr2->RegisterYourself();
3025 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
3026 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3027 fgkRadiusAminBTB, radiusAmaxBTB,
3028 fgkBTBlength/2., 0., 180.);
3029 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3030 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3031 fgkBTBlength/2., 270., 360.);
3032 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3033 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3035 roundTr1->RegisterYourself();
3037 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3038 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3039 fgkBTBlength/2., 180., 270.);
3040 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3041 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3043 roundTr2->RegisterYourself();
3045 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3046 "ITSsddBaseThermalBridgeShape",
3047 "ITSsddBTBbase1:ITSsddBTBtr1"
3048 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3049 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3050 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3051 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3052 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3053 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3054 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3055 "+ ITSsddBTBmainAxis");
3057 if(GetDebug(3)){// Remove compiler warning.
3058 base1->InspectShape();
3059 base2->InspectShape();
3060 side->InspectShape();
3061 hole->InspectShape();
3062 mainAxis->InspectShape();
3063 round1->InspectShape();
3064 round2->InspectShape();
3067 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3068 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3070 carbonFiberLadderStruct);
3072 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3073 return vBaseThermalBridge;
3077 //________________________________________________________________________
3078 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3080 // Return an assembly containing a end of a CF ladder.
3083 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3084 TGeoMedium *stesalite = GetMedium("G10FR4$");
3085 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3086 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3088 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3089 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3090 Double_t underSegDH = fLay3LadderUnderSegDH;
3091 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3092 // footDZ is also where to place the ruby's center in local Z
3093 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3096 } else if (iLay==4) {
3097 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3098 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3099 underSegDH = fLay4LadderUnderSegDH;
3100 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3101 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3103 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3107 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3108 + underSegDH/2); //space under ladder segment
3109 // here tDY is not the same as for the segment because the end ladder
3110 // does not have a space under it, inside the general ladder volume.
3111 Double_t segmentLength = fgkSegmentLength;
3112 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3114 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3116 //**********************************
3117 // coding real matter :
3118 //**********************************
3119 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3120 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3121 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3122 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3124 //--- The 3 V shape corners of the Carbon Fiber Ladder
3126 TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape",
3127 topCornerLength/2., halfTheta, -1,
3128 fgkLadderLa, fgkLadderHa, fgkLadderl);
3129 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1",
3130 cfLaddTop1,carbonFiberLadderStruct);
3131 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3132 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape",
3133 topCornerLength/2., halfTheta, 1,
3134 fgkLadderLa, fgkLadderHa, fgkLadderl);
3135 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3136 cfLaddTop2,carbonFiberLadderStruct);
3137 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3138 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3139 -(length-topCornerLength)/2.);
3140 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3141 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3144 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape",
3145 length/2., beta, -1,
3146 fgkLadderLb, fgkLadderHb, fgkLadderl);
3147 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3148 cfLaddSide1,carbonFiberLadderStruct);
3149 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3150 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape",
3152 fgkLadderLb, fgkLadderHb, fgkLadderl);
3153 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3154 cfLaddSide2,carbonFiberLadderStruct);
3155 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3156 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3157 TMath::Tan(beta) - fgkLadderBeamRadius );
3159 // because center of the triangle doesn't correspond to virtual vol. center
3160 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3161 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3162 alpha*TMath::RadToDeg());
3163 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3164 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3165 -alpha*TMath::RadToDeg());
3166 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3167 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3168 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3169 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3170 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3173 // Beams on the sides
3174 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3175 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3177 //Euler rotation : about Z, then new X, then new Z
3178 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3179 -beamPhiPrime*TMath::RadToDeg(), -90);
3180 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3181 beamPhiPrime*TMath::RadToDeg(), -90);
3182 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3183 beamPhiPrime*TMath::RadToDeg(), -90);
3184 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3185 -beamPhiPrime*TMath::RadToDeg(), -90);
3186 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3187 TMath::Tan(halfTheta),
3188 fgkLadderBeamRadius/2. + tDY,
3189 -length/2 + segmentLength/8, beamRot1);
3190 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3191 TMath::Tan(halfTheta),
3192 fgkLadderBeamRadius/2.+tDY,
3193 -length/2 + 3*segmentLength/8, beamRot2);
3194 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3195 TMath::Tan(halfTheta),
3196 fgkLadderBeamRadius/2.+tDY,
3197 -length/2 + segmentLength/8, beamRot3);
3198 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3199 TMath::Tan(halfTheta),
3200 fgkLadderBeamRadius/2. + tDY,
3201 -length/2+3*segmentLength/8, beamRot4);
3203 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3204 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3205 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3206 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3208 //--- Beams of the bottom
3209 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3211 /* Not there actually
3212 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3213 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3214 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3215 bottomBeam1, carbonFiberLadderStruct);
3216 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3218 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3219 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3220 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3221 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3223 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3224 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3225 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3226 bottomBeam2, carbonFiberLadderStruct);
3227 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3228 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3229 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3230 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3232 //**********************************
3233 //the cooling pipe supports
3234 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3235 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3237 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3238 (triangleHeight+triangleCPaxeDist/
3239 TMath::Sin(halfTheta)-coolPipeSuppH);
3241 if (fAddCoolingSyst) {
3242 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3243 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3244 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3245 -fgkLadderHeight/2.+ tDY +
3246 coolPipeSuppH+fgkLadderBeamRadius,
3247 -length/2., rotCPS1);
3248 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3249 -fgkLadderHeight/2.+ tDY +
3250 coolPipeSuppH+fgkLadderBeamRadius,
3251 -length/2., rotCPS2);
3253 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3254 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3257 //**********************************
3258 //--- The stesalite foot of the ladder
3260 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3261 - fgkLadFootY/2+fgkLadFingerPrintY;
3263 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3264 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3266 //=====================================
3269 if (fAddCoolingSyst) {
3271 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3272 -fgkLadderHeight/2.+ tDY +
3273 coolPipeSuppH + fgkLadderBeamRadius,
3274 -length/2.+coolPipeEndLen/2.);
3275 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3276 -fgkLadderHeight/2. + tDY +
3277 fgkLadderBeamRadius + coolPipeSuppH,
3278 -length/2.+coolPipeEndLen/2.);
3280 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3281 fgkCoolPipeOuterDiam/2,
3283 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3286 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3287 coolingPipeShape, phynoxSDD );
3288 coolingPipe->SetLineColor(fColorPhynox);
3289 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3292 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3293 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3295 virtualEnd->AddNode(cooler, 1, pipeTr1);
3296 virtualEnd->AddNode(cooler, 2, pipeTr2);
3300 //=====================================
3301 //--- HV cable guide
3304 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3305 fgkHVguideY1/2,fgkHVguideZ1/2);
3306 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3308 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3309 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3310 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3311 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3313 //=====================================
3315 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3316 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3317 -fgkLadderHeight/2.+ tDY +
3318 coolPipeSuppH+fgkLadderBeamRadius,
3319 -length/2.+coolPipeEndLen+raccordFullLen/2);
3320 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3321 -fgkLadderHeight/2.+ tDY +
3322 coolPipeSuppH+fgkLadderBeamRadius,
3323 -length/2.+coolPipeEndLen+raccordFullLen/2);
3325 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3326 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3328 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3333 //________________________________________________________________________
3334 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3336 //--- The stesalite foot of the ladder
3338 // The 2 screw holes on the left part
3339 // the small holes at each corner of the ruby cage (diam 2mm)
3340 // the really small level difference of 0.3mm on the bottom
3343 TGeoMedium *stesalite = GetMedium("G10FR4$");
3345 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3347 Double_t epsilon = 2e-10;
3348 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3350 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3351 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3352 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3353 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3355 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3356 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3357 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3360 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3361 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3363 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3364 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3365 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3367 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3368 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3369 rubyScrewHoleLen/2);
3371 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3372 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3373 fgkLadFootX/2-rubyScrewHoleLen/2,
3374 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3376 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3377 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3380 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3381 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3382 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3384 ladFootBox1Tr->RegisterYourself();
3385 ladFingerPrintTr->RegisterYourself();
3386 rubyCageHoleTr->RegisterYourself();
3387 rubyScrewHoleTr->RegisterYourself();
3388 rubyHoleTr->RegisterYourself();
3390 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3391 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3392 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3393 "+rubyHole:rubyHoleTr)");
3394 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3395 footRightPart,stesalite);
3396 vFootRightPart->SetLineColor(fColorStesalite);
3398 virtualFoot->AddNode(vFootRightPart, 1, 0);
3401 //--- This was the right part of the foot, now let's do the middle
3402 //--- and the right parts
3404 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3405 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3407 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3408 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3409 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3411 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3412 vFootMiddle->SetLineColor(fColorStesalite);
3413 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3416 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3417 (fgkLadFootY-fgkLadFingerPrintY)/2,
3419 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3420 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3421 -fgkLadFingerPrintY/2, 0);
3422 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3424 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3425 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3428 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3431 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3432 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3434 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3435 vFootLeft->SetLineColor(fColorStesalite);
3436 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3438 if(GetDebug(3)){ // Remove compiler warning.
3439 ladFingerPrint->InspectShape();
3440 ladFootBox1->InspectShape();
3441 rubyCageHole->InspectShape();
3442 rubyScrewHole->InspectShape();
3443 rubyHole->InspectShape();
3449 //________________________________________________________________________
3450 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3452 // return an assembly containing the CARLOS end-ladder board
3453 // and the heat bridge
3457 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3458 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3459 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3460 TGeoMedium *copper = GetMedium("COPPER$");
3461 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3462 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3464 //=========================================
3465 // cooling support of the Carlos card (HeatBridge):
3466 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3468 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3470 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3472 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3473 supCarlosBoard1, alCu12SDD);
3474 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3475 supCarlosBoard2, alCu12SDD);
3476 vSupCarlosBoard1->SetLineColor(4);
3477 vSupCarlosBoard2->SetLineColor(4);
3480 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3481 // shift of the main planes in the direction of their width
3482 // the center is fixed at the center of the 2 small fixing arms on each sides.
3485 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3486 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3487 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3488 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3490 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3491 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3494 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3498 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3499 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3501 //=========================================
3502 // fixing arm of the cooling support :
3503 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3505 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3506 supCarlosBoard3, alCu12SDD);
3507 vSupCarlosBoard3->SetLineColor(4);
3510 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3512 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3513 littleScrew, stainless);
3514 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3515 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3516 fgkLittleScrewHeadR-0.07, rotScrew);
3517 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3518 fgkLittleScrewHeadR+0.07, rotScrew);
3519 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3520 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3522 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3523 0, fgkCarlosSuppAngle, 0);
3524 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3525 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3526 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3527 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3528 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3529 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3532 //=========================================
3533 // screws fixing the board on the U tube
3534 Double_t aaa = fgkCarlosSuppY3; // ???
3535 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3536 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3537 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3538 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3539 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3540 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3542 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3544 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3545 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3546 screw1y,screw1z, CarlosSuppRot);
3548 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3549 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3550 screw1z,screw1y, CarlosSuppRot);
3552 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3553 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3554 screw1y,screw1z, CarlosSuppRot);
3556 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3557 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3558 screw1z,screw1y, CarlosSuppRot);
3560 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3561 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3562 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3563 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3565 //=========================================
3567 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3568 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3569 card1.SetNLayers(2);
3570 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3571 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3572 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3573 p1[0] = -fgkCarlosCardX1/2;
3574 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3575 p1[2] = fgkCarlosCardShift;
3576 p2[0] = fgkCarlosCardX1/2;
3577 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3578 p2[2] = fgkCarlosCardShift;
3579 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3580 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3581 card1.CreateAndInsertBoxCableSegment(1,90);
3583 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3584 card2.SetNLayers(2);
3585 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3586 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3587 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3589 p1[0] = -fgkCarlosCardX1/2;
3590 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3591 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3593 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3594 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3595 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3596 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3597 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3598 card2.CreateAndInsertBoxCableSegment(1,90);
3600 //=========================================
3601 // some chips on the board
3603 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3605 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3606 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3607 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3609 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3610 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3611 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3613 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3614 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3615 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3616 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3617 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3618 u1.CreateAndInsertBoxCableSegment(1,90);
3621 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3623 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3624 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3625 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3627 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3628 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3629 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3631 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3632 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3633 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3634 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3635 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3636 u2.CreateAndInsertBoxCableSegment(1,90);
3639 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3641 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3642 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3643 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3645 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3646 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3648 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3650 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3652 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3653 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3654 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3655 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3657 //--- U4 is like U3 (?)
3658 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3659 u4Trans->RotateX(90);
3660 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3661 fgkCarlosCardShift + fgkCarlosU4posZ);
3662 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3665 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3667 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3668 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3669 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3671 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3672 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3673 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3675 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3676 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3677 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3678 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3679 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3680 u17.CreateAndInsertBoxCableSegment(1,90);
3683 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3685 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3686 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3687 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3689 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3690 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3691 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3693 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3694 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3695 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3696 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3697 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3698 u35.CreateAndInsertBoxCableSegment(1,90);
3701 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3703 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3704 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3705 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3707 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3708 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3709 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3711 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3712 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3713 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3714 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3715 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3716 u36.CreateAndInsertBoxCableSegment(1,90);
3719 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3721 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3722 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3723 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3725 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3726 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3727 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3729 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3730 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3731 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3732 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3733 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3734 qz1.CreateAndInsertBoxCableSegment(1,90);
3736 return assemblySupCarlos;
3739 //________________________________________________________________________
3740 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3742 // Creates the assemblies containing the LV cards (left and right)
3745 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3746 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3747 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3748 TGeoMedium *copper = GetMedium("COPPER$");
3749 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3750 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3752 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3753 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3755 // we are going to use flat cable class to create multilayer box,
3756 // then we can use the pointers to created volumes to place them elsewhere
3757 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3759 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3760 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3761 cardLV.SetNLayers(2);
3762 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3763 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3764 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3766 p1[1] = fgkLVcardY/2;
3769 p2[1] = fgkLVcardY/2;
3771 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3772 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3773 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3774 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3775 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3776 fCardLVR->AddNode(boxVol, 1, trCard);
3778 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3779 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3780 chipO.SetNLayers(2);
3781 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3782 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3783 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3784 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3785 p1[1] = fgkLVChip0PosY;
3786 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3788 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3789 p2[1] = fgkLVChip0PosY;
3790 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3791 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3792 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3793 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3794 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3796 carLVfullThick/2+chip0fullThick/2, rotAdd);
3797 fCardLVR->AddNode(boxVol, 1, trCard);
3799 // put also this chip on the other side of the card
3800 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3802 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3803 fCardLVL->AddNode(boxVol, 2, trCard);
3804 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3806 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3807 fCardLVR->AddNode(boxVol, 2, trCard);
3809 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3810 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3811 chip1.SetNLayers(2);
3812 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3813 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3814 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3815 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3816 p1[1] = fgkLVChip1PosY;
3817 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3819 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3820 p2[1] = fgkLVChip1PosY;
3821 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3822 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3823 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3824 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3825 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3827 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3828 fCardLVR->AddNode(boxVol, 1, trCard);
3830 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3831 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3832 chip2.SetNLayers(2);
3833 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3834 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3835 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3836 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3837 p1[1] = fgkLVChip2PosY;
3838 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3839 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3840 p2[1] = fgkLVChip2PosY;
3841 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3842 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3843 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3844 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3845 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3847 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3848 fCardLVR->AddNode(boxVol, 1, trCard);
3850 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3851 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3852 chip3.SetNLayers(2);
3853 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3854 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3855 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3856 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3857 p1[1] = fgkLVChip3PosY;
3858 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3859 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3860 p2[1] = fgkLVChip3PosY;
3861 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3862 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3863 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3864 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3865 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3867 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3868 fCardLVR->AddNode(boxVol, 1, trCard);
3870 // the Al pieces for heat exchange :
3871 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3872 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3874 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3875 (fgkLVcoolX1/2+fgkLVcoolX2),
3876 fgkLVcoolPosY+fgkLVcoolY1/2,
3877 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3878 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3879 (fgkLVcoolX1/2+fgkLVcoolX2),
3880 fgkLVcoolPosY+fgkLVcoolY1/2,
3881 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3883 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3885 vAlLVcooling1->SetLineColor(2);
3888 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3889 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3890 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3892 fgkLVcoolPosY+fgkLVcoolY1/2,
3893 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3894 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3896 fgkLVcoolPosY+fgkLVcoolY1/2,
3897 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3899 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3901 vAlLVcooling2->SetLineColor(2);
3904 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3906 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3907 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3908 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3910 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3912 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3913 vAlLVcooling3->SetLineColor(2);
3915 //=== screw fixing th LV card to the U cooling tube :
3916 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3918 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3919 littleScrew, stainless);
3920 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3922 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3924 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3926 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3927 0, fgkLittleLVScrewHeadR,
3928 fgkLittleScrewHeadH/2);
3929 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3930 littleScrewHead, stainless);
3931 vLittleScrewHead->SetLineColor(kGray);
3932 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3933 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3934 fgkShiftLittleScrewLV,
3936 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3938 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3939 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3940 fgkShiftLittleScrewLV,
3942 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3944 // adding the cooling pieces to the left card
3945 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3946 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3947 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3948 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3949 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3951 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3952 -(fgkLVcoolX1/2+fgkLVcoolX2),
3953 fgkLVcoolPosY+fgkLVcoolY1/2,
3954 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3955 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3956 -(fgkLVcoolX1/2+fgkLVcoolX2),
3957 fgkLVcoolPosY+fgkLVcoolY1/2,
3958 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3959 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3961 fgkLVcoolPosY+fgkLVcoolY1/2,
3962 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3963 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3965 fgkLVcoolPosY+fgkLVcoolY1/2,
3966 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3968 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3970 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3972 // and to the right card
3973 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3974 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3975 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3976 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3977 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3982 //________________________________________________________________________
3983 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3985 // return an assembly containing the HV card
3989 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3990 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3991 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3992 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3993 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3994 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3996 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3998 //====================================
3999 //--- the card itself
4000 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
4001 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
4002 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
4003 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
4005 highVCard->AddNode(vCeramicCard, 1, 0);
4008 //====================================
4012 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
4013 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
4014 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
4017 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
4018 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
4019 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
4021 vCapa1End->SetLineColor(18);// grey silver
4022 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
4023 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4024 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
4025 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4027 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
4028 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
4029 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4031 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
4032 capa1->AddNode(vCapa1Middle, 1,0);
4033 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4034 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4036 highVCard->AddNode(capa1, 1, capa1PosTr);
4039 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4040 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4041 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4044 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4045 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4046 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4048 vCapa2End->SetLineColor(18);// grey silver
4049 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4050 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4051 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4052 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4054 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4055 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4056 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4058 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4059 capa2->AddNode(vCapa2Middle, 1,0);
4060 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4061 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4063 highVCard->AddNode(capa2, 1, capa2PosTr);
4066 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4067 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4068 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4071 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4072 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4073 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4075 vCapa3End->SetLineColor(18);// grey silver
4077 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4078 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4079 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4080 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4082 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4083 capa3->AddNode(vCapa3Middle, 1,0);
4084 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4085 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4087 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4088 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4089 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4091 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4092 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4093 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4095 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4096 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4097 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4099 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4100 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4101 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4103 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4104 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4105 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4107 highVCard->AddNode(capa3, 1, capa3PosTr1);
4108 highVCard->AddNode(capa3, 2, capa3PosTr2);
4109 highVCard->AddNode(capa3, 3, capa3PosTr3);
4110 highVCard->AddNode(capa3, 4, capa3PosTr4);
4111 highVCard->AddNode(capa3, 5, capa3PosTr5);
4113 //====================================
4114 //--- connexions to LV card
4116 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4117 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4118 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4119 Double_t fgkConnexLVHVx = 3*fgkmm;
4120 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4121 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4123 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4124 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4125 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4126 fgkConnexLVHVdiam1/2,
4127 fgkConnexLVHVdiam2/2,
4128 fgkConnexLVHVlen/2);
4129 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4130 connexLVHVmetal, stainless);
4131 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4132 connexLVHVplastic, plastic);
4133 vConnexLVHVmetal->SetLineColor(10);// white
4134 vConnexLVHVplast->SetLineColor(12); // dark grey
4136 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4137 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4138 connexion->AddNode(vConnexLVHVplast, 1, 0);
4140 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4141 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4142 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4143 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4145 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4146 fgkConnexLVHVy1+fgkConnexLVHVdy,
4147 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4148 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4149 fgkConnexLVHVy1+fgkConnexLVHVdy,
4150 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4152 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4153 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4154 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4155 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4156 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4157 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4159 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4160 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4161 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4162 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4163 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4164 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4166 highVCard->AddNode(connexion, 1, trConnexion1);
4167 highVCard->AddNode(connexion, 2, trConnexion2);
4168 highVCard->AddNode(connexion, 3, trConnexion3);
4169 highVCard->AddNode(connexion, 4, trConnexion4);
4170 highVCard->AddNode(connexion, 5, trConnexion5);
4171 highVCard->AddNode(connexion, 6, trConnexion6);
4172 highVCard->AddNode(connexion, 7, trConnexion7);
4173 highVCard->AddNode(connexion, 8, trConnexion8);
4175 //====================================
4176 //--- cooling pieces
4178 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4179 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4182 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4183 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4185 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4186 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4188 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4190 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4192 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4194 // This last volume contains the screw used for fixing
4195 // the card to the cooling tube ...
4196 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4198 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4199 littleScrewHV, stainless);
4201 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4202 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4204 vCardHVcool1->SetLineColor(2); //red
4205 vCardHVcool2->SetLineColor(2); //red
4206 vCardHVcool3->SetLineColor(2); //red
4208 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4209 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4210 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4211 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4212 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4213 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4214 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4215 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4217 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4218 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4220 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4221 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4222 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4223 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4225 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4226 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4227 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4228 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4230 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4231 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4233 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4234 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4235 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4236 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4238 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4239 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4240 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4241 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4243 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4244 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4246 //====================================
4248 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4249 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4250 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4251 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4253 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4254 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4255 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4256 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4259 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4260 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4266 //________________________________________________________________________
4267 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4269 // return an assembly containing the LV, HV and Carlos cards of one ladder
4270 // and their cooling system
4273 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4274 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4275 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4277 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4279 //=*********************************
4280 //--- The rounded pipe for the end ladder card coooling
4282 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4283 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4287 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4288 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4292 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4293 endLadderPipe.SetNLayers(2);
4294 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4295 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4297 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4298 // of the U colling pipe in its center
4300 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4301 Double_t vectA[3] = {0,0,1};
4303 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4304 Double_t vectB[3] = {0,0,1};
4306 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4307 Double_t vectC[3] = {1,0,0};
4309 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4310 Double_t vectD[3] = {-1,0,0};
4312 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4313 Double_t vectE[3] = {0,0,-1};
4315 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4316 Double_t vectF[3] = {0,0,-1};
4318 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4319 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4320 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4321 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4322 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4323 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4325 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4326 //endLadderPipe.CreateAndInsertCableSegment( 1);
4327 endLadderPipe.CreateAndInsertTubeSegment( 1);
4328 //endLadderPipe.CreateAndInsertCableSegment( 2);
4329 endLadderPipe.CreateAndInsertTorusSegment( 2);
4330 //endLadderPipe.CreateAndInsertCableSegment( 3);
4331 endLadderPipe.CreateAndInsertTubeSegment( 3);
4332 //endLadderPipe.CreateAndInsertCableSegment( 4);
4333 endLadderPipe.CreateAndInsertTorusSegment( 4);
4334 //endLadderPipe.CreateAndInsertCableSegment( 5);
4335 endLadderPipe.CreateAndInsertTubeSegment( 5);
4337 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4338 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4339 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4340 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4342 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4343 - fgkEndLadPipeArmBoxDX,
4344 fgkEndLadPipeArmBoxDY,0);
4345 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4346 fgkEndLadPipeArmBoxDX,
4347 fgkEndLadPipeArmBoxDY,0);
4348 endLadPipeArmBoxDY1->RegisterYourself();
4349 endLadPipeArmBoxDY2->RegisterYourself();
4351 if(GetDebug(3)) { // Remove compiler warning.
4352 endLadPipeArmBox->InspectShape();
4353 endLadPipeArmTube->InspectShape();
4356 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4357 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4358 "- endLadPipeArmTube");
4359 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4360 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4361 "- endLadPipeArmTube");
4363 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4364 endLadPipeArm1, alCu12SDD);
4365 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4366 endLadPipeArm2, alCu12SDD);
4367 vEndLadPipeArm1->SetLineColor(2);
4368 vEndLadPipeArm2->SetLineColor(2);
4370 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4371 +fgkEndLadPipeArmZpos);
4373 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4374 -fgkEndLadPipeUwidth/2,0,armZ);
4375 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4376 fgkEndLadPipeUwidth/2,0,armZ);
4378 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4379 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4381 //=*********************************
4383 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4384 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4386 Double_t spaceBetweenCards = 0.2*fgkmm;
4388 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4389 +fgkEndLadPipeArmBoxDX);
4390 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4391 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4393 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4396 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4397 +coolUzPos+1.25*fgkmm;
4398 // Position in z of the first LVB with respect to the start of the cooling
4399 // rectangular arm, coming (from inside of the ladder)
4400 // The cards are added one after the other
4402 for (Int_t iCard=0; iCard<nCards; iCard++) {
4404 Double_t cardLVzShift = firstLVCardZ +
4405 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4407 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4408 cardLVyShift, cardLVzShift);
4409 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4410 cardLVyShift, cardLVzShift);
4412 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4413 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4416 //=*********************************
4418 TGeoVolumeAssembly *cardHV = fCardHV;
4420 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4421 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4423 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4424 -(fgkHVCardCeramZ)/2);
4426 for (Int_t iCard=0; iCard<nCards; iCard++) {
4428 Double_t fact = iCard*2.+1.;
4429 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4430 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4431 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4432 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4435 //=*********************************
4438 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4439 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4440 // 0, -fgkCarlosSuppAngle, 0);
4442 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4443 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4444 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4445 // position in z of the first Carlos board, coming from inside of the ladder
4447 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4448 fgkEndLadPipeArmBoxDY);
4450 for (Int_t iCard=0; iCard<nCards; iCard++) {
4452 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4453 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4454 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4455 (TGeoRotation*) fCommonTr[0]);
4457 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4460 return endLadderCards;
4464 //________________________________________________________________________
4465 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4467 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4468 // and their cooling system
4469 // This is the code actually used for the end ladder cards
4472 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4473 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4474 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4475 TGeoMedium *copper = GetMedium("COPPER$");
4476 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4477 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4478 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
4479 TGeoMedium *polyurethane = GetMedium("POLYURETHANE$");
4481 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4482 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4484 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4485 Double_t deltaZcables = 0;
4486 // reference radius corresponding to local y=0
4489 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4490 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4492 rREF = fgkEndLaddCardsShortRadiusLay4;
4493 deltaZcables = 2.8*fgkmm;
4496 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4497 +fgkEndLadPipeArmBoxDX);
4498 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4499 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4501 Double_t rMin = rREF + cardLVyShift;
4502 // (The LV card is defining rMin because it is the lower object)
4504 Double_t thickTotCable = 0.5;
4506 //==================================
4507 //--- The Pcon container
4509 // minimum angle of the Pcon :
4510 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4511 (rREF-fgkEndLadPipeArmY/2) );
4512 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4513 Double_t phi0 = 90-dphi/2;
4514 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4515 // of the U colling pipe in its center
4516 Double_t zMax = endLadPipeUlength+coolUzPos;
4517 Double_t rMax = rMin + fgkLVcardY;
4518 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4519 Double_t cablesRadius = rMax-0.5;
4521 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4522 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4523 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4524 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4525 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4526 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4527 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4528 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4529 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4530 // the following is quite dirty but works for the moment ...
4531 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4532 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4534 // The next parameters define the shape of the Pcon at its end and where cables
4536 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4537 Double_t cableSectionR2 = rMax;
4538 Double_t cableSectionZ1 = zMax + 23.6*fgkmm + 3.0*fgkcm + deltaZcables;
4539 Double_t cableSectionZ2 = zMax + 23.6*fgkmm + 4.0*fgkcm + deltaZcables;
4540 // Those numbers are to be fixed to stick the maximum to the SDD cone
4541 // (hardcoded numbers are ugly, but it's easier to find where to stop)
4543 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4544 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4546 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4547 //endLadderCards->SetVisibility(kFALSE);
4549 //=*********************************
4550 //--- The rounded pipe for the end ladder card cooling
4552 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4553 endLadderPipe.SetNLayers(2);
4554 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4555 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4557 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4558 Double_t vectA[3] = {0,0,1};
4560 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4561 Double_t vectB[3] = {0,0,1};
4563 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4564 Double_t vectC[3] = {1,0,0};
4566 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4567 Double_t vectD[3] = {-1,0,0};
4569 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4570 Double_t vectE[3] = {0,0,-1};
4572 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4573 Double_t vectF[3] = {0,0,-1};
4575 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4576 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4577 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4578 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4579 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4580 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4582 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4583 //endLadderPipe.CreateAndInsertCableSegment( 1);
4584 endLadderPipe.CreateAndInsertTubeSegment( 1);
4585 //endLadderPipe.CreateAndInsertCableSegment( 2);
4586 endLadderPipe.CreateAndInsertTorusSegment( 2);
4587 //endLadderPipe.CreateAndInsertCableSegment( 3);
4588 endLadderPipe.CreateAndInsertTubeSegment( 3);
4589 //endLadderPipe.CreateAndInsertCableSegment( 4);
4590 endLadderPipe.CreateAndInsertTorusSegment( 4);
4591 //endLadderPipe.CreateAndInsertCableSegment( 5);
4592 endLadderPipe.CreateAndInsertTubeSegment( 5);
4594 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4595 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4596 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4597 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4599 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4600 - fgkEndLadPipeArmBoxDX,
4601 fgkEndLadPipeArmBoxDY,0);
4602 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4603 fgkEndLadPipeArmBoxDX,
4604 fgkEndLadPipeArmBoxDY,0);
4605 endLadPipeArmBoxDY1->RegisterYourself();
4606 endLadPipeArmBoxDY2->RegisterYourself();
4608 if(GetDebug(3)) { // Remove compiler warning.
4609 endLadPipeArmBox->InspectShape();
4610 endLadPipeArmTube->InspectShape();
4613 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4614 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4615 "- endLadPipeArmTube");
4616 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4617 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4618 "- endLadPipeArmTube");
4620 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4621 endLadPipeArm1, alCu12SDD);
4622 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4623 endLadPipeArm2, alCu12SDD);
4624 vEndLadPipeArm1->SetLineColor(2);
4625 vEndLadPipeArm2->SetLineColor(2);
4627 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4628 +fgkEndLadPipeArmZpos);
4630 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4631 -fgkEndLadPipeUwidth/2,rREF,armZ);
4632 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4633 fgkEndLadPipeUwidth/2,rREF,armZ);
4635 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4636 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4638 //=*********************************
4640 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4641 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4643 Double_t spaceBetweenCards = 0.2*fgkmm;
4646 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4649 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4650 +coolUzPos+1.25*fgkmm;
4651 // Position in z of the first LVB with respect to the start of the cooling
4652 // rectangular arm, coming (from inside of the ladder)
4653 // The cards are added one after the other
4655 for (Int_t iCard=0; iCard<nCards; iCard++) {
4657 Double_t cardLVzShift = firstLVCardZ +
4658 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4660 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4661 cardLVyShift+rREF, cardLVzShift);
4662 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4663 cardLVyShift+rREF, cardLVzShift);
4665 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4666 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4669 //=*********************************
4671 TGeoVolumeAssembly *cardHV = fCardHV;
4673 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4674 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4675 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4677 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4678 -(fgkHVCardCeramZ)/2);
4680 for (Int_t iCard=0; iCard<nCards; iCard++) {
4682 Double_t fact = iCard*2.+1.;
4683 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4684 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4685 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4686 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4689 //=*********************************
4692 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4693 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4694 // 0, -fgkCarlosSuppAngle, 0);
4696 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4697 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4698 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4699 // position in z of the first Carlos board, coming from inside of the ladder
4701 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4702 fgkEndLadPipeArmBoxDY);
4704 for (Int_t iCard=0; iCard<nCards; iCard++) {
4706 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4707 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4708 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4709 (TGeoRotation*) fCommonTr[0]);
4711 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4715 //=*********************************
4719 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4720 + fgkSectionGlassPerMod)*nCards
4721 + fgkSectionCoolPolyuEL + fgkSectionCoolWaterEL;
4722 // We fix thickness, then width is calculated accordingly
4723 Double_t width = sectionV/thickTotCable;
4724 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4725 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4726 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4727 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4728 Double_t thickGlass = thickTotCable*fgkSectionGlassPerMod
4729 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4731 Double_t thickCoolPolyu = thickTotCable*fgkSectionCoolPolyuEL
4732 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4733 Double_t thickCoolWater = thickTotCable*fgkSectionCoolWaterEL
4734 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4736 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4737 cable.SetNLayers(5);
4738 cable.SetLayer(0, thickCu, copper, kRed);
4739 cable.SetLayer(1, thickPlast, plastic, kYellow);
4740 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4741 cable.SetLayer(3, thickCoolPolyu, polyurethane, kGray);
4742 cable.SetLayer(4, thickCoolWater, coolerMediumSDD, kBlue);
4744 Double_t zVect[3]={0,0,1};
4745 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4746 +spaceBetweenCarlsoCards)/2 + 2.9;
4747 // the 2.9cm is for taking into account carlos card angle...
4749 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4750 cableSectionR2,cableSectionZ1,cableSectionZ2);
4752 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4753 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4754 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4755 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4756 cable.SetInitialNode(endLadderCards);
4757 cable.CreateAndInsertCableSegment(1);
4760 TGeoTorus *earthShape = new TGeoTorus(rMax-fgkEndLadderEarthCableR,
4761 0., fgkEndLadderEarthCableR,
4762 phi0, dphi); // same as containerShape
4764 TGeoVolume *earthCable = new TGeoVolume("SDDcableEndLadderEarthCable",
4765 earthShape, copper);
4767 endLadderCards->AddNode(earthCable, 1,
4768 new TGeoTranslation(0, 0, fgkDistEndLaddCardsLadd+1));
4770 return endLadderCards;
4773 //________________________________________________________________________
4774 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4776 // return an assembly of the support rings, attaching the ladders to the cone
4782 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4783 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4786 //**********************************
4789 Double_t fgkRubyCageX = 9*fgkmm;
4790 Double_t fgkRubyCageY = 5.5*fgkmm;
4791 Double_t fgkRubyCageZ = 8*fgkmm;
4792 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4793 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4794 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4795 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4796 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4798 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4801 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4803 // pieces common to both square and V cages
4804 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4805 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4807 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4808 fgkRubyCageHoleDX/2+epsilon);
4810 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4811 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4812 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4813 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4814 trScrewHole->RegisterYourself();
4816 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4817 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4818 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4819 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4820 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4821 trScrewHoleFoot->RegisterYourself();
4824 // pieces which differ
4825 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4827 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4828 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4830 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4831 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4832 trRubyCageVInternBox->RegisterYourself();
4834 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4835 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4836 fgkRubyCageInternSide/4);
4838 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4839 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4840 +epsilon,0,0, rotV );
4841 trRubyCageVInternTriangl->RegisterYourself();
4844 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4845 "rubyCageBox-(rubyCageInternBox"
4846 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4848 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4849 rubyCageSquare, stainless);
4850 vRubyCageSquare->SetLineColor(10);
4852 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4853 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4854 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4855 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4856 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4857 vRubyCageV->SetLineColor(10);
4859 if(GetDebug(3)) { // Remove compiler warning.
4860 rubyCageBox->InspectShape();
4861 rubyCageInternBox->InspectShape();
4862 screwHole->InspectShape();
4863 screwHoleFoot->InspectShape();
4864 rubyCageVInternBox->InspectShape();
4865 rubyCageVInternTriangl->InspectShape();
4868 supportRing->AddNode(vRubyCageSquare, 0, 0);
4869 //supportRing->AddNode(vRubyCageV, 0, 0);
4875 //________________________________________________________________________
4876 void AliITSv11GeometrySDD::CreateSDDsensor() {
4878 // return a box containing the SDD sensor
4881 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4882 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4883 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4884 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4885 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4886 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4889 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4890 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4891 // width : in the beam direction !
4893 Double_t sensoxBoxLength = ( fgkWaferLength +
4894 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4895 // Makes life easier to include the space for the WA HV cable on both sides
4896 Double_t sensoxBoxThick = fgkWaferThickness +
4897 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4899 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4900 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4902 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4903 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4905 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4906 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4909 //****************************
4911 //****************************
4913 // we need 2 different sensor objects, because they have to have different names
4914 // This is required for the step manager
4916 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4917 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4920 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4921 wafer3->SetLineColor(fColorSilicon);
4922 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4923 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4924 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4925 sensVol3->SetLineColor(fColorSilicon+5);
4926 wafer3->AddNode(sensVol3, 1, 0);
4927 fSDDsensor3->AddNode(wafer3, 1, 0);
4929 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4930 wafer4->SetLineColor(fColorSilicon);
4931 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4932 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4933 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4934 sensVol4->SetLineColor(fColorSilicon+5);
4935 wafer4->AddNode(sensVol4, 1, 0);
4936 fSDDsensor4->AddNode(wafer4, 1, 0);
4939 //****************************
4941 //****************************
4942 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4943 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4944 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4945 vGlass->SetLineColor(fColorGlass);
4946 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4947 fgkWaferThickness/2+fgkSensorGlassLY/2,
4948 fgkGlassDZOnSensor);
4949 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4950 fgkWaferThickness/2+fgkSensorGlassLY/2,
4951 fgkGlassDZOnSensor);
4952 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4953 fgkWaferThickness/2+fgkSensorGlassLY/2,
4954 -fgkGlassDZOnSensor);
4955 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4956 fgkWaferThickness/2+fgkSensorGlassLY/2,
4957 -fgkGlassDZOnSensor);
4958 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4959 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4960 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4961 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4963 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4964 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4965 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4966 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4968 //****************************
4969 // Wrap-around cable
4970 //****************************
4972 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4973 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4974 waHVCable.SetNLayers(2);
4975 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4976 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4977 waHVCable.SetInitialNode(fSDDsensor3);
4979 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4980 x1[0] = -fgkWaHVcableLength/2;
4982 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4984 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4987 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4988 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4989 TGeoCombiTrans *ctSegment = 0;
4990 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4991 fSDDsensor4->AddNode(segment, 1, ctSegment);
4995 waHVCable.SetName("ITSsddWaHVCableD");
4996 waHVCable.ResetPoints();
4997 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4998 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4999 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
5000 fSDDsensor4->AddNode(segment, 1, ctSegment);
5002 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
5004 waHVCableFold.SetPhi(180,360);
5005 waHVCableFold.SetNLayers(2);
5006 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
5007 polyhamideSDD, fColorPolyhamide);
5008 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
5009 waHVCableFold.SetInitialNode(fSDDsensor3);
5012 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
5014 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5015 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5016 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
5017 fSDDsensor4->AddNode(segment, 1, ctSegment);
5020 //****************************
5022 //****************************
5023 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
5024 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
5025 /(2.*fgkTransitHVHeadLZ);
5026 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
5027 headRadius-fgkTransitHVHeadLZ)
5030 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
5031 fgkTransitHVPolyThick/2,
5033 headPoly->SetName("headPoly");
5034 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
5035 -fgkTransitHVPolyThick/2);
5036 headPolyTr->SetName("headPolyTr");
5037 headPolyTr->RegisterYourself();
5039 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
5040 fgkTransitHVAlThick/2,
5042 headAl->SetName("headAl");
5043 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
5044 -fgkTransitHVPolyThick
5045 -fgkTransitHVAlThick/2);
5046 headAlTr->SetName("headAlTr");
5047 headAlTr->RegisterYourself();
5049 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
5050 (headRadius-fgkTransitHVHeadLZ)/2,
5051 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
5052 cache->SetName("cache");
5054 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5055 (headRadius-fgkTransitHVHeadLZ)/2,
5056 -(fgkTransitHVPolyThick
5057 +fgkTransitHVAlThick)/2);
5058 headCacheTr->SetName("cacheTr");
5059 headCacheTr->RegisterYourself();
5061 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5062 "headPoly:headPolyTr-cache:cacheTr");
5063 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5064 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5065 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5066 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5067 "headAl:headAlTr-cache:cacheTr");
5068 TGeoVolume *vHeadAlComp = new TGeoVolume(
5069 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5070 vHeadAlComp->SetLineColor(fColorAl);
5073 // TGeoRotation rotHead("",0,90,0);
5074 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5075 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5077 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5078 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5079 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5082 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5083 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5084 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5085 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5088 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5089 fgkTransitHVBondingLZ,
5090 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5091 transitHVCable.SetNLayers(2);
5092 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5094 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5095 transitHVCable.SetInitialNode(fSDDsensor3);
5097 x1[0] = -fgkTransitHVHeadLX/2;
5099 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5103 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5104 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5105 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5106 fSDDsensor4->AddNode(segment, 1, ctSegment);
5108 transitHVCable.ResetPoints();
5109 transitHVCable.SetName("ITSsddHVtransitTail");
5110 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5111 x1[0] = fgkTransitHVtailXpos;
5112 x2[0] = fgkTransitHVtailXpos;
5113 x1[2] = -fgkTransitHVBondingLZ/2;
5114 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5115 Double_t vZ[3] = {0,0,1};
5116 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5117 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5118 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5119 fSDDsensor4->AddNode(segment, 1, ctSegment);
5122 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5123 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5124 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5125 fgkTransitHVsideLZ);
5126 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5127 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5128 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5129 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5130 fgkTransitHVsideLZ);
5131 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5132 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5134 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5135 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5136 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5137 fgkTransitHVsideLZ);
5138 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5139 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5140 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5141 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5142 fgkTransitHVsideLZ);
5143 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5144 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5146 // sideRight is not there actually
5147 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5148 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5149 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5150 // fgkTransitHVsideLZ);
5151 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5152 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5153 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5154 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5155 // fgkTransitHVsideLZ);
5156 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5157 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5159 // TGeoRotation rotSide("",0,-90,0);
5160 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5161 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5162 // -fgkTransitHVBondingLZ/2,&rotSide);
5163 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5164 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5165 // -fgkTransitHVBondingLZ/2, &rotSide);
5166 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5167 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5168 // -fgkTransitHVBondingLZ/2, &rotSide);
5169 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5170 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5171 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5172 // -fgkTransitHVBondingLZ/2,rotSide);
5173 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5174 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5175 -fgkTransitHVBondingLZ/2, rotSide);
5176 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5177 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5178 -fgkTransitHVBondingLZ/2, rotSide);
5180 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5181 sideLeft,polyhamideSDD);
5182 vSideLeft->SetLineColor(fColorPolyhamide);
5183 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5185 vSideLeftAl->SetLineColor(fColorAl);
5187 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5188 // sideRight,polyhamideSDD);
5189 // vSideRight->SetLineColor(fColorPolyhamide);
5191 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5192 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5193 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5195 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5196 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5197 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5200 //****************************
5202 fSDDsensor3->CheckOverlaps(0.01);
5203 fSDDsensor4->CheckOverlaps(0.01);
5206 fSDDsensor3->SetVisibility(kFALSE);
5207 fSDDsensor4->SetVisibility(kFALSE);
5211 //________________________________________________________________________
5212 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5214 // return a box volume containing the detectors
5217 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5219 Int_t nDetectors = fgkLay3Ndet;
5220 Double_t ladderLength = fgkLay3LadderLength;
5221 Double_t *sensorZPos = fLay3sensorZPos;
5225 nDetectors = fgkLay4Ndet;
5226 ladderLength = fgkLay4LadderLength;
5227 sensorZPos = fLay4sensorZPos;
5229 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5233 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5234 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5236 sprintf(name,"ITSsddDetBox%i",iLay);
5237 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5238 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5239 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5241 for (Int_t i=0; i<nDetectors; i++) {
5242 Double_t localZ = sensorZPos[i];
5243 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5244 if (iLay==3) if (i%2!=0) localY = -localY;
5245 if (iLay==4) if (i%2==0) localY = -localY;
5246 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5248 if (i >= nDetectors/2) {
5249 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5250 sensorPos->SetName(name);
5251 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5254 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5255 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5257 sensorPos->SetName(name);
5258 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5262 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5263 virtualDet->SetVisibility(kFALSE);
5268 //________________________________________________________________________
5269 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5271 // return a box volume containing the detectors
5274 Int_t nDetectors = fgkLay3Ndet;
5275 Double_t ladderLength = fgkLay3LadderLength;
5276 Double_t *sensorZPos = fLay3sensorZPos;
5277 TGeoVolume *sensorSDD = fSDDsensor3;
5281 nDetectors = fgkLay4Ndet;
5282 ladderLength = fgkLay4LadderLength;
5283 sensorZPos = fLay4sensorZPos;
5284 sensorSDD = fSDDsensor4;
5286 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5290 sprintf(name,"ITSsddDetBox%i",iLay);
5292 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5294 for (Int_t i=0; i<nDetectors; i++) {
5295 Double_t localZ = sensorZPos[i];
5296 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5297 if (iLay==3) if (i%2!=0) localY = -localY;
5298 if (iLay==4) if (i%2==0) localY = -localY;
5299 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5301 if (i >= nDetectors/2) {
5302 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5303 sensorPos->SetName(name);
5304 virtualDet->AddNode(sensorSDD, i, sensorPos);
5307 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5308 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5310 sensorPos->SetName(name);
5311 virtualDet->AddNode(sensorSDD, i, sensorPos);
5315 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5320 //________________________________________________________________________
5321 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssemblyLadd2() {
5323 // return a box volume containing the detectors
5324 // Special case for Layer 3 Ladder 2 which is rotated (cannot simply
5325 // rotate the standard volume, because the module numbering would be wrong)
5326 // M.Sitta 25 Nov 2009
5329 Int_t nDetectors = fgkLay3Ndet;
5330 Double_t *sensorZPos = fLay3sensorZPos;
5331 TGeoVolume *sensorSDD = fSDDsensor3;
5334 sprintf(name,"ITSsddDetBoxLadd2");
5336 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5338 for (Int_t i=0; i<nDetectors; i++) {
5339 Double_t localZ = (-1.)*sensorZPos[nDetectors-1-i];
5340 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5341 if (i%2==0) localY = -localY;
5342 sprintf(name, "ITSsddLayLadd2SensorPos%i", i);
5344 if (i >= nDetectors/2) {
5345 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5346 sensorPos->SetName(name);
5347 virtualDet->AddNode(sensorSDD, i, sensorPos);
5350 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5351 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5353 sensorPos->SetName(name);
5354 virtualDet->AddNode(sensorSDD, i, sensorPos);
5358 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5363 //________________________________________________________________________
5364 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5367 // export the geometry in a AliITSgeom object
5372 printf("error:Try to fill null (AliITSgeom *) object");
5376 printf("error:Try to set sensor geometry while geometry is not defined\n");
5380 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5381 fgkWaferLengthSens/2.};
5382 if(!(geom->IsShapeDefined(kSDD)))
5383 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5386 char ladderName[30];
5387 char sensorName[30];
5388 char senstivName[30];
5389 const Int_t kNLay = 2;
5390 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5391 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5394 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5396 Int_t firstSDDmod = startMod;
5397 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5398 /////////////////////////////////////////
5399 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5400 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5402 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5403 TGeoVolume *layVolume = layNode->GetVolume();
5404 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5406 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5407 /////////////////////////////////////////
5408 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5409 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5411 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5412 TGeoVolume *laddVolume = laddNode->GetVolume();
5413 TGeoHMatrix laddMatrix(layMatrix);
5414 laddMatrix.Multiply(laddNode->GetMatrix());
5416 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5417 /////////////////////////////////////////
5418 sprintf(sensorName, "ITSsddSensor_%i",iDet);
5419 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5421 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5422 TGeoVolume *detVolume = detNode->GetVolume();
5423 TGeoHMatrix detMatrix(laddMatrix);
5424 detMatrix.Multiply(detNode->GetMatrix());
5426 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5428 TGeoVolume *wafVolume = wafNode->GetVolume();
5429 TGeoHMatrix wafMatrix(detMatrix);
5430 detMatrix.Multiply(wafNode->GetMatrix());
5431 //--------------------------------------------------------
5432 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5433 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5435 TGeoHMatrix sensMatrix(wafMatrix);
5436 sensMatrix.Multiply(sensitivNode->GetMatrix());
5438 // Sticking to the convention for local wafer coordinate
5440 if (iDet >= kNDet[iLay]/2) {
5441 // TGeoRotation rotY("",0,180,0);
5442 TGeoRotation rotY("",-180,-180,0);
5443 sensMatrix.Multiply(&rotY);
5445 // Creating the matrix in AliITSgeom for
5446 // this sensitive volume :
5447 Double_t *trans = sensMatrix.GetTranslation();
5448 Double_t *r = sensMatrix.GetRotationMatrix();
5449 Double_t rot[10] = {r[0],r[1],r[2],
5451 r[6],r[7],r[8], 1.0};
5452 //rot[9]!=0.0 => not a unity matrix
5453 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5455 // iLadd+1, iDet+1 because ladd. and det. start at +1
5460 printf("Error (ExportSensorGeometry) %s not found !\n",
5463 printf("Error (ExportSensorGeometry) %s not found !\n",
5466 printf("Error (ExportSensorGeometry) %s not found !\n",
5470 printf("Error (ExportSensorGeometry) %s not found !\n",
5474 printf("Error (ExportSensorGeometry) %s not found !\n",
5478 return (startMod-firstSDDmod);
5482 //________________________________________________________________________
5483 Int_t AliITSv11GeometrySDD::
5484 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5486 // Function which gives the layer, ladder and det.
5487 // index of the current volume. To be used in
5488 // AliITS::StepManager()
5491 if (gGeoManager->GetLevel()<3) return kFALSE;
5492 // Get the det index :
5493 TGeoNode *node = gGeoManager->GetMother(2);
5494 if (!node) return kFALSE;
5495 det = node->GetNumber()+1;
5497 // Get the ladder index :
5498 node = gGeoManager->GetMother(3);
5499 if (!node) return kFALSE;
5500 ladd = node->GetNumber()+1;
5502 // Get the layer index :
5503 if (node->GetNdaughters()==fgkLay3Ndet)
5504 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5511 //________________________________________________________________________
5512 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5513 Double_t r2max, Double_t z2,
5514 Double_t section, Int_t nDiv)
5516 // Creates a cone along z where the section is approximately constant
5517 // with z. This is for simulation of cables, because a cone with a constant
5518 // radius difference would show a quantity of matter increasing with z...
5519 // The max radius of the created Pcon is evolving linearly, the min radius
5520 // is calculated at several steps (nDiv).
5521 // z2 > z1 (required by the Pcon)
5523 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5525 Double_t dr = (r2max-r1max)/nDiv;
5526 Double_t dz = (z2-z1)/nDiv;
5527 Double_t r1minI, r2minI, r1maxI, r2maxI;
5530 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5531 Double_t cosAlpha = (z2-z1)/lZ;
5533 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5534 myPcon->DefineSection(0, z1, r1minI, r1max);
5536 for (Int_t i=0; i<nDiv; i++) {
5540 r1maxI = r1max + i*dr;
5541 r2maxI = r1maxI + dr;
5543 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5544 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5550 //________________________________________________________________________
5551 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5552 Double_t refZ1, Double_t refZ2) {
5553 // just a helping function
5554 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5557 //________________________________________________________________________
5558 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5559 Int_t nLay3, Int_t nLay4,
5560 Double_t r1, Double_t z1,
5561 Double_t r2, Double_t z2) {
5563 // Create some cables portions from SDD modules grouped
5564 // and attached at the border of the SSD cone
5566 TGeoMedium *copper = GetMedium("COPPER$");
5567 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5568 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5570 char titleCable[30];
5571 sprintf(titleCable,"cableSDDport%i",(Int_t)angle);
5574 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5575 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5576 Double_t width = section/thickness;
5577 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5578 +fgkSectionGlassPerMod);
5580 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5581 +fgkSectionGlassPerMod);
5583 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5584 +fgkSectionGlassPerMod);
5586 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5587 Double_t cosAlpha = (z2-z1)/hypothenus;
5588 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5589 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5590 angle *= TMath::DegToRad();
5591 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5592 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5593 Double_t pos1[3] = {x1,y1,z1};
5594 Double_t pos2[3] = {x2,y2,z2};
5595 Double_t zVect[3] = {0,0,1};
5597 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5598 cable.SetNLayers(3);
5599 cable.SetLayer(0, thickPlast, plastic, kYellow);
5600 cable.SetLayer(1, thickCu, copper, kRed);
5601 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5603 cable.AddCheckPoint( mother, 0, pos1, zVect );
5604 cable.AddCheckPoint( mother, 1, pos2, zVect );
5605 cable.SetInitialNode(mother);
5606 cable.CreateAndInsertCableSegment(1);
5613 //________________________________________________________________________
5614 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth)
5617 // Creates and inserts the SDD cables running on SDD and SSD cones
5620 // moth : the TGeoVolume owing the volume structure
5623 // Created: ??? Ludovic Gaudichet
5624 // Updated: 15 Mar 2008 Mario Sitta
5625 // Updated: 14 Apr 2008 Mario Sitta Overlap fixes
5626 // Updated: 09 May 2008 Mario Sitta SSD overlap fixes
5629 TGeoMedium *copper = GetMedium("COPPER$");
5630 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5631 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5632 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5635 //==================================
5637 //==================================
5639 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5640 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5642 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5643 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5644 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5646 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5647 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5648 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5650 // Do not use hardcoded numbers, get them from real shapes - M.S. 15/03/08
5651 TGeoVolume *sddCone = gGeoManager->GetVolume("SDDCarbonFiberCone");
5652 TGeoPcon *sddConeShape = (TGeoPcon*)sddCone->GetShape();
5654 TGeoVolume *sddCylinder = gGeoManager->GetVolume("SDDCarbonFiberCylinder");
5655 TGeoTube *sddCylinderShape = (TGeoTube*)sddCylinder->GetShape();
5657 // (were fgkConeSDDr1, fgkConeSDDr2, fgkConeSDDz1, fgkConeSDDz2 hardcoded)
5658 Double_t coneSDDr1 = sddConeShape->GetRmin(5);
5659 Double_t coneSDDr2 = sddConeShape->GetRmin(3);
5661 Double_t coneSDDz1 = sddConeShape->GetZ(9) - sddConeShape->GetZ(5) +
5662 sddCylinderShape->GetDz();
5663 Double_t coneSDDz2 = sddConeShape->GetZ(9) - sddConeShape->GetZ(3) +
5664 sddCylinderShape->GetDz();
5666 // Calculate z1, z2 thanks to R1 and R2
5667 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, coneSDDr1, coneSDDr2,
5668 coneSDDz1, coneSDDz2);
5669 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, coneSDDr1, coneSDDr2,
5670 coneSDDz1, coneSDDz2);
5671 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, coneSDDr1, coneSDDr2,
5672 coneSDDz1, coneSDDz2);
5674 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5676 //==================================
5677 // first set of cones : cables from layer 3
5678 //==================================
5680 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5681 fgkSDDCableR2, sddCableZ2,
5682 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5684 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5685 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0),
5686 pcon1all->GetRmax(0));
5688 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5689 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax,
5690 pcon1all->GetRmax(1));
5692 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container",
5693 pcon1container, airSDD);
5694 vpcon1container->SetVisibility(kFALSE);
5696 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5697 fgkSDDCableR2, sddCableZ2,
5698 sectionLay3Plastic, 3);
5700 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast",
5701 pcon1plast, plastic);
5702 vpcon1plast->SetLineColor(kYellow);
5703 vpcon1container->AddNode(vpcon1plast, 0);
5705 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5706 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5707 fgkSDDCableR2 - dr1a, sddCableZ2,
5710 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu",
5712 vpcon1Cu->SetLineColor(kRed);
5713 vpcon1container->AddNode(vpcon1Cu, 0);
5715 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5716 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5717 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5718 sectionLay3Glass, 3);
5720 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass",
5721 pcon1glass, opticalFiber);
5722 vpcon1glass->SetLineColor(kGreen);
5723 vpcon1container->AddNode(vpcon1glass, 0);
5725 moth->AddNode(vpcon1container, 1);
5726 moth->AddNode(vpcon1container, 2, rotCableSDD);
5728 //==================================
5729 // 2nd set of cones : cables from layer 3 and layer 4
5730 //==================================
5732 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5733 fgkSDDCableR3, sddCableZ3,
5734 sectionLay3Plastic+sectionLay4Plastic+
5735 sectionLay3Cu+sectionLay4Cu+
5736 sectionLay3Glass+sectionLay4Glass, 1);
5738 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5739 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0),
5740 pcon2all->GetRmax(0));
5742 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5743 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax,
5744 pcon2all->GetRmax(1));
5747 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container",
5748 pcon2container, airSDD);
5749 vpcon2container->SetVisibility(kFALSE);
5751 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5752 fgkSDDCableR3, sddCableZ3,
5754 sectionLay4Plastic, 3);
5756 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast",
5757 pcon2plast, plastic);
5758 vpcon2plast->SetLineColor(kYellow);
5759 vpcon2container->AddNode(vpcon2plast, 0);
5761 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5762 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5763 fgkSDDCableR3 - dr2a, sddCableZ3,
5764 sectionLay3Cu+sectionLay4Cu, 3);
5766 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu",
5768 vpcon2Cu->SetLineColor(kRed);
5769 vpcon2container->AddNode(vpcon2Cu, 0);
5771 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5772 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5773 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5775 sectionLay4Glass, 3);
5777 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass",
5778 pcon2glass, opticalFiber);
5779 vpcon2glass->SetLineColor(kGreen);
5780 vpcon2container->AddNode(vpcon2glass, 0);
5782 moth->AddNode(vpcon2container, 1);
5783 moth->AddNode(vpcon2container, 2, rotCableSDD);
5785 //==================================
5786 // intermediate cylinder
5787 //==================================
5789 // (was fgkSDDCableDZint hardcoded)
5790 Double_t sddCableDZint = (sddConeShape->GetZ(9) - sddConeShape->GetZ(0) +
5791 sddCylinderShape->GetDz()) - sddCableZ3;
5793 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl",
5794 pcon2container->GetRmin(1),
5795 pcon2container->GetRmax(1),
5798 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",
5800 vInterCyl->SetVisibility(kFALSE);
5802 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5803 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5804 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5806 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5807 rmaxCylPlast, sddCableDZint/2);
5809 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast",
5810 interCylPlast, plastic);
5811 vInterCylPlast->SetLineColor(kYellow);
5812 vInterCyl->AddNode(vInterCylPlast, 0);
5814 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5815 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5816 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5818 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5819 rmaxCylCu, sddCableDZint/2);
5821 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu",
5822 interCylCu, copper);
5823 vInterCylCu->SetLineColor(kRed);
5824 vInterCyl->AddNode(vInterCylCu, 0);
5826 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5827 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5828 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5830 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5831 rmaxCylGlass, sddCableDZint/2);
5833 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",
5834 interCylGlass,opticalFiber);
5835 vInterCylGlass->SetLineColor(kGreen);
5836 vInterCyl->AddNode(vInterCylGlass, 0);
5838 moth->AddNode(vInterCyl, 1, new TGeoTranslation(0, 0,
5839 sddCableZ3+sddCableDZint/2));
5840 moth->AddNode(vInterCyl, 2, new TGeoTranslation(0, 0,
5841 -sddCableZ3-sddCableDZint/2));
5843 //==================================
5844 // cable cone on the SSD cone
5845 //==================================
5847 Double_t sddCableR4 = rmaxCylPlast;
5848 Double_t sddCableZ4 = sddCableZ3 + sddCableDZint;
5850 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5851 fgkSDDCableR5, fgkSDDCableZ5,
5854 sectionLay3Cu+sectionLay4Cu+
5855 sectionLay3Glass+sectionLay4Glass, 1);
5857 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5858 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0),
5859 pcon3all->GetRmax(0));
5861 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5862 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax,
5863 pcon3all->GetRmax(1));
5866 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container",
5867 pcon3container, airSDD);
5868 vpcon3container->SetVisibility(kFALSE);
5870 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5871 fgkSDDCableR5, fgkSDDCableZ5,
5873 sectionLay4Plastic, 3);
5875 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast",
5876 pcon3plast, plastic);
5877 vpcon3plast->SetLineColor(kYellow);
5878 vpcon3container->AddNode(vpcon3plast, 0);
5880 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5881 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5882 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5883 sectionLay3Cu+sectionLay4Cu, 3);
5885 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu",
5887 vpcon3Cu->SetLineColor(kRed);
5888 vpcon3container->AddNode(vpcon3Cu, 0);
5890 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5891 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5892 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5893 sectionLay3Glass+sectionLay4Glass, 3);
5895 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass",
5896 pcon3glass,opticalFiber);
5897 vpcon3glass->SetLineColor(kGreen);
5898 vpcon3container->AddNode(vpcon3glass, 0);
5900 moth->AddNode(vpcon3container, 1);
5901 moth->AddNode(vpcon3container, 2, rotCableSDD);
5903 //==================================
5904 // cables that are grouped at the end of SSD cones
5905 //==================================
5907 // Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
5908 // Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
5909 Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
5910 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
5912 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5914 // Add some hardcoded shifts to avoid overlaps with SSD pathc panels
5915 CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
5916 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5918 CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
5919 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5921 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5922 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5924 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5925 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5927 CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
5928 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5930 CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
5931 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5933 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5934 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5936 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5937 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5939 CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
5940 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5942 CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
5943 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5945 CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
5946 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5948 CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
5949 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5951 CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
5952 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5954 moth->AddNode(endConeSDDCable, 1, 0);
5956 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5957 reflect->ReflectZ(kTRUE);
5958 moth->AddNode(endConeSDDCable, 2, reflect);