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
33 #include <Riostream.h>
36 // Root Geometry includes
37 #include <TGeoManager.h>
38 #include <TGeoVolume.h>
44 #include <TGeoCompositeShape.h>
45 #include <TGeoMatrix.h>
48 #include <TGeoTorus.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.21*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 = 7.5*fgkmm;
60 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH = 7.1*fgkmm;
61 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDHCorr= 2.1*fgkmm;
63 const Double_t AliITSv11GeometrySDD::fgkLadderBeamRadius = 0.6*fgkmm;
64 const Double_t AliITSv11GeometrySDD::fgkLadderLa = 3.*fgkmm;
65 const Double_t AliITSv11GeometrySDD::fgkLadderHa = 0.721979*fgkmm;
66 const Double_t AliITSv11GeometrySDD::fgkLadderLb = 3.7*fgkmm;
67 const Double_t AliITSv11GeometrySDD::fgkLadderHb = 0.890428*fgkmm;
68 const Double_t AliITSv11GeometrySDD::fgkLadderl = 0.25*fgkmm;
70 const Double_t AliITSv11GeometrySDD::fgkBottomBeamAngle = 56.5;
71 const Double_t AliITSv11GeometrySDD::fgkBeamSidePhi = 65;
73 const Double_t AliITSv11GeometrySDD::fgkLadWaferSep = 2*fgkmm;
74 const Double_t AliITSv11GeometrySDD::fgkPinSuppWidth = 2.5*fgkmm;
75 const Double_t AliITSv11GeometrySDD::fgkPinSuppHeight = 2.*fgkmm;
76 const Double_t AliITSv11GeometrySDD::fgkPinSuppRmax = 2.5/2.*fgkmm;
77 const Double_t AliITSv11GeometrySDD::fgkPinR = 1.5/2.*fgkmm;
78 const Double_t AliITSv11GeometrySDD::fgkPinSuppLength = 5.*fgkmm;
79 const Double_t AliITSv11GeometrySDD::fgkPinSuppThickness = 0.5*fgkmm;
80 const Double_t AliITSv11GeometrySDD::fgkPinSuppConeAngle = 4;
81 const Double_t AliITSv11GeometrySDD::fgkPinDXminOnSensor = (39./2.)*fgkmm;
82 const Double_t AliITSv11GeometrySDD::fgkPinPinDDXOnSensor = 3*fgkmm;
83 const Double_t AliITSv11GeometrySDD::fgkPinDYOnSensor = (52.5/2.)*fgkmm;
85 // parameters from ALR-0752/3
86 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHeight = 3.2*fgkmm;
87 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppMaxLength = 14*fgkmm;
88 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthExt = 0.4*fgkmm;
89 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthIn = 0.65*fgkmm;
90 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHoleDiam = 2*fgkmm;
91 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppFulWidth = 5.15*fgkmm;
92 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppTongW = 0.8*fgkmm;
93 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAngle = 22.5;
94 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppSlitL = 4.9*fgkmm;
95 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAxeDist = 3.05*fgkmm;
96 const Double_t AliITSv11GeometrySDD::fgkCoolPipeInnerDiam = 1.84*fgkmm;
97 const Double_t AliITSv11GeometrySDD::fgkCoolPipeOuterDiam = 2.*fgkmm;
99 const Double_t AliITSv11GeometrySDD::fgkBTBthick = 0.25 *fgkmm;
100 const Double_t AliITSv11GeometrySDD::fgkBTBlength = 55. *fgkmm;
101 const Double_t AliITSv11GeometrySDD::fgkBTBwidth = 18*fgkmm;
102 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBottom = 4*fgkmm;
103 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase = 1.2*fgkmm;
104 const Double_t AliITSv11GeometrySDD::fgkRadiusAminBTB = 1. *fgkmm;
105 const Double_t AliITSv11GeometrySDD::fgkRadiusBminBTB = 0.53 *fgkmm;
106 const Double_t AliITSv11GeometrySDD::fgkBTBHoleLength = 15 *fgkmm;
107 const Double_t AliITSv11GeometrySDD::fgkBTBHolewidth = 6 *fgkmm;
108 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefX = 10 *fgkmm;
109 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefY = 6.5 *fgkmm;
111 const Double_t AliITSv11GeometrySDD::fgkLay3Rmin = 129.*fgkmm;
112 const Double_t AliITSv11GeometrySDD::fgkLay3Rmax = 205.*fgkmm;
113 const Double_t AliITSv11GeometrySDD::fgkLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
114 const Double_t AliITSv11GeometrySDD::fgkLay3LadderLength = 524.*fgkmm;
115 const Double_t AliITSv11GeometrySDD::fgkLay3DetShortRadius = 146.0*fgkmm;
116 const Double_t AliITSv11GeometrySDD::fgkLay3DetLongRadius = 152.0*fgkmm;
117 const Double_t AliITSv11GeometrySDD::fgkLay3LaddTopCornerEnd = 15.6*fgkmm;
118 const Int_t AliITSv11GeometrySDD::fgkLay3Ndet = 6;
119 const Int_t AliITSv11GeometrySDD::fgkLay3Nladd = 14;
120 const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH = 7.5*fgkmm;
122 const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 220.*fgkmm;
123 const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 291.*fgkmm;
124 const Double_t AliITSv11GeometrySDD::fgkLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
125 const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength = 671.*fgkmm;
126 const Double_t AliITSv11GeometrySDD::fgkLay4DetShortRadius = 235.0*fgkmm;
127 const Double_t AliITSv11GeometrySDD::fgkLay4DetLongRadius = 240.5*fgkmm;
128 const Double_t AliITSv11GeometrySDD::fgkLay4LaddTopCornerEnd = 15.6*fgkmm;
129 const Int_t AliITSv11GeometrySDD::fgkLay4Ndet = 8;
130 const Int_t AliITSv11GeometrySDD::fgkLay4Nladd = 22;
131 const Double_t AliITSv11GeometrySDD::fgkLay4CoolPipeSuppH = 7.5*fgkmm;
133 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay3 = fgkLay3DetShortRadius;
134 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay4 = fgkLay4DetShortRadius;
135 const Double_t AliITSv11GeometrySDD::fgkDistEndLaddCardsLadd = 0.*fgkmm;
138 const Double_t AliITSv11GeometrySDD::fgkHybridAngle = 46; // approx !!!
139 // Origine taken at the hybrid corner :
140 const Double_t AliITSv11GeometrySDD::fgkHybridLength = 65*fgkmm;
141 const Double_t AliITSv11GeometrySDD::fgkHybridWidth = 41*fgkmm;
142 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleRad = 1.05*fgkmm;
143 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleZ = 2.5*fgkmm;
144 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleX = fgkHybridWidth-23.599*fgkmm;
146 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleDZ = 9.698*fgkmm;
147 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHolePasDX = 10.754*fgkmm;
148 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleAmbDX = 9.122*fgkmm;
149 // center of ships to the border
150 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ4 = fgkHybridLength-(4.654 )*fgkmm-fgkHybFLlowHoleDZ/2;
151 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ3 = fgkHybridLength-(4.654+15. )*fgkmm-fgkHybFLlowHoleDZ/2;
152 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ2 = fgkHybridLength-(4.654+15.*2)*fgkmm-fgkHybFLlowHoleDZ/2;
153 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ1 = fgkHybridLength-(4.654+15.*3)*fgkmm-fgkHybFLlowHoleDZ/2;
154 const Double_t AliITSv11GeometrySDD::fgkHybFLlowPasX = fgkHybridWidth-32.775*fgkmm;
155 const Double_t AliITSv11GeometrySDD::fgkHybFLlowAmbX = fgkHybridWidth-20.791*fgkmm;
156 const Double_t AliITSv11GeometrySDD::fgkHybChipsDZ = 9.221*fgkmm;
157 const Double_t AliITSv11GeometrySDD::fgkHybPascalDX = 10.245*fgkmm;
158 const Double_t AliITSv11GeometrySDD::fgkHybAmbraDX = 8.51*fgkmm;
159 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperWidth = 15.012*fgkmm;
160 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperLength = 59.878*fgkmm;
161 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAlDZ = 11.183*fgkmm;
162 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAldx = 2.307*fgkmm;
164 const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorLen = 12.000*fgkmm;
165 const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorWid = 1.490*fgkcm; //???
166 const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorAng = 40.0;
168 const Double_t AliITSv11GeometrySDD::fgkmu = 1*fgkmicron; // 1*fgkmicron; // can be increase for checking thin objects
169 const Double_t AliITSv11GeometrySDD::fgkHybridThBridgeThick = 0.25*fgkmm; // ???
170 const Double_t AliITSv11GeometrySDD::fgkHybAlThick = 30*fgkmu;
171 const Double_t AliITSv11GeometrySDD::fgkHybUpThick = 20*fgkmu;
172 const Double_t AliITSv11GeometrySDD::fgkHybGlueScrnThick = 50*fgkmu; // ??? ?????
173 const Double_t AliITSv11GeometrySDD::fgkHybGlueLowThick = 90*fgkmu;
174 const Double_t AliITSv11GeometrySDD::fgkHybGlueUpThick = 90*fgkmu; // sur ?????
175 const Double_t AliITSv11GeometrySDD::fgkHybAlCCThick = 12*fgkmu;
176 const Double_t AliITSv11GeometrySDD::fgkHybUpCCThick = 12*fgkmu;
177 const Double_t AliITSv11GeometrySDD::fgkHybChipThick = 150*fgkmu;
178 const Double_t AliITSv11GeometrySDD::fgkHybGlueAgThick = 50*fgkmu; // ??? ????
179 const Double_t AliITSv11GeometrySDD::fgkHybUnderNiThick = 20*fgkmu; // ??? ????
180 const Int_t AliITSv11GeometrySDD::fgkNHybSMD = 25;
181 const Double_t AliITSv11GeometrySDD::fgkHybSMDposX[fgkNHybSMD] =
182 {2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,21.40*fgkmm,
183 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
184 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,17.09*fgkmm,21.40*fgkmm,
185 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
186 1.63*fgkmm,5.22*fgkmm,13.59*fgkmm,21.40*fgkmm};
187 const Double_t AliITSv11GeometrySDD::fgkHybSMDposZ[fgkNHybSMD] =
188 { 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm,
189 17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,
190 32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,
191 47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,
192 62.68*fgkmm,62.06*fgkmm,62.06*fgkmm,62.06*fgkmm};
193 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleW = 0.954*fgkmm;
194 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleL = 0.47 *fgkmm;
195 const Double_t AliITSv11GeometrySDD::fgkHybSMDendW = 1.132*fgkmm;
196 const Double_t AliITSv11GeometrySDD::fgkHybSMDendL = 0.925*fgkmm;
197 const Double_t AliITSv11GeometrySDD::fgkHybSMDheight = 400.*fgkmu; // ??? ????!!!!!!!
199 const Double_t AliITSv11GeometrySDD::fgkWaferThickness = 300.*fgkmu;
200 const Double_t AliITSv11GeometrySDD::fgkWaferWidth = 72.5 *fgkmm;
201 const Double_t AliITSv11GeometrySDD::fgkWaferLength = 87.6 *fgkmm;
202 const Double_t AliITSv11GeometrySDD::fgkWaferThickSens = 299.8*fgkmu;
203 const Double_t AliITSv11GeometrySDD::fgkWaferWidthSens = 70.17*fgkmm;
204 // 256 anodes times 294 microns of pitch
205 const Double_t AliITSv11GeometrySDD::fgkWaferLengthSens = 256*294*fgkmicron;
207 const Double_t AliITSv11GeometrySDD::fgkDigitCablWidth = 18.4*fgkmm;
208 const Double_t AliITSv11GeometrySDD::fgkDigitCablAlThick = (30+30*8./10.)*fgkmicron; // will probably change
209 const Double_t AliITSv11GeometrySDD::fgkDigitCablPolyThick = (20+12)*fgkmicron; // will probably change
211 const Double_t AliITSv11GeometrySDD::fgkWaHVcableAlThick = 30*2./10.*fgkmu; // will probably change // Al ratio is random !!!
212 const Double_t AliITSv11GeometrySDD::fgkWaHVcablePolyThick = 175*fgkmu; // will probably change
213 const Double_t AliITSv11GeometrySDD::fgkWaHVcableLength = 67.08*fgkmm;
214 const Double_t AliITSv11GeometrySDD::fgkWaHVcableWitdh = 17.4*fgkmm; // check !!!
215 const Double_t AliITSv11GeometrySDD::fgkWaHVcableDW = 5.24*fgkmm; //5.24*fgkmm;// check !!!
217 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLX = 5. *fgkmm;
218 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLZ = 5. *fgkmm;
219 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLY = 150. *fgkmu;
220 const Double_t AliITSv11GeometrySDD::fgkGlassDXOnSensor = 26.28*fgkmm; // check !!!
221 const Double_t AliITSv11GeometrySDD::fgkGlassDZOnSensor = 22.50*fgkmm; // check !!!
223 const Double_t AliITSv11GeometrySDD::fgkTransitHVAlThick = 30*2./10.*fgkmu; // check // will probably change //Al ratio is random
224 const Double_t AliITSv11GeometrySDD::fgkTransitHVPolyThick = 100*fgkmu; // check // will probably change
225 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLX = 71.46*fgkmm; // check !!!
226 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLZ = 21.3*fgkmm;
227 const Double_t AliITSv11GeometrySDD::fgkTransitHVBondingLZ = 3.6*fgkmm;
228 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailLength = 27*fgkmm; // ???, not yet fixed ...
229 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailWidth = 26*fgkmm;
230 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailXpos = 8*fgkmm; //8*fgkmm // ???, a mesurer !!!
231 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLZ = 10.34*fgkmm;
232 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLeftZ = 4.11*fgkmm;
233 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideRightZ = 3.5*fgkmm; // ???, a mesurer !!!
235 const Double_t AliITSv11GeometrySDD::fgkLongHVcablePolyThick= (20+30+125+30+20+30+125+30+20)*fgkmu; // check // will probably change
236 const Double_t AliITSv11GeometrySDD::fgkLongHVcableAlThick = (30+30*2/10+30)*fgkmu; // check // will probably change
237 const Double_t AliITSv11GeometrySDD::fgkLongHVcableSeparation = 600*fgkmicron;
239 const Double_t AliITSv11GeometrySDD::fgkRubyDX = 14.*fgkmm;
240 const Double_t AliITSv11GeometrySDD::fgkRubyZladd3 = 250*fgkmm;
241 const Double_t AliITSv11GeometrySDD::fgkRubyZladd4 = 325*fgkmm;
243 // the stesalite ladder foot at its end
244 const Double_t AliITSv11GeometrySDD::fgkLadFootX = 60.*fgkmm;
245 const Double_t AliITSv11GeometrySDD::fgkLadFootZ = 20.*fgkmm;
246 const Double_t AliITSv11GeometrySDD::fgkLadFootY = 8.*fgkmm;
247 const Double_t AliITSv11GeometrySDD::fgkLadFootMiddleY = 4.5*fgkmm;
248 const Double_t AliITSv11GeometrySDD::fgkLadBox1X = 23.*fgkmm;
249 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintX = 6.*fgkmm;
250 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintY = 1.*fgkmm;
251 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintBorder = 4.*fgkmm;
252 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleZ = 8.*fgkmm;
253 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleX = 9.*fgkmm;
254 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleY = 6.5*fgkmm;
255 const Double_t AliITSv11GeometrySDD::fgkRubyCageAxisShift = 0.5*fgkmm;
256 const Double_t AliITSv11GeometrySDD::fgkScrewM4diam = 4.*fgkmm;
258 const Double_t AliITSv11GeometrySDD::fgkRubyScrewShiftToCenterY = 0.1;
259 const Double_t AliITSv11GeometrySDD::fgkRubyHoleDiam = 0.5;
261 // the U cooling pipe and its heat exchanger in end-ladder cards system
262 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay3 = 138*fgkmm;
263 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay4 = 150*fgkmm;
264 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUwidth = 59*fgkmm;
265 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeRadius = 5*fgkmm;
266 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeInnerDiam = 2.8*fgkmm;
267 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeOuterDiam = 3.*fgkmm;
268 //--- The al body of the cooling syst.of the heat exchanger :
269 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay3 = 112.*fgkmm; //
270 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay4 = 125.*fgkmm; //
271 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmX = 4.75*fgkmm; // the arms of the U cooling tube
272 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmY = 6.8*fgkmm;
273 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDY = 1.03*fgkmm; // shift in Y of the arms from the axis
274 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDX = 0.125*fgkmm;// shift in X of the arms from the axis
275 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZpos = 8.9*fgkmm; //
278 const Double_t AliITSv11GeometrySDD::fgkLVcardX = 26.525*fgkmm;
279 const Double_t AliITSv11GeometrySDD::fgkLVcardY = 44.95*fgkmm;
280 const Double_t AliITSv11GeometrySDD::fgkLVcardZ = 1.*fgkmm; // all except Cu layer //???
281 const Double_t AliITSv11GeometrySDD::fgkLVcardCuZ = 0.1*fgkmm; //???
283 const Double_t AliITSv11GeometrySDD::fgkLVChip0X = 16.525*fgkmm;
284 const Double_t AliITSv11GeometrySDD::fgkLVChip0Y = 10.8*fgkmm;
285 const Double_t AliITSv11GeometrySDD::fgkLVChip0Z = 3.5*fgkmm; // all except si layer //???
286 const Double_t AliITSv11GeometrySDD::fgkLVChip0SiZ = 0.2*fgkmm; //???????????????????????????????????????????????????
287 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosX = 13.*fgkmm; //19.95*fgkmm; ???
288 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosY = 10.3*fgkmm;
290 const Double_t AliITSv11GeometrySDD::fgkLVChip1X = 6.00*fgkmm;
291 const Double_t AliITSv11GeometrySDD::fgkLVChip1Y = 6.00*fgkmm;
292 const Double_t AliITSv11GeometrySDD::fgkLVChip1Z = 1*fgkmm; // ???
293 const Double_t AliITSv11GeometrySDD::fgkLVChip1SiZ = 0.2*fgkmm; // ???
294 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosX = 18.*fgkmm;
295 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosY = 27.6*fgkmm;
297 const Double_t AliITSv11GeometrySDD::fgkLVChip2X = 6.00*fgkmm;
298 const Double_t AliITSv11GeometrySDD::fgkLVChip2Y = 6.00*fgkmm;
299 const Double_t AliITSv11GeometrySDD::fgkLVChip2Z = 1*fgkmm; // ???
300 const Double_t AliITSv11GeometrySDD::fgkLVChip2SiZ = 0.2*fgkmm; //???
301 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosX = 18.0*fgkmm;
302 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosY = 39.0*fgkmm;
304 const Double_t AliITSv11GeometrySDD::fgkLVChip3X = 4.01*fgkmm;
305 const Double_t AliITSv11GeometrySDD::fgkLVChip3Y = 4.01*fgkmm;
306 const Double_t AliITSv11GeometrySDD::fgkLVChip3Z = 1*fgkmm; // ???
307 const Double_t AliITSv11GeometrySDD::fgkLVChip3SiZ = 0.2*fgkmm;
308 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosX = 20.7*fgkmm;
309 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosY = 21.4*fgkmm;
311 const Double_t AliITSv11GeometrySDD::fgkLVcoolX1 = 17.25*fgkmm;
312 const Double_t AliITSv11GeometrySDD::fgkLVcoolY1 = 8.7*fgkmm;
313 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ1 = 1.*fgkmm;
315 const Double_t AliITSv11GeometrySDD::fgkLVcoolX2 = 3.5*fgkmm;
316 const Double_t AliITSv11GeometrySDD::fgkLVcoolY2 = 8.7*fgkmm;
317 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ2 = 2.3*fgkmm;
319 const Double_t AliITSv11GeometrySDD::fgkLVcoolX3 = 4.75*fgkmm;
320 const Double_t AliITSv11GeometrySDD::fgkLVcoolY3 = 3.1*fgkmm; //+0.1=glue
321 const Double_t AliITSv11GeometrySDD::fgkLVcoolPosY = 6.5*fgkmm;
324 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramX = 54.01*fgkmm;
325 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramY = 40.89*fgkmm;
326 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramZ = 0.7*fgkmm; // ???
328 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1X = 6.8*fgkmm;
329 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Z = 1.*fgkmm; // ???
330 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Ymid = 4.1*fgkmm;
331 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Yend = 0.95*fgkmm; // doesn't take into account the soldering
332 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosX = 13.1*fgkmm;
333 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosY = 14.5*fgkmm;
335 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2X = 6.8*fgkmm;
336 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Z = 1.*fgkmm; // ???
337 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Ymid = 2.9*fgkmm;
338 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Yend = 0.95*fgkmm;
339 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosX = -12.6*fgkmm;
340 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosY = 16.54*fgkmm;
342 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xmid = 3.0*fgkmm;
343 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xend = 0.91*fgkmm;
344 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Z = 2.*fgkmm; // ???
345 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Y = 3.43*fgkmm;
347 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX1 = 14.6*fgkmm;
348 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX2 = 7.2*fgkmm;
349 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX3 = 2.52*fgkmm;
350 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX4 = -4.96*fgkmm;
351 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX5 = -13.82*fgkmm;
352 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY1 = 6.27*fgkmm;
353 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY2 = 0.7*fgkmm;
354 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY3 = 9.1*fgkmm;
356 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1X = 14.*fgkmm;
357 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Y = 9.5*fgkmm;
358 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Z = 2.*fgkmm;
359 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2X = 14.25*fgkmm;
360 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Y = 3.5*fgkmm;
361 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Z = 4.5*fgkmm;
362 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3X = 4.5*fgkmm;
363 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Y = 3.5*fgkmm;
364 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Z = 7.2*fgkmm;
365 const Double_t AliITSv11GeometrySDD::fgkHVCardCoolDY = 6.*fgkmm;
367 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX1 = 19.5*fgkmm;
368 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY1 = 2*fgkmm;
369 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX2 = 35.*fgkmm;
370 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY2 = 3.9*fgkmm;
371 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ = 17.*fgkmm;
372 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppAngle = 45;
373 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX3 = 4.5*fgkmm;
374 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY3 = 3.*fgkmm;
375 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ3 = 12.*fgkmm;
376 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppTopLen = 8.65*fgkmm;
378 // screws fixing boards to the end-ladder on the U tube
379 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadR = 1.85*fgkmm;
380 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadH = 1.5*fgkmm;
381 const Double_t AliITSv11GeometrySDD::fgkLittleScrewR = 0.7*fgkmm;
382 const Double_t AliITSv11GeometrySDD::fgkShiftLittleScrewLV = 3*fgkmm; // ???
383 const Double_t AliITSv11GeometrySDD::fgkLittleLVScrewHeadR = 1.2*fgkmm; // ???
386 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX1 = (25.50+28.50)*fgkmm; // length (first part of Carlos card)
387 const Double_t AliITSv11GeometrySDD::fgkCarlosCardY1 = 1.6*fgkmm; // thickness
388 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ1 = 40.8*fgkmm; // width
389 const Double_t AliITSv11GeometrySDD::fgkCarlosCardCuY = 0.1*fgkmm; // thickness of Cu layer (strips)
390 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX2 = 25.50*fgkmm; // length (2nd part of Carlos card)
391 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ2 = 8.20*fgkmm; // width
393 const Double_t AliITSv11GeometrySDD::fgkCarlosCardChipSiThick = 0.1*fgkmm; // ??? idem for all chips ???
394 const Double_t AliITSv11GeometrySDD::fgkCarlosCardShift = 9*fgkmm; // ??? shift in z w.r.t. heat bridge
396 // size and position of various chips on carlos end-ladder board
397 const Double_t AliITSv11GeometrySDD::fgkCarlosU1X = 13*fgkmm;
398 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Y = 1.68*fgkmm;
399 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Z = 13*fgkmm;
400 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posX = 18.4*fgkmm;
401 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posZ = -7.2*fgkmm;
403 const Double_t AliITSv11GeometrySDD::fgkCarlosU2X = 13.75*fgkmm;
404 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Y = 1.60*fgkmm;
405 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Z = 13.85*fgkmm;
406 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posX = -0.375*fgkmm;
407 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posZ = -9.725*fgkmm;
409 const Double_t AliITSv11GeometrySDD::fgkCarlosU3X = 5*fgkmm;
410 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Y = 1.*fgkmm;
411 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Z = 5*fgkmm;
412 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posX = 6.4*fgkmm;
413 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posZ = 9.9*fgkmm;
416 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posX = -12*fgkmm;
417 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posZ = 3.6*fgkmm;
419 const Double_t AliITSv11GeometrySDD::fgkCarlosU17X = 16*fgkmm;
420 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Y = 3.5*fgkmm;
421 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Z = 10.9*fgkmm;
422 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posX = -17.84*fgkmm;
423 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posZ = -10.95*fgkmm;
425 const Double_t AliITSv11GeometrySDD::fgkCarlosU35X = 4*fgkmm;
426 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Y = 1.*fgkmm;
427 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Z = 4*fgkmm;
428 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posX = -21.6*fgkmm;
429 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posZ = 2.3*fgkmm;
431 const Double_t AliITSv11GeometrySDD::fgkCarlosU36X = 6*fgkmm;
432 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Y = 1.*fgkmm;
433 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Z = 6*fgkmm;
434 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posX = -21.6*fgkmm;
435 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posZ = 9.6*fgkmm;
437 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1X = 8*fgkmm;
438 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Y = 1.7*fgkmm; // look thicker than design number (0.7) ! ???
439 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Z = 3.7*fgkmm;
440 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posX = -12*fgkmm;
441 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posZ = 10.6*fgkmm;
443 // distance from the heat bridge center to the card center :
444 const Double_t AliITSv11GeometrySDD::fgkCarlosCard2HeatBridge = fgkCarlosSuppY2/2+fgkCarlosCardY1/2+fgkCarlosU1Y+0.1*fgkmm;
446 // some pieces at the end of the carbon fiber ladder
447 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay3Len = 467.*fgkmm; // ???
448 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay4Len = 616.*fgkmm; // ???
449 const Double_t AliITSv11GeometrySDD::fgkHVguideX1 = 42.5*fgkmm;
450 const Double_t AliITSv11GeometrySDD::fgkHVguideY1 = 7.*fgkmm;
451 const Double_t AliITSv11GeometrySDD::fgkHVguideZ1 = 10.*fgkmm;
452 const Double_t AliITSv11GeometrySDD::fgkHVguideZ2 = 6.*fgkmm;
453 const Double_t AliITSv11GeometrySDD::fgkHVguideDX = -8.5*fgkmm;
454 const Double_t AliITSv11GeometrySDD::fgkHVguideSuppFullZ = 37.5*fgkmm;
456 // Cooling connector between phynox and plastic cooling water tubes
457 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeRmin = 1 *fgkmm;
458 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR1 = 2.5*fgkmm; // ???
459 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL1 = 3.*fgkmm; // ???
460 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR2 = 3.5*fgkmm; // ???
461 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL2 = 2.*fgkmm; // ???
462 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR3 = 3.*fgkmm; // ???
463 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL3 = 5 *fgkmm; // ???
466 // parameters for coding SDD cables on SDD and SSD cones
467 const Double_t AliITSv11GeometrySDD::fgkSectionCuPerMod = 3*2*0.006 + 3*2*0.0005 + 2*0.002;
468 // copper : LV + signal + HV(HV ???)
469 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)
470 - fgkSectionCuPerMod);
472 const Double_t AliITSv11GeometrySDD::fgkSectionGlassPerMod = 3*0.006; // ???
473 const Double_t AliITSv11GeometrySDD::fgkSectionCoolPolyuEL = 0.4672;
474 const Double_t AliITSv11GeometrySDD::fgkSectionCoolWaterEL = 0.3496;
475 const Double_t AliITSv11GeometrySDD::fgkEndLadderEarthCableR = 0.5*fgkmm;
476 // (sections are given in cm square)
477 const Double_t AliITSv11GeometrySDD::fgkCableBendRatio = 1.3; // ??? this factor account for the bending of cables
478 const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilThick = 0.1*fgkmm; // Thickness of Al foil on hybrid side - TO BE CHECKED
479 const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilWide = 4.2*fgkmm; // Width of Al foil on hybrid side - from digitCableA
480 const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilSide = 2.0*fgkmm; // Side length of Al foil on hybrid side
482 const Double_t AliITSv11GeometrySDD::fgkConeSDDr1 = 11.87574*fgkcm;
483 const Double_t AliITSv11GeometrySDD::fgkConeSDDr2 = 26.07574*fgkcm;
484 const Double_t AliITSv11GeometrySDD::fgkConeSDDz1 = 3.36066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
485 const Double_t AliITSv11GeometrySDD::fgkConeSDDz2 = 17.56066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
486 // These last parameters come from cone's code and define the slope
487 // and position of the SDD cone end. For some unknown reason, this doesn't
488 // allow to stick on the SDD cone. This has to be checked when a correct
489 // version of the cone is available ... For now 'm applying some approximative
492 const Double_t AliITSv11GeometrySDD::fgkSDDCableR1 = 16*fgkcm; // ??? // part 1 of "cable cone"
493 const Double_t AliITSv11GeometrySDD::fgkSDDCableR2 = 23*fgkcm; // ??? // part 1/2 of "cable cone"
494 const Double_t AliITSv11GeometrySDD::fgkSDDCableR3 = 26*fgkcm; // ??? // part 2 of "cable cone"
496 const Double_t AliITSv11GeometrySDD::fgkSDDCableDZint = 3.5*fgkcm;
497 const Double_t AliITSv11GeometrySDD::fgkSDDCableR5 = 37*fgkcm; // third part of "cable cone"
498 const Double_t AliITSv11GeometrySDD::fgkSDDCableZ5 = 65*fgkcm; // third part of "cable cone"
506 ClassImp(AliITSv11GeometrySDD)
508 //________________________________________________________________________
509 AliITSv11GeometrySDD::AliITSv11GeometrySDD():
512 fCoolPipeSupportL(0),
513 fCoolPipeSupportR(0),
516 fBaseThermalBridge(0),
533 fAddCoolingSyst(kTRUE),
535 fAddOnlyLadder3min(-1),
536 fAddOnlyLadder3max(-1),
537 fAddOnlyLadder4min(-1),
538 fAddOnlyLadder4max(-1),
539 fColorCarbonFiber(4),
549 fLay3LadderUnderSegDH(0),
550 fLay4LadderUnderSegDH(0),
551 fLay3LaddShortRadius(0),
552 fLay3LaddLongRadius(0),
553 fLay4LaddShortRadius(0),
554 fLay4LaddLongRadius(0)
557 // Standard constructor
559 fCommonVol[0] = NULL;
560 fCommonVol[1] = NULL;
563 for (Int_t i=0; i<fgkNladdSegCommonVol; i++){
564 fLaddSegCommonVol[i] = NULL;
565 fLaddSegCommonTr[i] = NULL;
571 //________________________________________________________________________
572 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
573 AliITSv11Geometry(debug),
575 fCoolPipeSupportL(0),
576 fCoolPipeSupportR(0),
579 fBaseThermalBridge(0),
596 fAddCoolingSyst(kTRUE),
598 fAddOnlyLadder3min(-1),
599 fAddOnlyLadder3max(-1),
600 fAddOnlyLadder4min(-1),
601 fAddOnlyLadder4max(-1),
602 fColorCarbonFiber(4),
612 fLay3LadderUnderSegDH(0),
613 fLay4LadderUnderSegDH(0),
614 fLay3LaddShortRadius(0),
615 fLay3LaddLongRadius(0),
616 fLay4LaddShortRadius(0),
617 fLay4LaddLongRadius(0)
620 // Constructor setting debugging level
622 fCommonVol[0] = NULL;
623 fCommonVol[1] = NULL;
626 for (Int_t i=0; i<fgkNladdSegCommonVol; i++){
627 fLaddSegCommonVol[i] = NULL;
628 fLaddSegCommonTr[i] = NULL;
633 //________________________________________________________________________
634 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
635 AliITSv11Geometry(s.GetDebug()),
636 fPinSupport(s.fPinSupport),
637 fCoolPipeSupportL(s.fCoolPipeSupportL),
638 fCoolPipeSupportR(s.fCoolPipeSupportR),
639 fSDDsensor3(s.fSDDsensor3),
640 fSDDsensor4(s.fSDDsensor4),
641 fBaseThermalBridge(s.fBaseThermalBridge),
643 fLadderFoot(s.fLadderFoot),
644 fCardLVR(s.fCardLVR),
645 fCardLVL(s.fCardLVL),
647 fCardCarlos(s.fCardCarlos),
648 fRaccordoL(s.fRaccordoL),
649 fDigitCableLay3A(s.fDigitCableLay3A),
650 fDigitCableLay3B(s.fDigitCableLay3B),
651 fDigitCableLay4A(s.fDigitCableLay4A),
652 fDigitCableLay4B(s.fDigitCableLay4B),
653 fMotherVol(s.fMotherVol),
654 fAddHybrids(s.fAddHybrids),
655 fAddSensors(s.fAddSensors),
656 fAddHVcables(s.fAddHVcables),
657 fAddCables(s.fAddCables),
658 fAddCoolingSyst(s.fAddCoolingSyst),
659 fCoolingOn(s.fCoolingOn),
660 fAddOnlyLadder3min(s.fAddOnlyLadder3min),
661 fAddOnlyLadder3max(s.fAddOnlyLadder3max),
662 fAddOnlyLadder4min(s.fAddOnlyLadder4min),
663 fAddOnlyLadder4max(s.fAddOnlyLadder4max),
664 fColorCarbonFiber(s.fColorCarbonFiber),
665 fColorRyton(s.fColorRyton),
666 fColorPhynox(s.fColorPhynox),
667 fColorSilicon(s.fColorSilicon),
668 fColorAl(s.fColorAl),
669 fColorPolyhamide(s.fColorPolyhamide),
670 fColorGlass(s.fColorGlass),
671 fColorSMD(s.fColorSMD),
672 fColorSMDweld(s.fColorSMDweld),
673 fColorStesalite(s.fColorStesalite),
674 fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
675 fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
676 fLay3LaddShortRadius(s.fLay3LaddShortRadius),
677 fLay3LaddLongRadius(s.fLay3LaddLongRadius),
678 fLay4LaddShortRadius(s.fLay4LaddShortRadius),
679 fLay4LaddLongRadius(s.fLay4LaddLongRadius)
682 // do only a "shallow copy" ...
683 fCommonVol[0] = s.fCommonVol[0];
684 fCommonVol[1] = s.fCommonVol[1];
685 fCommonTr[0] = s.fCommonTr[0];
686 fCommonTr[1] = s.fCommonTr[1];
687 for (Int_t i=0; i<fgkNladdSegCommonVol; i++){
688 fLaddSegCommonVol[i] = s.fLaddSegCommonVol[i];
689 fLaddSegCommonTr[i] = s.fLaddSegCommonTr[i];
694 //________________________________________________________________________
695 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
696 operator=(const AliITSv11GeometrySDD &s) {
697 // Assignment operator
698 if(&s == this) return *this;
699 fMotherVol = s.fMotherVol;
700 fAddHybrids = s.fAddHybrids;
701 fAddSensors = s.fAddSensors;
702 fAddHVcables = s.fAddHVcables;
703 fAddCables = s.fAddCables;
704 fAddCoolingSyst = s.fAddCoolingSyst;
705 fCoolingOn = s.fCoolingOn;
706 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
707 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
708 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
709 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
713 //________________________________________________________________________
714 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
715 // Look like a destructor
716 // Smell like a destructor
717 // And actually is the destructor
718 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
719 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
720 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
721 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
724 //________________________________________________________________________
725 void AliITSv11GeometrySDD::SetParameters() {
727 // Define display colors and the non constant geometry parameters
730 Double_t detLadderDist = 8*fgkmm;
732 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
733 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
735 // radius from the center to the CF ladder :
736 fLay3LaddShortRadius = (fgkLay3DetShortRadius
737 + fgkLadWaferSep+2*fgkWaferThickness
739 fLay3LaddLongRadius = (fgkLay3DetLongRadius
740 + fgkLadWaferSep+2*fgkWaferThickness
742 fLay4LaddShortRadius = (fgkLay4DetShortRadius
743 + fgkLadWaferSep+2*fgkWaferThickness
745 fLay4LaddLongRadius = (fgkLay4DetLongRadius
746 + fgkLadWaferSep+2*fgkWaferThickness
749 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
750 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
751 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
752 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
753 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
754 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
756 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
757 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
758 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
759 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
760 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
761 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
762 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
763 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
767 //________________________________________________________________________
768 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
770 // Called to get a medium, checks that it exists.
771 // If not, prints an error and returns 0
775 snprintf(ch, 30, "ITS_%s",mediumName);
776 TGeoMedium* medium = gGeoManager->GetMedium(ch);
778 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
783 //________________________________________________________________________
784 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
785 // Get the actual number of ladder in layer 3
786 if ( (fAddOnlyLadder3min<0) ||
787 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
788 (fAddOnlyLadder3max<0) ||
789 (fAddOnlyLadder3max >= fgkLay3Nladd) )
791 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
795 //________________________________________________________________________
796 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
797 // Get the actual number of ladder in layer 4
798 if ( (fAddOnlyLadder4min<0) ||
799 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
800 (fAddOnlyLadder4max<0) ||
801 (fAddOnlyLadder4max >= fgkLay4Nladd) )
803 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
807 //________________________________________________________________________
808 void AliITSv11GeometrySDD::CreateBasicObjects() {
810 // Create basics objets which will be assembled together
811 // in Layer3 and Layer4 functions
815 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
816 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
817 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
818 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
820 fPinSupport = CreatePinSupport();
821 fCoolPipeSupportL = CreateCoolPipeSupportL();
822 fCoolPipeSupportR = CreateCoolPipeSupportR();
824 fBaseThermalBridge = CreateBaseThermalBridge();
825 fHybrid = CreateHybrid(0);
827 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
828 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
829 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
830 TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws
831 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
832 TGeoMedium *raccordMedium = GetMedium("INOX$"); // same as AISI 316-L
834 //********************************************************************
835 // pieces of the carbon fiber structure
836 //********************************************************************
837 Double_t dy = fgkLadderSegBoxDH/2;
838 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
839 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
840 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
841 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
842 Double_t dYTranslation = (fgkLadderHeight/2.
843 -0.5*fgkLadderWidth*TMath::Tan(beta)
844 -fgkLadderBeamRadius);
845 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
847 //--- the top V of the Carbon Fiber Ladder (segment)
848 TGeoArb8 *cfLaddTop1 = CreateLadderSide( "CFladdTopCornerVol1shape",
849 fgkSegmentLength/2., halfTheta,
850 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
851 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
852 cfLaddTop1,carbonFiberLadderStruct);
853 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerVol2shape",
854 fgkSegmentLength/2., halfTheta,
855 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
856 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
857 cfLaddTop2, carbonFiberLadderStruct);
858 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
859 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
860 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
863 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerVol1shape",
864 fgkSegmentLength/2., beta, -1,
865 fgkLadderLb, fgkLadderHb, fgkLadderl);
866 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
867 cfLaddSide1,carbonFiberLadderStruct);
868 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerVol2shape",
869 fgkSegmentLength/2., beta, 1,
870 fgkLadderLb, fgkLadderHb, fgkLadderl);
871 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
872 cfLaddSide2,carbonFiberLadderStruct);
873 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
874 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
875 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
876 alpha*TMath::RadToDeg());
877 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
878 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
879 -alpha*TMath::RadToDeg());
880 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
883 // Beams on the sides
884 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
885 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
886 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
887 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
888 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
889 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
890 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
892 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
893 carbonFiberLadderStruct);
894 sideBeam->SetLineColor(fColorCarbonFiber);
896 //Euler rotation : about Z, then new X, then new Z
897 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
898 -beamPhiPrime*TMath::RadToDeg(),-90);
899 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
900 beamPhiPrime*TMath::RadToDeg(), -90);
901 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
902 beamPhiPrime*TMath::RadToDeg(), -90);
903 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
904 -beamPhiPrime*TMath::RadToDeg(),-90);
906 TGeoCombiTrans *beamTransf[8];
907 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
908 TMath::Tan(halfTheta),
909 fgkLadderBeamRadius/2. - dy,
910 -3*fgkSegmentLength/8, beamRot1);
912 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
913 TMath::Tan(halfTheta),
914 fgkLadderBeamRadius/2. - dy,
915 -3*fgkSegmentLength/8, beamRot1);
916 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
918 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
919 TMath::Tan(halfTheta),
920 fgkLadderBeamRadius/2. - dy,
921 -fgkSegmentLength/8, beamRot2);
923 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
924 TMath::Tan(halfTheta),
925 fgkLadderBeamRadius/2. - dy,
926 -fgkSegmentLength/8, beamRot2);
927 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
929 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
930 TMath::Tan(halfTheta),
931 fgkLadderBeamRadius/2. - dy,
932 -3*fgkSegmentLength/8, beamRot3);
934 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
935 TMath::Tan(halfTheta),
936 fgkLadderBeamRadius/2. - dy,
937 -3*fgkSegmentLength/8, beamRot3);
938 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
940 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
941 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
942 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
943 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
945 //--- Beams of the bottom
946 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
947 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
948 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
949 bottomBeam1, carbonFiberLadderStruct);
950 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
951 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
952 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
953 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
954 bottomBeam2, carbonFiberLadderStruct);
955 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
956 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
957 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
958 - fgkLadderLb/3, 0, 180);
959 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
960 bottomBeam3, carbonFiberLadderStruct);
961 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
962 //bottomBeam3Vol->SetLineColor(2);
963 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
964 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
966 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
967 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
968 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
969 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
970 -fgkSegmentLength/2, bottomBeamRot1);
971 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
972 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
973 - dy, fgkSegmentLength/2, bottomBeamRot2);
974 // be careful for beams #3: when "reading" from -z to +z and
975 // from the bottom of the ladder, it should draw a Lambda, and not a V
976 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
977 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
978 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
979 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
980 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
981 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
983 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
984 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
985 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
986 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
987 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
988 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
989 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
990 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
991 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
992 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
993 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
994 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
995 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
996 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
997 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
998 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
999 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
1000 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
1001 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
1004 //********************************************************************
1006 //********************************************************************
1008 for (Int_t i=0; i<fgkLay3Ndet; i++) {
1009 snprintf(cableName, 30, "digitCableLay3A_%i",i);
1010 fDigitCableLay3A[i].SetName(cableName);
1011 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
1012 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1013 fDigitCableLay3A[i].SetNLayers(2);
1014 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1016 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1017 snprintf(cableName, 30, "digitCableLay3B_%i",i);
1018 fDigitCableLay3B[i].SetName(cableName);
1019 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
1020 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1021 fDigitCableLay3B[i].SetNLayers(2);
1022 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1024 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1026 for (Int_t i=0; i<fgkLay4Ndet; i++) {
1027 snprintf(cableName, 30, "digitCableLay4A_%i",i);
1028 fDigitCableLay4A[i].SetName(cableName);
1029 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
1030 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1031 fDigitCableLay4A[i].SetNLayers(2);
1032 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1034 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1035 snprintf(cableName, 30, "digitCableLay4B_%i",i);
1036 fDigitCableLay4B[i].SetName(cableName);
1037 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
1038 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1039 fDigitCableLay4B[i].SetNLayers(2);
1040 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1042 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1044 // Well, those digit cables could also include the analog cables
1045 // which have the same width and the same path, at least in the ladder.
1046 // It will gain some computing ressources (less volumes) and some
1047 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1048 // The only thing to do is to change the names and put the correct total
1051 // some transformations and volumes used in several places
1052 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1053 0, -fgkCarlosSuppAngle, 0);
1055 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1056 fgkLittleScrewHeadH/2);
1057 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1058 littleScrewHead, stainless);
1059 fCommonVol[0]->SetLineColor(kGray);
1061 fLadderFoot = CreateLadderFoot();
1063 fCardHV = CreateHVCard(0);
1064 fCardCarlos = CreateCarlosCard(0);
1066 //==================
1067 // link beteen phynox and plastic cooling tubes
1068 //==================
1070 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1071 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1072 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1073 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1074 vwaterRac->SetLineColor(kBlue);
1076 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1077 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1078 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1079 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1080 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1081 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1082 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1083 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1084 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1085 vtube1Rac->SetLineColor(kGray);
1086 vtube2Rac->SetLineColor(kGray);
1087 vtube3Rac->SetLineColor(kGray);
1089 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1090 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1091 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1092 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1093 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1094 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1095 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1096 fRaccordoL->AddNode(vwaterRac, 1,0);
1097 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1098 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1099 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1103 //________________________________________________________________________
1104 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1106 // a debugging function for checking some possible overlaps
1108 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1109 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1110 if (fHybrid) fHybrid->CheckOverlaps(precision);
1114 //________________________________________________________________________
1115 TGeoCombiTrans *AliITSv11GeometrySDD::
1116 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1119 // return the TGeoCombiTrans which make a translation in y and z
1120 // and a rotation in phi in the global coord system
1121 // If planeSym = true, the rotation places the object symetrically
1122 // (with respect to the transverse plane) to its position in the
1123 // case planeSym = false
1126 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1127 TGeoRotation r1("",0.,0.,dphi);
1128 TGeoRotation r2("",90, 180, -90-dphi);
1130 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1131 combiTrans1->SetTranslation(t1);
1132 if (planeSym) combiTrans1->SetRotation(r1);
1133 else combiTrans1->SetRotation(r2);
1138 //________________________________________________________________________
1139 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1143 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1144 const Double_t *vect = ct->GetTranslation();
1145 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1146 ct->SetTranslation(newVect);
1150 //________________________________________________________________________
1151 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1152 // for code developpment and debugging purposes
1154 if (! fSDDsensor3) CreateBasicObjects();
1156 // moth->AddNode(fPinSupport, 1, 0);
1157 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1158 // moth->AddNode(fSDDsensor3, 1, 0);
1159 // moth->AddNode(fSDDsensor4, 1, 0);
1160 // moth->AddNode(fBaseThermalBridge, 1, 0);
1161 // moth->AddNode(fHybrid,100,0);
1162 // moth->AddNode(fLadderFoot,1,0);
1163 //moth->AddNode(fCardLVL,1,0);
1164 //moth->AddNode(fCardLVR,1,0);
1166 TGeoVolume* seg = CreateLadderSegment( 3, 0);
1167 moth->AddNode(seg, 1, 0);
1169 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1170 // moth->AddNode(lay3Ladder, 1, 0);
1172 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1173 // moth->AddNode(lay3Detectors, 1, 0);
1175 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1176 // moth->AddNode(lay3Detectors, 1, 0);
1179 // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1180 // moth->AddNode(endLadder, 1, 0);
1182 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1183 // moth->AddNode(highVCard, 1, 0);
1185 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1186 // moth->AddNode(supportRing, 1, 0);
1188 // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1189 // moth->AddNode(endLadderCards, 1, 0);
1191 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1192 // moth->AddNode(carlosCard, 1, 0);
1197 //==================================
1198 //--- test of flat cable curvature
1199 //==================================
1202 AliITSv11GeomCableFlat cable("test", 3, 0.3);
1203 cable.SetNLayers(1);
1204 cable.SetNLayers(2);
1205 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1206 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1207 cable.SetInitialNode(endLadderCards);
1209 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1218 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1219 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1220 cable.CreateAndInsertBoxCableSegment(1,angle);
1222 Double_t p3[3], p4[3];
1227 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1228 cable.CreateAndInsertCableCylSegment(2,angle);
1233 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1234 cable.CreateAndInsertCableSegment(3,angle);
1239 //________________________________________________________________________
1240 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1242 // Insert the layer 3 in the mother volume. This is a virtual volume
1243 // containing ladders of layer 3 and the supporting rings
1247 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1251 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1254 if (! fSDDsensor3) CreateBasicObjects();
1256 //====================================
1257 // First we create the central barrel
1258 //====================================
1260 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1261 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1262 TGeoVolumeAssembly *lay3Ladd2Det = CreateDetectorsAssemblyLadd2();
1263 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1264 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1265 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1266 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1267 virtualLayer3Shape, airSDD);
1269 Double_t dPhi = 360./fgkLay3Nladd;
1270 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1271 // Placing virtual ladder and detectors volumes following
1272 // ladder ordering convention
1275 Int_t iLaddMax = fgkLay3Nladd;
1276 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1277 iLaddMin = fAddOnlyLadder3min;
1278 iLaddMax = fAddOnlyLadder3max+1;
1281 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1283 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1284 snprintf(rotName, 30, "ITSsddLay3Ladd%i",iLadd);
1285 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1287 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1288 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1289 TGeoCombiTrans *ctLadd;
1290 //=============================================================
1292 // Special modification for ladder 2 of layer 3:
1293 // It has been inverted (pi rotation around y axis)
1295 //=============================================================
1297 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1298 0, ladderPhi, kTRUE);
1300 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1301 0, ladderPhi, kFALSE);
1302 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1303 ///////////////////////////////////////////////////
1304 snprintf(rotName, 30, "ITSsddLay3DetBox%i",iLadd);
1305 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1306 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1307 minRadiusDetBox += detectorsThick/2;
1308 TGeoCombiTrans *ctDet;
1309 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1310 0, ladderPhi, kTRUE);
1313 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1315 virtualLayer3->AddNode(lay3Ladd2Det , iLadd, ctDet);
1317 ///////////////////////////////////////////////////
1321 //====================================
1322 // Then the forward rapidity pieces
1323 // (cooling, Carlos, LV, HV ...)
1324 //====================================
1326 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1327 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1328 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1330 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1331 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1332 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1333 fgkForwardLay3Length/2.);
1335 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1336 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1337 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1340 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1341 virtualForward3Shape, airSDD);
1342 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1343 virtualForward3Shape, airSDD);
1344 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1345 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1347 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1348 fgkLay3Length/2+fgkForwardLay3Length/2);
1349 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1350 -fgkLay3Length/2-fgkForwardLay3Length/2);
1352 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1354 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1355 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1356 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1357 minRadiusDetBox += detectorsThick/2;
1359 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1361 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1362 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1363 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1364 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1366 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1367 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1374 virtualLayer3->CheckOverlaps(0.01);
1375 //virtualForward3Pos->CheckOverlaps(0.01);
1376 //virtualForward3Neg->CheckOverlaps(0.01);
1379 virtualLayer3->SetVisibility(kFALSE);
1380 //virtualForward3Pos->SetVisibility(kFALSE);
1381 //virtualForward3Neg->SetVisibility(kFALSE);
1384 moth->AddNode(virtualLayer3, 1, 0);
1385 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1386 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1390 // //________________________________________________________________________
1391 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1393 // // Insert the forward pieces of layer 3 in the mother volume.
1394 // // (cooling, Carlos, LV, HV ...)
1398 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1402 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1404 // if (! fSDDsensor3) CreateBasicObjects();
1406 // Double_t dPhi = 360./fgkLay3Nladd;
1407 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1408 // Int_t iLaddMin = 0;
1409 // Int_t iLaddMax = fgkLay3Nladd;
1410 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1411 // iLaddMin = fAddOnlyLadder3min;
1412 // iLaddMax = fAddOnlyLadder3max+1;
1414 // char rotName[30];
1417 // //=================
1419 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1420 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1421 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1423 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1424 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1425 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1426 // fgkForwardLay3Length/2.);
1428 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1429 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1430 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1433 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1434 // virtualForward3Shape, airSDD);
1435 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1436 // virtualForward3Shape, airSDD);
1437 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1438 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1440 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1441 // fgkLay3Length/2+fgkForwardLay3Length/2);
1442 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1443 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1445 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1447 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1448 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1449 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1450 // minRadiusDetBox += detectorsThick/2;
1452 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1454 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1455 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1456 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1457 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1459 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1460 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1463 // if(GetDebug(1)) {
1464 // virtualForward3Pos->CheckOverlaps(0.01);
1465 // virtualForward3Neg->CheckOverlaps(0.01);
1468 // virtualForward3Pos->SetVisibility(kFALSE);
1469 // virtualForward3Neg->SetVisibility(kFALSE);
1471 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1472 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1477 //________________________________________________________________________
1478 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1480 // Insert the end-ladder of layer 3 in the mother volume.
1481 // (cooling, Carlos, LV, HV ...)
1485 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1489 if (! fSDDsensor3) CreateBasicObjects();
1492 Int_t iLaddMax = fgkLay3Nladd;
1493 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1494 iLaddMin = fAddOnlyLadder3min;
1495 iLaddMax = fAddOnlyLadder3max+1;
1498 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1499 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1502 Double_t dPhi = 360./fgkLay3Nladd;
1503 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1505 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1507 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1509 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1511 snprintf(rotName, 30, "ITSsddLay3EndLadd%i",iLadd);
1513 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1514 fgkLay3Length/2, ladderPhi, kTRUE);
1515 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1516 -fgkLay3Length/2, ladderPhi, kFALSE);
1518 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1519 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1523 virtualForward3Pos->CheckOverlaps(0.01);
1524 virtualForward3Neg->CheckOverlaps(0.01);
1527 // 180deg Y rotation to compensate the cancellation of ITSD volume
1528 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1529 TGeoRotation *y180 = new TGeoRotation();
1530 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1531 moth->AddNode(virtualForward3Pos, 1, y180);
1532 moth->AddNode(virtualForward3Neg, 1, y180);
1535 //________________________________________________________________________
1536 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1538 // Insert the layer 4 in the mother volume. This is a virtual volume
1539 // containing ladders of layer 4 and the supporting rings
1543 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1549 if (! fSDDsensor3) CreateBasicObjects();
1551 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1552 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1553 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1554 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1555 virtualLayer4Shape, airSDD);
1557 //====================================
1558 // First we create the central barrel
1559 //====================================
1561 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1562 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1563 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1565 Double_t dPhi = 360./fgkLay4Nladd;
1566 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1568 // placing virtual ladder and detectors volumes following ladder
1569 // ordering convention
1572 Int_t iLaddMax = fgkLay4Nladd;
1573 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1574 iLaddMin = fAddOnlyLadder4min;
1575 iLaddMax = fAddOnlyLadder4max+1;
1577 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1579 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1580 snprintf(rotName, 30, "ITSsddLay4Ladd%i",iLadd);
1581 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1583 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1584 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1585 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1586 0, ladderPhi, kTRUE);
1587 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1588 ///////////////////////////////////////////////////
1589 snprintf(rotName, 30, "ITSsddLay4DetBox%i",iLadd);
1590 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1592 minRadiusDetBox = fgkLay4DetLongRadius;
1593 minRadiusDetBox += detBoxThickness/2;
1594 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1595 0, ladderPhi, kTRUE);
1596 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1597 ///////////////////////////////////////////////////
1601 //====================================
1602 // Then the pieces at forward rapidity
1603 // (cooling, Carlos, LV, HV ...)
1604 //====================================
1606 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1607 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1608 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1610 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1611 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1612 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1613 fgkForwardLay4Length/2.);
1614 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1615 virtualForward4Shape, airSDD);
1616 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1617 virtualForward4Shape, airSDD);
1618 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1619 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1621 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1622 fgkLay4Length/2+fgkForwardLay4Length/2);
1623 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1624 -fgkLay4Length/2-fgkForwardLay4Length/2);
1626 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1628 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1629 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1631 minRadiusDetBox = fgkLay4DetLongRadius;
1632 minRadiusDetBox += detBoxThickness/2;
1634 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1636 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1637 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1638 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1639 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1640 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1641 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1645 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1647 virtualLayer4->SetVisibility(kFALSE);
1648 //virtualForward4Pos->SetVisibility(kFALSE);
1649 //virtualForward4Neg->SetVisibility(kFALSE);
1651 moth->AddNode(virtualLayer4,1,0);
1652 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1653 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1657 // //________________________________________________________________________
1658 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1660 // // Insert the layer 4 in the mother volume. This is a virtual volume
1661 // // containing ladders of layer 4 and the supporting rings
1662 // // (cooling, Carlos, LV, HV ...)
1666 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1670 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1672 // if (! fSDDsensor3) CreateBasicObjects();
1674 // Double_t dPhi = 360./fgkLay4Nladd;
1675 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1677 // // placing virtual ladder and detectors volumes following ladder
1678 // // ordering convention
1679 // char rotName[20];
1680 // Int_t iLaddMin = 0;
1681 // Int_t iLaddMax = fgkLay4Nladd;
1682 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1683 // iLaddMin = fAddOnlyLadder4min;
1684 // iLaddMax = fAddOnlyLadder4max+1;
1687 // //=================
1688 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1689 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1690 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1692 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1693 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1694 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1695 // fgkForwardLay4Length/2.);
1696 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1697 // virtualForward4Shape, airSDD);
1698 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1699 // virtualForward4Shape, airSDD);
1700 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1701 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1703 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1704 // fgkLay4Length/2+fgkForwardLay4Length/2);
1705 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1706 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1708 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1710 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1711 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1712 // if (iLadd%2 != 0)
1713 // minRadiusDetBox = fgkLay4DetLongRadius;
1714 // minRadiusDetBox += detBoxThickness/2;
1716 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1718 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1719 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1720 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1721 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1722 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1723 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1726 // virtualForward4Pos->SetVisibility(kFALSE);
1727 // virtualForward4Neg->SetVisibility(kFALSE);
1729 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1730 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1734 //________________________________________________________________________
1735 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1737 // Insert the end-ladder of layer 4 in the mother volume.
1738 // (cooling, Carlos, LV, HV ...)
1742 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1746 if (! fSDDsensor3) CreateBasicObjects();
1748 // placing virtual ladder and detectors volumes following ladder
1749 // ordering convention
1751 Int_t iLaddMax = fgkLay4Nladd;
1752 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1753 iLaddMin = fAddOnlyLadder4min;
1754 iLaddMax = fAddOnlyLadder4max+1;
1757 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1758 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1761 Double_t dPhi = 360./fgkLay4Nladd;
1762 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1764 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1766 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1769 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1771 snprintf(rotName, 30, "ITSsddLay4EndLadd%i",iLadd);
1773 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1774 fgkLay4Length/2, ladderPhi, kTRUE);
1775 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1776 -fgkLay4Length/2, ladderPhi, kFALSE);
1777 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1778 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1781 // 180deg Y rotation to compensate the cancellation of ITSD volume
1782 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1783 TGeoRotation *y180 = new TGeoRotation();
1784 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1785 moth->AddNode(virtualForward4Pos, 1, y180);
1786 moth->AddNode(virtualForward4Neg, 1, y180);
1790 //________________________________________________________________________
1791 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1793 // return an assembly volume containing the CF ladder
1796 Int_t nDetectors = fgkLay3Ndet;
1797 Double_t ladderLength = fgkLay3LadderLength;
1798 Double_t underSegDH = fLay3LadderUnderSegDH;
1799 Double_t *sensorZPos = fLay3sensorZPos;
1800 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1801 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1805 nDetectors = fgkLay4Ndet;
1806 ladderLength = fgkLay4LadderLength;
1807 digitCableA = fDigitCableLay4A;
1808 digitCableB = fDigitCableLay4B;
1809 underSegDH = fLay4LadderUnderSegDH;
1810 sensorZPos = fLay4sensorZPos;
1813 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1815 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1816 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1818 // placing virtual ladder segment following detector ordering convention
1819 //=======================================================================
1822 // adding segment this way to create cable points in the correct order ...
1823 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1825 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1826 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1827 snprintf(transName, 30, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1828 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1829 + fgkSegmentLength/2;
1830 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1831 underSegDH/2,segmentPos);
1833 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1835 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1837 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1838 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1839 snprintf(transName, 30, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1840 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1841 + fgkSegmentLength/2;
1842 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1843 underSegDH/2,segmentPos);
1845 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1848 // putting virtual volume corresponding to the end of ladder
1849 //=======================================================================
1850 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1851 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1852 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1853 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1854 // Euler rotation : about Z, then new X, then new Z
1855 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1856 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1857 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1858 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1859 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1861 // creating and inserting cable segments
1862 // (check points are placed while creating segments)
1863 //=======================================================================
1865 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1867 digitCableA[iSegment].SetInitialNode(virtualLadder);
1868 digitCableB[iSegment].SetInitialNode(virtualLadder);
1870 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1871 Double_t rotation = 0;
1873 rotation = 90-fgkHybridAngle;
1874 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1876 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1880 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1881 Double_t rotation = 0;
1883 rotation = fgkHybridAngle-90;
1884 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1886 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1891 //=======================================================================
1893 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1894 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1896 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1897 char cableHVname[30];
1898 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1899 snprintf(cableHVname,30,"ITSsddHVcable%i", iSegment);
1900 cableHV[iSegment].SetName(cableHVname);
1901 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1902 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1903 cableHV[iSegment].SetNLayers(2);
1904 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1906 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1907 cableHV[iSegment].SetInitialNode(virtualLadder);
1909 Double_t x1[3], x2[3], x3[3],
1910 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1912 x1[0] = -fgkTransitHVtailXpos;
1913 x2[0] = -fgkTransitHVtailXpos;
1914 x3[0] = -fgkTransitHVtailXpos;
1915 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1916 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1917 *fgkLongHVcableSeparation;
1918 // adjust where HV long cable starts in Y
1919 // useful if you want to let some space for alignment
1920 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1921 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1922 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1924 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1925 x2[2] = x1[2]+5*fgkmm;
1926 x3[2] = ladderLength/2-endLength;
1927 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1928 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1929 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1931 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1932 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1933 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1934 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1938 x1[0] = fgkTransitHVtailXpos;
1939 x2[0] = fgkTransitHVtailXpos;
1940 x3[0] = fgkTransitHVtailXpos;
1942 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1943 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1944 *fgkLongHVcableSeparation;
1945 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1946 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1947 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1949 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1950 x2[2] = x1[2]-5*fgkmm;
1951 x3[2] = -ladderLength/2+endLength;
1952 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1953 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1954 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1956 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1957 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1961 //**********************************
1962 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1963 return virtualLadder;
1967 //________________________________________________________________________
1968 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(const char *name,
1969 Double_t dz, Double_t angle, Double_t xSign,
1970 Double_t L, Double_t H, Double_t l) {
1971 // Create one half of the V shape corner of CF ladder
1973 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1974 cfLaddSide->SetName(name);
1976 // Points must be in clockwise order
1977 cfLaddSide->SetVertex(0, 0, 0);
1978 cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1979 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1980 cfLaddSide->SetVertex(4, 0, 0);
1981 cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1982 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1984 cfLaddSide->SetVertex(1, 0, -H);
1985 cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1986 cfLaddSide->SetVertex(5, 0, -H);
1987 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1989 cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1990 cfLaddSide->SetVertex(3, 0, -H);
1991 cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1992 cfLaddSide->SetVertex(7, 0, -H);
1998 //________________________________________________________________________
1999 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
2001 // return a box containing the front-end hybrid
2004 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
2006 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
2007 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
2008 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
2009 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
2010 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
2011 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
2012 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
2013 // + upFLTotalThick + ccUpLayerTotThick);
2014 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
2016 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
2018 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
2020 //**************************************************** media :
2021 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2022 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
2023 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
2024 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2025 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2026 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
2027 TGeoMedium *niSDD = GetMedium("NICKEL$");
2028 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2029 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
2030 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors
2031 TGeoMedium *medSMDweld = GetMedium("SDD X7R weld$");
2033 //**************************************************** main volume :
2034 // TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
2035 // (fgkHybridLength)/2);
2036 Double_t xhybr[6],yhybr[6];
2037 xhybr[0] = -fgkHybridWidth/2;
2038 yhybr[0] = -volumeThick/2;
2039 xhybr[1] = fgkHybridWidth/2;
2040 yhybr[1] = -volumeThick/2;
2041 xhybr[2] = fgkHybridWidth/2;
2042 yhybr[2] = volumeThick/2;
2043 xhybr[3] = -fgkHybridWidth/2;
2044 yhybr[3] = volumeThick/2;
2045 xhybr[4] = xhybr[3] - 1.05*fgkHybCC2SensorLen*SinD(fgkHybCC2SensorAng);
2046 yhybr[4] = yhybr[3] - 1.05*fgkHybCC2SensorLen*CosD(fgkHybCC2SensorAng);
2047 xhybr[5] = xhybr[4];
2048 yhybr[5] = yhybr[4] - volumeThick;
2050 TGeoXtru *hybridBox = new TGeoXtru(2);
2051 hybridBox->DefinePolygon(6, xhybr, yhybr);
2052 hybridBox->DefineSection(0,-fgkHybridLength/2);
2053 hybridBox->DefineSection(1, fgkHybridLength/2);
2055 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
2058 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
2059 fgkHybridThBridgeThick/2,
2062 //**************************************************** Thermal bridge :
2063 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
2065 carbonFiberLadderStruct);
2066 vThermalBridge->SetLineColor(fColorCarbonFiber);
2067 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
2068 +fgkHybridThBridgeThick/2, 0);
2069 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
2071 //**************************************************** Screen layer :
2072 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
2073 fgkHybAlThick/2, fgkHybridLength/2);
2074 //here the upedex and glue layers are both assumed to be polyimide
2075 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
2077 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2079 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2080 (screenTotalThick+lowFLTotalThick)/2);
2082 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2083 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2085 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2086 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2087 +fgkHybAlThick/2, 0);
2089 TGeoTranslation hybHolePos1Tr(roundHoleX,
2090 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2091 -fgkHybridLength/2+fgkHybRndHoleZ);
2092 TGeoTranslation hybHolePos2Tr(roundHoleX,
2093 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2094 fgkHybridLength/2-fgkHybRndHoleZ);
2096 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2097 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2098 hybHolePos1->SetName("hybHolePos1");
2099 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2100 hybHolePos2->SetName("hybHolePos2");
2102 upGlueScreenTr->RegisterYourself();
2103 alScreenTr->RegisterYourself();
2104 hybHolePos1->RegisterYourself();
2105 hybHolePos2->RegisterYourself();
2108 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2109 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2110 "+sRoundHole:hybHolePos2)");
2111 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2112 vScreenAl->SetLineColor(fColorAl);
2113 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2114 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2115 "+sRoundHole:hybHolePos2)");
2116 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2117 sScreenUpGlue,polyhamideSDD);
2118 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2120 hybrid->AddNode(vScreenUpGlue, 1, 0);
2121 hybrid->AddNode(vScreenAl, 1, 0);
2123 //**************************************************** FL low layer :
2124 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2125 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2127 //here the upedex and glue layers are both assumed to be polyimide
2128 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2129 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2131 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2132 fgkHybAlThick/2, sideWidth1/2);
2134 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2135 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2136 -(fgkHybridLength-sideWidth1)/2);
2137 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2138 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2139 -(fgkHybridLength-sideWidth1)/2);
2140 upGlueBarTr1->RegisterYourself();
2141 alBarTr1->RegisterYourself();
2143 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2144 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2145 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2146 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2147 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2148 sLowUpGlueBar1, polyhamideSDD);
2149 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2151 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2152 vLowAlBar1->SetLineColor(fColorAl);
2153 hybrid->AddNode(vLowUpGlueBar1,1,0);
2154 hybrid->AddNode(vLowAlBar1,1,0);
2157 //here the upedex and glue layers are both assumed to be polyimide
2158 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2159 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2161 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2162 fgkHybAlThick/2, sideWidth2/2);
2164 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2165 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2166 (fgkHybridLength-sideWidth2)/2);
2167 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2168 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2169 (fgkHybridLength-sideWidth2)/2);
2170 upGlueBarTr2->RegisterYourself();
2171 alBarTr2->RegisterYourself();
2173 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2174 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2175 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2176 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2177 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2179 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2181 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2182 vLowAlBar2->SetLineColor(fColorAl);
2183 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2184 hybrid->AddNode(vLowAlBar2, 1, 0);
2186 if(GetDebug(3)) { // Remove compiler warning.
2187 sAlScreenLayer->InspectShape();
2188 sUpGlueScreenLayer->InspectShape();
2189 sRoundHole->InspectShape();
2190 sUpGlueBar1->InspectShape();
2191 sUpGlueBar2->InspectShape();
2192 sAlBar1->InspectShape();
2193 sAlBar2->InspectShape();
2196 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2197 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2198 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2200 lowFLpiece.SetNLayers(2);
2201 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2203 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2204 // alSDD at 80% : mostly to take into account strips of piece 3
2206 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2207 lowLayerYmin + lowFLTotalThick/2,
2208 -fgkHybridLength/2 + sideWidth1 };
2209 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2210 Double_t vZ[3] = {0,0,1};
2211 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2212 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2213 lowFLpiece.SetInitialNode(hybrid);
2214 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2215 lowFLpiece.ResetPoints();
2217 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2218 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2220 lowFLpiece.SetWidth(piece2width);
2221 lowFLpiece.SetName("lowFLpiece2");
2222 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2224 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2225 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2226 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2227 lowFLpiece.ResetPoints();
2229 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2230 - fgkHybFLlowHoleAmbDX/2;
2232 lowFLpiece.SetWidth(piece3width);
2233 lowFLpiece.SetName("lowFLpiece3");
2234 x1[0] = fgkHybridWidth/2-piece3width/2;
2236 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2237 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2238 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2240 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2241 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2242 Double_t vX[3] = {1,0,0};
2243 for (Int_t i=0; i<3; i++) {
2245 snprintf(ch, 20, "lowFLpieceA%i", i+4);
2246 lowFLpiece.SetName(ch);
2247 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2249 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2250 x1[0] = -fgkHybridWidth/2 + piece1width;
2251 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2252 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2253 x1[2] = zPiece; x2[2] = zPiece;
2254 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2255 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2256 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2257 lowFLpiece.ResetPoints();
2259 snprintf(ch, 20, "lowFLpieceB%i", i+4);
2260 lowFLpiece.SetName(ch);
2261 x1[0] = fgkHybridWidth/2 - piece3width;
2262 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2263 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2264 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2265 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2268 //**************************************************** chips+CC:
2269 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2270 chip.SetInitialNode(hybrid);
2272 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2273 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2274 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2275 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2277 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2278 // Here the tho CC (low+up) are merged
2279 // In fact, the last layer has a smaller surface of Al -> I put 80%
2281 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2285 for (Int_t i=0; i<4; i++) {
2286 snprintf(ch, 20, "pascalCC%i", i);
2288 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2289 x2[0] = x1[0] + fgkHybPascalDX;
2290 x1[2] = zChips[i] - fgkHybridLength/2;
2292 chip.AddCheckPoint( hybrid, 0, x1, vX );
2293 chip.AddCheckPoint( hybrid, 1, x2, vX );
2294 chip.CreateAndInsertBoxCableSegment(1,-90);
2297 snprintf(ch, 20, "ambraCC%i", i);
2299 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2300 x2[0] = x1[0] + fgkHybAmbraDX;
2301 chip.AddCheckPoint( hybrid, 0, x1, vX );
2302 chip.AddCheckPoint( hybrid, 1, x2, vX );
2303 chip.CreateAndInsertBoxCableSegment(1,-90);
2307 //**************************************************** CC outside chips:
2308 // I don't think there is a second aluminium layer here ...
2309 for (Int_t i = 0; i<4; i++) {
2310 snprintf(ch, 20, "ccLayerA%i", i);
2312 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2313 ccLayer1.SetInitialNode(hybrid);
2314 ccLayer1.SetNLayers(2);
2315 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2316 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2319 x1[0] = -fgkHybridWidth/2;
2320 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2321 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2322 + fgkHybChipThick + ccUpLayerTotThick/2;
2324 x1[2] = zChips[i] - fgkHybridLength/2;
2326 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2327 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2328 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2330 snprintf(ch, 20, "ccLayerB%i", i);
2331 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2332 ccLayer2.SetInitialNode(hybrid);
2333 ccLayer2.SetNLayers(2);
2334 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2335 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2338 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2339 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2340 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2341 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2342 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2343 ccLayer2.ResetPoints();
2344 snprintf(ch, 20, "ccLayerC%i", i);
2345 ccLayer2.SetName(ch);
2346 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2347 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2348 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2349 + ccUpLayerTotThick/2;
2352 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2353 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2354 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2356 //**************************************************** CC to sensors:
2357 // (alas, we cannot use GeomCableFlat here because section is not constant)
2358 Double_t xcc[6],ycc[6];
2359 xcc[0] = -0.5*ccLayer1.GetWidth();
2361 xcc[1] = 0.5*ccLayer1.GetWidth();
2364 ycc[2] = -fgkHybCC2SensorLen;
2365 xcc[3] = xcc[2] - fgkHybCC2SensorWid;
2368 ycc[4] = 0.8*ycc[3];
2370 ycc[5] = 0.2*ycc[3];
2372 TGeoXtru* ccToSensPoliSh = new TGeoXtru(2);
2373 ccToSensPoliSh->DefinePolygon(6, xcc, ycc);
2374 ccToSensPoliSh->DefineSection(0, 0.);
2375 ccToSensPoliSh->DefineSection(1, ccLayer1.GetThickness());
2377 snprintf(ch, 20, "ccToSens%i", i);
2378 TGeoVolume* ccToSensPoliVol = new TGeoVolume(ch, ccToSensPoliSh, polyhamideSDD);
2379 ccToSensPoliVol->SetLineColor(fColorPolyhamide);
2381 TGeoXtru* ccToSensAlSh = new TGeoXtru(2);
2382 ccToSensAlSh->DefinePolygon(6, xcc, ycc);
2383 ccToSensAlSh->DefineSection(0, 0.);
2384 ccToSensAlSh->DefineSection(1, fgkHybAlCCThick);
2386 snprintf(ch, 20, "ccToSensAl%i", i);
2387 TGeoVolume* ccToSensAlVol = new TGeoVolume(ch, ccToSensAlSh, alSDD50p100);
2388 ccToSensAlVol->SetLineColor(fColorAl);
2390 ccToSensPoliVol->AddNode(ccToSensAlVol, 1, 0);
2393 ccLayer1.GetPoint(0,coord);
2394 hybrid->AddNode(ccToSensPoliVol, i+1,
2395 new TGeoCombiTrans(coord[0], coord[1], coord[2],
2396 new TGeoRotation("",-90-fgkHybCC2SensorAng, 90, 90)));
2399 //**************************************************** FL UP:
2400 // (last Al layer will be a special triangular shape)
2401 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2402 fgkHybFLUpperWidth/2, flUpThick/2,
2403 fgkHybFLUpperLength/2);
2404 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2405 sFLupPolyhamide, polyhamideSDD);
2406 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2407 TGeoTranslation *trFLupPolyhamide =
2408 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2409 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2411 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2413 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2414 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2415 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2416 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2417 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2418 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2419 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2420 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2421 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2422 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2425 vAluStrip->SetLineColor(fColorAl);
2426 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2427 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2429 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2430 +flUpThick+fgkHybAlThick/2;
2431 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2432 fgkHybridWidth/2,yRotAluStrip,
2433 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2434 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2435 AddTranslationToCombiTrans(aluStripTr2,0,0,
2436 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2437 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2438 AddTranslationToCombiTrans(aluStripTr3,0,0,
2439 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2440 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2441 AddTranslationToCombiTrans(aluStripTr4,0,0,
2442 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2444 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2445 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2446 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2447 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2448 //**************************************************** SMD:
2449 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2450 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2451 fgkHybSMDheight/2,fgkHybSMDendW/2);
2452 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2454 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2455 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2456 fgkHybSMDmiddleW/2);
2457 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2458 hybSMDmiddle,medSMD);
2459 vHybSMDmiddle->SetLineColor(fColorSMD);
2460 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2461 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2462 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2463 hybSMDend,medSMDweld);
2464 vHybSMDend->SetLineColor(fColorSMDweld);
2465 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2466 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2467 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2468 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2469 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2470 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2471 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2472 for (Int_t i=0; i<fgkNHybSMD; i++) {
2473 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2474 -fgkHybridWidth/2+fgkHybSMDposX[i],
2475 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2476 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2477 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2483 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2484 hybrid->SetVisibility(kFALSE);
2488 //________________________________________________________________________
2489 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2491 // Return a TGeoVolume* containing a segment of a ladder.
2494 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2495 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2496 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2497 TGeoMedium *alSDD = GetMedium("AL$");
2499 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2500 Double_t segmentLength = fgkSegmentLength;
2501 Double_t spaceBetweenCables = 500*fgkmicron;
2503 //*****************************************
2504 // Set parameters according to (iLay,iSeg):
2505 //*****************************************
2506 Int_t nDetectors = fgkLay3Ndet;
2507 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2508 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2509 (fgkSegmentLength*fgkLay3Ndet/2. -
2510 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2511 // sensorCenterZPos = z in segment local coord syst.
2513 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2514 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2517 } else if (iLay==4) {
2518 nDetectors = fgkLay4Ndet;
2519 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2520 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2521 (fgkSegmentLength*fgkLay4Ndet/2. -
2522 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2523 digitCableA = fDigitCableLay4A;
2524 digitCableB = fDigitCableLay4B;
2526 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2529 Double_t cableSideSign = -1;
2530 if (iSeg<nDetectors/2) cableSideSign = 1;
2531 Double_t spaceForCables = spaceBetweenCables*
2532 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2534 // gives [0-1-2-2-1-0]*spaceBetweenCables
2535 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2536 Int_t iUpdateCableMin;
2537 Int_t iUpdateCableMax;
2538 if (cableSideSign==-1) {
2539 iUpdateCableMin = nDetectors/2;
2540 iUpdateCableMax = iSeg-1;
2542 iUpdateCableMin = iSeg+1;
2543 iUpdateCableMax = nDetectors/2-1;
2547 cout << "Segment ("<< iLay <<',' << iSeg
2548 << ") : sensor z shift in local segment coord.="
2549 << sensorCenterZPos << endl;
2552 //****************************
2553 // The segment volume
2554 //****************************
2556 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2557 // likely slows down the transport of particles through the geometry
2559 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2561 // TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2562 // fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2563 // fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2564 // segmentLength/2);
2565 // A shaped Xtru instead of a simple BBox to avoid overlaps and extrusions
2566 TGeoXtru *segBox = new TGeoXtru(2);
2567 segBox->SetName("ITSsddSegBox");
2569 Double_t xseg[8],yseg[8];
2570 xseg[0] = -(fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW);
2571 yseg[0] = fgkLadderHeight/2+fgkLadderSegBoxDH/2;
2578 xseg[4] = 0.35*xseg[3];
2581 yseg[5] = yseg[4] + fgkLadderSegBoxDHCorr;
2587 segBox->DefinePolygon(8, xseg, yseg);
2588 segBox->DefineSection(0,-segmentLength/2);
2589 segBox->DefineSection(1, segmentLength/2);
2591 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2593 virtualSeg->SetVisibility(kFALSE);
2595 //******************************
2596 // Carbon fiber structure :
2597 //******************************
2599 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2600 Int_t volumeIndex = 1;
2601 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2602 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2606 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2607 fLaddSegCommonTr[i]);
2610 //**********************************
2611 // Pine support of the sensors :
2612 //**********************************
2613 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2614 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2616 // The use of the following constructor type allow to use rotPS1 and rotPS2
2617 // (and not copy them) therefore we gain some memory
2618 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2619 - fgkLadderHeight/2.-tDY
2620 + fgkPinSuppHeight/2.,
2621 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2623 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2624 - fgkLadderHeight/2.-tDY
2625 + fgkPinSuppHeight/2.,
2626 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2627 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2629 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2630 - fgkLadderHeight/2.-tDY
2631 + fgkPinSuppHeight/2.,
2632 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2633 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2635 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2636 - fgkLadderHeight/2.-tDY
2637 + fgkPinSuppHeight/2.,
2638 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2639 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2641 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2642 - fgkLadderHeight/2. - tDY
2643 + fgkPinSuppHeight/2.,
2644 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2646 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2647 - fgkLadderHeight/2. - tDY
2648 + fgkPinSuppHeight/2.,
2649 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2650 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2652 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2653 - fgkLadderHeight/2. - tDY
2654 + fgkPinSuppHeight/2.,
2655 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2656 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2658 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2659 - fgkLadderHeight/2. - tDY
2660 + fgkPinSuppHeight/2.,
2661 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2662 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2664 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2665 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2666 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2667 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2668 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2669 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2670 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2671 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2673 TGeoMedium *pinMed = GetMedium("RYTON$");
2674 Double_t fgkPinHeight = 4.5*fgkmm;
2675 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2677 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2679 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2680 - fgkLadderHeight/2.-tDY
2682 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2683 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2684 virtualSeg->AddNode(pineV, 1, transPS2b);
2686 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2687 - fgkLadderHeight/2. - tDY
2689 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2690 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2691 virtualSeg->AddNode(pineV, 2, transPS6b);
2694 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2695 - fgkLadderHeight/2.-tDY
2697 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2698 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2699 virtualSeg->AddNode(pineV, 3, transPS4b);
2701 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2702 - fgkLadderHeight/2. - tDY
2704 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2705 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2706 virtualSeg->AddNode(pineV, 4, transPS8b);
2709 //******************************
2710 // Cooling pipe supports :
2711 //******************************
2712 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2713 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2714 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2715 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2717 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2718 (triangleHeight+triangleCPaxeDist/
2719 TMath::Sin(halfTheta)-coolPipeSuppH);
2720 if (fAddCoolingSyst) {
2721 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2722 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2723 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2724 -fgkLadderHeight/2. - tDY
2725 +coolPipeSuppH+fgkLadderBeamRadius,
2726 -segmentLength/2., rotCPS1);
2728 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2729 -fgkLadderHeight/2. - tDY
2730 +coolPipeSuppH+fgkLadderBeamRadius,
2731 -segmentLength/2., rotCPS1);
2732 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2734 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2735 -fgkLadderHeight/2.- tDY
2736 +coolPipeSuppH+fgkLadderBeamRadius,
2737 segmentLength/2., rotCPS2);
2739 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2740 -fgkLadderHeight/2.- tDY
2741 +coolPipeSuppH+fgkLadderBeamRadius,
2742 segmentLength/2., rotCPS2);
2743 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2745 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2746 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2747 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2748 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2751 //************************
2753 //************************
2754 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2755 -fgkLadderHeight/2. - tDY +
2756 fgkLadderBeamRadius+coolPipeSuppH, 0);
2757 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2758 -fgkLadderHeight/2.- tDY +
2759 fgkLadderBeamRadius+coolPipeSuppH, 0);
2761 if (fAddCoolingSyst) {
2762 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2763 fgkCoolPipeOuterDiam/2,
2765 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2768 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2769 coolingPipeShape, phynoxSDD );
2770 coolingPipe->SetLineColor(fColorPhynox);
2771 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2775 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2776 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2778 virtualSeg->AddNode(cooler, 1, pipeTr1);
2779 virtualSeg->AddNode(cooler, 2, pipeTr2);
2783 //**********************************
2784 // Bases of hybrid thermal bridges
2785 //**********************************
2786 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2787 // approx !!! not clear on 0752/14-A
2788 if (fAddCoolingSyst) {
2789 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2790 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2791 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2792 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2794 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2795 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2798 //*************************
2800 //*************************
2801 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2802 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2804 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2805 - shiftHyb*SinD(fgkHybridAngle) );
2806 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2807 + shiftHyb*CosD(fgkHybridAngle) );
2809 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2810 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2811 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2812 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2813 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2814 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2816 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2817 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2824 // Starting from this segment
2825 Double_t hybDz = ((TGeoXtru*)fHybrid->GetShape())->GetZ(1);
2826 Double_t hybDx = ((TGeoXtru*)fHybrid->GetShape())->GetX(1);
2827 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2828 - digitCableA->GetWidth()/2;
2829 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2830 - digitCableA->GetThickness()/2;
2832 Double_t digitCableX = ( coolPipeSuppL
2833 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2834 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2835 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2836 + fgkLadderBeamRadius+coolPipeSuppH
2837 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2838 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2841 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2842 digitCableY, cableSideSign*hybDz };
2843 Double_t digitCableCenterA1[3] = {
2844 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2845 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2846 cableSideSign*segmentLength/2 };
2848 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2849 digitCableY,cableSideSign*hybDz};
2850 Double_t digitCableCenterB1[3]={
2851 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2852 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2853 cableSideSign*segmentLength/2 };
2855 Double_t vZ[3] = {0,0,1};
2856 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2857 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2858 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2859 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2861 // Updating the other cables
2862 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2864 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2866 digitCableA[iCable].GetPoint( 1, coord);
2867 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2868 digitCableB[iCable].GetPoint( 1, coord);
2869 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2872 // Now the small Al foil on the same hybrid side
2873 Double_t xfoil[5],yfoil[5];
2875 xfoil[0] = -fgkHybridAlFoilWide/2;
2877 xfoil[1] = fgkHybridAlFoilWide/2;
2878 yfoil[1] = yfoil[0];
2879 xfoil[2] = xfoil[1];
2880 yfoil[2] = -hybDx + (fgkHybridAlFoilWide - fgkHybridAlFoilSide);
2881 xfoil[3] = xfoil[0] + fgkHybridAlFoilSide;
2883 xfoil[4] = xfoil[0];
2884 yfoil[4] = yfoil[3];
2886 TGeoXtru* alFoilSh = new TGeoXtru(2);
2887 alFoilSh->DefinePolygon(5, xfoil, yfoil);
2888 alFoilSh->DefineSection(0,-fgkHybridAlFoilThick/2);
2889 alFoilSh->DefineSection(1, fgkHybridAlFoilThick/2);
2891 TGeoVolume* alFoilVol = new TGeoVolume("ITSsddAlFoilHybSide", alFoilSh, alSDD);
2892 alFoilVol->SetLineColor(fColorAl);
2894 Double_t zFoilTrans = cableSideSign*(hybDz + alFoilSh->GetX(1));
2895 TGeoRotation rotFoil3;
2896 TGeoRotation rotFoil4;
2897 if (cableSideSign > 0) {
2898 rotFoil3 = TGeoRotation("", 90-fgkHybridAngle, -90, -90);
2899 rotFoil4 = TGeoRotation("",-90+fgkHybridAngle, 90, 90);
2901 rotFoil3 = TGeoRotation("", 90-fgkHybridAngle, 90, -90);
2902 rotFoil4 = TGeoRotation("",-90+fgkHybridAngle, -90, 90);
2904 TGeoCombiTrans *foiTr1 = new TGeoCombiTrans(*pipeTr2, rotFoil3);
2905 TGeoCombiTrans *foiTr2 = new TGeoCombiTrans(*pipeTr1, rotFoil4);
2906 AddTranslationToCombiTrans( foiTr1, -hybrVolX, hybrVolY, zFoilTrans);
2907 AddTranslationToCombiTrans( foiTr2, hybrVolX, hybrVolY, zFoilTrans);
2909 virtualSeg->AddNode(alFoilVol, 1, foiTr1);
2910 virtualSeg->AddNode(alFoilVol, 2, foiTr2);
2913 //**********************************
2914 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2919 //________________________________________________________________________
2920 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2922 // Create a pine support and its pine
2923 // axis of rotation is the cone axis, center in its middle
2925 TGeoMedium *rytonSDD = GetMedium("RYTON$");
2927 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2928 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2929 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2930 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2931 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2932 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2933 fgkPinSuppHeight/2.+0.00001);
2934 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2936 if(GetDebug(3)){// Remove compiler warning.
2937 cone->InspectShape();
2938 tong->InspectShape();
2939 hole->InspectShape();
2942 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2943 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2944 tongTrans->RegisterYourself();
2945 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2946 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2947 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2949 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2951 pinSupport->SetLineColor(fColorRyton);
2957 //________________________________________________________________________
2958 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2960 // Create half of the cooling pipe support (ALR-0752/3)
2963 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2965 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2966 side1->SetName("ITSsddCPSside1");
2967 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2968 side1->SetVertex( 1, 0, fgkCoolPipeSuppWidthExt/2.);
2969 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2970 fgkCoolPipeSuppWidthExt/2.);
2971 side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX,
2972 -fgkCoolPipeSuppWidthExt/2.);
2973 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2974 side1->SetVertex( 5, 0, fgkCoolPipeSuppWidthExt/2.);
2975 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2976 fgkCoolPipeSuppWidthExt/2.);
2977 side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2.,
2978 -fgkCoolPipeSuppWidthExt/2.);
2980 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2981 - fgkCoolPipeSuppAxeDist
2982 + fgkCoolPipeSuppWidthExt/2., 0);
2983 side1Tr->RegisterYourself();
2984 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2985 - fgkCoolPipeSuppAxeDist
2986 + fgkCoolPipeSuppWidthExt*3/2.
2987 + fgkCoolPipeSuppWidthIn,0);
2988 side2Tr->RegisterYourself();
2990 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2991 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2992 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2993 TGeoTranslation *middleTr =
2994 new TGeoTranslation("ITSsddCPStr3",
2995 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2996 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2997 +fgkCoolPipeSuppWidthIn/2., 0);
2998 middleTr->RegisterYourself();
3000 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
3001 fgkCoolPipeSuppTongW/4.,
3002 (fgkCoolPipeSuppFulWidth
3003 - 2*fgkCoolPipeSuppWidthExt
3004 - fgkCoolPipeSuppWidthIn)/2,
3005 fgkCoolPipeSuppHeight/2.);
3007 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
3008 fgkCoolPipeSuppTongW/4.,
3009 - fgkCoolPipeSuppAxeDist
3010 + fgkCoolPipeSuppFulWidth
3011 - axeBox->GetDY(), 0);
3012 axeBoxTr->RegisterYourself();
3014 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
3015 fgkCoolPipeSuppTongW/4.);
3017 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
3018 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
3019 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
3020 axeTrans->RegisterYourself();
3021 //delete axeRot; // make the code crash, no idea of why !!!
3024 middle->InspectShape();
3025 axe->InspectShape();
3028 TGeoMedium *rytonSDD = GetMedium("RYTON$");
3030 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
3031 "ITSsddCoolPipeSuppShapeL",
3032 "ITSsddCPSmiddle:ITSsddCPStr3"
3033 "+ITSsddCPSside1:ITSsddCPStr1"
3034 "+ITSsddCPSside1:ITSsddCPStr2"
3035 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
3036 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
3037 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
3038 coolPipeSuppShape, rytonSDD);
3040 coolPipeSupp->SetLineColor(fColorRyton);
3042 return coolPipeSupp;
3046 //________________________________________________________________________
3047 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
3049 //Create half of the cooling pipe support (ALR-0752/3)
3052 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
3054 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
3055 side1->SetName("ITSsddCPSside1R");
3056 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
3057 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
3058 -fgkCoolPipeSuppWidthExt/2.);
3059 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
3060 fgkCoolPipeSuppWidthExt/2.);
3061 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
3062 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
3063 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
3064 -fgkCoolPipeSuppWidthExt/2.);
3065 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
3066 fgkCoolPipeSuppWidthExt/2.);
3067 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
3069 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
3070 - fgkCoolPipeSuppAxeDist
3071 + fgkCoolPipeSuppWidthExt/2., 0);
3072 side1Tr->RegisterYourself();
3073 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
3074 - fgkCoolPipeSuppAxeDist
3075 + fgkCoolPipeSuppWidthExt*3/2.
3076 + fgkCoolPipeSuppWidthIn, 0);
3077 side2Tr->RegisterYourself();
3079 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
3080 (fgkCoolPipeSuppMaxLength/2.
3081 - fgkCoolPipeSuppSlitL)/2.,
3082 fgkCoolPipeSuppWidthIn/2.,
3083 fgkCoolPipeSuppHeight/2.);
3084 TGeoTranslation *middleTr =
3085 new TGeoTranslation("ITSsddCPStr3R",
3086 -( fgkCoolPipeSuppMaxLength/2.
3087 -fgkCoolPipeSuppSlitL)/2.,
3088 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
3089 + fgkCoolPipeSuppWidthIn/2.,0);
3090 middleTr->RegisterYourself();
3092 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
3093 fgkCoolPipeSuppTongW/4.,
3094 (fgkCoolPipeSuppFulWidth
3095 - 2*fgkCoolPipeSuppWidthExt
3096 - fgkCoolPipeSuppWidthIn)/2,
3097 fgkCoolPipeSuppHeight/2.);
3099 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
3100 - fgkCoolPipeSuppTongW/4.,
3101 - fgkCoolPipeSuppAxeDist
3102 + fgkCoolPipeSuppFulWidth
3103 - axeBox->GetDY(),0);
3104 axeBoxTr->RegisterYourself();
3106 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
3107 fgkCoolPipeSuppTongW/4.);
3109 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
3110 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
3111 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
3112 axeTrans->RegisterYourself();
3116 middle->InspectShape();
3117 axe->InspectShape();
3120 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
3121 "ITSsddCoolPipeSuppShapeR",
3122 "ITSsddCPSmiddleR:ITSsddCPStr3R"
3123 "+ITSsddCPSside1R:ITSsddCPStr1R"
3124 "+ITSsddCPSside1R:ITSsddCPStr2R"
3125 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
3126 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
3128 TGeoMedium *rytonSDD = GetMedium("RYTON$");
3129 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
3130 coolPipeSuppShape, rytonSDD);
3131 coolPipeSupp->SetLineColor(fColorRyton);
3133 return coolPipeSupp;
3136 //________________________________________________________________________
3137 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
3139 // based on ALR 0752/8
3142 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
3144 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
3145 - (fgkRadiusAminBTB+fgkBTBthick);
3146 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
3147 fgkBTBthick/2., fgkBTBlength/2.);
3148 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
3149 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
3150 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
3151 base1Tr->RegisterYourself();
3153 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
3155 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
3156 fgkBTBthick/2., fgkBTBlength/2.);
3157 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
3158 fgkBTBaxisAtoBottom - base2width/2.,
3159 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
3160 base2Tr->RegisterYourself();
3162 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
3163 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
3164 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
3165 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
3166 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
3167 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
3168 sideTr1->RegisterYourself();
3169 sideTr2->RegisterYourself();
3171 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
3172 fgkBTBthick/2., fgkBTBHoleLength/2.);
3173 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
3174 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3175 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3176 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
3177 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
3178 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3179 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3180 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
3181 holeTr1->RegisterYourself();
3182 holeTr2->RegisterYourself();
3184 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
3185 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3186 fgkRadiusAminBTB, radiusAmaxBTB,
3187 fgkBTBlength/2., 0., 180.);
3188 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3189 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3190 fgkBTBlength/2., 270., 360.);
3191 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3192 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3194 roundTr1->RegisterYourself();
3196 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3197 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3198 fgkBTBlength/2., 180., 270.);
3199 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3200 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3202 roundTr2->RegisterYourself();
3204 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3205 "ITSsddBaseThermalBridgeShape",
3206 "ITSsddBTBbase1:ITSsddBTBtr1"
3207 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3208 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3209 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3210 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3211 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3212 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3213 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3214 "+ ITSsddBTBmainAxis");
3216 if(GetDebug(3)){// Remove compiler warning.
3217 base1->InspectShape();
3218 base2->InspectShape();
3219 side->InspectShape();
3220 hole->InspectShape();
3221 mainAxis->InspectShape();
3222 round1->InspectShape();
3223 round2->InspectShape();
3226 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3227 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3229 carbonFiberLadderStruct);
3231 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3232 return vBaseThermalBridge;
3236 //________________________________________________________________________
3237 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3239 // Return an assembly containing a end of a CF ladder.
3242 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3243 TGeoMedium *stesalite = GetMedium("G10FR4$");
3244 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3245 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3247 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3248 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3249 Double_t underSegDH = fLay3LadderUnderSegDH;
3250 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3251 // footDZ is also where to place the ruby's center in local Z
3252 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3255 } else if (iLay==4) {
3256 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3257 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3258 underSegDH = fLay4LadderUnderSegDH;
3259 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3260 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3262 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3266 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3267 + underSegDH/2); //space under ladder segment
3268 // here tDY is not the same as for the segment because the end ladder
3269 // does not have a space under it, inside the general ladder volume.
3270 Double_t segmentLength = fgkSegmentLength;
3271 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3273 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3275 //**********************************
3276 // coding real matter :
3277 //**********************************
3278 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3279 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3280 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3281 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3283 //--- The 3 V shape corners of the Carbon Fiber Ladder
3285 TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape",
3286 topCornerLength/2., halfTheta, -1,
3287 fgkLadderLa, fgkLadderHa, fgkLadderl);
3288 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1",
3289 cfLaddTop1,carbonFiberLadderStruct);
3290 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3291 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape",
3292 topCornerLength/2., halfTheta, 1,
3293 fgkLadderLa, fgkLadderHa, fgkLadderl);
3294 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3295 cfLaddTop2,carbonFiberLadderStruct);
3296 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3297 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3298 -(length-topCornerLength)/2.);
3299 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3300 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3303 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape",
3304 length/2., beta, -1,
3305 fgkLadderLb, fgkLadderHb, fgkLadderl);
3306 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3307 cfLaddSide1,carbonFiberLadderStruct);
3308 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3309 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape",
3311 fgkLadderLb, fgkLadderHb, fgkLadderl);
3312 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3313 cfLaddSide2,carbonFiberLadderStruct);
3314 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3315 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3316 TMath::Tan(beta) - fgkLadderBeamRadius );
3318 // because center of the triangle doesn't correspond to virtual vol. center
3319 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3320 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3321 alpha*TMath::RadToDeg());
3322 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3323 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3324 -alpha*TMath::RadToDeg());
3325 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3326 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3327 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3328 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3329 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3332 // Beams on the sides
3333 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3334 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3336 //Euler rotation : about Z, then new X, then new Z
3337 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3338 -beamPhiPrime*TMath::RadToDeg(), -90);
3339 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3340 beamPhiPrime*TMath::RadToDeg(), -90);
3341 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3342 beamPhiPrime*TMath::RadToDeg(), -90);
3343 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3344 -beamPhiPrime*TMath::RadToDeg(), -90);
3345 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3346 TMath::Tan(halfTheta),
3347 fgkLadderBeamRadius/2. + tDY,
3348 -length/2 + segmentLength/8, beamRot1);
3349 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3350 TMath::Tan(halfTheta),
3351 fgkLadderBeamRadius/2.+tDY,
3352 -length/2 + 3*segmentLength/8, beamRot2);
3353 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3354 TMath::Tan(halfTheta),
3355 fgkLadderBeamRadius/2.+tDY,
3356 -length/2 + segmentLength/8, beamRot3);
3357 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3358 TMath::Tan(halfTheta),
3359 fgkLadderBeamRadius/2. + tDY,
3360 -length/2+3*segmentLength/8, beamRot4);
3362 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3363 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3364 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3365 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3367 //--- Beams of the bottom
3368 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3370 /* Not there actually
3371 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3372 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3373 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3374 bottomBeam1, carbonFiberLadderStruct);
3375 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3377 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3378 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3379 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3380 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3382 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3383 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3384 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3385 bottomBeam2, carbonFiberLadderStruct);
3386 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3387 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3388 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3389 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3391 //**********************************
3392 //the cooling pipe supports
3393 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3394 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3396 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3397 (triangleHeight+triangleCPaxeDist/
3398 TMath::Sin(halfTheta)-coolPipeSuppH);
3400 if (fAddCoolingSyst) {
3401 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3402 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3403 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3404 -fgkLadderHeight/2.+ tDY +
3405 coolPipeSuppH+fgkLadderBeamRadius,
3406 -length/2., rotCPS1);
3407 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3408 -fgkLadderHeight/2.+ tDY +
3409 coolPipeSuppH+fgkLadderBeamRadius,
3410 -length/2., rotCPS2);
3412 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3413 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3416 //**********************************
3417 //--- The stesalite foot of the ladder
3419 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3420 - fgkLadFootY/2+fgkLadFingerPrintY;
3422 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3423 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3425 //=====================================
3428 if (fAddCoolingSyst) {
3430 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3431 -fgkLadderHeight/2.+ tDY +
3432 coolPipeSuppH + fgkLadderBeamRadius,
3433 -length/2.+coolPipeEndLen/2.);
3434 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3435 -fgkLadderHeight/2. + tDY +
3436 fgkLadderBeamRadius + coolPipeSuppH,
3437 -length/2.+coolPipeEndLen/2.);
3439 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3440 fgkCoolPipeOuterDiam/2,
3442 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3445 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3446 coolingPipeShape, phynoxSDD );
3447 coolingPipe->SetLineColor(fColorPhynox);
3448 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3451 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3452 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3454 virtualEnd->AddNode(cooler, 1, pipeTr1);
3455 virtualEnd->AddNode(cooler, 2, pipeTr2);
3459 //=====================================
3460 //--- HV cable guide
3463 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3464 fgkHVguideY1/2,fgkHVguideZ1/2);
3465 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3467 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3468 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3469 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3470 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3472 //=====================================
3474 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3475 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3476 -fgkLadderHeight/2.+ tDY +
3477 coolPipeSuppH+fgkLadderBeamRadius,
3478 -length/2.+coolPipeEndLen+raccordFullLen/2);
3479 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3480 -fgkLadderHeight/2.+ tDY +
3481 coolPipeSuppH+fgkLadderBeamRadius,
3482 -length/2.+coolPipeEndLen+raccordFullLen/2);
3484 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3485 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3487 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3492 //________________________________________________________________________
3493 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3495 //--- The stesalite foot of the ladder
3497 // The 2 screw holes on the left part
3498 // the small holes at each corner of the ruby cage (diam 2mm)
3499 // the really small level difference of 0.3mm on the bottom
3502 TGeoMedium *stesalite = GetMedium("G10FR4$");
3504 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3506 Double_t epsilon = 2e-10;
3507 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3509 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3510 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3511 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3512 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3514 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3515 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3516 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3519 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3520 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3522 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3523 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3524 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3526 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3527 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3528 rubyScrewHoleLen/2);
3530 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3531 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3532 fgkLadFootX/2-rubyScrewHoleLen/2,
3533 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3535 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3536 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3539 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3540 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3541 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3543 ladFootBox1Tr->RegisterYourself();
3544 ladFingerPrintTr->RegisterYourself();
3545 rubyCageHoleTr->RegisterYourself();
3546 rubyScrewHoleTr->RegisterYourself();
3547 rubyHoleTr->RegisterYourself();
3549 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3550 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3551 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3552 "+rubyHole:rubyHoleTr)");
3553 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3554 footRightPart,stesalite);
3555 vFootRightPart->SetLineColor(fColorStesalite);
3557 virtualFoot->AddNode(vFootRightPart, 1, 0);
3560 //--- This was the right part of the foot, now let's do the middle
3561 //--- and the right parts
3563 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3564 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3566 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3567 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3568 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3570 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3571 vFootMiddle->SetLineColor(fColorStesalite);
3572 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3575 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3576 (fgkLadFootY-fgkLadFingerPrintY)/2,
3578 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3579 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3580 -fgkLadFingerPrintY/2, 0);
3581 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3583 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3584 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3587 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3590 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3591 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3593 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3594 vFootLeft->SetLineColor(fColorStesalite);
3595 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3597 if(GetDebug(3)){ // Remove compiler warning.
3598 ladFingerPrint->InspectShape();
3599 ladFootBox1->InspectShape();
3600 rubyCageHole->InspectShape();
3601 rubyScrewHole->InspectShape();
3602 rubyHole->InspectShape();
3608 //________________________________________________________________________
3609 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3611 // return an assembly containing the CARLOS end-ladder board
3612 // and the heat bridge
3616 TGeoMedium *glassFiber = GetMedium("GLASS FIBER$");// glassFiber
3617 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3618 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3619 TGeoMedium *copper = GetMedium("COPPER$");
3620 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
3621 TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws
3623 //=========================================
3624 // cooling support of the Carlos card (HeatBridge):
3625 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3627 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3629 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3631 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3632 supCarlosBoard1, alCu12SDD);
3633 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3634 supCarlosBoard2, alCu12SDD);
3635 vSupCarlosBoard1->SetLineColor(4);
3636 vSupCarlosBoard2->SetLineColor(4);
3639 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3640 // shift of the main planes in the direction of their width
3641 // the center is fixed at the center of the 2 small fixing arms on each sides.
3644 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3645 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3646 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3647 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3649 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3650 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3653 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3657 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3658 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3660 //=========================================
3661 // fixing arm of the cooling support :
3662 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3664 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3665 supCarlosBoard3, alCu12SDD);
3666 vSupCarlosBoard3->SetLineColor(4);
3669 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3671 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3672 littleScrew, stainless);
3673 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3674 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3675 fgkLittleScrewHeadR-0.07, rotScrew);
3676 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3677 fgkLittleScrewHeadR+0.07, rotScrew);
3678 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3679 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3681 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3682 0, fgkCarlosSuppAngle, 0);
3683 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3684 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3685 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3686 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3687 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3688 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3691 //=========================================
3692 // screws fixing the board on the U tube
3693 Double_t aaa = fgkCarlosSuppY3; // ???
3694 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3695 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3696 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3697 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3698 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3699 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3701 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3703 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3704 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3705 screw1y,screw1z, CarlosSuppRot);
3707 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3708 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3709 screw1z,screw1y, CarlosSuppRot);
3711 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3712 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3713 screw1y,screw1z, CarlosSuppRot);
3715 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3716 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3717 screw1z,screw1y, CarlosSuppRot);
3719 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3720 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3721 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3722 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3724 //=========================================
3726 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3727 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3728 card1.SetNLayers(2);
3729 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3730 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3731 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3732 p1[0] = -fgkCarlosCardX1/2;
3733 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3734 p1[2] = fgkCarlosCardShift;
3735 p2[0] = fgkCarlosCardX1/2;
3736 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3737 p2[2] = fgkCarlosCardShift;
3738 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3739 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3740 card1.CreateAndInsertBoxCableSegment(1,90);
3742 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3743 card2.SetNLayers(2);
3744 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3745 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3746 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3748 p1[0] = -fgkCarlosCardX1/2;
3749 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3750 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3752 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3753 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3754 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3755 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3756 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3757 card2.CreateAndInsertBoxCableSegment(1,90);
3759 //=========================================
3760 // some chips on the board
3762 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3764 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3765 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3766 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3768 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3769 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3770 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3772 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3773 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3774 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3775 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3776 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3777 u1.CreateAndInsertBoxCableSegment(1,90);
3780 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3782 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3783 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3784 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3786 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3787 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3788 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3790 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3791 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3792 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3793 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3794 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3795 u2.CreateAndInsertBoxCableSegment(1,90);
3798 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3800 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3801 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3802 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3804 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3805 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3807 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3809 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3811 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3812 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3813 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3814 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3816 //--- U4 is like U3 (?)
3817 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3818 u4Trans->RotateX(90);
3819 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3820 fgkCarlosCardShift + fgkCarlosU4posZ);
3821 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3824 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3826 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3827 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3828 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3830 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3831 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3832 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3834 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3835 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3836 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3837 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3838 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3839 u17.CreateAndInsertBoxCableSegment(1,90);
3842 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3844 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3845 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3846 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3848 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3849 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3850 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3852 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3853 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3854 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3855 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3856 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3857 u35.CreateAndInsertBoxCableSegment(1,90);
3860 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3862 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3863 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3864 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3866 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3867 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3868 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3870 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3871 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3872 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3873 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3874 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3875 u36.CreateAndInsertBoxCableSegment(1,90);
3878 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3880 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3881 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3882 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3884 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3885 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3886 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3888 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3889 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3890 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3891 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3892 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3893 qz1.CreateAndInsertBoxCableSegment(1,90);
3895 return assemblySupCarlos;
3898 //________________________________________________________________________
3899 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3901 // Creates the assemblies containing the LV cards (left and right)
3904 TGeoMedium *glassFiber = GetMedium("GLASS FIBER$");// glassFiber
3905 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3906 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3907 TGeoMedium *copper = GetMedium("COPPER$");
3908 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
3909 TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws
3911 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3912 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3914 // we are going to use flat cable class to create multilayer box,
3915 // then we can use the pointers to created volumes to place them elsewhere
3916 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3918 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3919 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3920 cardLV.SetNLayers(2);
3921 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3922 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3923 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3925 p1[1] = fgkLVcardY/2;
3928 p2[1] = fgkLVcardY/2;
3930 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3931 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3932 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3933 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3934 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3935 fCardLVR->AddNode(boxVol, 1, trCard);
3937 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3938 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3939 chipO.SetNLayers(2);
3940 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3941 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3942 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3943 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3944 p1[1] = fgkLVChip0PosY;
3945 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3947 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3948 p2[1] = fgkLVChip0PosY;
3949 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3950 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3951 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3952 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3953 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3955 carLVfullThick/2+chip0fullThick/2, rotAdd);
3956 fCardLVR->AddNode(boxVol, 1, trCard);
3958 // put also this chip on the other side of the card
3959 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3961 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3962 fCardLVL->AddNode(boxVol, 2, trCard);
3963 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3965 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3966 fCardLVR->AddNode(boxVol, 2, trCard);
3968 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3969 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3970 chip1.SetNLayers(2);
3971 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3972 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3973 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3974 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3975 p1[1] = fgkLVChip1PosY;
3976 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3978 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3979 p2[1] = fgkLVChip1PosY;
3980 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3981 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3982 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3983 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3984 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3986 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3987 fCardLVR->AddNode(boxVol, 1, trCard);
3989 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3990 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3991 chip2.SetNLayers(2);
3992 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3993 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3994 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3995 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3996 p1[1] = fgkLVChip2PosY;
3997 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3998 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3999 p2[1] = fgkLVChip2PosY;
4000 p2[2] = carLVfullThick/2 + chip2fullThick/2;
4001 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
4002 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
4003 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
4004 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
4006 carLVfullThick/2 + chip2fullThick/2, rotAdd);
4007 fCardLVR->AddNode(boxVol, 1, trCard);
4009 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
4010 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
4011 chip3.SetNLayers(2);
4012 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
4013 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
4014 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
4015 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
4016 p1[1] = fgkLVChip3PosY;
4017 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
4018 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
4019 p2[1] = fgkLVChip3PosY;
4020 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
4021 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
4022 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
4023 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
4024 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
4026 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
4027 fCardLVR->AddNode(boxVol, 1, trCard);
4029 // the Al pieces for heat exchange :
4030 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
4031 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
4033 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
4034 (fgkLVcoolX1/2+fgkLVcoolX2),
4035 fgkLVcoolPosY+fgkLVcoolY1/2,
4036 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
4037 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
4038 (fgkLVcoolX1/2+fgkLVcoolX2),
4039 fgkLVcoolPosY+fgkLVcoolY1/2,
4040 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
4042 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
4044 vAlLVcooling1->SetLineColor(2);
4047 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
4048 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
4049 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
4051 fgkLVcoolPosY+fgkLVcoolY1/2,
4052 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
4053 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
4055 fgkLVcoolPosY+fgkLVcoolY1/2,
4056 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
4058 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
4060 vAlLVcooling2->SetLineColor(2);
4063 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4065 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
4066 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
4067 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
4069 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
4071 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
4072 vAlLVcooling3->SetLineColor(2);
4074 //=== screw fixing th LV card to the U cooling tube :
4075 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
4077 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
4078 littleScrew, stainless);
4079 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
4081 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
4083 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
4085 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
4086 0, fgkLittleLVScrewHeadR,
4087 fgkLittleScrewHeadH/2);
4088 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
4089 littleScrewHead, stainless);
4090 vLittleScrewHead->SetLineColor(kGray);
4091 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
4092 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
4093 fgkShiftLittleScrewLV,
4095 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
4097 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
4098 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
4099 fgkShiftLittleScrewLV,
4101 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
4103 // adding the cooling pieces to the left card
4104 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
4105 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
4106 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
4107 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
4108 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
4110 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
4111 -(fgkLVcoolX1/2+fgkLVcoolX2),
4112 fgkLVcoolPosY+fgkLVcoolY1/2,
4113 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
4114 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
4115 -(fgkLVcoolX1/2+fgkLVcoolX2),
4116 fgkLVcoolPosY+fgkLVcoolY1/2,
4117 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
4118 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
4120 fgkLVcoolPosY+fgkLVcoolY1/2,
4121 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
4122 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
4124 fgkLVcoolPosY+fgkLVcoolY1/2,
4125 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
4127 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
4129 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
4131 // and to the right card
4132 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
4133 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
4134 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
4135 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
4136 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
4141 //________________________________________________________________________
4142 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
4144 // return an assembly containing the HV card
4148 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
4149 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // check if different
4150 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // check if different
4151 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
4152 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
4153 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
4155 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
4157 //====================================
4158 //--- the card itself
4159 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
4160 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
4161 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
4162 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
4164 highVCard->AddNode(vCeramicCard, 1, 0);
4167 //====================================
4171 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
4172 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
4173 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
4176 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
4177 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
4178 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
4180 vCapa1End->SetLineColor(18);// grey silver
4181 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
4182 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4183 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
4184 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4186 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
4187 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
4188 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4190 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
4191 capa1->AddNode(vCapa1Middle, 1,0);
4192 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4193 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4195 highVCard->AddNode(capa1, 1, capa1PosTr);
4198 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4199 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4200 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4203 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4204 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4205 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4207 vCapa2End->SetLineColor(18);// grey silver
4208 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4209 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4210 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4211 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4213 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4214 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4215 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4217 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4218 capa2->AddNode(vCapa2Middle, 1,0);
4219 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4220 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4222 highVCard->AddNode(capa2, 1, capa2PosTr);
4225 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4226 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4227 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4230 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4231 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4232 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4234 vCapa3End->SetLineColor(18);// grey silver
4236 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4237 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4238 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4239 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4241 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4242 capa3->AddNode(vCapa3Middle, 1,0);
4243 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4244 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4246 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4247 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4248 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4250 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4251 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4252 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4254 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4255 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4256 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4258 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4259 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4260 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4262 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4263 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4264 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4266 highVCard->AddNode(capa3, 1, capa3PosTr1);
4267 highVCard->AddNode(capa3, 2, capa3PosTr2);
4268 highVCard->AddNode(capa3, 3, capa3PosTr3);
4269 highVCard->AddNode(capa3, 4, capa3PosTr4);
4270 highVCard->AddNode(capa3, 5, capa3PosTr5);
4272 //====================================
4273 //--- connexions to LV card
4275 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4276 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4277 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4278 Double_t fgkConnexLVHVx = 3*fgkmm;
4279 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4280 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4282 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4283 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4284 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4285 fgkConnexLVHVdiam1/2,
4286 fgkConnexLVHVdiam2/2,
4287 fgkConnexLVHVlen/2);
4288 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4289 connexLVHVmetal, stainless);
4290 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4291 connexLVHVplastic, plastic);
4292 vConnexLVHVmetal->SetLineColor(10);// white
4293 vConnexLVHVplast->SetLineColor(12); // dark grey
4295 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4296 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4297 connexion->AddNode(vConnexLVHVplast, 1, 0);
4299 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4300 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4301 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4302 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4304 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4305 fgkConnexLVHVy1+fgkConnexLVHVdy,
4306 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4307 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4308 fgkConnexLVHVy1+fgkConnexLVHVdy,
4309 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4311 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4312 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4313 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4314 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4315 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4316 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4318 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4319 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4320 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4321 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4322 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4323 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4325 highVCard->AddNode(connexion, 1, trConnexion1);
4326 highVCard->AddNode(connexion, 2, trConnexion2);
4327 highVCard->AddNode(connexion, 3, trConnexion3);
4328 highVCard->AddNode(connexion, 4, trConnexion4);
4329 highVCard->AddNode(connexion, 5, trConnexion5);
4330 highVCard->AddNode(connexion, 6, trConnexion6);
4331 highVCard->AddNode(connexion, 7, trConnexion7);
4332 highVCard->AddNode(connexion, 8, trConnexion8);
4334 //====================================
4335 //--- cooling pieces
4337 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4338 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4341 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4342 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4344 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4345 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4347 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4349 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4351 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4353 // This last volume contains the screw used for fixing
4354 // the card to the cooling tube ...
4355 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4357 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4358 littleScrewHV, stainless);
4360 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4361 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4363 vCardHVcool1->SetLineColor(2); //red
4364 vCardHVcool2->SetLineColor(2); //red
4365 vCardHVcool3->SetLineColor(2); //red
4367 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4368 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4369 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4370 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4371 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4372 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4373 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4374 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4376 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4377 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4379 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4380 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4381 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4382 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4384 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4385 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4386 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4387 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4389 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4390 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4392 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4393 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4394 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4395 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4397 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4398 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4399 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4400 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4402 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4403 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4405 //====================================
4407 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4408 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4409 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4410 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4412 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4413 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4414 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4415 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4418 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4419 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4425 //________________________________________________________________________
4426 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4428 // return an assembly containing the LV, HV and Carlos cards of one ladder
4429 // and their cooling system
4432 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
4433 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4434 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4436 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4438 //=*********************************
4439 //--- The rounded pipe for the end ladder card coooling
4441 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4442 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4446 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4447 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4451 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4452 endLadderPipe.SetNLayers(2);
4453 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4454 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4456 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4457 // of the U colling pipe in its center
4459 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4460 Double_t vectA[3] = {0,0,1};
4462 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4463 Double_t vectB[3] = {0,0,1};
4465 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4466 Double_t vectC[3] = {1,0,0};
4468 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4469 Double_t vectD[3] = {-1,0,0};
4471 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4472 Double_t vectE[3] = {0,0,-1};
4474 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4475 Double_t vectF[3] = {0,0,-1};
4477 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4478 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4479 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4480 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4481 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4482 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4484 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4485 //endLadderPipe.CreateAndInsertCableSegment( 1);
4486 endLadderPipe.CreateAndInsertTubeSegment( 1);
4487 //endLadderPipe.CreateAndInsertCableSegment( 2);
4488 endLadderPipe.CreateAndInsertTorusSegment( 2);
4489 //endLadderPipe.CreateAndInsertCableSegment( 3);
4490 endLadderPipe.CreateAndInsertTubeSegment( 3);
4491 //endLadderPipe.CreateAndInsertCableSegment( 4);
4492 endLadderPipe.CreateAndInsertTorusSegment( 4);
4493 //endLadderPipe.CreateAndInsertCableSegment( 5);
4494 endLadderPipe.CreateAndInsertTubeSegment( 5);
4496 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4497 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4498 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4499 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4501 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4502 - fgkEndLadPipeArmBoxDX,
4503 fgkEndLadPipeArmBoxDY,0);
4504 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4505 fgkEndLadPipeArmBoxDX,
4506 fgkEndLadPipeArmBoxDY,0);
4507 endLadPipeArmBoxDY1->RegisterYourself();
4508 endLadPipeArmBoxDY2->RegisterYourself();
4510 if(GetDebug(3)) { // Remove compiler warning.
4511 endLadPipeArmBox->InspectShape();
4512 endLadPipeArmTube->InspectShape();
4515 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4516 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4517 "- endLadPipeArmTube");
4518 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4519 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4520 "- endLadPipeArmTube");
4522 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4523 endLadPipeArm1, alCu12SDD);
4524 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4525 endLadPipeArm2, alCu12SDD);
4526 vEndLadPipeArm1->SetLineColor(2);
4527 vEndLadPipeArm2->SetLineColor(2);
4529 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4530 +fgkEndLadPipeArmZpos);
4532 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4533 -fgkEndLadPipeUwidth/2,0,armZ);
4534 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4535 fgkEndLadPipeUwidth/2,0,armZ);
4537 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4538 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4540 //=*********************************
4542 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4543 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4545 Double_t spaceBetweenCards = 0.2*fgkmm;
4547 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4548 +fgkEndLadPipeArmBoxDX);
4549 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4550 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4552 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4555 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4556 +coolUzPos+1.25*fgkmm;
4557 // Position in z of the first LVB with respect to the start of the cooling
4558 // rectangular arm, coming (from inside of the ladder)
4559 // The cards are added one after the other
4561 for (Int_t iCard=0; iCard<nCards; iCard++) {
4563 Double_t cardLVzShift = firstLVCardZ +
4564 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4566 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4567 cardLVyShift, cardLVzShift);
4568 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4569 cardLVyShift, cardLVzShift);
4571 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4572 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4575 //=*********************************
4577 TGeoVolumeAssembly *cardHV = fCardHV;
4579 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4580 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4582 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4583 -(fgkHVCardCeramZ)/2);
4585 for (Int_t iCard=0; iCard<nCards; iCard++) {
4587 Double_t fact = iCard*2.+1.;
4588 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4589 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4590 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4591 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4594 //=*********************************
4597 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4598 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4599 // 0, -fgkCarlosSuppAngle, 0);
4601 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4602 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4603 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4604 // position in z of the first Carlos board, coming from inside of the ladder
4606 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4607 fgkEndLadPipeArmBoxDY);
4609 for (Int_t iCard=0; iCard<nCards; iCard++) {
4611 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4612 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4613 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4614 (TGeoRotation*) fCommonTr[0]);
4616 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4619 return endLadderCards;
4623 //________________________________________________________________________
4624 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4626 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4627 // and their cooling system
4628 // This is the code actually used for the end ladder cards
4631 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
4632 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4633 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4634 TGeoMedium *copper = GetMedium("COPPER$");
4635 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4636 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4637 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
4638 TGeoMedium *polyurethane = GetMedium("POLYURETHANE$");
4640 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4641 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4643 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4644 Double_t deltaZcables = 0;
4645 // reference radius corresponding to local y=0
4648 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4649 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4651 rREF = fgkEndLaddCardsShortRadiusLay4;
4652 deltaZcables = 2.8*fgkmm;
4655 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4656 +fgkEndLadPipeArmBoxDX);
4657 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4658 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4660 Double_t rMin = rREF + cardLVyShift;
4661 // (The LV card is defining rMin because it is the lower object)
4663 Double_t thickTotCable = 0.5;
4665 //==================================
4666 //--- The Pcon container
4668 // minimum angle of the Pcon :
4669 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4670 (rREF-fgkEndLadPipeArmY/2) );
4671 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4672 Double_t phi0 = 90-dphi/2;
4673 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4674 // of the U colling pipe in its center
4675 Double_t zMax = endLadPipeUlength+coolUzPos;
4676 Double_t rMax = rMin + fgkLVcardY;
4677 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4678 Double_t cablesRadius = rMax-0.5;
4680 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4681 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4682 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4683 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4684 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4685 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4686 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4687 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4688 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4689 // the following is quite dirty but works for the moment ...
4690 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4691 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4693 // The next parameters define the shape of the Pcon at its end and where cables
4695 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4696 Double_t cableSectionR2 = rMax;
4697 Double_t cableSectionZ1 = zMax + 23.6*fgkmm + 3.0*fgkcm + deltaZcables;
4698 Double_t cableSectionZ2 = zMax + 23.6*fgkmm + 4.0*fgkcm + deltaZcables;
4699 // Those numbers are to be fixed to stick the maximum to the SDD cone
4700 // (hardcoded numbers are ugly, but it's easier to find where to stop)
4702 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4703 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4705 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4706 //endLadderCards->SetVisibility(kFALSE);
4708 //=*********************************
4709 //--- The rounded pipe for the end ladder card cooling
4711 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4712 endLadderPipe.SetNLayers(2);
4713 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4714 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4716 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4717 Double_t vectA[3] = {0,0,1};
4719 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4720 Double_t vectB[3] = {0,0,1};
4722 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4723 Double_t vectC[3] = {1,0,0};
4725 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4726 Double_t vectD[3] = {-1,0,0};
4728 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4729 Double_t vectE[3] = {0,0,-1};
4731 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4732 Double_t vectF[3] = {0,0,-1};
4734 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4735 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4736 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4737 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4738 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4739 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4741 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4742 //endLadderPipe.CreateAndInsertCableSegment( 1);
4743 endLadderPipe.CreateAndInsertTubeSegment( 1);
4744 //endLadderPipe.CreateAndInsertCableSegment( 2);
4745 endLadderPipe.CreateAndInsertTorusSegment( 2);
4746 //endLadderPipe.CreateAndInsertCableSegment( 3);
4747 endLadderPipe.CreateAndInsertTubeSegment( 3);
4748 //endLadderPipe.CreateAndInsertCableSegment( 4);
4749 endLadderPipe.CreateAndInsertTorusSegment( 4);
4750 //endLadderPipe.CreateAndInsertCableSegment( 5);
4751 endLadderPipe.CreateAndInsertTubeSegment( 5);
4753 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4754 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4755 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4756 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4758 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4759 - fgkEndLadPipeArmBoxDX,
4760 fgkEndLadPipeArmBoxDY,0);
4761 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4762 fgkEndLadPipeArmBoxDX,
4763 fgkEndLadPipeArmBoxDY,0);
4764 endLadPipeArmBoxDY1->RegisterYourself();
4765 endLadPipeArmBoxDY2->RegisterYourself();
4767 if(GetDebug(3)) { // Remove compiler warning.
4768 endLadPipeArmBox->InspectShape();
4769 endLadPipeArmTube->InspectShape();
4772 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4773 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4774 "- endLadPipeArmTube");
4775 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4776 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4777 "- endLadPipeArmTube");
4779 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4780 endLadPipeArm1, alCu12SDD);
4781 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4782 endLadPipeArm2, alCu12SDD);
4783 vEndLadPipeArm1->SetLineColor(2);
4784 vEndLadPipeArm2->SetLineColor(2);
4786 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4787 +fgkEndLadPipeArmZpos);
4789 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4790 -fgkEndLadPipeUwidth/2,rREF,armZ);
4791 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4792 fgkEndLadPipeUwidth/2,rREF,armZ);
4794 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4795 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4797 //=*********************************
4799 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4800 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4802 Double_t spaceBetweenCards = 0.2*fgkmm;
4805 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4808 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4809 +coolUzPos+1.25*fgkmm;
4810 // Position in z of the first LVB with respect to the start of the cooling
4811 // rectangular arm, coming (from inside of the ladder)
4812 // The cards are added one after the other
4814 for (Int_t iCard=0; iCard<nCards; iCard++) {
4816 Double_t cardLVzShift = firstLVCardZ +
4817 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4819 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4820 cardLVyShift+rREF, cardLVzShift);
4821 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4822 cardLVyShift+rREF, cardLVzShift);
4824 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4825 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4828 //=*********************************
4830 TGeoVolumeAssembly *cardHV = fCardHV;
4832 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4833 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4834 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4836 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4837 -(fgkHVCardCeramZ)/2);
4839 for (Int_t iCard=0; iCard<nCards; iCard++) {
4841 Double_t fact = iCard*2.+1.;
4842 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4843 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4844 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4845 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4848 //=*********************************
4851 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4852 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4853 // 0, -fgkCarlosSuppAngle, 0);
4855 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4856 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4857 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4858 // position in z of the first Carlos board, coming from inside of the ladder
4860 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4861 fgkEndLadPipeArmBoxDY);
4863 for (Int_t iCard=0; iCard<nCards; iCard++) {
4865 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4866 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4867 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4868 (TGeoRotation*) fCommonTr[0]);
4870 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4874 //=*********************************
4878 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4879 + fgkSectionGlassPerMod)*nCards
4880 + fgkSectionCoolPolyuEL + fgkSectionCoolWaterEL;
4881 // We fix thickness, then width is calculated accordingly
4882 Double_t width = sectionV/thickTotCable;
4883 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4884 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4885 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4886 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4887 Double_t thickGlass = thickTotCable*fgkSectionGlassPerMod
4888 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4890 Double_t thickCoolPolyu = thickTotCable*fgkSectionCoolPolyuEL
4891 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4892 Double_t thickCoolWater = thickTotCable*fgkSectionCoolWaterEL
4893 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4895 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4896 cable.SetNLayers(5);
4897 cable.SetLayer(0, thickCu, copper, kRed);
4898 cable.SetLayer(1, thickPlast, plastic, kYellow);
4899 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4900 cable.SetLayer(3, thickCoolPolyu, polyurethane, kGray);
4901 cable.SetLayer(4, thickCoolWater, coolerMediumSDD, kBlue);
4903 Double_t zVect[3]={0,0,1};
4904 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4905 +spaceBetweenCarlsoCards)/2 + 2.9;
4906 // the 2.9cm is for taking into account carlos card angle...
4908 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4909 cableSectionR2,cableSectionZ1,cableSectionZ2);
4911 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4912 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4913 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4914 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4915 cable.SetInitialNode(endLadderCards);
4916 cable.CreateAndInsertCableSegment(1);
4919 TGeoTorus *earthShape = new TGeoTorus(rMax-fgkEndLadderEarthCableR,
4920 0., fgkEndLadderEarthCableR,
4921 phi0, dphi); // same as containerShape
4923 TGeoVolume *earthCable = new TGeoVolume("SDDcableEndLadderEarthCable",
4924 earthShape, copper);
4926 endLadderCards->AddNode(earthCable, 1,
4927 new TGeoTranslation(0, 0, fgkDistEndLaddCardsLadd+1));
4929 return endLadderCards;
4932 //________________________________________________________________________
4933 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4935 // return an assembly of the support rings, attaching the ladders to the cone
4941 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4942 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4945 //**********************************
4948 Double_t fgkRubyCageX = 9*fgkmm;
4949 Double_t fgkRubyCageY = 5.5*fgkmm;
4950 Double_t fgkRubyCageZ = 8*fgkmm;
4951 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4952 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4953 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4954 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4955 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4957 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4960 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4962 // pieces common to both square and V cages
4963 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4964 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4966 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4967 fgkRubyCageHoleDX/2+epsilon);
4969 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4970 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4971 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4972 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4973 trScrewHole->RegisterYourself();
4975 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4976 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4977 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4978 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4979 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4980 trScrewHoleFoot->RegisterYourself();
4983 // pieces which differ
4984 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4986 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4987 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4989 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4990 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4991 trRubyCageVInternBox->RegisterYourself();
4993 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4994 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4995 fgkRubyCageInternSide/4);
4997 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4998 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4999 +epsilon,0,0, rotV );
5000 trRubyCageVInternTriangl->RegisterYourself();
5003 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
5004 "rubyCageBox-(rubyCageInternBox"
5005 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
5007 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
5008 rubyCageSquare, stainless);
5009 vRubyCageSquare->SetLineColor(10);
5011 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
5012 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
5013 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
5014 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
5015 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
5016 vRubyCageV->SetLineColor(10);
5018 if(GetDebug(3)) { // Remove compiler warning.
5019 rubyCageBox->InspectShape();
5020 rubyCageInternBox->InspectShape();
5021 screwHole->InspectShape();
5022 screwHoleFoot->InspectShape();
5023 rubyCageVInternBox->InspectShape();
5024 rubyCageVInternTriangl->InspectShape();
5027 supportRing->AddNode(vRubyCageSquare, 0, 0);
5028 //supportRing->AddNode(vRubyCageV, 0, 0);
5034 //________________________________________________________________________
5035 void AliITSv11GeometrySDD::CreateSDDsensor() {
5037 // return a box containing the SDD sensor
5040 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5041 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
5042 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
5043 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
5044 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
5045 TGeoMedium *glassSDD = GetMedium("STDGLASS$"); // StdGlass
5048 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
5049 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
5050 // width : in the beam direction !
5052 Double_t sensoxBoxLength = ( fgkWaferLength +
5053 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
5054 // Makes life easier to include the space for the WA HV cable on both sides
5055 Double_t sensoxBoxThick = fgkWaferThickness +
5056 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
5058 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
5059 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
5061 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
5062 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
5064 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
5065 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
5068 //****************************
5070 //****************************
5072 // we need 2 different sensor objects, because they have to have different names
5073 // This is required for the step manager
5075 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
5076 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
5079 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
5080 wafer3->SetLineColor(fColorSilicon);
5081 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
5082 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
5083 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
5084 sensVol3->SetLineColor(fColorSilicon+5);
5085 wafer3->AddNode(sensVol3, 1, 0);
5086 fSDDsensor3->AddNode(wafer3, 1, 0);
5088 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
5089 wafer4->SetLineColor(fColorSilicon);
5090 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
5091 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
5092 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
5093 sensVol4->SetLineColor(fColorSilicon+5);
5094 wafer4->AddNode(sensVol4, 1, 0);
5095 fSDDsensor4->AddNode(wafer4, 1, 0);
5098 //****************************
5100 //****************************
5101 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
5102 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
5103 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
5104 vGlass->SetLineColor(fColorGlass);
5105 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
5106 fgkWaferThickness/2+fgkSensorGlassLY/2,
5107 fgkGlassDZOnSensor);
5108 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
5109 fgkWaferThickness/2+fgkSensorGlassLY/2,
5110 fgkGlassDZOnSensor);
5111 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
5112 fgkWaferThickness/2+fgkSensorGlassLY/2,
5113 -fgkGlassDZOnSensor);
5114 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
5115 fgkWaferThickness/2+fgkSensorGlassLY/2,
5116 -fgkGlassDZOnSensor);
5117 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
5118 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
5119 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
5120 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
5122 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
5123 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
5124 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
5125 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
5127 //****************************
5128 // Wrap-around cable
5129 //****************************
5131 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
5132 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
5133 waHVCable.SetNLayers(2);
5134 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
5135 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
5136 waHVCable.SetInitialNode(fSDDsensor3);
5138 Double_t x1[3], x2[3], vX[3] = {1,0,0};
5139 x1[0] = -fgkWaHVcableLength/2;
5141 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
5143 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
5146 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5147 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5148 TGeoCombiTrans *ctSegment = 0;
5149 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
5150 fSDDsensor4->AddNode(segment, 1, ctSegment);
5154 waHVCable.SetName("ITSsddWaHVCableD");
5155 waHVCable.ResetPoints();
5156 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5157 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5158 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
5159 fSDDsensor4->AddNode(segment, 1, ctSegment);
5161 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
5163 waHVCableFold.SetPhi(180,360);
5164 waHVCableFold.SetNLayers(2);
5165 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
5166 polyhamideSDD, fColorPolyhamide);
5167 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
5168 waHVCableFold.SetInitialNode(fSDDsensor3);
5171 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
5173 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5174 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5175 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
5176 fSDDsensor4->AddNode(segment, 1, ctSegment);
5179 //****************************
5181 //****************************
5182 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
5183 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
5184 /(2.*fgkTransitHVHeadLZ);
5185 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
5186 headRadius-fgkTransitHVHeadLZ)
5189 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
5190 fgkTransitHVPolyThick/2,
5192 headPoly->SetName("headPoly");
5193 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
5194 -fgkTransitHVPolyThick/2);
5195 headPolyTr->SetName("headPolyTr");
5196 headPolyTr->RegisterYourself();
5198 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
5199 fgkTransitHVAlThick/2,
5201 headAl->SetName("headAl");
5202 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
5203 -fgkTransitHVPolyThick
5204 -fgkTransitHVAlThick/2);
5205 headAlTr->SetName("headAlTr");
5206 headAlTr->RegisterYourself();
5208 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
5209 (headRadius-fgkTransitHVHeadLZ)/2,
5210 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
5211 cache->SetName("cache");
5213 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5214 (headRadius-fgkTransitHVHeadLZ)/2,
5215 -(fgkTransitHVPolyThick
5216 +fgkTransitHVAlThick)/2);
5217 headCacheTr->SetName("cacheTr");
5218 headCacheTr->RegisterYourself();
5220 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5221 "headPoly:headPolyTr-cache:cacheTr");
5222 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5223 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5224 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5225 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5226 "headAl:headAlTr-cache:cacheTr");
5227 TGeoVolume *vHeadAlComp = new TGeoVolume(
5228 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5229 vHeadAlComp->SetLineColor(fColorAl);
5232 // TGeoRotation rotHead("",0,90,0);
5233 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5234 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5236 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5237 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5238 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5241 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5242 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5243 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5244 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5247 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5248 fgkTransitHVBondingLZ,
5249 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5250 transitHVCable.SetNLayers(2);
5251 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5253 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5254 transitHVCable.SetInitialNode(fSDDsensor3);
5256 x1[0] = -fgkTransitHVHeadLX/2;
5258 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5262 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5263 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5264 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5265 fSDDsensor4->AddNode(segment, 1, ctSegment);
5267 transitHVCable.ResetPoints();
5268 transitHVCable.SetName("ITSsddHVtransitTail");
5269 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5270 x1[0] = fgkTransitHVtailXpos;
5271 x2[0] = fgkTransitHVtailXpos;
5272 x1[2] = -fgkTransitHVBondingLZ/2;
5273 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5274 Double_t vZ[3] = {0,0,1};
5275 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5276 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5277 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5278 fSDDsensor4->AddNode(segment, 1, ctSegment);
5281 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5282 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5283 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5284 fgkTransitHVsideLZ);
5285 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5286 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5287 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5288 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5289 fgkTransitHVsideLZ);
5290 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5291 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5293 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5294 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5295 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5296 fgkTransitHVsideLZ);
5297 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5298 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5299 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5300 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5301 fgkTransitHVsideLZ);
5302 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5303 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5305 // sideRight is not there actually
5306 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5307 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5308 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5309 // fgkTransitHVsideLZ);
5310 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5311 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5312 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5313 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5314 // fgkTransitHVsideLZ);
5315 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5316 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5318 // TGeoRotation rotSide("",0,-90,0);
5319 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5320 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5321 // -fgkTransitHVBondingLZ/2,&rotSide);
5322 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5323 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5324 // -fgkTransitHVBondingLZ/2, &rotSide);
5325 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5326 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5327 // -fgkTransitHVBondingLZ/2, &rotSide);
5328 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5329 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5330 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5331 // -fgkTransitHVBondingLZ/2,rotSide);
5332 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5333 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5334 -fgkTransitHVBondingLZ/2, rotSide);
5335 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5336 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5337 -fgkTransitHVBondingLZ/2, rotSide);
5339 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5340 sideLeft,polyhamideSDD);
5341 vSideLeft->SetLineColor(fColorPolyhamide);
5342 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5344 vSideLeftAl->SetLineColor(fColorAl);
5346 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5347 // sideRight,polyhamideSDD);
5348 // vSideRight->SetLineColor(fColorPolyhamide);
5350 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5351 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5352 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5354 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5355 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5356 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5359 //****************************
5361 fSDDsensor3->CheckOverlaps(0.01);
5362 fSDDsensor4->CheckOverlaps(0.01);
5365 fSDDsensor3->SetVisibility(kFALSE);
5366 fSDDsensor4->SetVisibility(kFALSE);
5370 //________________________________________________________________________
5371 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5373 // return a box volume containing the detectors
5376 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5378 Int_t nDetectors = fgkLay3Ndet;
5379 Double_t ladderLength = fgkLay3LadderLength;
5380 Double_t *sensorZPos = fLay3sensorZPos;
5384 nDetectors = fgkLay4Ndet;
5385 ladderLength = fgkLay4LadderLength;
5386 sensorZPos = fLay4sensorZPos;
5388 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5392 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5393 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5395 sprintf(name,"ITSsddDetBox%i",iLay);
5396 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5397 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5398 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5400 for (Int_t i=0; i<nDetectors; i++) {
5401 Double_t localZ = sensorZPos[i];
5402 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5403 if (iLay==3) if (i%2!=0) localY = -localY;
5404 if (iLay==4) if (i%2==0) localY = -localY;
5405 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5407 if (i >= nDetectors/2) {
5408 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5409 sensorPos->SetName(name);
5410 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5413 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5414 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5416 sensorPos->SetName(name);
5417 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5421 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5422 virtualDet->SetVisibility(kFALSE);
5427 //________________________________________________________________________
5428 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5430 // return a box volume containing the detectors
5433 Int_t nDetectors = fgkLay3Ndet;
5434 Double_t ladderLength = fgkLay3LadderLength;
5435 Double_t *sensorZPos = fLay3sensorZPos;
5436 TGeoVolume *sensorSDD = fSDDsensor3;
5440 nDetectors = fgkLay4Ndet;
5441 ladderLength = fgkLay4LadderLength;
5442 sensorZPos = fLay4sensorZPos;
5443 sensorSDD = fSDDsensor4;
5445 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5449 snprintf(name,30,"ITSsddDetBox%i",iLay);
5451 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5453 for (Int_t i=0; i<nDetectors; i++) {
5454 Double_t localZ = sensorZPos[i];
5455 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5456 if (iLay==3) if (i%2!=0) localY = -localY;
5457 if (iLay==4) if (i%2==0) localY = -localY;
5458 snprintf(name, 30, "ITSsddLay%iSensorPos%i",iLay, i);
5460 if (i >= nDetectors/2) {
5461 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5462 sensorPos->SetName(name);
5463 virtualDet->AddNode(sensorSDD, i, sensorPos);
5466 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5467 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5469 sensorPos->SetName(name);
5470 virtualDet->AddNode(sensorSDD, i, sensorPos);
5474 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5479 //________________________________________________________________________
5480 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssemblyLadd2() {
5482 // return a box volume containing the detectors
5483 // Special case for Layer 3 Ladder 2 which is rotated (cannot simply
5484 // rotate the standard volume, because the module numbering would be wrong)
5485 // M.Sitta 25 Nov 2009
5488 Int_t nDetectors = fgkLay3Ndet;
5489 Double_t *sensorZPos = fLay3sensorZPos;
5490 TGeoVolume *sensorSDD = fSDDsensor3;
5493 snprintf(name,30,"ITSsddDetBoxLadd2");
5495 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5497 for (Int_t i=0; i<nDetectors; i++) {
5498 Double_t localZ = (-1.)*sensorZPos[nDetectors-1-i];
5499 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5500 if (i%2==0) localY = -localY;
5501 snprintf(name, 30, "ITSsddLayLadd2SensorPos%i", i);
5503 if (i >= nDetectors/2) {
5504 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5505 sensorPos->SetName(name);
5506 virtualDet->AddNode(sensorSDD, i, sensorPos);
5509 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5510 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5512 sensorPos->SetName(name);
5513 virtualDet->AddNode(sensorSDD, i, sensorPos);
5517 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5522 //________________________________________________________________________
5523 Int_t AliITSv11GeometrySDD::
5524 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5526 // Function which gives the layer, ladder and det.
5527 // index of the current volume. To be used in
5528 // AliITS::StepManager()
5531 if (gGeoManager->GetLevel()<3) return kFALSE;
5532 // Get the det index :
5533 TGeoNode *node = gGeoManager->GetMother(2);
5534 if (!node) return kFALSE;
5535 det = node->GetNumber()+1;
5537 // Get the ladder index :
5538 node = gGeoManager->GetMother(3);
5539 if (!node) return kFALSE;
5540 ladd = node->GetNumber()+1;
5542 // Get the layer index :
5543 if (node->GetNdaughters()==fgkLay3Ndet)
5551 //________________________________________________________________________
5552 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5553 Double_t r2max, Double_t z2,
5554 Double_t section, Int_t nDiv)
5556 // Creates a cone along z where the section is approximately constant
5557 // with z. This is for simulation of cables, because a cone with a constant
5558 // radius difference would show a quantity of matter increasing with z...
5559 // The max radius of the created Pcon is evolving linearly, the min radius
5560 // is calculated at several steps (nDiv).
5561 // z2 > z1 (required by the Pcon)
5563 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5565 Double_t dr = (r2max-r1max)/nDiv;
5566 Double_t dz = (z2-z1)/nDiv;
5567 Double_t r1minI, r2minI, r1maxI, r2maxI;
5570 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5571 Double_t cosAlpha = (z2-z1)/lZ;
5573 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5574 myPcon->DefineSection(0, z1, r1minI, r1max);
5576 for (Int_t i=0; i<nDiv; i++) {
5580 r1maxI = r1max + i*dr;
5581 r2maxI = r1maxI + dr;
5583 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5584 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5590 //________________________________________________________________________
5591 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5592 Double_t refZ1, Double_t refZ2) {
5593 // just a helping function
5594 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5597 //________________________________________________________________________
5598 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5599 Int_t nLay3, Int_t nLay4,
5600 Double_t r1, Double_t z1,
5601 Double_t r2, Double_t z2) {
5603 // Create some cables portions from SDD modules grouped
5604 // and attached at the border of the SSD cone
5606 TGeoMedium *copper = GetMedium("COPPER$");
5607 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5608 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5610 char titleCable[30];
5611 snprintf(titleCable,30,"cableSDDport%i",(Int_t)angle);
5614 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5615 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5616 Double_t width = section/thickness;
5617 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5618 +fgkSectionGlassPerMod);
5620 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5621 +fgkSectionGlassPerMod);
5623 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5624 +fgkSectionGlassPerMod);
5626 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5627 Double_t cosAlpha = (z2-z1)/hypothenus;
5628 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5629 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5630 angle *= TMath::DegToRad();
5631 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5632 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5633 Double_t pos1[3] = {x1,y1,z1};
5634 Double_t pos2[3] = {x2,y2,z2};
5635 Double_t zVect[3] = {0,0,1};
5637 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5638 cable.SetNLayers(3);
5639 cable.SetLayer(0, thickPlast, plastic, kYellow);
5640 cable.SetLayer(1, thickCu, copper, kRed);
5641 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5643 cable.AddCheckPoint( mother, 0, pos1, zVect );
5644 cable.AddCheckPoint( mother, 1, pos2, zVect );
5645 cable.SetInitialNode(mother);
5646 cable.CreateAndInsertCableSegment(1);
5653 //________________________________________________________________________
5654 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth)
5657 // Creates and inserts the SDD cables running on SDD and SSD cones
5660 // moth : the TGeoVolume owing the volume structure
5663 // Created: ??? Ludovic Gaudichet
5664 // Updated: 15 Mar 2008 Mario Sitta
5665 // Updated: 14 Apr 2008 Mario Sitta Overlap fixes
5666 // Updated: 09 May 2008 Mario Sitta SSD overlap fixes
5669 TGeoMedium *copper = GetMedium("COPPER$");
5670 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5671 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5672 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5675 //==================================
5677 //==================================
5679 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5680 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5682 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5683 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5684 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5686 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5687 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5688 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5690 // Do not use hardcoded numbers, get them from real shapes - M.S. 15/03/08
5691 TGeoVolume *sddCone = gGeoManager->GetVolume("SDDCarbonFiberCone");
5692 TGeoPcon *sddConeShape = (TGeoPcon*)sddCone->GetShape();
5694 TGeoVolume *sddCylinder = gGeoManager->GetVolume("SDDCarbonFiberCylinder");
5695 TGeoTube *sddCylinderShape = (TGeoTube*)sddCylinder->GetShape();
5697 // (were fgkConeSDDr1, fgkConeSDDr2, fgkConeSDDz1, fgkConeSDDz2 hardcoded)
5698 Double_t coneSDDr1 = sddConeShape->GetRmin(5);
5699 Double_t coneSDDr2 = sddConeShape->GetRmin(3);
5701 Double_t coneSDDz1 = sddConeShape->GetZ(9) - sddConeShape->GetZ(5) +
5702 sddCylinderShape->GetDz();
5703 Double_t coneSDDz2 = sddConeShape->GetZ(9) - sddConeShape->GetZ(3) +
5704 sddCylinderShape->GetDz();
5706 // Calculate z1, z2 thanks to R1 and R2
5707 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, coneSDDr1, coneSDDr2,
5708 coneSDDz1, coneSDDz2);
5709 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, coneSDDr1, coneSDDr2,
5710 coneSDDz1, coneSDDz2);
5711 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, coneSDDr1, coneSDDr2,
5712 coneSDDz1, coneSDDz2);
5714 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5716 //==================================
5717 // first set of cones : cables from layer 3
5718 //==================================
5720 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5721 fgkSDDCableR2, sddCableZ2,
5722 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5724 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5725 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0),
5726 pcon1all->GetRmax(0));
5728 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5729 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax,
5730 pcon1all->GetRmax(1));
5732 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container",
5733 pcon1container, airSDD);
5734 vpcon1container->SetVisibility(kFALSE);
5736 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5737 fgkSDDCableR2, sddCableZ2,
5738 sectionLay3Plastic, 3);
5740 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast",
5741 pcon1plast, plastic);
5742 vpcon1plast->SetLineColor(kYellow);
5743 vpcon1container->AddNode(vpcon1plast, 0);
5745 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5746 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5747 fgkSDDCableR2 - dr1a, sddCableZ2,
5750 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu",
5752 vpcon1Cu->SetLineColor(kRed);
5753 vpcon1container->AddNode(vpcon1Cu, 0);
5755 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5756 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5757 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5758 sectionLay3Glass, 3);
5760 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass",
5761 pcon1glass, opticalFiber);
5762 vpcon1glass->SetLineColor(kGreen);
5763 vpcon1container->AddNode(vpcon1glass, 0);
5765 moth->AddNode(vpcon1container, 1);
5766 moth->AddNode(vpcon1container, 2, rotCableSDD);
5768 //==================================
5769 // 2nd set of cones : cables from layer 3 and layer 4
5770 //==================================
5772 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5773 fgkSDDCableR3, sddCableZ3,
5774 sectionLay3Plastic+sectionLay4Plastic+
5775 sectionLay3Cu+sectionLay4Cu+
5776 sectionLay3Glass+sectionLay4Glass, 1);
5778 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5779 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0),
5780 pcon2all->GetRmax(0));
5782 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5783 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax,
5784 pcon2all->GetRmax(1));
5787 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container",
5788 pcon2container, airSDD);
5789 vpcon2container->SetVisibility(kFALSE);
5791 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5792 fgkSDDCableR3, sddCableZ3,
5794 sectionLay4Plastic, 3);
5796 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast",
5797 pcon2plast, plastic);
5798 vpcon2plast->SetLineColor(kYellow);
5799 vpcon2container->AddNode(vpcon2plast, 0);
5801 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5802 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5803 fgkSDDCableR3 - dr2a, sddCableZ3,
5804 sectionLay3Cu+sectionLay4Cu, 3);
5806 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu",
5808 vpcon2Cu->SetLineColor(kRed);
5809 vpcon2container->AddNode(vpcon2Cu, 0);
5811 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5812 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5813 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5815 sectionLay4Glass, 3);
5817 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass",
5818 pcon2glass, opticalFiber);
5819 vpcon2glass->SetLineColor(kGreen);
5820 vpcon2container->AddNode(vpcon2glass, 0);
5822 moth->AddNode(vpcon2container, 1);
5823 moth->AddNode(vpcon2container, 2, rotCableSDD);
5825 //==================================
5826 // intermediate cylinder
5827 //==================================
5829 // (was fgkSDDCableDZint hardcoded)
5830 Double_t sddCableDZint = (sddConeShape->GetZ(9) - sddConeShape->GetZ(0) +
5831 sddCylinderShape->GetDz()) - sddCableZ3;
5833 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl",
5834 pcon2container->GetRmin(1),
5835 pcon2container->GetRmax(1),
5838 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",
5840 vInterCyl->SetVisibility(kFALSE);
5842 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5843 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5844 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5846 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5847 rmaxCylPlast, sddCableDZint/2);
5849 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast",
5850 interCylPlast, plastic);
5851 vInterCylPlast->SetLineColor(kYellow);
5852 vInterCyl->AddNode(vInterCylPlast, 0);
5854 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5855 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5856 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5858 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5859 rmaxCylCu, sddCableDZint/2);
5861 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu",
5862 interCylCu, copper);
5863 vInterCylCu->SetLineColor(kRed);
5864 vInterCyl->AddNode(vInterCylCu, 0);
5866 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5867 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5868 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5870 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5871 rmaxCylGlass, sddCableDZint/2);
5873 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",
5874 interCylGlass,opticalFiber);
5875 vInterCylGlass->SetLineColor(kGreen);
5876 vInterCyl->AddNode(vInterCylGlass, 0);
5878 moth->AddNode(vInterCyl, 1, new TGeoTranslation(0, 0,
5879 sddCableZ3+sddCableDZint/2));
5880 moth->AddNode(vInterCyl, 2, new TGeoTranslation(0, 0,
5881 -sddCableZ3-sddCableDZint/2));
5883 //==================================
5884 // cable cone on the SSD cone
5885 //==================================
5887 Double_t sddCableR4 = rmaxCylPlast;
5888 Double_t sddCableZ4 = sddCableZ3 + sddCableDZint;
5890 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5891 fgkSDDCableR5, fgkSDDCableZ5,
5894 sectionLay3Cu+sectionLay4Cu+
5895 sectionLay3Glass+sectionLay4Glass, 1);
5897 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5898 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0),
5899 pcon3all->GetRmax(0));
5901 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5902 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax,
5903 pcon3all->GetRmax(1));
5906 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container",
5907 pcon3container, airSDD);
5908 vpcon3container->SetVisibility(kFALSE);
5910 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5911 fgkSDDCableR5, fgkSDDCableZ5,
5913 sectionLay4Plastic, 3);
5915 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast",
5916 pcon3plast, plastic);
5917 vpcon3plast->SetLineColor(kYellow);
5918 vpcon3container->AddNode(vpcon3plast, 0);
5920 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5921 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5922 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5923 sectionLay3Cu+sectionLay4Cu, 3);
5925 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu",
5927 vpcon3Cu->SetLineColor(kRed);
5928 vpcon3container->AddNode(vpcon3Cu, 0);
5930 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5931 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5932 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5933 sectionLay3Glass+sectionLay4Glass, 3);
5935 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass",
5936 pcon3glass,opticalFiber);
5937 vpcon3glass->SetLineColor(kGreen);
5938 vpcon3container->AddNode(vpcon3glass, 0);
5940 moth->AddNode(vpcon3container, 1);
5941 moth->AddNode(vpcon3container, 2, rotCableSDD);
5943 //==================================
5944 // cables that are grouped at the end of SSD cones
5945 //==================================
5947 // Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
5948 // Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
5949 Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
5950 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
5952 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5954 // Add some hardcoded shifts to avoid overlaps with SSD pathc panels
5955 CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
5956 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5958 CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
5959 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5961 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5962 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5964 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5965 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5967 CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
5968 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5970 CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
5971 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5973 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5974 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5976 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5977 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5979 CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
5980 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5982 CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
5983 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5985 CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
5986 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5988 CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
5989 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5991 CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
5992 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5994 moth->AddNode(endConeSDDCable, 1, 0);
5996 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5997 reflect->ReflectZ(kTRUE);
5998 moth->AddNode(endConeSDDCable, 2, reflect);