1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 //*************************************************************************
19 // SDD geometry, based on ROOT geometrical modeler
22 // This geometry has no dependence with aliroot, you can run it with root
23 // only, provided that the AliITSv11GeomCable classes are also compiled
25 // Ludovic Gaudichet gaudichet@to.infn.it
26 //*************************************************************************
32 // General Root includes
35 // Root Geometry includes
36 #include <TGeoManager.h>
37 #include <TGeoVolume.h>
43 #include <TGeoCompositeShape.h>
44 #include <TGeoMatrix.h>
47 #include <TGeoTorus.h>
49 #include "AliITSgeom.h"
50 #include "AliITSgeomSDD.h"
51 #include "AliITSv11GeometrySDD.h"
52 #include "AliITSv11GeomCableFlat.h"
53 #include "AliITSv11GeomCableRound.h"
55 const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName3 = "ITSsddSensitivL3";
56 const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName4 = "ITSsddSensitivL4";
57 const Double_t AliITSv11GeometrySDD::fgkSegmentLength = 37.21*2*fgkmm;
58 const Double_t AliITSv11GeometrySDD::fgkLadderWidth = 50.0*fgkmm;
59 const Double_t AliITSv11GeometrySDD::fgkLadderHeight = 30.0*fgkmm;
60 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDW = 7.5*fgkmm;
61 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH = 7.1*fgkmm;
62 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDHCorr= 2.1*fgkmm;
64 const Double_t AliITSv11GeometrySDD::fgkLadderBeamRadius = 0.6*fgkmm;
65 const Double_t AliITSv11GeometrySDD::fgkLadderLa = 3.*fgkmm;
66 const Double_t AliITSv11GeometrySDD::fgkLadderHa = 0.721979*fgkmm;
67 const Double_t AliITSv11GeometrySDD::fgkLadderLb = 3.7*fgkmm;
68 const Double_t AliITSv11GeometrySDD::fgkLadderHb = 0.890428*fgkmm;
69 const Double_t AliITSv11GeometrySDD::fgkLadderl = 0.25*fgkmm;
71 const Double_t AliITSv11GeometrySDD::fgkBottomBeamAngle = 56.5;
72 const Double_t AliITSv11GeometrySDD::fgkBeamSidePhi = 65;
74 const Double_t AliITSv11GeometrySDD::fgkLadWaferSep = 2*fgkmm;
75 const Double_t AliITSv11GeometrySDD::fgkPinSuppWidth = 2.5*fgkmm;
76 const Double_t AliITSv11GeometrySDD::fgkPinSuppHeight = 2.*fgkmm;
77 const Double_t AliITSv11GeometrySDD::fgkPinSuppRmax = 2.5/2.*fgkmm;
78 const Double_t AliITSv11GeometrySDD::fgkPinR = 1.5/2.*fgkmm;
79 const Double_t AliITSv11GeometrySDD::fgkPinSuppLength = 5.*fgkmm;
80 const Double_t AliITSv11GeometrySDD::fgkPinSuppThickness = 0.5*fgkmm;
81 const Double_t AliITSv11GeometrySDD::fgkPinSuppConeAngle = 4;
82 const Double_t AliITSv11GeometrySDD::fgkPinDXminOnSensor = (39./2.)*fgkmm;
83 const Double_t AliITSv11GeometrySDD::fgkPinPinDDXOnSensor = 3*fgkmm;
84 const Double_t AliITSv11GeometrySDD::fgkPinDYOnSensor = (52.5/2.)*fgkmm;
86 // parameters from ALR-0752/3
87 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHeight = 3.2*fgkmm;
88 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppMaxLength = 14*fgkmm;
89 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthExt = 0.4*fgkmm;
90 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthIn = 0.65*fgkmm;
91 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHoleDiam = 2*fgkmm;
92 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppFulWidth = 5.15*fgkmm;
93 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppTongW = 0.8*fgkmm;
94 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAngle = 22.5;
95 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppSlitL = 4.9*fgkmm;
96 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAxeDist = 3.05*fgkmm;
97 const Double_t AliITSv11GeometrySDD::fgkCoolPipeInnerDiam = 1.84*fgkmm;
98 const Double_t AliITSv11GeometrySDD::fgkCoolPipeOuterDiam = 2.*fgkmm;
100 const Double_t AliITSv11GeometrySDD::fgkBTBthick = 0.25 *fgkmm;
101 const Double_t AliITSv11GeometrySDD::fgkBTBlength = 55. *fgkmm;
102 const Double_t AliITSv11GeometrySDD::fgkBTBwidth = 18*fgkmm;
103 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBottom = 4*fgkmm;
104 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase = 1.2*fgkmm;
105 const Double_t AliITSv11GeometrySDD::fgkRadiusAminBTB = 1. *fgkmm;
106 const Double_t AliITSv11GeometrySDD::fgkRadiusBminBTB = 0.53 *fgkmm;
107 const Double_t AliITSv11GeometrySDD::fgkBTBHoleLength = 15 *fgkmm;
108 const Double_t AliITSv11GeometrySDD::fgkBTBHolewidth = 6 *fgkmm;
109 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefX = 10 *fgkmm;
110 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefY = 6.5 *fgkmm;
112 const Double_t AliITSv11GeometrySDD::fgkLay3Rmin = 129.*fgkmm;
113 const Double_t AliITSv11GeometrySDD::fgkLay3Rmax = 205.*fgkmm;
114 const Double_t AliITSv11GeometrySDD::fgkLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
115 const Double_t AliITSv11GeometrySDD::fgkLay3LadderLength = 524.*fgkmm;
116 const Double_t AliITSv11GeometrySDD::fgkLay3DetShortRadius = 146.0*fgkmm;
117 const Double_t AliITSv11GeometrySDD::fgkLay3DetLongRadius = 152.0*fgkmm;
118 const Double_t AliITSv11GeometrySDD::fgkLay3LaddTopCornerEnd = 15.6*fgkmm;
119 const Int_t AliITSv11GeometrySDD::fgkLay3Ndet = 6;
120 const Int_t AliITSv11GeometrySDD::fgkLay3Nladd = 14;
121 const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH = 7.5*fgkmm;
123 const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 220.*fgkmm;
124 const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 291.*fgkmm;
125 const Double_t AliITSv11GeometrySDD::fgkLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
126 const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength = 671.*fgkmm;
127 const Double_t AliITSv11GeometrySDD::fgkLay4DetShortRadius = 235.0*fgkmm;
128 const Double_t AliITSv11GeometrySDD::fgkLay4DetLongRadius = 240.5*fgkmm;
129 const Double_t AliITSv11GeometrySDD::fgkLay4LaddTopCornerEnd = 15.6*fgkmm;
130 const Int_t AliITSv11GeometrySDD::fgkLay4Ndet = 8;
131 const Int_t AliITSv11GeometrySDD::fgkLay4Nladd = 22;
132 const Double_t AliITSv11GeometrySDD::fgkLay4CoolPipeSuppH = 7.5*fgkmm;
134 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay3 = fgkLay3DetShortRadius;
135 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay4 = fgkLay4DetShortRadius;
136 const Double_t AliITSv11GeometrySDD::fgkDistEndLaddCardsLadd = 0.*fgkmm;
139 const Double_t AliITSv11GeometrySDD::fgkHybridAngle = 46; // approx !!!
140 // Origine taken at the hybrid corner :
141 const Double_t AliITSv11GeometrySDD::fgkHybridLength = 65*fgkmm;
142 const Double_t AliITSv11GeometrySDD::fgkHybridWidth = 41*fgkmm;
143 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleRad = 1.05*fgkmm;
144 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleZ = 2.5*fgkmm;
145 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleX = fgkHybridWidth-23.599*fgkmm;
147 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleDZ = 9.698*fgkmm;
148 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHolePasDX = 10.754*fgkmm;
149 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleAmbDX = 9.122*fgkmm;
150 // center of ships to the border
151 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ4 = fgkHybridLength-(4.654 )*fgkmm-fgkHybFLlowHoleDZ/2;
152 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ3 = fgkHybridLength-(4.654+15. )*fgkmm-fgkHybFLlowHoleDZ/2;
153 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ2 = fgkHybridLength-(4.654+15.*2)*fgkmm-fgkHybFLlowHoleDZ/2;
154 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ1 = fgkHybridLength-(4.654+15.*3)*fgkmm-fgkHybFLlowHoleDZ/2;
155 const Double_t AliITSv11GeometrySDD::fgkHybFLlowPasX = fgkHybridWidth-32.775*fgkmm;
156 const Double_t AliITSv11GeometrySDD::fgkHybFLlowAmbX = fgkHybridWidth-20.791*fgkmm;
157 const Double_t AliITSv11GeometrySDD::fgkHybChipsDZ = 9.221*fgkmm;
158 const Double_t AliITSv11GeometrySDD::fgkHybPascalDX = 10.245*fgkmm;
159 const Double_t AliITSv11GeometrySDD::fgkHybAmbraDX = 8.51*fgkmm;
160 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperWidth = 15.012*fgkmm;
161 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperLength = 59.878*fgkmm;
162 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAlDZ = 11.183*fgkmm;
163 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAldx = 2.307*fgkmm;
165 const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorLen = 12.000*fgkmm;
166 const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorWid = 1.490*fgkcm; //???
167 const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorAng = 40.0;
169 const Double_t AliITSv11GeometrySDD::fgkmu = 1*fgkmicron; // 1*fgkmicron; // can be increase for checking thin objects
170 const Double_t AliITSv11GeometrySDD::fgkHybridThBridgeThick = 0.25*fgkmm; // ???
171 const Double_t AliITSv11GeometrySDD::fgkHybAlThick = 30*fgkmu;
172 const Double_t AliITSv11GeometrySDD::fgkHybUpThick = 20*fgkmu;
173 const Double_t AliITSv11GeometrySDD::fgkHybGlueScrnThick = 50*fgkmu; // ??? ?????
174 const Double_t AliITSv11GeometrySDD::fgkHybGlueLowThick = 90*fgkmu;
175 const Double_t AliITSv11GeometrySDD::fgkHybGlueUpThick = 90*fgkmu; // sur ?????
176 const Double_t AliITSv11GeometrySDD::fgkHybAlCCThick = 12*fgkmu;
177 const Double_t AliITSv11GeometrySDD::fgkHybUpCCThick = 12*fgkmu;
178 const Double_t AliITSv11GeometrySDD::fgkHybChipThick = 150*fgkmu;
179 const Double_t AliITSv11GeometrySDD::fgkHybGlueAgThick = 50*fgkmu; // ??? ????
180 const Double_t AliITSv11GeometrySDD::fgkHybUnderNiThick = 20*fgkmu; // ??? ????
181 const Int_t AliITSv11GeometrySDD::fgkNHybSMD = 25;
182 const Double_t AliITSv11GeometrySDD::fgkHybSMDposX[fgkNHybSMD] =
183 {2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,21.40*fgkmm,
184 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
185 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,17.09*fgkmm,21.40*fgkmm,
186 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
187 1.63*fgkmm,5.22*fgkmm,13.59*fgkmm,21.40*fgkmm};
188 const Double_t AliITSv11GeometrySDD::fgkHybSMDposZ[fgkNHybSMD] =
189 { 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm,
190 17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,
191 32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,
192 47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,
193 62.68*fgkmm,62.06*fgkmm,62.06*fgkmm,62.06*fgkmm};
194 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleW = 0.954*fgkmm;
195 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleL = 0.47 *fgkmm;
196 const Double_t AliITSv11GeometrySDD::fgkHybSMDendW = 1.132*fgkmm;
197 const Double_t AliITSv11GeometrySDD::fgkHybSMDendL = 0.925*fgkmm;
198 const Double_t AliITSv11GeometrySDD::fgkHybSMDheight = 400.*fgkmu; // ??? ????!!!!!!!
200 const Double_t AliITSv11GeometrySDD::fgkWaferThickness = 300.*fgkmu;
201 const Double_t AliITSv11GeometrySDD::fgkWaferWidth = 72.5 *fgkmm;
202 const Double_t AliITSv11GeometrySDD::fgkWaferLength = 87.6 *fgkmm;
203 const Double_t AliITSv11GeometrySDD::fgkWaferThickSens = 299.8*fgkmu;
204 const Double_t AliITSv11GeometrySDD::fgkWaferWidthSens = 70.17*fgkmm;
205 // 256 anodes times 294 microns of pitch
206 const Double_t AliITSv11GeometrySDD::fgkWaferLengthSens = 256*294*fgkmicron;
208 const Double_t AliITSv11GeometrySDD::fgkDigitCablWidth = 18.4*fgkmm;
209 const Double_t AliITSv11GeometrySDD::fgkDigitCablAlThick = (30+30*8./10.)*fgkmicron; // will probably change
210 const Double_t AliITSv11GeometrySDD::fgkDigitCablPolyThick = (20+12)*fgkmicron; // will probably change
212 const Double_t AliITSv11GeometrySDD::fgkWaHVcableAlThick = 30*2./10.*fgkmu; // will probably change // Al ratio is random !!!
213 const Double_t AliITSv11GeometrySDD::fgkWaHVcablePolyThick = 175*fgkmu; // will probably change
214 const Double_t AliITSv11GeometrySDD::fgkWaHVcableLength = 67.08*fgkmm;
215 const Double_t AliITSv11GeometrySDD::fgkWaHVcableWitdh = 17.4*fgkmm; // check !!!
216 const Double_t AliITSv11GeometrySDD::fgkWaHVcableDW = 5.24*fgkmm; //5.24*fgkmm;// check !!!
218 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLX = 5. *fgkmm;
219 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLZ = 5. *fgkmm;
220 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLY = 150. *fgkmu;
221 const Double_t AliITSv11GeometrySDD::fgkGlassDXOnSensor = 26.28*fgkmm; // check !!!
222 const Double_t AliITSv11GeometrySDD::fgkGlassDZOnSensor = 22.50*fgkmm; // check !!!
224 const Double_t AliITSv11GeometrySDD::fgkTransitHVAlThick = 30*2./10.*fgkmu; // check // will probably change //Al ratio is random
225 const Double_t AliITSv11GeometrySDD::fgkTransitHVPolyThick = 100*fgkmu; // check // will probably change
226 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLX = 71.46*fgkmm; // check !!!
227 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLZ = 21.3*fgkmm;
228 const Double_t AliITSv11GeometrySDD::fgkTransitHVBondingLZ = 3.6*fgkmm;
229 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailLength = 27*fgkmm; // ???, not yet fixed ...
230 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailWidth = 26*fgkmm;
231 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailXpos = 8*fgkmm; //8*fgkmm // ???, a mesurer !!!
232 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLZ = 10.34*fgkmm;
233 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLeftZ = 4.11*fgkmm;
234 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideRightZ = 3.5*fgkmm; // ???, a mesurer !!!
236 const Double_t AliITSv11GeometrySDD::fgkLongHVcablePolyThick= (20+30+125+30+20+30+125+30+20)*fgkmu; // check // will probably change
237 const Double_t AliITSv11GeometrySDD::fgkLongHVcableAlThick = (30+30*2/10+30)*fgkmu; // check // will probably change
238 const Double_t AliITSv11GeometrySDD::fgkLongHVcableSeparation = 600*fgkmicron;
240 const Double_t AliITSv11GeometrySDD::fgkRubyDX = 14.*fgkmm;
241 const Double_t AliITSv11GeometrySDD::fgkRubyZladd3 = 250*fgkmm;
242 const Double_t AliITSv11GeometrySDD::fgkRubyZladd4 = 325*fgkmm;
244 // the stesalite ladder foot at its end
245 const Double_t AliITSv11GeometrySDD::fgkLadFootX = 60.*fgkmm;
246 const Double_t AliITSv11GeometrySDD::fgkLadFootZ = 20.*fgkmm;
247 const Double_t AliITSv11GeometrySDD::fgkLadFootY = 8.*fgkmm;
248 const Double_t AliITSv11GeometrySDD::fgkLadFootMiddleY = 4.5*fgkmm;
249 const Double_t AliITSv11GeometrySDD::fgkLadBox1X = 23.*fgkmm;
250 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintX = 6.*fgkmm;
251 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintY = 1.*fgkmm;
252 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintBorder = 4.*fgkmm;
253 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleZ = 8.*fgkmm;
254 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleX = 9.*fgkmm;
255 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleY = 6.5*fgkmm;
256 const Double_t AliITSv11GeometrySDD::fgkRubyCageAxisShift = 0.5*fgkmm;
257 const Double_t AliITSv11GeometrySDD::fgkScrewM4diam = 4.*fgkmm;
259 const Double_t AliITSv11GeometrySDD::fgkRubyScrewShiftToCenterY = 0.1;
260 const Double_t AliITSv11GeometrySDD::fgkRubyHoleDiam = 0.5;
262 // the U cooling pipe and its heat exchanger in end-ladder cards system
263 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay3 = 138*fgkmm;
264 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay4 = 150*fgkmm;
265 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUwidth = 59*fgkmm;
266 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeRadius = 5*fgkmm;
267 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeInnerDiam = 2.8*fgkmm;
268 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeOuterDiam = 3.*fgkmm;
269 //--- The al body of the cooling syst.of the heat exchanger :
270 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay3 = 112.*fgkmm; //
271 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay4 = 125.*fgkmm; //
272 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmX = 4.75*fgkmm; // the arms of the U cooling tube
273 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmY = 6.8*fgkmm;
274 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDY = 1.03*fgkmm; // shift in Y of the arms from the axis
275 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDX = 0.125*fgkmm;// shift in X of the arms from the axis
276 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZpos = 8.9*fgkmm; //
279 const Double_t AliITSv11GeometrySDD::fgkLVcardX = 26.525*fgkmm;
280 const Double_t AliITSv11GeometrySDD::fgkLVcardY = 44.95*fgkmm;
281 const Double_t AliITSv11GeometrySDD::fgkLVcardZ = 1.*fgkmm; // all except Cu layer //???
282 const Double_t AliITSv11GeometrySDD::fgkLVcardCuZ = 0.1*fgkmm; //???
284 const Double_t AliITSv11GeometrySDD::fgkLVChip0X = 16.525*fgkmm;
285 const Double_t AliITSv11GeometrySDD::fgkLVChip0Y = 10.8*fgkmm;
286 const Double_t AliITSv11GeometrySDD::fgkLVChip0Z = 3.5*fgkmm; // all except si layer //???
287 const Double_t AliITSv11GeometrySDD::fgkLVChip0SiZ = 0.2*fgkmm; //???????????????????????????????????????????????????
288 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosX = 13.*fgkmm; //19.95*fgkmm; ???
289 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosY = 10.3*fgkmm;
291 const Double_t AliITSv11GeometrySDD::fgkLVChip1X = 6.00*fgkmm;
292 const Double_t AliITSv11GeometrySDD::fgkLVChip1Y = 6.00*fgkmm;
293 const Double_t AliITSv11GeometrySDD::fgkLVChip1Z = 1*fgkmm; // ???
294 const Double_t AliITSv11GeometrySDD::fgkLVChip1SiZ = 0.2*fgkmm; // ???
295 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosX = 18.*fgkmm;
296 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosY = 27.6*fgkmm;
298 const Double_t AliITSv11GeometrySDD::fgkLVChip2X = 6.00*fgkmm;
299 const Double_t AliITSv11GeometrySDD::fgkLVChip2Y = 6.00*fgkmm;
300 const Double_t AliITSv11GeometrySDD::fgkLVChip2Z = 1*fgkmm; // ???
301 const Double_t AliITSv11GeometrySDD::fgkLVChip2SiZ = 0.2*fgkmm; //???
302 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosX = 18.0*fgkmm;
303 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosY = 39.0*fgkmm;
305 const Double_t AliITSv11GeometrySDD::fgkLVChip3X = 4.01*fgkmm;
306 const Double_t AliITSv11GeometrySDD::fgkLVChip3Y = 4.01*fgkmm;
307 const Double_t AliITSv11GeometrySDD::fgkLVChip3Z = 1*fgkmm; // ???
308 const Double_t AliITSv11GeometrySDD::fgkLVChip3SiZ = 0.2*fgkmm;
309 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosX = 20.7*fgkmm;
310 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosY = 21.4*fgkmm;
312 const Double_t AliITSv11GeometrySDD::fgkLVcoolX1 = 17.25*fgkmm;
313 const Double_t AliITSv11GeometrySDD::fgkLVcoolY1 = 8.7*fgkmm;
314 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ1 = 1.*fgkmm;
316 const Double_t AliITSv11GeometrySDD::fgkLVcoolX2 = 3.5*fgkmm;
317 const Double_t AliITSv11GeometrySDD::fgkLVcoolY2 = 8.7*fgkmm;
318 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ2 = 2.3*fgkmm;
320 const Double_t AliITSv11GeometrySDD::fgkLVcoolX3 = 4.75*fgkmm;
321 const Double_t AliITSv11GeometrySDD::fgkLVcoolY3 = 3.1*fgkmm; //+0.1=glue
322 const Double_t AliITSv11GeometrySDD::fgkLVcoolPosY = 6.5*fgkmm;
325 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramX = 54.01*fgkmm;
326 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramY = 40.89*fgkmm;
327 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramZ = 0.7*fgkmm; // ???
329 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1X = 6.8*fgkmm;
330 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Z = 1.*fgkmm; // ???
331 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Ymid = 4.1*fgkmm;
332 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Yend = 0.95*fgkmm; // doesn't take into account the soldering
333 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosX = 13.1*fgkmm;
334 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosY = 14.5*fgkmm;
336 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2X = 6.8*fgkmm;
337 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Z = 1.*fgkmm; // ???
338 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Ymid = 2.9*fgkmm;
339 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Yend = 0.95*fgkmm;
340 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosX = -12.6*fgkmm;
341 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosY = 16.54*fgkmm;
343 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xmid = 3.0*fgkmm;
344 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xend = 0.91*fgkmm;
345 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Z = 2.*fgkmm; // ???
346 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Y = 3.43*fgkmm;
348 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX1 = 14.6*fgkmm;
349 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX2 = 7.2*fgkmm;
350 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX3 = 2.52*fgkmm;
351 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX4 = -4.96*fgkmm;
352 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX5 = -13.82*fgkmm;
353 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY1 = 6.27*fgkmm;
354 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY2 = 0.7*fgkmm;
355 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY3 = 9.1*fgkmm;
357 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1X = 14.*fgkmm;
358 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Y = 9.5*fgkmm;
359 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Z = 2.*fgkmm;
360 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2X = 14.25*fgkmm;
361 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Y = 3.5*fgkmm;
362 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Z = 4.5*fgkmm;
363 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3X = 4.5*fgkmm;
364 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Y = 3.5*fgkmm;
365 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Z = 7.2*fgkmm;
366 const Double_t AliITSv11GeometrySDD::fgkHVCardCoolDY = 6.*fgkmm;
368 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX1 = 19.5*fgkmm;
369 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY1 = 2*fgkmm;
370 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX2 = 35.*fgkmm;
371 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY2 = 3.9*fgkmm;
372 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ = 17.*fgkmm;
373 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppAngle = 45;
374 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX3 = 4.5*fgkmm;
375 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY3 = 3.*fgkmm;
376 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ3 = 12.*fgkmm;
377 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppTopLen = 8.65*fgkmm;
379 // screws fixing boards to the end-ladder on the U tube
380 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadR = 1.85*fgkmm;
381 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadH = 1.5*fgkmm;
382 const Double_t AliITSv11GeometrySDD::fgkLittleScrewR = 0.7*fgkmm;
383 const Double_t AliITSv11GeometrySDD::fgkShiftLittleScrewLV = 3*fgkmm; // ???
384 const Double_t AliITSv11GeometrySDD::fgkLittleLVScrewHeadR = 1.2*fgkmm; // ???
387 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX1 = (25.50+28.50)*fgkmm; // length (first part of Carlos card)
388 const Double_t AliITSv11GeometrySDD::fgkCarlosCardY1 = 1.6*fgkmm; // thickness
389 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ1 = 40.8*fgkmm; // width
390 const Double_t AliITSv11GeometrySDD::fgkCarlosCardCuY = 0.1*fgkmm; // thickness of Cu layer (strips)
391 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX2 = 25.50*fgkmm; // length (2nd part of Carlos card)
392 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ2 = 8.20*fgkmm; // width
394 const Double_t AliITSv11GeometrySDD::fgkCarlosCardChipSiThick = 0.1*fgkmm; // ??? idem for all chips ???
395 const Double_t AliITSv11GeometrySDD::fgkCarlosCardShift = 9*fgkmm; // ??? shift in z w.r.t. heat bridge
397 // size and position of various chips on carlos end-ladder board
398 const Double_t AliITSv11GeometrySDD::fgkCarlosU1X = 13*fgkmm;
399 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Y = 1.68*fgkmm;
400 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Z = 13*fgkmm;
401 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posX = 18.4*fgkmm;
402 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posZ = -7.2*fgkmm;
404 const Double_t AliITSv11GeometrySDD::fgkCarlosU2X = 13.75*fgkmm;
405 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Y = 1.60*fgkmm;
406 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Z = 13.85*fgkmm;
407 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posX = -0.375*fgkmm;
408 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posZ = -9.725*fgkmm;
410 const Double_t AliITSv11GeometrySDD::fgkCarlosU3X = 5*fgkmm;
411 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Y = 1.*fgkmm;
412 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Z = 5*fgkmm;
413 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posX = 6.4*fgkmm;
414 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posZ = 9.9*fgkmm;
417 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posX = -12*fgkmm;
418 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posZ = 3.6*fgkmm;
420 const Double_t AliITSv11GeometrySDD::fgkCarlosU17X = 16*fgkmm;
421 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Y = 3.5*fgkmm;
422 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Z = 10.9*fgkmm;
423 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posX = -17.84*fgkmm;
424 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posZ = -10.95*fgkmm;
426 const Double_t AliITSv11GeometrySDD::fgkCarlosU35X = 4*fgkmm;
427 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Y = 1.*fgkmm;
428 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Z = 4*fgkmm;
429 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posX = -21.6*fgkmm;
430 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posZ = 2.3*fgkmm;
432 const Double_t AliITSv11GeometrySDD::fgkCarlosU36X = 6*fgkmm;
433 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Y = 1.*fgkmm;
434 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Z = 6*fgkmm;
435 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posX = -21.6*fgkmm;
436 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posZ = 9.6*fgkmm;
438 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1X = 8*fgkmm;
439 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Y = 1.7*fgkmm; // look thicker than design number (0.7) ! ???
440 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Z = 3.7*fgkmm;
441 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posX = -12*fgkmm;
442 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posZ = 10.6*fgkmm;
444 // distance from the heat bridge center to the card center :
445 const Double_t AliITSv11GeometrySDD::fgkCarlosCard2HeatBridge = fgkCarlosSuppY2/2+fgkCarlosCardY1/2+fgkCarlosU1Y+0.1*fgkmm;
447 // some pieces at the end of the carbon fiber ladder
448 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay3Len = 467.*fgkmm; // ???
449 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay4Len = 616.*fgkmm; // ???
450 const Double_t AliITSv11GeometrySDD::fgkHVguideX1 = 42.5*fgkmm;
451 const Double_t AliITSv11GeometrySDD::fgkHVguideY1 = 7.*fgkmm;
452 const Double_t AliITSv11GeometrySDD::fgkHVguideZ1 = 10.*fgkmm;
453 const Double_t AliITSv11GeometrySDD::fgkHVguideZ2 = 6.*fgkmm;
454 const Double_t AliITSv11GeometrySDD::fgkHVguideDX = -8.5*fgkmm;
455 const Double_t AliITSv11GeometrySDD::fgkHVguideSuppFullZ = 37.5*fgkmm;
457 // Cooling connector between phynox and plastic cooling water tubes
458 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeRmin = 1 *fgkmm;
459 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR1 = 2.5*fgkmm; // ???
460 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL1 = 3.*fgkmm; // ???
461 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR2 = 3.5*fgkmm; // ???
462 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL2 = 2.*fgkmm; // ???
463 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR3 = 3.*fgkmm; // ???
464 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL3 = 5 *fgkmm; // ???
467 // parameters for coding SDD cables on SDD and SSD cones
468 const Double_t AliITSv11GeometrySDD::fgkSectionCuPerMod = 3*2*0.006 + 3*2*0.0005 + 2*0.002;
469 // copper : LV + signal + HV(HV ???)
470 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)
471 - fgkSectionCuPerMod);
473 const Double_t AliITSv11GeometrySDD::fgkSectionGlassPerMod = 3*0.006; // ???
474 const Double_t AliITSv11GeometrySDD::fgkSectionCoolPolyuEL = 0.4672;
475 const Double_t AliITSv11GeometrySDD::fgkSectionCoolWaterEL = 0.3496;
476 const Double_t AliITSv11GeometrySDD::fgkEndLadderEarthCableR = 0.5*fgkmm;
477 // (sections are given in cm square)
478 const Double_t AliITSv11GeometrySDD::fgkCableBendRatio = 1.3; // ??? this factor account for the bending of cables
479 const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilThick = 0.1*fgkmm; // Thickness of Al foil on hybrid side - TO BE CHECKED
480 const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilWide = 4.2*fgkmm; // Width of Al foil on hybrid side - from digitCableA
481 const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilSide = 2.0*fgkmm; // Side length of Al foil on hybrid side
483 const Double_t AliITSv11GeometrySDD::fgkConeSDDr1 = 11.87574*fgkcm;
484 const Double_t AliITSv11GeometrySDD::fgkConeSDDr2 = 26.07574*fgkcm;
485 const Double_t AliITSv11GeometrySDD::fgkConeSDDz1 = 3.36066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
486 const Double_t AliITSv11GeometrySDD::fgkConeSDDz2 = 17.56066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
487 // These last parameters come from cone's code and define the slope
488 // and position of the SDD cone end. For some unknown reason, this doesn't
489 // allow to stick on the SDD cone. This has to be checked when a correct
490 // version of the cone is available ... For now 'm applying some approximative
493 const Double_t AliITSv11GeometrySDD::fgkSDDCableR1 = 16*fgkcm; // ??? // part 1 of "cable cone"
494 const Double_t AliITSv11GeometrySDD::fgkSDDCableR2 = 23*fgkcm; // ??? // part 1/2 of "cable cone"
495 const Double_t AliITSv11GeometrySDD::fgkSDDCableR3 = 26*fgkcm; // ??? // part 2 of "cable cone"
497 const Double_t AliITSv11GeometrySDD::fgkSDDCableDZint = 3.5*fgkcm;
498 const Double_t AliITSv11GeometrySDD::fgkSDDCableR5 = 37*fgkcm; // third part of "cable cone"
499 const Double_t AliITSv11GeometrySDD::fgkSDDCableZ5 = 65*fgkcm; // third part of "cable cone"
507 ClassImp(AliITSv11GeometrySDD)
509 //________________________________________________________________________
510 AliITSv11GeometrySDD::AliITSv11GeometrySDD():
513 fCoolPipeSupportL(0),
514 fCoolPipeSupportR(0),
517 fBaseThermalBridge(0),
534 fAddCoolingSyst(kTRUE),
536 fAddOnlyLadder3min(-1),
537 fAddOnlyLadder3max(-1),
538 fAddOnlyLadder4min(-1),
539 fAddOnlyLadder4max(-1),
540 fColorCarbonFiber(4),
550 fLay3LadderUnderSegDH(0),
551 fLay4LadderUnderSegDH(0),
552 fLay3LaddShortRadius(0),
553 fLay3LaddLongRadius(0),
554 fLay4LaddShortRadius(0),
555 fLay4LaddLongRadius(0)
558 // Standard constructor
560 fCommonVol[0] = NULL;
561 fCommonVol[1] = NULL;
564 for (Int_t i=0; i<fgkNladdSegCommonVol; i++){
565 fLaddSegCommonVol[i] = NULL;
566 fLaddSegCommonTr[i] = NULL;
572 //________________________________________________________________________
573 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
574 AliITSv11Geometry(debug),
576 fCoolPipeSupportL(0),
577 fCoolPipeSupportR(0),
580 fBaseThermalBridge(0),
597 fAddCoolingSyst(kTRUE),
599 fAddOnlyLadder3min(-1),
600 fAddOnlyLadder3max(-1),
601 fAddOnlyLadder4min(-1),
602 fAddOnlyLadder4max(-1),
603 fColorCarbonFiber(4),
613 fLay3LadderUnderSegDH(0),
614 fLay4LadderUnderSegDH(0),
615 fLay3LaddShortRadius(0),
616 fLay3LaddLongRadius(0),
617 fLay4LaddShortRadius(0),
618 fLay4LaddLongRadius(0)
621 // Constructor setting debugging level
623 fCommonVol[0] = NULL;
624 fCommonVol[1] = NULL;
627 for (Int_t i=0; i<fgkNladdSegCommonVol; i++){
628 fLaddSegCommonVol[i] = NULL;
629 fLaddSegCommonTr[i] = NULL;
634 //________________________________________________________________________
635 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
636 AliITSv11Geometry(s.GetDebug()),
637 fPinSupport(s.fPinSupport),
638 fCoolPipeSupportL(s.fCoolPipeSupportL),
639 fCoolPipeSupportR(s.fCoolPipeSupportR),
640 fSDDsensor3(s.fSDDsensor3),
641 fSDDsensor4(s.fSDDsensor4),
642 fBaseThermalBridge(s.fBaseThermalBridge),
644 fLadderFoot(s.fLadderFoot),
645 fCardLVR(s.fCardLVR),
646 fCardLVL(s.fCardLVL),
648 fCardCarlos(s.fCardCarlos),
649 fRaccordoL(s.fRaccordoL),
650 fDigitCableLay3A(s.fDigitCableLay3A),
651 fDigitCableLay3B(s.fDigitCableLay3B),
652 fDigitCableLay4A(s.fDigitCableLay4A),
653 fDigitCableLay4B(s.fDigitCableLay4B),
654 fMotherVol(s.fMotherVol),
655 fAddHybrids(s.fAddHybrids),
656 fAddSensors(s.fAddSensors),
657 fAddHVcables(s.fAddHVcables),
658 fAddCables(s.fAddCables),
659 fAddCoolingSyst(s.fAddCoolingSyst),
660 fCoolingOn(s.fCoolingOn),
661 fAddOnlyLadder3min(s.fAddOnlyLadder3min),
662 fAddOnlyLadder3max(s.fAddOnlyLadder3max),
663 fAddOnlyLadder4min(s.fAddOnlyLadder4min),
664 fAddOnlyLadder4max(s.fAddOnlyLadder4max),
665 fColorCarbonFiber(s.fColorCarbonFiber),
666 fColorRyton(s.fColorRyton),
667 fColorPhynox(s.fColorPhynox),
668 fColorSilicon(s.fColorSilicon),
669 fColorAl(s.fColorAl),
670 fColorPolyhamide(s.fColorPolyhamide),
671 fColorGlass(s.fColorGlass),
672 fColorSMD(s.fColorSMD),
673 fColorSMDweld(s.fColorSMDweld),
674 fColorStesalite(s.fColorStesalite),
675 fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
676 fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
677 fLay3LaddShortRadius(s.fLay3LaddShortRadius),
678 fLay3LaddLongRadius(s.fLay3LaddLongRadius),
679 fLay4LaddShortRadius(s.fLay4LaddShortRadius),
680 fLay4LaddLongRadius(s.fLay4LaddLongRadius)
683 // do only a "shallow copy" ...
684 fCommonVol[0] = s.fCommonVol[0];
685 fCommonVol[1] = s.fCommonVol[1];
686 fCommonTr[0] = s.fCommonTr[0];
687 fCommonTr[1] = s.fCommonTr[1];
688 for (Int_t i=0; i<fgkNladdSegCommonVol; i++){
689 fLaddSegCommonVol[i] = s.fLaddSegCommonVol[i];
690 fLaddSegCommonTr[i] = s.fLaddSegCommonTr[i];
695 //________________________________________________________________________
696 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
697 operator=(const AliITSv11GeometrySDD &s) {
698 // Assignment operator
699 if(&s == this) return *this;
700 fMotherVol = s.fMotherVol;
701 fAddHybrids = s.fAddHybrids;
702 fAddSensors = s.fAddSensors;
703 fAddHVcables = s.fAddHVcables;
704 fAddCables = s.fAddCables;
705 fAddCoolingSyst = s.fAddCoolingSyst;
706 fCoolingOn = s.fCoolingOn;
707 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
708 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
709 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
710 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
714 //________________________________________________________________________
715 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
716 // Look like a destructor
717 // Smell like a destructor
718 // And actually is the destructor
719 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
720 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
721 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
722 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
725 //________________________________________________________________________
726 void AliITSv11GeometrySDD::SetParameters() {
728 // Define display colors and the non constant geometry parameters
731 Double_t detLadderDist = 8*fgkmm;
733 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
734 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
736 // radius from the center to the CF ladder :
737 fLay3LaddShortRadius = (fgkLay3DetShortRadius
738 + fgkLadWaferSep+2*fgkWaferThickness
740 fLay3LaddLongRadius = (fgkLay3DetLongRadius
741 + fgkLadWaferSep+2*fgkWaferThickness
743 fLay4LaddShortRadius = (fgkLay4DetShortRadius
744 + fgkLadWaferSep+2*fgkWaferThickness
746 fLay4LaddLongRadius = (fgkLay4DetLongRadius
747 + fgkLadWaferSep+2*fgkWaferThickness
750 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
751 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
752 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
753 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
754 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
755 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
757 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
758 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
759 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
760 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
761 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
762 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
763 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
764 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
768 //________________________________________________________________________
769 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
771 // Called to get a medium, checks that it exists.
772 // If not, prints an error and returns 0
776 snprintf(ch, 30, "ITS_%s",mediumName);
777 TGeoMedium* medium = gGeoManager->GetMedium(ch);
779 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
784 //________________________________________________________________________
785 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
786 // Get the actual number of ladder in layer 3
787 if ( (fAddOnlyLadder3min<0) ||
788 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
789 (fAddOnlyLadder3max<0) ||
790 (fAddOnlyLadder3max >= fgkLay3Nladd) )
792 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
796 //________________________________________________________________________
797 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
798 // Get the actual number of ladder in layer 4
799 if ( (fAddOnlyLadder4min<0) ||
800 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
801 (fAddOnlyLadder4max<0) ||
802 (fAddOnlyLadder4max >= fgkLay4Nladd) )
804 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
808 //________________________________________________________________________
809 void AliITSv11GeometrySDD::CreateBasicObjects() {
811 // Create basics objets which will be assembled together
812 // in Layer3 and Layer4 functions
816 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
817 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
818 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
819 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
821 fPinSupport = CreatePinSupport();
822 fCoolPipeSupportL = CreateCoolPipeSupportL();
823 fCoolPipeSupportR = CreateCoolPipeSupportR();
825 fBaseThermalBridge = CreateBaseThermalBridge();
826 fHybrid = CreateHybrid(0);
828 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
829 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
830 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
831 TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws
832 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
833 TGeoMedium *raccordMedium = GetMedium("INOX$"); // same as AISI 316-L
835 //********************************************************************
836 // pieces of the carbon fiber structure
837 //********************************************************************
838 Double_t dy = fgkLadderSegBoxDH/2;
839 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
840 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
841 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
842 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
843 Double_t dYTranslation = (fgkLadderHeight/2.
844 -0.5*fgkLadderWidth*TMath::Tan(beta)
845 -fgkLadderBeamRadius);
846 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
848 //--- the top V of the Carbon Fiber Ladder (segment)
849 TGeoArb8 *cfLaddTop1 = CreateLadderSide( "CFladdTopCornerVol1shape",
850 fgkSegmentLength/2., halfTheta,
851 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
852 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
853 cfLaddTop1,carbonFiberLadderStruct);
854 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerVol2shape",
855 fgkSegmentLength/2., halfTheta,
856 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
857 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
858 cfLaddTop2, carbonFiberLadderStruct);
859 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
860 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
861 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
864 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerVol1shape",
865 fgkSegmentLength/2., beta, -1,
866 fgkLadderLb, fgkLadderHb, fgkLadderl);
867 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
868 cfLaddSide1,carbonFiberLadderStruct);
869 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerVol2shape",
870 fgkSegmentLength/2., beta, 1,
871 fgkLadderLb, fgkLadderHb, fgkLadderl);
872 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
873 cfLaddSide2,carbonFiberLadderStruct);
874 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
875 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
876 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
877 alpha*TMath::RadToDeg());
878 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
879 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
880 -alpha*TMath::RadToDeg());
881 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
884 // Beams on the sides
885 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
886 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
887 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
888 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
889 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
890 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
891 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
893 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
894 carbonFiberLadderStruct);
895 sideBeam->SetLineColor(fColorCarbonFiber);
897 //Euler rotation : about Z, then new X, then new Z
898 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
899 -beamPhiPrime*TMath::RadToDeg(),-90);
900 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
901 beamPhiPrime*TMath::RadToDeg(), -90);
902 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
903 beamPhiPrime*TMath::RadToDeg(), -90);
904 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
905 -beamPhiPrime*TMath::RadToDeg(),-90);
907 TGeoCombiTrans *beamTransf[8];
908 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
909 TMath::Tan(halfTheta),
910 fgkLadderBeamRadius/2. - dy,
911 -3*fgkSegmentLength/8, beamRot1);
913 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
914 TMath::Tan(halfTheta),
915 fgkLadderBeamRadius/2. - dy,
916 -3*fgkSegmentLength/8, beamRot1);
917 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
919 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
920 TMath::Tan(halfTheta),
921 fgkLadderBeamRadius/2. - dy,
922 -fgkSegmentLength/8, beamRot2);
924 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
925 TMath::Tan(halfTheta),
926 fgkLadderBeamRadius/2. - dy,
927 -fgkSegmentLength/8, beamRot2);
928 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
930 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
931 TMath::Tan(halfTheta),
932 fgkLadderBeamRadius/2. - dy,
933 -3*fgkSegmentLength/8, beamRot3);
935 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
936 TMath::Tan(halfTheta),
937 fgkLadderBeamRadius/2. - dy,
938 -3*fgkSegmentLength/8, beamRot3);
939 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
941 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
942 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
943 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
944 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
946 //--- Beams of the bottom
947 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
948 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
949 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
950 bottomBeam1, carbonFiberLadderStruct);
951 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
952 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
953 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
954 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
955 bottomBeam2, carbonFiberLadderStruct);
956 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
957 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
958 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
959 - fgkLadderLb/3, 0, 180);
960 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
961 bottomBeam3, carbonFiberLadderStruct);
962 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
963 //bottomBeam3Vol->SetLineColor(2);
964 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
965 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
967 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
968 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
969 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
970 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
971 -fgkSegmentLength/2, bottomBeamRot1);
972 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
973 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
974 - dy, fgkSegmentLength/2, bottomBeamRot2);
975 // be careful for beams #3: when "reading" from -z to +z and
976 // from the bottom of the ladder, it should draw a Lambda, and not a V
977 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
978 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
979 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
980 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
981 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
982 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
984 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
985 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
986 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
987 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
988 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
989 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
990 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
991 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
992 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
993 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
994 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
995 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
996 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
997 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
998 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
999 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
1000 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
1001 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
1002 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
1005 //********************************************************************
1007 //********************************************************************
1009 for (Int_t i=0; i<fgkLay3Ndet; i++) {
1010 snprintf(cableName, 30, "digitCableLay3A_%i",i);
1011 fDigitCableLay3A[i].SetName(cableName);
1012 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
1013 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1014 fDigitCableLay3A[i].SetNLayers(2);
1015 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1017 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1018 snprintf(cableName, 30, "digitCableLay3B_%i",i);
1019 fDigitCableLay3B[i].SetName(cableName);
1020 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
1021 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1022 fDigitCableLay3B[i].SetNLayers(2);
1023 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1025 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1027 for (Int_t i=0; i<fgkLay4Ndet; i++) {
1028 snprintf(cableName, 30, "digitCableLay4A_%i",i);
1029 fDigitCableLay4A[i].SetName(cableName);
1030 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
1031 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1032 fDigitCableLay4A[i].SetNLayers(2);
1033 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1035 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1036 snprintf(cableName, 30, "digitCableLay4B_%i",i);
1037 fDigitCableLay4B[i].SetName(cableName);
1038 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
1039 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1040 fDigitCableLay4B[i].SetNLayers(2);
1041 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1043 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1045 // Well, those digit cables could also include the analog cables
1046 // which have the same width and the same path, at least in the ladder.
1047 // It will gain some computing ressources (less volumes) and some
1048 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1049 // The only thing to do is to change the names and put the correct total
1052 // some transformations and volumes used in several places
1053 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1054 0, -fgkCarlosSuppAngle, 0);
1056 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1057 fgkLittleScrewHeadH/2);
1058 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1059 littleScrewHead, stainless);
1060 fCommonVol[0]->SetLineColor(kGray);
1062 fLadderFoot = CreateLadderFoot();
1064 fCardHV = CreateHVCard(0);
1065 fCardCarlos = CreateCarlosCard(0);
1067 //==================
1068 // link beteen phynox and plastic cooling tubes
1069 //==================
1071 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1072 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1073 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1074 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1075 vwaterRac->SetLineColor(kBlue);
1077 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1078 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1079 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1080 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1081 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1082 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1083 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1084 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1085 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1086 vtube1Rac->SetLineColor(kGray);
1087 vtube2Rac->SetLineColor(kGray);
1088 vtube3Rac->SetLineColor(kGray);
1090 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1091 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1092 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1093 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1094 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1095 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1096 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1097 fRaccordoL->AddNode(vwaterRac, 1,0);
1098 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1099 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1100 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1104 //________________________________________________________________________
1105 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1107 // a debugging function for checking some possible overlaps
1109 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1110 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1111 if (fHybrid) fHybrid->CheckOverlaps(precision);
1115 //________________________________________________________________________
1116 TGeoCombiTrans *AliITSv11GeometrySDD::
1117 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1120 // return the TGeoCombiTrans which make a translation in y and z
1121 // and a rotation in phi in the global coord system
1122 // If planeSym = true, the rotation places the object symetrically
1123 // (with respect to the transverse plane) to its position in the
1124 // case planeSym = false
1127 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1128 TGeoRotation r1("",0.,0.,dphi);
1129 TGeoRotation r2("",90, 180, -90-dphi);
1131 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1132 combiTrans1->SetTranslation(t1);
1133 if (planeSym) combiTrans1->SetRotation(r1);
1134 else combiTrans1->SetRotation(r2);
1139 //________________________________________________________________________
1140 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1144 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1145 const Double_t *vect = ct->GetTranslation();
1146 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1147 ct->SetTranslation(newVect);
1151 //________________________________________________________________________
1152 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1153 // for code developpment and debugging purposes
1155 if (! fSDDsensor3) CreateBasicObjects();
1157 // moth->AddNode(fPinSupport, 1, 0);
1158 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1159 // moth->AddNode(fSDDsensor3, 1, 0);
1160 // moth->AddNode(fSDDsensor4, 1, 0);
1161 // moth->AddNode(fBaseThermalBridge, 1, 0);
1162 // moth->AddNode(fHybrid,100,0);
1163 // moth->AddNode(fLadderFoot,1,0);
1164 //moth->AddNode(fCardLVL,1,0);
1165 //moth->AddNode(fCardLVR,1,0);
1167 TGeoVolume* seg = CreateLadderSegment( 3, 0);
1168 moth->AddNode(seg, 1, 0);
1170 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1171 // moth->AddNode(lay3Ladder, 1, 0);
1173 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1174 // moth->AddNode(lay3Detectors, 1, 0);
1176 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1177 // moth->AddNode(lay3Detectors, 1, 0);
1180 // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1181 // moth->AddNode(endLadder, 1, 0);
1183 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1184 // moth->AddNode(highVCard, 1, 0);
1186 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1187 // moth->AddNode(supportRing, 1, 0);
1189 // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1190 // moth->AddNode(endLadderCards, 1, 0);
1192 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1193 // moth->AddNode(carlosCard, 1, 0);
1198 //==================================
1199 //--- test of flat cable curvature
1200 //==================================
1203 AliITSv11GeomCableFlat cable("test", 3, 0.3);
1204 cable.SetNLayers(1);
1205 cable.SetNLayers(2);
1206 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1207 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1208 cable.SetInitialNode(endLadderCards);
1210 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1219 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1220 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1221 cable.CreateAndInsertBoxCableSegment(1,angle);
1223 Double_t p3[3], p4[3];
1228 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1229 cable.CreateAndInsertCableCylSegment(2,angle);
1234 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1235 cable.CreateAndInsertCableSegment(3,angle);
1240 //________________________________________________________________________
1241 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1243 // Insert the layer 3 in the mother volume. This is a virtual volume
1244 // containing ladders of layer 3 and the supporting rings
1248 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1252 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1255 if (! fSDDsensor3) CreateBasicObjects();
1257 //====================================
1258 // First we create the central barrel
1259 //====================================
1261 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1262 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1263 TGeoVolumeAssembly *lay3Ladd2Det = CreateDetectorsAssemblyLadd2();
1264 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1265 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1266 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1267 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1268 virtualLayer3Shape, airSDD);
1270 Double_t dPhi = 360./fgkLay3Nladd;
1271 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1272 // Placing virtual ladder and detectors volumes following
1273 // ladder ordering convention
1276 Int_t iLaddMax = fgkLay3Nladd;
1277 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1278 iLaddMin = fAddOnlyLadder3min;
1279 iLaddMax = fAddOnlyLadder3max+1;
1282 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1284 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1285 snprintf(rotName, 30, "ITSsddLay3Ladd%i",iLadd);
1286 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1288 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1289 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1290 TGeoCombiTrans *ctLadd;
1291 //=============================================================
1293 // Special modification for ladder 2 of layer 3:
1294 // It has been inverted (pi rotation around y axis)
1296 //=============================================================
1298 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1299 0, ladderPhi, kTRUE);
1301 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1302 0, ladderPhi, kFALSE);
1303 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1304 ///////////////////////////////////////////////////
1305 snprintf(rotName, 30, "ITSsddLay3DetBox%i",iLadd);
1306 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1307 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1308 minRadiusDetBox += detectorsThick/2;
1309 TGeoCombiTrans *ctDet;
1310 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1311 0, ladderPhi, kTRUE);
1314 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1316 virtualLayer3->AddNode(lay3Ladd2Det , iLadd, ctDet);
1318 ///////////////////////////////////////////////////
1322 //====================================
1323 // Then the forward rapidity pieces
1324 // (cooling, Carlos, LV, HV ...)
1325 //====================================
1327 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1328 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1329 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1331 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1332 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1333 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1334 fgkForwardLay3Length/2.);
1336 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1337 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1338 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1341 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1342 virtualForward3Shape, airSDD);
1343 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1344 virtualForward3Shape, airSDD);
1345 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1346 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1348 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1349 fgkLay3Length/2+fgkForwardLay3Length/2);
1350 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1351 -fgkLay3Length/2-fgkForwardLay3Length/2);
1353 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1355 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1356 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1357 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1358 minRadiusDetBox += detectorsThick/2;
1360 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1362 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1363 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1364 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1365 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1367 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1368 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1375 virtualLayer3->CheckOverlaps(0.01);
1376 //virtualForward3Pos->CheckOverlaps(0.01);
1377 //virtualForward3Neg->CheckOverlaps(0.01);
1380 virtualLayer3->SetVisibility(kFALSE);
1381 //virtualForward3Pos->SetVisibility(kFALSE);
1382 //virtualForward3Neg->SetVisibility(kFALSE);
1385 moth->AddNode(virtualLayer3, 1, 0);
1386 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1387 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1391 // //________________________________________________________________________
1392 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1394 // // Insert the forward pieces of layer 3 in the mother volume.
1395 // // (cooling, Carlos, LV, HV ...)
1399 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1403 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1405 // if (! fSDDsensor3) CreateBasicObjects();
1407 // Double_t dPhi = 360./fgkLay3Nladd;
1408 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1409 // Int_t iLaddMin = 0;
1410 // Int_t iLaddMax = fgkLay3Nladd;
1411 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1412 // iLaddMin = fAddOnlyLadder3min;
1413 // iLaddMax = fAddOnlyLadder3max+1;
1415 // char rotName[30];
1418 // //=================
1420 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1421 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1422 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1424 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1425 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1426 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1427 // fgkForwardLay3Length/2.);
1429 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1430 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1431 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1434 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1435 // virtualForward3Shape, airSDD);
1436 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1437 // virtualForward3Shape, airSDD);
1438 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1439 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1441 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1442 // fgkLay3Length/2+fgkForwardLay3Length/2);
1443 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1444 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1446 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1448 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1449 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1450 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1451 // minRadiusDetBox += detectorsThick/2;
1453 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1455 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1456 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1457 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1458 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1460 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1461 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1464 // if(GetDebug(1)) {
1465 // virtualForward3Pos->CheckOverlaps(0.01);
1466 // virtualForward3Neg->CheckOverlaps(0.01);
1469 // virtualForward3Pos->SetVisibility(kFALSE);
1470 // virtualForward3Neg->SetVisibility(kFALSE);
1472 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1473 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1478 //________________________________________________________________________
1479 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1481 // Insert the end-ladder of layer 3 in the mother volume.
1482 // (cooling, Carlos, LV, HV ...)
1486 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1490 if (! fSDDsensor3) CreateBasicObjects();
1493 Int_t iLaddMax = fgkLay3Nladd;
1494 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1495 iLaddMin = fAddOnlyLadder3min;
1496 iLaddMax = fAddOnlyLadder3max+1;
1499 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1500 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1503 Double_t dPhi = 360./fgkLay3Nladd;
1504 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1506 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1508 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1510 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1512 snprintf(rotName, 30, "ITSsddLay3EndLadd%i",iLadd);
1514 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1515 fgkLay3Length/2, ladderPhi, kTRUE);
1516 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1517 -fgkLay3Length/2, ladderPhi, kFALSE);
1519 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1520 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1524 virtualForward3Pos->CheckOverlaps(0.01);
1525 virtualForward3Neg->CheckOverlaps(0.01);
1528 // 180deg Y rotation to compensate the cancellation of ITSD volume
1529 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1530 TGeoRotation *y180 = new TGeoRotation();
1531 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1532 moth->AddNode(virtualForward3Pos, 1, y180);
1533 moth->AddNode(virtualForward3Neg, 1, y180);
1536 //________________________________________________________________________
1537 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1539 // Insert the layer 4 in the mother volume. This is a virtual volume
1540 // containing ladders of layer 4 and the supporting rings
1544 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1550 if (! fSDDsensor3) CreateBasicObjects();
1552 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1553 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1554 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1555 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1556 virtualLayer4Shape, airSDD);
1558 //====================================
1559 // First we create the central barrel
1560 //====================================
1562 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1563 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1564 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1566 Double_t dPhi = 360./fgkLay4Nladd;
1567 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1569 // placing virtual ladder and detectors volumes following ladder
1570 // ordering convention
1573 Int_t iLaddMax = fgkLay4Nladd;
1574 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1575 iLaddMin = fAddOnlyLadder4min;
1576 iLaddMax = fAddOnlyLadder4max+1;
1578 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1580 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1581 snprintf(rotName, 30, "ITSsddLay4Ladd%i",iLadd);
1582 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1584 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1585 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1586 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1587 0, ladderPhi, kTRUE);
1588 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1589 ///////////////////////////////////////////////////
1590 snprintf(rotName, 30, "ITSsddLay4DetBox%i",iLadd);
1591 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1593 minRadiusDetBox = fgkLay4DetLongRadius;
1594 minRadiusDetBox += detBoxThickness/2;
1595 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1596 0, ladderPhi, kTRUE);
1597 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1598 ///////////////////////////////////////////////////
1602 //====================================
1603 // Then the pieces at forward rapidity
1604 // (cooling, Carlos, LV, HV ...)
1605 //====================================
1607 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1608 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1609 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1611 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1612 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1613 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1614 fgkForwardLay4Length/2.);
1615 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1616 virtualForward4Shape, airSDD);
1617 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1618 virtualForward4Shape, airSDD);
1619 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1620 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1622 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1623 fgkLay4Length/2+fgkForwardLay4Length/2);
1624 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1625 -fgkLay4Length/2-fgkForwardLay4Length/2);
1627 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1629 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1630 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1632 minRadiusDetBox = fgkLay4DetLongRadius;
1633 minRadiusDetBox += detBoxThickness/2;
1635 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1637 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1638 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1639 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1640 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1641 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1642 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1646 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1648 virtualLayer4->SetVisibility(kFALSE);
1649 //virtualForward4Pos->SetVisibility(kFALSE);
1650 //virtualForward4Neg->SetVisibility(kFALSE);
1652 moth->AddNode(virtualLayer4,1,0);
1653 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1654 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1658 // //________________________________________________________________________
1659 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1661 // // Insert the layer 4 in the mother volume. This is a virtual volume
1662 // // containing ladders of layer 4 and the supporting rings
1663 // // (cooling, Carlos, LV, HV ...)
1667 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1671 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1673 // if (! fSDDsensor3) CreateBasicObjects();
1675 // Double_t dPhi = 360./fgkLay4Nladd;
1676 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1678 // // placing virtual ladder and detectors volumes following ladder
1679 // // ordering convention
1680 // char rotName[20];
1681 // Int_t iLaddMin = 0;
1682 // Int_t iLaddMax = fgkLay4Nladd;
1683 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1684 // iLaddMin = fAddOnlyLadder4min;
1685 // iLaddMax = fAddOnlyLadder4max+1;
1688 // //=================
1689 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1690 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1691 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1693 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1694 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1695 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1696 // fgkForwardLay4Length/2.);
1697 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1698 // virtualForward4Shape, airSDD);
1699 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1700 // virtualForward4Shape, airSDD);
1701 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1702 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1704 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1705 // fgkLay4Length/2+fgkForwardLay4Length/2);
1706 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1707 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1709 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1711 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1712 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1713 // if (iLadd%2 != 0)
1714 // minRadiusDetBox = fgkLay4DetLongRadius;
1715 // minRadiusDetBox += detBoxThickness/2;
1717 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1719 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1720 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1721 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1722 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1723 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1724 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1727 // virtualForward4Pos->SetVisibility(kFALSE);
1728 // virtualForward4Neg->SetVisibility(kFALSE);
1730 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1731 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1735 //________________________________________________________________________
1736 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1738 // Insert the end-ladder of layer 4 in the mother volume.
1739 // (cooling, Carlos, LV, HV ...)
1743 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1747 if (! fSDDsensor3) CreateBasicObjects();
1749 // placing virtual ladder and detectors volumes following ladder
1750 // ordering convention
1752 Int_t iLaddMax = fgkLay4Nladd;
1753 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1754 iLaddMin = fAddOnlyLadder4min;
1755 iLaddMax = fAddOnlyLadder4max+1;
1758 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1759 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1762 Double_t dPhi = 360./fgkLay4Nladd;
1763 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1765 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1767 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1770 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1772 snprintf(rotName, 30, "ITSsddLay4EndLadd%i",iLadd);
1774 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1775 fgkLay4Length/2, ladderPhi, kTRUE);
1776 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1777 -fgkLay4Length/2, ladderPhi, kFALSE);
1778 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1779 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1782 // 180deg Y rotation to compensate the cancellation of ITSD volume
1783 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1784 TGeoRotation *y180 = new TGeoRotation();
1785 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1786 moth->AddNode(virtualForward4Pos, 1, y180);
1787 moth->AddNode(virtualForward4Neg, 1, y180);
1791 //________________________________________________________________________
1792 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1794 // return an assembly volume containing the CF ladder
1797 Int_t nDetectors = fgkLay3Ndet;
1798 Double_t ladderLength = fgkLay3LadderLength;
1799 Double_t underSegDH = fLay3LadderUnderSegDH;
1800 Double_t *sensorZPos = fLay3sensorZPos;
1801 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1802 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1806 nDetectors = fgkLay4Ndet;
1807 ladderLength = fgkLay4LadderLength;
1808 digitCableA = fDigitCableLay4A;
1809 digitCableB = fDigitCableLay4B;
1810 underSegDH = fLay4LadderUnderSegDH;
1811 sensorZPos = fLay4sensorZPos;
1814 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1816 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1817 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1819 // placing virtual ladder segment following detector ordering convention
1820 //=======================================================================
1823 // adding segment this way to create cable points in the correct order ...
1824 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1826 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1827 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1828 snprintf(transName, 30, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1829 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1830 + fgkSegmentLength/2;
1831 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1832 underSegDH/2,segmentPos);
1834 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1836 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1838 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1839 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1840 snprintf(transName, 30, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1841 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1842 + fgkSegmentLength/2;
1843 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1844 underSegDH/2,segmentPos);
1846 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1849 // putting virtual volume corresponding to the end of ladder
1850 //=======================================================================
1851 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1852 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1853 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1854 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1855 // Euler rotation : about Z, then new X, then new Z
1856 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1857 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1858 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1859 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1860 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1862 // creating and inserting cable segments
1863 // (check points are placed while creating segments)
1864 //=======================================================================
1866 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1868 digitCableA[iSegment].SetInitialNode(virtualLadder);
1869 digitCableB[iSegment].SetInitialNode(virtualLadder);
1871 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1872 Double_t rotation = 0;
1874 rotation = 90-fgkHybridAngle;
1875 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1877 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1881 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1882 Double_t rotation = 0;
1884 rotation = fgkHybridAngle-90;
1885 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1887 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1892 //=======================================================================
1894 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1895 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1897 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1898 char cableHVname[30];
1899 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1900 snprintf(cableHVname,30,"ITSsddHVcable%i", iSegment);
1901 cableHV[iSegment].SetName(cableHVname);
1902 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1903 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1904 cableHV[iSegment].SetNLayers(2);
1905 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1907 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1908 cableHV[iSegment].SetInitialNode(virtualLadder);
1910 Double_t x1[3], x2[3], x3[3],
1911 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1913 x1[0] = -fgkTransitHVtailXpos;
1914 x2[0] = -fgkTransitHVtailXpos;
1915 x3[0] = -fgkTransitHVtailXpos;
1916 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1917 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1918 *fgkLongHVcableSeparation;
1919 // adjust where HV long cable starts in Y
1920 // useful if you want to let some space for alignment
1921 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1922 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1923 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1925 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1926 x2[2] = x1[2]+5*fgkmm;
1927 x3[2] = ladderLength/2-endLength;
1928 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1929 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1930 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1932 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1933 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1934 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1935 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1939 x1[0] = fgkTransitHVtailXpos;
1940 x2[0] = fgkTransitHVtailXpos;
1941 x3[0] = fgkTransitHVtailXpos;
1943 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1944 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1945 *fgkLongHVcableSeparation;
1946 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1947 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1948 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1950 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1951 x2[2] = x1[2]-5*fgkmm;
1952 x3[2] = -ladderLength/2+endLength;
1953 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1954 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1955 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1957 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1958 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1962 //**********************************
1963 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1964 return virtualLadder;
1968 //________________________________________________________________________
1969 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(const char *name,
1970 Double_t dz, Double_t angle, Double_t xSign,
1971 Double_t L, Double_t H, Double_t l) {
1972 // Create one half of the V shape corner of CF ladder
1974 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1975 cfLaddSide->SetName(name);
1977 // Points must be in clockwise order
1978 cfLaddSide->SetVertex(0, 0, 0);
1979 cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1980 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1981 cfLaddSide->SetVertex(4, 0, 0);
1982 cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1983 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1985 cfLaddSide->SetVertex(1, 0, -H);
1986 cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1987 cfLaddSide->SetVertex(5, 0, -H);
1988 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1990 cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1991 cfLaddSide->SetVertex(3, 0, -H);
1992 cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1993 cfLaddSide->SetVertex(7, 0, -H);
1999 //________________________________________________________________________
2000 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
2002 // return a box containing the front-end hybrid
2005 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
2007 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
2008 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
2009 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
2010 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
2011 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
2012 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
2013 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
2014 // + upFLTotalThick + ccUpLayerTotThick);
2015 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
2017 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
2019 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
2021 //**************************************************** media :
2022 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2023 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
2024 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
2025 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2026 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2027 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
2028 TGeoMedium *niSDD = GetMedium("NICKEL$");
2029 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2030 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
2031 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors
2032 TGeoMedium *medSMDweld = GetMedium("SDD X7R weld$");
2034 //**************************************************** main volume :
2035 // TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
2036 // (fgkHybridLength)/2);
2037 Double_t xhybr[6],yhybr[6];
2038 xhybr[0] = -fgkHybridWidth/2;
2039 yhybr[0] = -volumeThick/2;
2040 xhybr[1] = fgkHybridWidth/2;
2041 yhybr[1] = -volumeThick/2;
2042 xhybr[2] = fgkHybridWidth/2;
2043 yhybr[2] = volumeThick/2;
2044 xhybr[3] = -fgkHybridWidth/2;
2045 yhybr[3] = volumeThick/2;
2046 xhybr[4] = xhybr[3] - 1.05*fgkHybCC2SensorLen*SinD(fgkHybCC2SensorAng);
2047 yhybr[4] = yhybr[3] - 1.05*fgkHybCC2SensorLen*CosD(fgkHybCC2SensorAng);
2048 xhybr[5] = xhybr[4];
2049 yhybr[5] = yhybr[4] - volumeThick;
2051 TGeoXtru *hybridBox = new TGeoXtru(2);
2052 hybridBox->DefinePolygon(6, xhybr, yhybr);
2053 hybridBox->DefineSection(0,-fgkHybridLength/2);
2054 hybridBox->DefineSection(1, fgkHybridLength/2);
2056 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
2059 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
2060 fgkHybridThBridgeThick/2,
2063 //**************************************************** Thermal bridge :
2064 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
2066 carbonFiberLadderStruct);
2067 vThermalBridge->SetLineColor(fColorCarbonFiber);
2068 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
2069 +fgkHybridThBridgeThick/2, 0);
2070 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
2072 //**************************************************** Screen layer :
2073 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
2074 fgkHybAlThick/2, fgkHybridLength/2);
2075 //here the upedex and glue layers are both assumed to be polyimide
2076 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
2078 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2080 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2081 (screenTotalThick+lowFLTotalThick)/2);
2083 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2084 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2086 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2087 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2088 +fgkHybAlThick/2, 0);
2090 TGeoTranslation hybHolePos1Tr(roundHoleX,
2091 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2092 -fgkHybridLength/2+fgkHybRndHoleZ);
2093 TGeoTranslation hybHolePos2Tr(roundHoleX,
2094 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2095 fgkHybridLength/2-fgkHybRndHoleZ);
2097 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2098 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2099 hybHolePos1->SetName("hybHolePos1");
2100 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2101 hybHolePos2->SetName("hybHolePos2");
2103 upGlueScreenTr->RegisterYourself();
2104 alScreenTr->RegisterYourself();
2105 hybHolePos1->RegisterYourself();
2106 hybHolePos2->RegisterYourself();
2109 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2110 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2111 "+sRoundHole:hybHolePos2)");
2112 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2113 vScreenAl->SetLineColor(fColorAl);
2114 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2115 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2116 "+sRoundHole:hybHolePos2)");
2117 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2118 sScreenUpGlue,polyhamideSDD);
2119 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2121 hybrid->AddNode(vScreenUpGlue, 1, 0);
2122 hybrid->AddNode(vScreenAl, 1, 0);
2124 //**************************************************** FL low layer :
2125 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2126 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2128 //here the upedex and glue layers are both assumed to be polyimide
2129 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2130 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2132 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2133 fgkHybAlThick/2, sideWidth1/2);
2135 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2136 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2137 -(fgkHybridLength-sideWidth1)/2);
2138 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2139 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2140 -(fgkHybridLength-sideWidth1)/2);
2141 upGlueBarTr1->RegisterYourself();
2142 alBarTr1->RegisterYourself();
2144 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2145 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2146 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2147 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2148 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2149 sLowUpGlueBar1, polyhamideSDD);
2150 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2152 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2153 vLowAlBar1->SetLineColor(fColorAl);
2154 hybrid->AddNode(vLowUpGlueBar1,1,0);
2155 hybrid->AddNode(vLowAlBar1,1,0);
2158 //here the upedex and glue layers are both assumed to be polyimide
2159 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2160 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2162 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2163 fgkHybAlThick/2, sideWidth2/2);
2165 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2166 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2167 (fgkHybridLength-sideWidth2)/2);
2168 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2169 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2170 (fgkHybridLength-sideWidth2)/2);
2171 upGlueBarTr2->RegisterYourself();
2172 alBarTr2->RegisterYourself();
2174 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2175 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2176 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2177 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2178 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2180 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2182 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2183 vLowAlBar2->SetLineColor(fColorAl);
2184 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2185 hybrid->AddNode(vLowAlBar2, 1, 0);
2187 if(GetDebug(3)) { // Remove compiler warning.
2188 sAlScreenLayer->InspectShape();
2189 sUpGlueScreenLayer->InspectShape();
2190 sRoundHole->InspectShape();
2191 sUpGlueBar1->InspectShape();
2192 sUpGlueBar2->InspectShape();
2193 sAlBar1->InspectShape();
2194 sAlBar2->InspectShape();
2197 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2198 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2199 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2201 lowFLpiece.SetNLayers(2);
2202 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2204 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2205 // alSDD at 80% : mostly to take into account strips of piece 3
2207 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2208 lowLayerYmin + lowFLTotalThick/2,
2209 -fgkHybridLength/2 + sideWidth1 };
2210 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2211 Double_t vZ[3] = {0,0,1};
2212 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2213 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2214 lowFLpiece.SetInitialNode(hybrid);
2215 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2216 lowFLpiece.ResetPoints();
2218 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2219 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2221 lowFLpiece.SetWidth(piece2width);
2222 lowFLpiece.SetName("lowFLpiece2");
2223 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2225 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2226 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2227 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2228 lowFLpiece.ResetPoints();
2230 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2231 - fgkHybFLlowHoleAmbDX/2;
2233 lowFLpiece.SetWidth(piece3width);
2234 lowFLpiece.SetName("lowFLpiece3");
2235 x1[0] = fgkHybridWidth/2-piece3width/2;
2237 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2238 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2239 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2241 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2242 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2243 Double_t vX[3] = {1,0,0};
2244 for (Int_t i=0; i<3; i++) {
2246 snprintf(ch, 20, "lowFLpieceA%i", i+4);
2247 lowFLpiece.SetName(ch);
2248 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2250 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2251 x1[0] = -fgkHybridWidth/2 + piece1width;
2252 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2253 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2254 x1[2] = zPiece; x2[2] = zPiece;
2255 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2256 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2257 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2258 lowFLpiece.ResetPoints();
2260 snprintf(ch, 20, "lowFLpieceB%i", i+4);
2261 lowFLpiece.SetName(ch);
2262 x1[0] = fgkHybridWidth/2 - piece3width;
2263 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2264 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2265 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2266 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2269 //**************************************************** chips+CC:
2270 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2271 chip.SetInitialNode(hybrid);
2273 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2274 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2275 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2276 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2278 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2279 // Here the tho CC (low+up) are merged
2280 // In fact, the last layer has a smaller surface of Al -> I put 80%
2282 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2286 for (Int_t i=0; i<4; i++) {
2287 snprintf(ch, 20, "pascalCC%i", i);
2289 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2290 x2[0] = x1[0] + fgkHybPascalDX;
2291 x1[2] = zChips[i] - fgkHybridLength/2;
2293 chip.AddCheckPoint( hybrid, 0, x1, vX );
2294 chip.AddCheckPoint( hybrid, 1, x2, vX );
2295 chip.CreateAndInsertBoxCableSegment(1,-90);
2298 snprintf(ch, 20, "ambraCC%i", i);
2300 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2301 x2[0] = x1[0] + fgkHybAmbraDX;
2302 chip.AddCheckPoint( hybrid, 0, x1, vX );
2303 chip.AddCheckPoint( hybrid, 1, x2, vX );
2304 chip.CreateAndInsertBoxCableSegment(1,-90);
2308 //**************************************************** CC outside chips:
2309 // I don't think there is a second aluminium layer here ...
2310 for (Int_t i = 0; i<4; i++) {
2311 snprintf(ch, 20, "ccLayerA%i", i);
2313 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2314 ccLayer1.SetInitialNode(hybrid);
2315 ccLayer1.SetNLayers(2);
2316 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2317 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2320 x1[0] = -fgkHybridWidth/2;
2321 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2322 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2323 + fgkHybChipThick + ccUpLayerTotThick/2;
2325 x1[2] = zChips[i] - fgkHybridLength/2;
2327 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2328 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2329 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2331 snprintf(ch, 20, "ccLayerB%i", i);
2332 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2333 ccLayer2.SetInitialNode(hybrid);
2334 ccLayer2.SetNLayers(2);
2335 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2336 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2339 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2340 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2341 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2342 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2343 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2344 ccLayer2.ResetPoints();
2345 snprintf(ch, 20, "ccLayerC%i", i);
2346 ccLayer2.SetName(ch);
2347 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2348 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2349 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2350 + ccUpLayerTotThick/2;
2353 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2354 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2355 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2357 //**************************************************** CC to sensors:
2358 // (alas, we cannot use GeomCableFlat here because section is not constant)
2359 Double_t xcc[6],ycc[6];
2360 xcc[0] = -0.5*ccLayer1.GetWidth();
2362 xcc[1] = 0.5*ccLayer1.GetWidth();
2365 ycc[2] = -fgkHybCC2SensorLen;
2366 xcc[3] = xcc[2] - fgkHybCC2SensorWid;
2369 ycc[4] = 0.8*ycc[3];
2371 ycc[5] = 0.2*ycc[3];
2373 TGeoXtru* ccToSensPoliSh = new TGeoXtru(2);
2374 ccToSensPoliSh->DefinePolygon(6, xcc, ycc);
2375 ccToSensPoliSh->DefineSection(0, 0.);
2376 ccToSensPoliSh->DefineSection(1, ccLayer1.GetThickness());
2378 snprintf(ch, 20, "ccToSens%i", i);
2379 TGeoVolume* ccToSensPoliVol = new TGeoVolume(ch, ccToSensPoliSh, polyhamideSDD);
2380 ccToSensPoliVol->SetLineColor(fColorPolyhamide);
2382 TGeoXtru* ccToSensAlSh = new TGeoXtru(2);
2383 ccToSensAlSh->DefinePolygon(6, xcc, ycc);
2384 ccToSensAlSh->DefineSection(0, 0.);
2385 ccToSensAlSh->DefineSection(1, fgkHybAlCCThick);
2387 snprintf(ch, 20, "ccToSensAl%i", i);
2388 TGeoVolume* ccToSensAlVol = new TGeoVolume(ch, ccToSensAlSh, alSDD50p100);
2389 ccToSensAlVol->SetLineColor(fColorAl);
2391 ccToSensPoliVol->AddNode(ccToSensAlVol, 1, 0);
2394 ccLayer1.GetPoint(0,coord);
2395 hybrid->AddNode(ccToSensPoliVol, i+1,
2396 new TGeoCombiTrans(coord[0], coord[1], coord[2],
2397 new TGeoRotation("",-90-fgkHybCC2SensorAng, 90, 90)));
2400 //**************************************************** FL UP:
2401 // (last Al layer will be a special triangular shape)
2402 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2403 fgkHybFLUpperWidth/2, flUpThick/2,
2404 fgkHybFLUpperLength/2);
2405 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2406 sFLupPolyhamide, polyhamideSDD);
2407 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2408 TGeoTranslation *trFLupPolyhamide =
2409 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2410 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2412 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2414 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2415 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2416 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2417 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2418 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2419 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2420 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2421 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2422 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2423 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2426 vAluStrip->SetLineColor(fColorAl);
2427 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2428 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2430 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2431 +flUpThick+fgkHybAlThick/2;
2432 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2433 fgkHybridWidth/2,yRotAluStrip,
2434 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2435 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2436 AddTranslationToCombiTrans(aluStripTr2,0,0,
2437 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2438 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2439 AddTranslationToCombiTrans(aluStripTr3,0,0,
2440 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2441 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2442 AddTranslationToCombiTrans(aluStripTr4,0,0,
2443 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2445 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2446 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2447 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2448 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2449 //**************************************************** SMD:
2450 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2451 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2452 fgkHybSMDheight/2,fgkHybSMDendW/2);
2453 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2455 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2456 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2457 fgkHybSMDmiddleW/2);
2458 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2459 hybSMDmiddle,medSMD);
2460 vHybSMDmiddle->SetLineColor(fColorSMD);
2461 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2462 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2463 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2464 hybSMDend,medSMDweld);
2465 vHybSMDend->SetLineColor(fColorSMDweld);
2466 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2467 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2468 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2469 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2470 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2471 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2472 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2473 for (Int_t i=0; i<fgkNHybSMD; i++) {
2474 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2475 -fgkHybridWidth/2+fgkHybSMDposX[i],
2476 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2477 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2478 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2484 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2485 hybrid->SetVisibility(kFALSE);
2489 //________________________________________________________________________
2490 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2492 // Return a TGeoVolume* containing a segment of a ladder.
2495 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2496 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2497 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2498 TGeoMedium *alSDD = GetMedium("AL$");
2500 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2501 Double_t segmentLength = fgkSegmentLength;
2502 Double_t spaceBetweenCables = 500*fgkmicron;
2504 //*****************************************
2505 // Set parameters according to (iLay,iSeg):
2506 //*****************************************
2507 Int_t nDetectors = fgkLay3Ndet;
2508 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2509 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2510 (fgkSegmentLength*fgkLay3Ndet/2. -
2511 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2512 // sensorCenterZPos = z in segment local coord syst.
2514 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2515 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2518 } else if (iLay==4) {
2519 nDetectors = fgkLay4Ndet;
2520 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2521 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2522 (fgkSegmentLength*fgkLay4Ndet/2. -
2523 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2524 digitCableA = fDigitCableLay4A;
2525 digitCableB = fDigitCableLay4B;
2527 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2530 Double_t cableSideSign = -1;
2531 if (iSeg<nDetectors/2) cableSideSign = 1;
2532 Double_t spaceForCables = spaceBetweenCables*
2533 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2535 // gives [0-1-2-2-1-0]*spaceBetweenCables
2536 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2537 Int_t iUpdateCableMin;
2538 Int_t iUpdateCableMax;
2539 if (cableSideSign==-1) {
2540 iUpdateCableMin = nDetectors/2;
2541 iUpdateCableMax = iSeg-1;
2543 iUpdateCableMin = iSeg+1;
2544 iUpdateCableMax = nDetectors/2-1;
2548 cout << "Segment ("<< iLay <<',' << iSeg
2549 << ") : sensor z shift in local segment coord.="
2550 << sensorCenterZPos << endl;
2553 //****************************
2554 // The segment volume
2555 //****************************
2557 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2558 // likely slows down the transport of particles through the geometry
2560 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2562 // TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2563 // fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2564 // fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2565 // segmentLength/2);
2566 // A shaped Xtru instead of a simple BBox to avoid overlaps and extrusions
2567 TGeoXtru *segBox = new TGeoXtru(2);
2568 segBox->SetName("ITSsddSegBox");
2570 Double_t xseg[8],yseg[8];
2571 xseg[0] = -(fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW);
2572 yseg[0] = fgkLadderHeight/2+fgkLadderSegBoxDH/2;
2579 xseg[4] = 0.35*xseg[3];
2582 yseg[5] = yseg[4] + fgkLadderSegBoxDHCorr;
2588 segBox->DefinePolygon(8, xseg, yseg);
2589 segBox->DefineSection(0,-segmentLength/2);
2590 segBox->DefineSection(1, segmentLength/2);
2592 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2594 virtualSeg->SetVisibility(kFALSE);
2596 //******************************
2597 // Carbon fiber structure :
2598 //******************************
2600 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2601 Int_t volumeIndex = 1;
2602 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2603 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2607 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2608 fLaddSegCommonTr[i]);
2611 //**********************************
2612 // Pine support of the sensors :
2613 //**********************************
2614 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2615 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2617 // The use of the following constructor type allow to use rotPS1 and rotPS2
2618 // (and not copy them) therefore we gain some memory
2619 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2620 - fgkLadderHeight/2.-tDY
2621 + fgkPinSuppHeight/2.,
2622 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2624 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2625 - fgkLadderHeight/2.-tDY
2626 + fgkPinSuppHeight/2.,
2627 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2628 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2630 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2631 - fgkLadderHeight/2.-tDY
2632 + fgkPinSuppHeight/2.,
2633 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2634 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2636 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2637 - fgkLadderHeight/2.-tDY
2638 + fgkPinSuppHeight/2.,
2639 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2640 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2642 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2643 - fgkLadderHeight/2. - tDY
2644 + fgkPinSuppHeight/2.,
2645 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2647 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2648 - fgkLadderHeight/2. - tDY
2649 + fgkPinSuppHeight/2.,
2650 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2651 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2653 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2654 - fgkLadderHeight/2. - tDY
2655 + fgkPinSuppHeight/2.,
2656 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2657 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2659 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2660 - fgkLadderHeight/2. - tDY
2661 + fgkPinSuppHeight/2.,
2662 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2663 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2665 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2666 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2667 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2668 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2669 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2670 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2671 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2672 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2674 TGeoMedium *pinMed = GetMedium("RYTON$");
2675 Double_t fgkPinHeight = 4.5*fgkmm;
2676 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2678 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2680 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2681 - fgkLadderHeight/2.-tDY
2683 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2684 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2685 virtualSeg->AddNode(pineV, 1, transPS2b);
2687 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2688 - fgkLadderHeight/2. - tDY
2690 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2691 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2692 virtualSeg->AddNode(pineV, 2, transPS6b);
2695 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2696 - fgkLadderHeight/2.-tDY
2698 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2699 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2700 virtualSeg->AddNode(pineV, 3, transPS4b);
2702 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2703 - fgkLadderHeight/2. - tDY
2705 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2706 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2707 virtualSeg->AddNode(pineV, 4, transPS8b);
2710 //******************************
2711 // Cooling pipe supports :
2712 //******************************
2713 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2714 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2715 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2716 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2718 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2719 (triangleHeight+triangleCPaxeDist/
2720 TMath::Sin(halfTheta)-coolPipeSuppH);
2721 if (fAddCoolingSyst) {
2722 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2723 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2724 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2725 -fgkLadderHeight/2. - tDY
2726 +coolPipeSuppH+fgkLadderBeamRadius,
2727 -segmentLength/2., rotCPS1);
2729 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2730 -fgkLadderHeight/2. - tDY
2731 +coolPipeSuppH+fgkLadderBeamRadius,
2732 -segmentLength/2., rotCPS1);
2733 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2735 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2736 -fgkLadderHeight/2.- tDY
2737 +coolPipeSuppH+fgkLadderBeamRadius,
2738 segmentLength/2., rotCPS2);
2740 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2741 -fgkLadderHeight/2.- tDY
2742 +coolPipeSuppH+fgkLadderBeamRadius,
2743 segmentLength/2., rotCPS2);
2744 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2746 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2747 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2748 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2749 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2752 //************************
2754 //************************
2755 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2756 -fgkLadderHeight/2. - tDY +
2757 fgkLadderBeamRadius+coolPipeSuppH, 0);
2758 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2759 -fgkLadderHeight/2.- tDY +
2760 fgkLadderBeamRadius+coolPipeSuppH, 0);
2762 if (fAddCoolingSyst) {
2763 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2764 fgkCoolPipeOuterDiam/2,
2766 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2769 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2770 coolingPipeShape, phynoxSDD );
2771 coolingPipe->SetLineColor(fColorPhynox);
2772 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2776 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2777 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2779 virtualSeg->AddNode(cooler, 1, pipeTr1);
2780 virtualSeg->AddNode(cooler, 2, pipeTr2);
2784 //**********************************
2785 // Bases of hybrid thermal bridges
2786 //**********************************
2787 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2788 // approx !!! not clear on 0752/14-A
2789 if (fAddCoolingSyst) {
2790 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2791 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2792 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2793 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2795 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2796 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2799 //*************************
2801 //*************************
2802 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2803 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2805 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2806 - shiftHyb*SinD(fgkHybridAngle) );
2807 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2808 + shiftHyb*CosD(fgkHybridAngle) );
2810 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2811 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2812 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2813 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2814 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2815 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2817 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2818 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2825 // Starting from this segment
2826 Double_t hybDz = ((TGeoXtru*)fHybrid->GetShape())->GetZ(1);
2827 Double_t hybDx = ((TGeoXtru*)fHybrid->GetShape())->GetX(1);
2828 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2829 - digitCableA->GetWidth()/2;
2830 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2831 - digitCableA->GetThickness()/2;
2833 Double_t digitCableX = ( coolPipeSuppL
2834 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2835 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2836 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2837 + fgkLadderBeamRadius+coolPipeSuppH
2838 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2839 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2842 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2843 digitCableY, cableSideSign*hybDz };
2844 Double_t digitCableCenterA1[3] = {
2845 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2846 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2847 cableSideSign*segmentLength/2 };
2849 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2850 digitCableY,cableSideSign*hybDz};
2851 Double_t digitCableCenterB1[3]={
2852 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2853 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2854 cableSideSign*segmentLength/2 };
2856 Double_t vZ[3] = {0,0,1};
2857 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2858 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2859 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2860 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2862 // Updating the other cables
2863 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2865 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2867 digitCableA[iCable].GetPoint( 1, coord);
2868 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2869 digitCableB[iCable].GetPoint( 1, coord);
2870 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2873 // Now the small Al foil on the same hybrid side
2874 Double_t xfoil[5],yfoil[5];
2876 xfoil[0] = -fgkHybridAlFoilWide/2;
2878 xfoil[1] = fgkHybridAlFoilWide/2;
2879 yfoil[1] = yfoil[0];
2880 xfoil[2] = xfoil[1];
2881 yfoil[2] = -hybDx + (fgkHybridAlFoilWide - fgkHybridAlFoilSide);
2882 xfoil[3] = xfoil[0] + fgkHybridAlFoilSide;
2884 xfoil[4] = xfoil[0];
2885 yfoil[4] = yfoil[3];
2887 TGeoXtru* alFoilSh = new TGeoXtru(2);
2888 alFoilSh->DefinePolygon(5, xfoil, yfoil);
2889 alFoilSh->DefineSection(0,-fgkHybridAlFoilThick/2);
2890 alFoilSh->DefineSection(1, fgkHybridAlFoilThick/2);
2892 TGeoVolume* alFoilVol = new TGeoVolume("ITSsddAlFoilHybSide", alFoilSh, alSDD);
2893 alFoilVol->SetLineColor(fColorAl);
2895 Double_t zFoilTrans = cableSideSign*(hybDz + alFoilSh->GetX(1));
2896 TGeoRotation rotFoil3;
2897 TGeoRotation rotFoil4;
2898 if (cableSideSign > 0) {
2899 rotFoil3 = TGeoRotation("", 90-fgkHybridAngle, -90, -90);
2900 rotFoil4 = TGeoRotation("",-90+fgkHybridAngle, 90, 90);
2902 rotFoil3 = TGeoRotation("", 90-fgkHybridAngle, 90, -90);
2903 rotFoil4 = TGeoRotation("",-90+fgkHybridAngle, -90, 90);
2905 TGeoCombiTrans *foiTr1 = new TGeoCombiTrans(*pipeTr2, rotFoil3);
2906 TGeoCombiTrans *foiTr2 = new TGeoCombiTrans(*pipeTr1, rotFoil4);
2907 AddTranslationToCombiTrans( foiTr1, -hybrVolX, hybrVolY, zFoilTrans);
2908 AddTranslationToCombiTrans( foiTr2, hybrVolX, hybrVolY, zFoilTrans);
2910 virtualSeg->AddNode(alFoilVol, 1, foiTr1);
2911 virtualSeg->AddNode(alFoilVol, 2, foiTr2);
2914 //**********************************
2915 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2920 //________________________________________________________________________
2921 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2923 // Create a pine support and its pine
2924 // axis of rotation is the cone axis, center in its middle
2926 TGeoMedium *rytonSDD = GetMedium("RYTON$");
2928 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2929 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2930 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2931 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2932 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2933 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2934 fgkPinSuppHeight/2.+0.00001);
2935 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2937 if(GetDebug(3)){// Remove compiler warning.
2938 cone->InspectShape();
2939 tong->InspectShape();
2940 hole->InspectShape();
2943 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2944 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2945 tongTrans->RegisterYourself();
2946 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2947 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2948 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2950 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2952 pinSupport->SetLineColor(fColorRyton);
2958 //________________________________________________________________________
2959 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2961 // Create half of the cooling pipe support (ALR-0752/3)
2964 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2966 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2967 side1->SetName("ITSsddCPSside1");
2968 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2969 side1->SetVertex( 1, 0, fgkCoolPipeSuppWidthExt/2.);
2970 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2971 fgkCoolPipeSuppWidthExt/2.);
2972 side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX,
2973 -fgkCoolPipeSuppWidthExt/2.);
2974 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2975 side1->SetVertex( 5, 0, fgkCoolPipeSuppWidthExt/2.);
2976 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2977 fgkCoolPipeSuppWidthExt/2.);
2978 side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2.,
2979 -fgkCoolPipeSuppWidthExt/2.);
2981 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2982 - fgkCoolPipeSuppAxeDist
2983 + fgkCoolPipeSuppWidthExt/2., 0);
2984 side1Tr->RegisterYourself();
2985 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2986 - fgkCoolPipeSuppAxeDist
2987 + fgkCoolPipeSuppWidthExt*3/2.
2988 + fgkCoolPipeSuppWidthIn,0);
2989 side2Tr->RegisterYourself();
2991 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2992 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2993 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2994 TGeoTranslation *middleTr =
2995 new TGeoTranslation("ITSsddCPStr3",
2996 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2997 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2998 +fgkCoolPipeSuppWidthIn/2., 0);
2999 middleTr->RegisterYourself();
3001 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
3002 fgkCoolPipeSuppTongW/4.,
3003 (fgkCoolPipeSuppFulWidth
3004 - 2*fgkCoolPipeSuppWidthExt
3005 - fgkCoolPipeSuppWidthIn)/2,
3006 fgkCoolPipeSuppHeight/2.);
3008 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
3009 fgkCoolPipeSuppTongW/4.,
3010 - fgkCoolPipeSuppAxeDist
3011 + fgkCoolPipeSuppFulWidth
3012 - axeBox->GetDY(), 0);
3013 axeBoxTr->RegisterYourself();
3015 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
3016 fgkCoolPipeSuppTongW/4.);
3018 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
3019 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
3020 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
3021 axeTrans->RegisterYourself();
3022 //delete axeRot; // make the code crash, no idea of why !!!
3025 middle->InspectShape();
3026 axe->InspectShape();
3029 TGeoMedium *rytonSDD = GetMedium("RYTON$");
3031 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
3032 "ITSsddCoolPipeSuppShapeL",
3033 "ITSsddCPSmiddle:ITSsddCPStr3"
3034 "+ITSsddCPSside1:ITSsddCPStr1"
3035 "+ITSsddCPSside1:ITSsddCPStr2"
3036 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
3037 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
3038 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
3039 coolPipeSuppShape, rytonSDD);
3041 coolPipeSupp->SetLineColor(fColorRyton);
3043 return coolPipeSupp;
3047 //________________________________________________________________________
3048 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
3050 //Create half of the cooling pipe support (ALR-0752/3)
3053 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
3055 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
3056 side1->SetName("ITSsddCPSside1R");
3057 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
3058 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
3059 -fgkCoolPipeSuppWidthExt/2.);
3060 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
3061 fgkCoolPipeSuppWidthExt/2.);
3062 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
3063 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
3064 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
3065 -fgkCoolPipeSuppWidthExt/2.);
3066 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
3067 fgkCoolPipeSuppWidthExt/2.);
3068 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
3070 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
3071 - fgkCoolPipeSuppAxeDist
3072 + fgkCoolPipeSuppWidthExt/2., 0);
3073 side1Tr->RegisterYourself();
3074 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
3075 - fgkCoolPipeSuppAxeDist
3076 + fgkCoolPipeSuppWidthExt*3/2.
3077 + fgkCoolPipeSuppWidthIn, 0);
3078 side2Tr->RegisterYourself();
3080 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
3081 (fgkCoolPipeSuppMaxLength/2.
3082 - fgkCoolPipeSuppSlitL)/2.,
3083 fgkCoolPipeSuppWidthIn/2.,
3084 fgkCoolPipeSuppHeight/2.);
3085 TGeoTranslation *middleTr =
3086 new TGeoTranslation("ITSsddCPStr3R",
3087 -( fgkCoolPipeSuppMaxLength/2.
3088 -fgkCoolPipeSuppSlitL)/2.,
3089 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
3090 + fgkCoolPipeSuppWidthIn/2.,0);
3091 middleTr->RegisterYourself();
3093 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
3094 fgkCoolPipeSuppTongW/4.,
3095 (fgkCoolPipeSuppFulWidth
3096 - 2*fgkCoolPipeSuppWidthExt
3097 - fgkCoolPipeSuppWidthIn)/2,
3098 fgkCoolPipeSuppHeight/2.);
3100 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
3101 - fgkCoolPipeSuppTongW/4.,
3102 - fgkCoolPipeSuppAxeDist
3103 + fgkCoolPipeSuppFulWidth
3104 - axeBox->GetDY(),0);
3105 axeBoxTr->RegisterYourself();
3107 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
3108 fgkCoolPipeSuppTongW/4.);
3110 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
3111 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
3112 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
3113 axeTrans->RegisterYourself();
3117 middle->InspectShape();
3118 axe->InspectShape();
3121 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
3122 "ITSsddCoolPipeSuppShapeR",
3123 "ITSsddCPSmiddleR:ITSsddCPStr3R"
3124 "+ITSsddCPSside1R:ITSsddCPStr1R"
3125 "+ITSsddCPSside1R:ITSsddCPStr2R"
3126 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
3127 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
3129 TGeoMedium *rytonSDD = GetMedium("RYTON$");
3130 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
3131 coolPipeSuppShape, rytonSDD);
3132 coolPipeSupp->SetLineColor(fColorRyton);
3134 return coolPipeSupp;
3137 //________________________________________________________________________
3138 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
3140 // based on ALR 0752/8
3143 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
3145 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
3146 - (fgkRadiusAminBTB+fgkBTBthick);
3147 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
3148 fgkBTBthick/2., fgkBTBlength/2.);
3149 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
3150 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
3151 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
3152 base1Tr->RegisterYourself();
3154 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
3156 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
3157 fgkBTBthick/2., fgkBTBlength/2.);
3158 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
3159 fgkBTBaxisAtoBottom - base2width/2.,
3160 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
3161 base2Tr->RegisterYourself();
3163 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
3164 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
3165 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
3166 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
3167 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
3168 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
3169 sideTr1->RegisterYourself();
3170 sideTr2->RegisterYourself();
3172 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
3173 fgkBTBthick/2., fgkBTBHoleLength/2.);
3174 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
3175 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3176 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3177 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
3178 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
3179 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3180 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3181 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
3182 holeTr1->RegisterYourself();
3183 holeTr2->RegisterYourself();
3185 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
3186 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3187 fgkRadiusAminBTB, radiusAmaxBTB,
3188 fgkBTBlength/2., 0., 180.);
3189 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3190 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3191 fgkBTBlength/2., 270., 360.);
3192 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3193 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3195 roundTr1->RegisterYourself();
3197 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3198 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3199 fgkBTBlength/2., 180., 270.);
3200 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3201 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3203 roundTr2->RegisterYourself();
3205 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3206 "ITSsddBaseThermalBridgeShape",
3207 "ITSsddBTBbase1:ITSsddBTBtr1"
3208 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3209 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3210 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3211 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3212 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3213 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3214 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3215 "+ ITSsddBTBmainAxis");
3217 if(GetDebug(3)){// Remove compiler warning.
3218 base1->InspectShape();
3219 base2->InspectShape();
3220 side->InspectShape();
3221 hole->InspectShape();
3222 mainAxis->InspectShape();
3223 round1->InspectShape();
3224 round2->InspectShape();
3227 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3228 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3230 carbonFiberLadderStruct);
3232 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3233 return vBaseThermalBridge;
3237 //________________________________________________________________________
3238 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3240 // Return an assembly containing a end of a CF ladder.
3243 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3244 TGeoMedium *stesalite = GetMedium("G10FR4$");
3245 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3246 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3248 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3249 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3250 Double_t underSegDH = fLay3LadderUnderSegDH;
3251 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3252 // footDZ is also where to place the ruby's center in local Z
3253 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3256 } else if (iLay==4) {
3257 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3258 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3259 underSegDH = fLay4LadderUnderSegDH;
3260 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3261 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3263 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3267 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3268 + underSegDH/2); //space under ladder segment
3269 // here tDY is not the same as for the segment because the end ladder
3270 // does not have a space under it, inside the general ladder volume.
3271 Double_t segmentLength = fgkSegmentLength;
3272 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3274 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3276 //**********************************
3277 // coding real matter :
3278 //**********************************
3279 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3280 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3281 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3282 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3284 //--- The 3 V shape corners of the Carbon Fiber Ladder
3286 TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape",
3287 topCornerLength/2., halfTheta, -1,
3288 fgkLadderLa, fgkLadderHa, fgkLadderl);
3289 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1",
3290 cfLaddTop1,carbonFiberLadderStruct);
3291 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3292 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape",
3293 topCornerLength/2., halfTheta, 1,
3294 fgkLadderLa, fgkLadderHa, fgkLadderl);
3295 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3296 cfLaddTop2,carbonFiberLadderStruct);
3297 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3298 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3299 -(length-topCornerLength)/2.);
3300 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3301 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3304 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape",
3305 length/2., beta, -1,
3306 fgkLadderLb, fgkLadderHb, fgkLadderl);
3307 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3308 cfLaddSide1,carbonFiberLadderStruct);
3309 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3310 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape",
3312 fgkLadderLb, fgkLadderHb, fgkLadderl);
3313 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3314 cfLaddSide2,carbonFiberLadderStruct);
3315 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3316 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3317 TMath::Tan(beta) - fgkLadderBeamRadius );
3319 // because center of the triangle doesn't correspond to virtual vol. center
3320 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3321 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3322 alpha*TMath::RadToDeg());
3323 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3324 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3325 -alpha*TMath::RadToDeg());
3326 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3327 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3328 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3329 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3330 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3333 // Beams on the sides
3334 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3335 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3337 //Euler rotation : about Z, then new X, then new Z
3338 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3339 -beamPhiPrime*TMath::RadToDeg(), -90);
3340 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3341 beamPhiPrime*TMath::RadToDeg(), -90);
3342 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3343 beamPhiPrime*TMath::RadToDeg(), -90);
3344 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3345 -beamPhiPrime*TMath::RadToDeg(), -90);
3346 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3347 TMath::Tan(halfTheta),
3348 fgkLadderBeamRadius/2. + tDY,
3349 -length/2 + segmentLength/8, beamRot1);
3350 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3351 TMath::Tan(halfTheta),
3352 fgkLadderBeamRadius/2.+tDY,
3353 -length/2 + 3*segmentLength/8, beamRot2);
3354 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3355 TMath::Tan(halfTheta),
3356 fgkLadderBeamRadius/2.+tDY,
3357 -length/2 + segmentLength/8, beamRot3);
3358 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3359 TMath::Tan(halfTheta),
3360 fgkLadderBeamRadius/2. + tDY,
3361 -length/2+3*segmentLength/8, beamRot4);
3363 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3364 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3365 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3366 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3368 //--- Beams of the bottom
3369 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3371 /* Not there actually
3372 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3373 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3374 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3375 bottomBeam1, carbonFiberLadderStruct);
3376 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3378 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3379 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3380 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3381 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3383 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3384 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3385 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3386 bottomBeam2, carbonFiberLadderStruct);
3387 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3388 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3389 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3390 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3392 //**********************************
3393 //the cooling pipe supports
3394 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3395 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3397 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3398 (triangleHeight+triangleCPaxeDist/
3399 TMath::Sin(halfTheta)-coolPipeSuppH);
3401 if (fAddCoolingSyst) {
3402 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3403 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3404 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3405 -fgkLadderHeight/2.+ tDY +
3406 coolPipeSuppH+fgkLadderBeamRadius,
3407 -length/2., rotCPS1);
3408 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3409 -fgkLadderHeight/2.+ tDY +
3410 coolPipeSuppH+fgkLadderBeamRadius,
3411 -length/2., rotCPS2);
3413 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3414 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3417 //**********************************
3418 //--- The stesalite foot of the ladder
3420 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3421 - fgkLadFootY/2+fgkLadFingerPrintY;
3423 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3424 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3426 //=====================================
3429 if (fAddCoolingSyst) {
3431 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3432 -fgkLadderHeight/2.+ tDY +
3433 coolPipeSuppH + fgkLadderBeamRadius,
3434 -length/2.+coolPipeEndLen/2.);
3435 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3436 -fgkLadderHeight/2. + tDY +
3437 fgkLadderBeamRadius + coolPipeSuppH,
3438 -length/2.+coolPipeEndLen/2.);
3440 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3441 fgkCoolPipeOuterDiam/2,
3443 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3446 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3447 coolingPipeShape, phynoxSDD );
3448 coolingPipe->SetLineColor(fColorPhynox);
3449 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3452 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3453 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3455 virtualEnd->AddNode(cooler, 1, pipeTr1);
3456 virtualEnd->AddNode(cooler, 2, pipeTr2);
3460 //=====================================
3461 //--- HV cable guide
3464 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3465 fgkHVguideY1/2,fgkHVguideZ1/2);
3466 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3468 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3469 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3470 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3471 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3473 //=====================================
3475 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3476 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3477 -fgkLadderHeight/2.+ tDY +
3478 coolPipeSuppH+fgkLadderBeamRadius,
3479 -length/2.+coolPipeEndLen+raccordFullLen/2);
3480 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3481 -fgkLadderHeight/2.+ tDY +
3482 coolPipeSuppH+fgkLadderBeamRadius,
3483 -length/2.+coolPipeEndLen+raccordFullLen/2);
3485 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3486 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3488 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3493 //________________________________________________________________________
3494 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3496 //--- The stesalite foot of the ladder
3498 // The 2 screw holes on the left part
3499 // the small holes at each corner of the ruby cage (diam 2mm)
3500 // the really small level difference of 0.3mm on the bottom
3503 TGeoMedium *stesalite = GetMedium("G10FR4$");
3505 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3507 Double_t epsilon = 2e-10;
3508 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3510 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3511 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3512 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3513 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3515 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3516 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3517 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3520 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3521 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3523 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3524 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3525 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3527 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3528 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3529 rubyScrewHoleLen/2);
3531 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3532 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3533 fgkLadFootX/2-rubyScrewHoleLen/2,
3534 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3536 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3537 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3540 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3541 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3542 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3544 ladFootBox1Tr->RegisterYourself();
3545 ladFingerPrintTr->RegisterYourself();
3546 rubyCageHoleTr->RegisterYourself();
3547 rubyScrewHoleTr->RegisterYourself();
3548 rubyHoleTr->RegisterYourself();
3550 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3551 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3552 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3553 "+rubyHole:rubyHoleTr)");
3554 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3555 footRightPart,stesalite);
3556 vFootRightPart->SetLineColor(fColorStesalite);
3558 virtualFoot->AddNode(vFootRightPart, 1, 0);
3561 //--- This was the right part of the foot, now let's do the middle
3562 //--- and the right parts
3564 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3565 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3567 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3568 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3569 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3571 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3572 vFootMiddle->SetLineColor(fColorStesalite);
3573 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3576 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3577 (fgkLadFootY-fgkLadFingerPrintY)/2,
3579 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3580 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3581 -fgkLadFingerPrintY/2, 0);
3582 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3584 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3585 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3588 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3591 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3592 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3594 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3595 vFootLeft->SetLineColor(fColorStesalite);
3596 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3598 if(GetDebug(3)){ // Remove compiler warning.
3599 ladFingerPrint->InspectShape();
3600 ladFootBox1->InspectShape();
3601 rubyCageHole->InspectShape();
3602 rubyScrewHole->InspectShape();
3603 rubyHole->InspectShape();
3609 //________________________________________________________________________
3610 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3612 // return an assembly containing the CARLOS end-ladder board
3613 // and the heat bridge
3617 TGeoMedium *glassFiber = GetMedium("GLASS FIBER$");// glassFiber
3618 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3619 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3620 TGeoMedium *copper = GetMedium("COPPER$");
3621 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
3622 TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws
3624 //=========================================
3625 // cooling support of the Carlos card (HeatBridge):
3626 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3628 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3630 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3632 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3633 supCarlosBoard1, alCu12SDD);
3634 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3635 supCarlosBoard2, alCu12SDD);
3636 vSupCarlosBoard1->SetLineColor(4);
3637 vSupCarlosBoard2->SetLineColor(4);
3640 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3641 // shift of the main planes in the direction of their width
3642 // the center is fixed at the center of the 2 small fixing arms on each sides.
3645 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3646 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3647 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3648 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3650 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3651 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3654 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3658 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3659 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3661 //=========================================
3662 // fixing arm of the cooling support :
3663 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3665 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3666 supCarlosBoard3, alCu12SDD);
3667 vSupCarlosBoard3->SetLineColor(4);
3670 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3672 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3673 littleScrew, stainless);
3674 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3675 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3676 fgkLittleScrewHeadR-0.07, rotScrew);
3677 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3678 fgkLittleScrewHeadR+0.07, rotScrew);
3679 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3680 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3682 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3683 0, fgkCarlosSuppAngle, 0);
3684 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3685 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3686 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3687 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3688 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3689 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3692 //=========================================
3693 // screws fixing the board on the U tube
3694 Double_t aaa = fgkCarlosSuppY3; // ???
3695 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3696 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3697 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3698 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3699 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3700 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3702 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3704 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3705 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3706 screw1y,screw1z, CarlosSuppRot);
3708 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3709 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3710 screw1z,screw1y, CarlosSuppRot);
3712 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3713 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3714 screw1y,screw1z, CarlosSuppRot);
3716 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3717 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3718 screw1z,screw1y, CarlosSuppRot);
3720 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3721 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3722 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3723 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3725 //=========================================
3727 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3728 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3729 card1.SetNLayers(2);
3730 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3731 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3732 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3733 p1[0] = -fgkCarlosCardX1/2;
3734 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3735 p1[2] = fgkCarlosCardShift;
3736 p2[0] = fgkCarlosCardX1/2;
3737 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3738 p2[2] = fgkCarlosCardShift;
3739 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3740 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3741 card1.CreateAndInsertBoxCableSegment(1,90);
3743 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3744 card2.SetNLayers(2);
3745 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3746 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3747 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3749 p1[0] = -fgkCarlosCardX1/2;
3750 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3751 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3753 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3754 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3755 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3756 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3757 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3758 card2.CreateAndInsertBoxCableSegment(1,90);
3760 //=========================================
3761 // some chips on the board
3763 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3765 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3766 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3767 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3769 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3770 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3771 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3773 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3774 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3775 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3776 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3777 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3778 u1.CreateAndInsertBoxCableSegment(1,90);
3781 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3783 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3784 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3785 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3787 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3788 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3789 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3791 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3792 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3793 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3794 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3795 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3796 u2.CreateAndInsertBoxCableSegment(1,90);
3799 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3801 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3802 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3803 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3805 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3806 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3808 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3810 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3812 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3813 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3814 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3815 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3817 //--- U4 is like U3 (?)
3818 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3819 u4Trans->RotateX(90);
3820 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3821 fgkCarlosCardShift + fgkCarlosU4posZ);
3822 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3825 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3827 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3828 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3829 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3831 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3832 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3833 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3835 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3836 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3837 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3838 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3839 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3840 u17.CreateAndInsertBoxCableSegment(1,90);
3843 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3845 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3846 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3847 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3849 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3850 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3851 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3853 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3854 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3855 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3856 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3857 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3858 u35.CreateAndInsertBoxCableSegment(1,90);
3861 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3863 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3864 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3865 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3867 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3868 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3869 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3871 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3872 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3873 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3874 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3875 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3876 u36.CreateAndInsertBoxCableSegment(1,90);
3879 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3881 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3882 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3883 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3885 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3886 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3887 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3889 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3890 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3891 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3892 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3893 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3894 qz1.CreateAndInsertBoxCableSegment(1,90);
3896 return assemblySupCarlos;
3899 //________________________________________________________________________
3900 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3902 // Creates the assemblies containing the LV cards (left and right)
3905 TGeoMedium *glassFiber = GetMedium("GLASS FIBER$");// glassFiber
3906 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3907 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3908 TGeoMedium *copper = GetMedium("COPPER$");
3909 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
3910 TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws
3912 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3913 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3915 // we are going to use flat cable class to create multilayer box,
3916 // then we can use the pointers to created volumes to place them elsewhere
3917 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3919 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3920 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3921 cardLV.SetNLayers(2);
3922 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3923 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3924 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3926 p1[1] = fgkLVcardY/2;
3929 p2[1] = fgkLVcardY/2;
3931 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3932 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3933 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3934 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3935 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3936 fCardLVR->AddNode(boxVol, 1, trCard);
3938 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3939 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3940 chipO.SetNLayers(2);
3941 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3942 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3943 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3944 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3945 p1[1] = fgkLVChip0PosY;
3946 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3948 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3949 p2[1] = fgkLVChip0PosY;
3950 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3951 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3952 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3953 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3954 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3956 carLVfullThick/2+chip0fullThick/2, rotAdd);
3957 fCardLVR->AddNode(boxVol, 1, trCard);
3959 // put also this chip on the other side of the card
3960 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3962 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3963 fCardLVL->AddNode(boxVol, 2, trCard);
3964 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3966 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3967 fCardLVR->AddNode(boxVol, 2, trCard);
3969 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3970 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3971 chip1.SetNLayers(2);
3972 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3973 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3974 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3975 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3976 p1[1] = fgkLVChip1PosY;
3977 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3979 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3980 p2[1] = fgkLVChip1PosY;
3981 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3982 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3983 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3984 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3985 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3987 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3988 fCardLVR->AddNode(boxVol, 1, trCard);
3990 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3991 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3992 chip2.SetNLayers(2);
3993 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3994 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3995 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3996 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3997 p1[1] = fgkLVChip2PosY;
3998 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3999 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
4000 p2[1] = fgkLVChip2PosY;
4001 p2[2] = carLVfullThick/2 + chip2fullThick/2;
4002 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
4003 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
4004 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
4005 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
4007 carLVfullThick/2 + chip2fullThick/2, rotAdd);
4008 fCardLVR->AddNode(boxVol, 1, trCard);
4010 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
4011 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
4012 chip3.SetNLayers(2);
4013 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
4014 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
4015 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
4016 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
4017 p1[1] = fgkLVChip3PosY;
4018 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
4019 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
4020 p2[1] = fgkLVChip3PosY;
4021 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
4022 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
4023 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
4024 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
4025 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
4027 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
4028 fCardLVR->AddNode(boxVol, 1, trCard);
4030 // the Al pieces for heat exchange :
4031 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
4032 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
4034 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
4035 (fgkLVcoolX1/2+fgkLVcoolX2),
4036 fgkLVcoolPosY+fgkLVcoolY1/2,
4037 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
4038 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
4039 (fgkLVcoolX1/2+fgkLVcoolX2),
4040 fgkLVcoolPosY+fgkLVcoolY1/2,
4041 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
4043 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
4045 vAlLVcooling1->SetLineColor(2);
4048 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
4049 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
4050 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
4052 fgkLVcoolPosY+fgkLVcoolY1/2,
4053 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
4054 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
4056 fgkLVcoolPosY+fgkLVcoolY1/2,
4057 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
4059 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
4061 vAlLVcooling2->SetLineColor(2);
4064 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4066 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
4067 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
4068 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
4070 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
4072 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
4073 vAlLVcooling3->SetLineColor(2);
4075 //=== screw fixing th LV card to the U cooling tube :
4076 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
4078 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
4079 littleScrew, stainless);
4080 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
4082 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
4084 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
4086 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
4087 0, fgkLittleLVScrewHeadR,
4088 fgkLittleScrewHeadH/2);
4089 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
4090 littleScrewHead, stainless);
4091 vLittleScrewHead->SetLineColor(kGray);
4092 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
4093 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
4094 fgkShiftLittleScrewLV,
4096 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
4098 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
4099 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
4100 fgkShiftLittleScrewLV,
4102 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
4104 // adding the cooling pieces to the left card
4105 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
4106 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
4107 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
4108 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
4109 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
4111 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
4112 -(fgkLVcoolX1/2+fgkLVcoolX2),
4113 fgkLVcoolPosY+fgkLVcoolY1/2,
4114 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
4115 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
4116 -(fgkLVcoolX1/2+fgkLVcoolX2),
4117 fgkLVcoolPosY+fgkLVcoolY1/2,
4118 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
4119 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
4121 fgkLVcoolPosY+fgkLVcoolY1/2,
4122 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
4123 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
4125 fgkLVcoolPosY+fgkLVcoolY1/2,
4126 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
4128 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
4130 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
4132 // and to the right card
4133 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
4134 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
4135 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
4136 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
4137 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
4142 //________________________________________________________________________
4143 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
4145 // return an assembly containing the HV card
4149 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
4150 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // check if different
4151 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // check if different
4152 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
4153 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
4154 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
4156 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
4158 //====================================
4159 //--- the card itself
4160 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
4161 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
4162 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
4163 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
4165 highVCard->AddNode(vCeramicCard, 1, 0);
4168 //====================================
4172 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
4173 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
4174 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
4177 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
4178 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
4179 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
4181 vCapa1End->SetLineColor(18);// grey silver
4182 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
4183 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4184 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
4185 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4187 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
4188 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
4189 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4191 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
4192 capa1->AddNode(vCapa1Middle, 1,0);
4193 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4194 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4196 highVCard->AddNode(capa1, 1, capa1PosTr);
4199 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4200 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4201 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4204 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4205 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4206 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4208 vCapa2End->SetLineColor(18);// grey silver
4209 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4210 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4211 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4212 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4214 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4215 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4216 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4218 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4219 capa2->AddNode(vCapa2Middle, 1,0);
4220 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4221 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4223 highVCard->AddNode(capa2, 1, capa2PosTr);
4226 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4227 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4228 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4231 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4232 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4233 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4235 vCapa3End->SetLineColor(18);// grey silver
4237 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4238 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4239 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4240 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4242 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4243 capa3->AddNode(vCapa3Middle, 1,0);
4244 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4245 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4247 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4248 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4249 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4251 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4252 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4253 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4255 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4256 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4257 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4259 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4260 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4261 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4263 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4264 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4265 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4267 highVCard->AddNode(capa3, 1, capa3PosTr1);
4268 highVCard->AddNode(capa3, 2, capa3PosTr2);
4269 highVCard->AddNode(capa3, 3, capa3PosTr3);
4270 highVCard->AddNode(capa3, 4, capa3PosTr4);
4271 highVCard->AddNode(capa3, 5, capa3PosTr5);
4273 //====================================
4274 //--- connexions to LV card
4276 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4277 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4278 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4279 Double_t fgkConnexLVHVx = 3*fgkmm;
4280 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4281 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4283 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4284 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4285 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4286 fgkConnexLVHVdiam1/2,
4287 fgkConnexLVHVdiam2/2,
4288 fgkConnexLVHVlen/2);
4289 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4290 connexLVHVmetal, stainless);
4291 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4292 connexLVHVplastic, plastic);
4293 vConnexLVHVmetal->SetLineColor(10);// white
4294 vConnexLVHVplast->SetLineColor(12); // dark grey
4296 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4297 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4298 connexion->AddNode(vConnexLVHVplast, 1, 0);
4300 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4301 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4302 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4303 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4305 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4306 fgkConnexLVHVy1+fgkConnexLVHVdy,
4307 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4308 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4309 fgkConnexLVHVy1+fgkConnexLVHVdy,
4310 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4312 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4313 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4314 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4315 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4316 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4317 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4319 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4320 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4321 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4322 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4323 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4324 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4326 highVCard->AddNode(connexion, 1, trConnexion1);
4327 highVCard->AddNode(connexion, 2, trConnexion2);
4328 highVCard->AddNode(connexion, 3, trConnexion3);
4329 highVCard->AddNode(connexion, 4, trConnexion4);
4330 highVCard->AddNode(connexion, 5, trConnexion5);
4331 highVCard->AddNode(connexion, 6, trConnexion6);
4332 highVCard->AddNode(connexion, 7, trConnexion7);
4333 highVCard->AddNode(connexion, 8, trConnexion8);
4335 //====================================
4336 //--- cooling pieces
4338 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4339 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4342 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4343 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4345 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4346 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4348 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4350 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4352 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4354 // This last volume contains the screw used for fixing
4355 // the card to the cooling tube ...
4356 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4358 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4359 littleScrewHV, stainless);
4361 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4362 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4364 vCardHVcool1->SetLineColor(2); //red
4365 vCardHVcool2->SetLineColor(2); //red
4366 vCardHVcool3->SetLineColor(2); //red
4368 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4369 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4370 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4371 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4372 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4373 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4374 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4375 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4377 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4378 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4380 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4381 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4382 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4383 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4385 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4386 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4387 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4388 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4390 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4391 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4393 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4394 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4395 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4396 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4398 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4399 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4400 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4401 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4403 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4404 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4406 //====================================
4408 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4409 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4410 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4411 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4413 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4414 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4415 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4416 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4419 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4420 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4426 //________________________________________________________________________
4427 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4429 // return an assembly containing the LV, HV and Carlos cards of one ladder
4430 // and their cooling system
4433 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
4434 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4435 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4437 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4439 //=*********************************
4440 //--- The rounded pipe for the end ladder card coooling
4442 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4443 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4447 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4448 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4452 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4453 endLadderPipe.SetNLayers(2);
4454 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4455 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4457 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4458 // of the U colling pipe in its center
4460 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4461 Double_t vectA[3] = {0,0,1};
4463 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4464 Double_t vectB[3] = {0,0,1};
4466 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4467 Double_t vectC[3] = {1,0,0};
4469 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4470 Double_t vectD[3] = {-1,0,0};
4472 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4473 Double_t vectE[3] = {0,0,-1};
4475 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4476 Double_t vectF[3] = {0,0,-1};
4478 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4479 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4480 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4481 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4482 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4483 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4485 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4486 //endLadderPipe.CreateAndInsertCableSegment( 1);
4487 endLadderPipe.CreateAndInsertTubeSegment( 1);
4488 //endLadderPipe.CreateAndInsertCableSegment( 2);
4489 endLadderPipe.CreateAndInsertTorusSegment( 2);
4490 //endLadderPipe.CreateAndInsertCableSegment( 3);
4491 endLadderPipe.CreateAndInsertTubeSegment( 3);
4492 //endLadderPipe.CreateAndInsertCableSegment( 4);
4493 endLadderPipe.CreateAndInsertTorusSegment( 4);
4494 //endLadderPipe.CreateAndInsertCableSegment( 5);
4495 endLadderPipe.CreateAndInsertTubeSegment( 5);
4497 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4498 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4499 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4500 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4502 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4503 - fgkEndLadPipeArmBoxDX,
4504 fgkEndLadPipeArmBoxDY,0);
4505 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4506 fgkEndLadPipeArmBoxDX,
4507 fgkEndLadPipeArmBoxDY,0);
4508 endLadPipeArmBoxDY1->RegisterYourself();
4509 endLadPipeArmBoxDY2->RegisterYourself();
4511 if(GetDebug(3)) { // Remove compiler warning.
4512 endLadPipeArmBox->InspectShape();
4513 endLadPipeArmTube->InspectShape();
4516 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4517 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4518 "- endLadPipeArmTube");
4519 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4520 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4521 "- endLadPipeArmTube");
4523 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4524 endLadPipeArm1, alCu12SDD);
4525 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4526 endLadPipeArm2, alCu12SDD);
4527 vEndLadPipeArm1->SetLineColor(2);
4528 vEndLadPipeArm2->SetLineColor(2);
4530 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4531 +fgkEndLadPipeArmZpos);
4533 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4534 -fgkEndLadPipeUwidth/2,0,armZ);
4535 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4536 fgkEndLadPipeUwidth/2,0,armZ);
4538 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4539 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4541 //=*********************************
4543 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4544 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4546 Double_t spaceBetweenCards = 0.2*fgkmm;
4548 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4549 +fgkEndLadPipeArmBoxDX);
4550 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4551 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4553 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4556 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4557 +coolUzPos+1.25*fgkmm;
4558 // Position in z of the first LVB with respect to the start of the cooling
4559 // rectangular arm, coming (from inside of the ladder)
4560 // The cards are added one after the other
4562 for (Int_t iCard=0; iCard<nCards; iCard++) {
4564 Double_t cardLVzShift = firstLVCardZ +
4565 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4567 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4568 cardLVyShift, cardLVzShift);
4569 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4570 cardLVyShift, cardLVzShift);
4572 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4573 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4576 //=*********************************
4578 TGeoVolumeAssembly *cardHV = fCardHV;
4580 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4581 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4583 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4584 -(fgkHVCardCeramZ)/2);
4586 for (Int_t iCard=0; iCard<nCards; iCard++) {
4588 Double_t fact = iCard*2.+1.;
4589 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4590 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4591 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4592 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4595 //=*********************************
4598 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4599 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4600 // 0, -fgkCarlosSuppAngle, 0);
4602 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4603 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4604 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4605 // position in z of the first Carlos board, coming from inside of the ladder
4607 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4608 fgkEndLadPipeArmBoxDY);
4610 for (Int_t iCard=0; iCard<nCards; iCard++) {
4612 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4613 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4614 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4615 (TGeoRotation*) fCommonTr[0]);
4617 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4620 return endLadderCards;
4624 //________________________________________________________________________
4625 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4627 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4628 // and their cooling system
4629 // This is the code actually used for the end ladder cards
4632 TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
4633 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4634 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4635 TGeoMedium *copper = GetMedium("COPPER$");
4636 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4637 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4638 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
4639 TGeoMedium *polyurethane = GetMedium("POLYURETHANE$");
4641 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4642 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4644 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4645 Double_t deltaZcables = 0;
4646 // reference radius corresponding to local y=0
4649 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4650 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4652 rREF = fgkEndLaddCardsShortRadiusLay4;
4653 deltaZcables = 2.8*fgkmm;
4656 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4657 +fgkEndLadPipeArmBoxDX);
4658 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4659 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4661 Double_t rMin = rREF + cardLVyShift;
4662 // (The LV card is defining rMin because it is the lower object)
4664 Double_t thickTotCable = 0.5;
4666 //==================================
4667 //--- The Pcon container
4669 // minimum angle of the Pcon :
4670 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4671 (rREF-fgkEndLadPipeArmY/2) );
4672 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4673 Double_t phi0 = 90-dphi/2;
4674 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4675 // of the U colling pipe in its center
4676 Double_t zMax = endLadPipeUlength+coolUzPos;
4677 Double_t rMax = rMin + fgkLVcardY;
4678 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4679 Double_t cablesRadius = rMax-0.5;
4681 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4682 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4683 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4684 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4685 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4686 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4687 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4688 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4689 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4690 // the following is quite dirty but works for the moment ...
4691 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4692 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4694 // The next parameters define the shape of the Pcon at its end and where cables
4696 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4697 Double_t cableSectionR2 = rMax;
4698 Double_t cableSectionZ1 = zMax + 23.6*fgkmm + 3.0*fgkcm + deltaZcables;
4699 Double_t cableSectionZ2 = zMax + 23.6*fgkmm + 4.0*fgkcm + deltaZcables;
4700 // Those numbers are to be fixed to stick the maximum to the SDD cone
4701 // (hardcoded numbers are ugly, but it's easier to find where to stop)
4703 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4704 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4706 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4707 //endLadderCards->SetVisibility(kFALSE);
4709 //=*********************************
4710 //--- The rounded pipe for the end ladder card cooling
4712 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4713 endLadderPipe.SetNLayers(2);
4714 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4715 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4717 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4718 Double_t vectA[3] = {0,0,1};
4720 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4721 Double_t vectB[3] = {0,0,1};
4723 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4724 Double_t vectC[3] = {1,0,0};
4726 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4727 Double_t vectD[3] = {-1,0,0};
4729 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4730 Double_t vectE[3] = {0,0,-1};
4732 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4733 Double_t vectF[3] = {0,0,-1};
4735 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4736 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4737 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4738 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4739 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4740 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4742 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4743 //endLadderPipe.CreateAndInsertCableSegment( 1);
4744 endLadderPipe.CreateAndInsertTubeSegment( 1);
4745 //endLadderPipe.CreateAndInsertCableSegment( 2);
4746 endLadderPipe.CreateAndInsertTorusSegment( 2);
4747 //endLadderPipe.CreateAndInsertCableSegment( 3);
4748 endLadderPipe.CreateAndInsertTubeSegment( 3);
4749 //endLadderPipe.CreateAndInsertCableSegment( 4);
4750 endLadderPipe.CreateAndInsertTorusSegment( 4);
4751 //endLadderPipe.CreateAndInsertCableSegment( 5);
4752 endLadderPipe.CreateAndInsertTubeSegment( 5);
4754 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4755 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4756 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4757 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4759 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4760 - fgkEndLadPipeArmBoxDX,
4761 fgkEndLadPipeArmBoxDY,0);
4762 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4763 fgkEndLadPipeArmBoxDX,
4764 fgkEndLadPipeArmBoxDY,0);
4765 endLadPipeArmBoxDY1->RegisterYourself();
4766 endLadPipeArmBoxDY2->RegisterYourself();
4768 if(GetDebug(3)) { // Remove compiler warning.
4769 endLadPipeArmBox->InspectShape();
4770 endLadPipeArmTube->InspectShape();
4773 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4774 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4775 "- endLadPipeArmTube");
4776 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4777 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4778 "- endLadPipeArmTube");
4780 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4781 endLadPipeArm1, alCu12SDD);
4782 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4783 endLadPipeArm2, alCu12SDD);
4784 vEndLadPipeArm1->SetLineColor(2);
4785 vEndLadPipeArm2->SetLineColor(2);
4787 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4788 +fgkEndLadPipeArmZpos);
4790 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4791 -fgkEndLadPipeUwidth/2,rREF,armZ);
4792 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4793 fgkEndLadPipeUwidth/2,rREF,armZ);
4795 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4796 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4798 //=*********************************
4800 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4801 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4803 Double_t spaceBetweenCards = 0.2*fgkmm;
4806 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4809 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4810 +coolUzPos+1.25*fgkmm;
4811 // Position in z of the first LVB with respect to the start of the cooling
4812 // rectangular arm, coming (from inside of the ladder)
4813 // The cards are added one after the other
4815 for (Int_t iCard=0; iCard<nCards; iCard++) {
4817 Double_t cardLVzShift = firstLVCardZ +
4818 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4820 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4821 cardLVyShift+rREF, cardLVzShift);
4822 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4823 cardLVyShift+rREF, cardLVzShift);
4825 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4826 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4829 //=*********************************
4831 TGeoVolumeAssembly *cardHV = fCardHV;
4833 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4834 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4835 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4837 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4838 -(fgkHVCardCeramZ)/2);
4840 for (Int_t iCard=0; iCard<nCards; iCard++) {
4842 Double_t fact = iCard*2.+1.;
4843 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4844 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4845 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4846 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4849 //=*********************************
4852 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4853 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4854 // 0, -fgkCarlosSuppAngle, 0);
4856 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4857 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4858 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4859 // position in z of the first Carlos board, coming from inside of the ladder
4861 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4862 fgkEndLadPipeArmBoxDY);
4864 for (Int_t iCard=0; iCard<nCards; iCard++) {
4866 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4867 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4868 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4869 (TGeoRotation*) fCommonTr[0]);
4871 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4875 //=*********************************
4879 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4880 + fgkSectionGlassPerMod)*nCards
4881 + fgkSectionCoolPolyuEL + fgkSectionCoolWaterEL;
4882 // We fix thickness, then width is calculated accordingly
4883 Double_t width = sectionV/thickTotCable;
4884 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4885 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4886 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4887 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4888 Double_t thickGlass = thickTotCable*fgkSectionGlassPerMod
4889 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4891 Double_t thickCoolPolyu = thickTotCable*fgkSectionCoolPolyuEL
4892 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4893 Double_t thickCoolWater = thickTotCable*fgkSectionCoolWaterEL
4894 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4896 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4897 cable.SetNLayers(5);
4898 cable.SetLayer(0, thickCu, copper, kRed);
4899 cable.SetLayer(1, thickPlast, plastic, kYellow);
4900 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4901 cable.SetLayer(3, thickCoolPolyu, polyurethane, kGray);
4902 cable.SetLayer(4, thickCoolWater, coolerMediumSDD, kBlue);
4904 Double_t zVect[3]={0,0,1};
4905 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4906 +spaceBetweenCarlsoCards)/2 + 2.9;
4907 // the 2.9cm is for taking into account carlos card angle...
4909 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4910 cableSectionR2,cableSectionZ1,cableSectionZ2);
4912 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4913 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4914 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4915 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4916 cable.SetInitialNode(endLadderCards);
4917 cable.CreateAndInsertCableSegment(1);
4920 TGeoTorus *earthShape = new TGeoTorus(rMax-fgkEndLadderEarthCableR,
4921 0., fgkEndLadderEarthCableR,
4922 phi0, dphi); // same as containerShape
4924 TGeoVolume *earthCable = new TGeoVolume("SDDcableEndLadderEarthCable",
4925 earthShape, copper);
4927 endLadderCards->AddNode(earthCable, 1,
4928 new TGeoTranslation(0, 0, fgkDistEndLaddCardsLadd+1));
4930 return endLadderCards;
4933 //________________________________________________________________________
4934 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4936 // return an assembly of the support rings, attaching the ladders to the cone
4942 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4943 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4946 //**********************************
4949 Double_t fgkRubyCageX = 9*fgkmm;
4950 Double_t fgkRubyCageY = 5.5*fgkmm;
4951 Double_t fgkRubyCageZ = 8*fgkmm;
4952 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4953 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4954 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4955 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4956 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4958 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4961 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4963 // pieces common to both square and V cages
4964 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4965 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4967 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4968 fgkRubyCageHoleDX/2+epsilon);
4970 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4971 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4972 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4973 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4974 trScrewHole->RegisterYourself();
4976 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4977 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4978 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4979 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4980 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4981 trScrewHoleFoot->RegisterYourself();
4984 // pieces which differ
4985 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4987 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4988 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4990 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4991 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4992 trRubyCageVInternBox->RegisterYourself();
4994 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4995 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4996 fgkRubyCageInternSide/4);
4998 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4999 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
5000 +epsilon,0,0, rotV );
5001 trRubyCageVInternTriangl->RegisterYourself();
5004 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
5005 "rubyCageBox-(rubyCageInternBox"
5006 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
5008 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
5009 rubyCageSquare, stainless);
5010 vRubyCageSquare->SetLineColor(10);
5012 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
5013 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
5014 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
5015 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
5016 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
5017 vRubyCageV->SetLineColor(10);
5019 if(GetDebug(3)) { // Remove compiler warning.
5020 rubyCageBox->InspectShape();
5021 rubyCageInternBox->InspectShape();
5022 screwHole->InspectShape();
5023 screwHoleFoot->InspectShape();
5024 rubyCageVInternBox->InspectShape();
5025 rubyCageVInternTriangl->InspectShape();
5028 supportRing->AddNode(vRubyCageSquare, 0, 0);
5029 //supportRing->AddNode(vRubyCageV, 0, 0);
5035 //________________________________________________________________________
5036 void AliITSv11GeometrySDD::CreateSDDsensor() {
5038 // return a box containing the SDD sensor
5041 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5042 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
5043 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
5044 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
5045 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
5046 TGeoMedium *glassSDD = GetMedium("STDGLASS$"); // StdGlass
5049 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
5050 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
5051 // width : in the beam direction !
5053 Double_t sensoxBoxLength = ( fgkWaferLength +
5054 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
5055 // Makes life easier to include the space for the WA HV cable on both sides
5056 Double_t sensoxBoxThick = fgkWaferThickness +
5057 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
5059 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
5060 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
5062 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
5063 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
5065 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
5066 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
5069 //****************************
5071 //****************************
5073 // we need 2 different sensor objects, because they have to have different names
5074 // This is required for the step manager
5076 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
5077 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
5080 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
5081 wafer3->SetLineColor(fColorSilicon);
5082 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
5083 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
5084 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
5085 sensVol3->SetLineColor(fColorSilicon+5);
5086 wafer3->AddNode(sensVol3, 1, 0);
5087 fSDDsensor3->AddNode(wafer3, 1, 0);
5089 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
5090 wafer4->SetLineColor(fColorSilicon);
5091 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
5092 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
5093 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
5094 sensVol4->SetLineColor(fColorSilicon+5);
5095 wafer4->AddNode(sensVol4, 1, 0);
5096 fSDDsensor4->AddNode(wafer4, 1, 0);
5099 //****************************
5101 //****************************
5102 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
5103 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
5104 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
5105 vGlass->SetLineColor(fColorGlass);
5106 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
5107 fgkWaferThickness/2+fgkSensorGlassLY/2,
5108 fgkGlassDZOnSensor);
5109 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
5110 fgkWaferThickness/2+fgkSensorGlassLY/2,
5111 fgkGlassDZOnSensor);
5112 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
5113 fgkWaferThickness/2+fgkSensorGlassLY/2,
5114 -fgkGlassDZOnSensor);
5115 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
5116 fgkWaferThickness/2+fgkSensorGlassLY/2,
5117 -fgkGlassDZOnSensor);
5118 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
5119 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
5120 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
5121 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
5123 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
5124 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
5125 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
5126 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
5128 //****************************
5129 // Wrap-around cable
5130 //****************************
5132 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
5133 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
5134 waHVCable.SetNLayers(2);
5135 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
5136 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
5137 waHVCable.SetInitialNode(fSDDsensor3);
5139 Double_t x1[3], x2[3], vX[3] = {1,0,0};
5140 x1[0] = -fgkWaHVcableLength/2;
5142 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
5144 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
5147 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5148 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5149 TGeoCombiTrans *ctSegment = 0;
5150 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
5151 fSDDsensor4->AddNode(segment, 1, ctSegment);
5155 waHVCable.SetName("ITSsddWaHVCableD");
5156 waHVCable.ResetPoints();
5157 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5158 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5159 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
5160 fSDDsensor4->AddNode(segment, 1, ctSegment);
5162 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
5164 waHVCableFold.SetPhi(180,360);
5165 waHVCableFold.SetNLayers(2);
5166 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
5167 polyhamideSDD, fColorPolyhamide);
5168 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
5169 waHVCableFold.SetInitialNode(fSDDsensor3);
5172 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
5174 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5175 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5176 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
5177 fSDDsensor4->AddNode(segment, 1, ctSegment);
5180 //****************************
5182 //****************************
5183 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
5184 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
5185 /(2.*fgkTransitHVHeadLZ);
5186 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
5187 headRadius-fgkTransitHVHeadLZ)
5190 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
5191 fgkTransitHVPolyThick/2,
5193 headPoly->SetName("headPoly");
5194 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
5195 -fgkTransitHVPolyThick/2);
5196 headPolyTr->SetName("headPolyTr");
5197 headPolyTr->RegisterYourself();
5199 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
5200 fgkTransitHVAlThick/2,
5202 headAl->SetName("headAl");
5203 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
5204 -fgkTransitHVPolyThick
5205 -fgkTransitHVAlThick/2);
5206 headAlTr->SetName("headAlTr");
5207 headAlTr->RegisterYourself();
5209 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
5210 (headRadius-fgkTransitHVHeadLZ)/2,
5211 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
5212 cache->SetName("cache");
5214 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5215 (headRadius-fgkTransitHVHeadLZ)/2,
5216 -(fgkTransitHVPolyThick
5217 +fgkTransitHVAlThick)/2);
5218 headCacheTr->SetName("cacheTr");
5219 headCacheTr->RegisterYourself();
5221 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5222 "headPoly:headPolyTr-cache:cacheTr");
5223 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5224 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5225 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5226 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5227 "headAl:headAlTr-cache:cacheTr");
5228 TGeoVolume *vHeadAlComp = new TGeoVolume(
5229 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5230 vHeadAlComp->SetLineColor(fColorAl);
5233 // TGeoRotation rotHead("",0,90,0);
5234 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5235 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5237 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5238 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5239 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5242 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5243 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5244 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5245 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5248 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5249 fgkTransitHVBondingLZ,
5250 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5251 transitHVCable.SetNLayers(2);
5252 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5254 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5255 transitHVCable.SetInitialNode(fSDDsensor3);
5257 x1[0] = -fgkTransitHVHeadLX/2;
5259 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5263 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5264 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5265 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5266 fSDDsensor4->AddNode(segment, 1, ctSegment);
5268 transitHVCable.ResetPoints();
5269 transitHVCable.SetName("ITSsddHVtransitTail");
5270 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5271 x1[0] = fgkTransitHVtailXpos;
5272 x2[0] = fgkTransitHVtailXpos;
5273 x1[2] = -fgkTransitHVBondingLZ/2;
5274 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5275 Double_t vZ[3] = {0,0,1};
5276 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5277 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5278 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5279 fSDDsensor4->AddNode(segment, 1, ctSegment);
5282 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5283 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5284 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5285 fgkTransitHVsideLZ);
5286 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5287 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5288 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5289 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5290 fgkTransitHVsideLZ);
5291 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5292 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5294 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5295 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5296 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5297 fgkTransitHVsideLZ);
5298 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5299 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5300 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5301 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5302 fgkTransitHVsideLZ);
5303 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5304 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5306 // sideRight is not there actually
5307 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5308 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5309 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5310 // fgkTransitHVsideLZ);
5311 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5312 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5313 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5314 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5315 // fgkTransitHVsideLZ);
5316 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5317 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5319 // TGeoRotation rotSide("",0,-90,0);
5320 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5321 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5322 // -fgkTransitHVBondingLZ/2,&rotSide);
5323 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5324 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5325 // -fgkTransitHVBondingLZ/2, &rotSide);
5326 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5327 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5328 // -fgkTransitHVBondingLZ/2, &rotSide);
5329 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5330 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5331 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5332 // -fgkTransitHVBondingLZ/2,rotSide);
5333 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5334 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5335 -fgkTransitHVBondingLZ/2, rotSide);
5336 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5337 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5338 -fgkTransitHVBondingLZ/2, rotSide);
5340 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5341 sideLeft,polyhamideSDD);
5342 vSideLeft->SetLineColor(fColorPolyhamide);
5343 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5345 vSideLeftAl->SetLineColor(fColorAl);
5347 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5348 // sideRight,polyhamideSDD);
5349 // vSideRight->SetLineColor(fColorPolyhamide);
5351 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5352 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5353 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5355 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5356 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5357 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5360 //****************************
5362 fSDDsensor3->CheckOverlaps(0.01);
5363 fSDDsensor4->CheckOverlaps(0.01);
5366 fSDDsensor3->SetVisibility(kFALSE);
5367 fSDDsensor4->SetVisibility(kFALSE);
5371 //________________________________________________________________________
5372 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5374 // return a box volume containing the detectors
5377 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5379 Int_t nDetectors = fgkLay3Ndet;
5380 Double_t ladderLength = fgkLay3LadderLength;
5381 Double_t *sensorZPos = fLay3sensorZPos;
5385 nDetectors = fgkLay4Ndet;
5386 ladderLength = fgkLay4LadderLength;
5387 sensorZPos = fLay4sensorZPos;
5389 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5393 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5394 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5396 sprintf(name,"ITSsddDetBox%i",iLay);
5397 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5398 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5399 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5401 for (Int_t i=0; i<nDetectors; i++) {
5402 Double_t localZ = sensorZPos[i];
5403 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5404 if (iLay==3) if (i%2!=0) localY = -localY;
5405 if (iLay==4) if (i%2==0) localY = -localY;
5406 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5408 if (i >= nDetectors/2) {
5409 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5410 sensorPos->SetName(name);
5411 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5414 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5415 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5417 sensorPos->SetName(name);
5418 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5422 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5423 virtualDet->SetVisibility(kFALSE);
5428 //________________________________________________________________________
5429 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5431 // return a box volume containing the detectors
5434 Int_t nDetectors = fgkLay3Ndet;
5435 Double_t ladderLength = fgkLay3LadderLength;
5436 Double_t *sensorZPos = fLay3sensorZPos;
5437 TGeoVolume *sensorSDD = fSDDsensor3;
5441 nDetectors = fgkLay4Ndet;
5442 ladderLength = fgkLay4LadderLength;
5443 sensorZPos = fLay4sensorZPos;
5444 sensorSDD = fSDDsensor4;
5446 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5450 snprintf(name,30,"ITSsddDetBox%i",iLay);
5452 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5454 for (Int_t i=0; i<nDetectors; i++) {
5455 Double_t localZ = sensorZPos[i];
5456 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5457 if (iLay==3) if (i%2!=0) localY = -localY;
5458 if (iLay==4) if (i%2==0) localY = -localY;
5459 snprintf(name, 30, "ITSsddLay%iSensorPos%i",iLay, i);
5461 if (i >= nDetectors/2) {
5462 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5463 sensorPos->SetName(name);
5464 virtualDet->AddNode(sensorSDD, i, sensorPos);
5467 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5468 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5470 sensorPos->SetName(name);
5471 virtualDet->AddNode(sensorSDD, i, sensorPos);
5475 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5480 //________________________________________________________________________
5481 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssemblyLadd2() {
5483 // return a box volume containing the detectors
5484 // Special case for Layer 3 Ladder 2 which is rotated (cannot simply
5485 // rotate the standard volume, because the module numbering would be wrong)
5486 // M.Sitta 25 Nov 2009
5489 Int_t nDetectors = fgkLay3Ndet;
5490 Double_t *sensorZPos = fLay3sensorZPos;
5491 TGeoVolume *sensorSDD = fSDDsensor3;
5494 snprintf(name,30,"ITSsddDetBoxLadd2");
5496 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5498 for (Int_t i=0; i<nDetectors; i++) {
5499 Double_t localZ = (-1.)*sensorZPos[nDetectors-1-i];
5500 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5501 if (i%2==0) localY = -localY;
5502 snprintf(name, 30, "ITSsddLayLadd2SensorPos%i", i);
5504 if (i >= nDetectors/2) {
5505 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5506 sensorPos->SetName(name);
5507 virtualDet->AddNode(sensorSDD, i, sensorPos);
5510 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5511 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5513 sensorPos->SetName(name);
5514 virtualDet->AddNode(sensorSDD, i, sensorPos);
5518 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5523 //________________________________________________________________________
5524 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5527 // export the geometry in a AliITSgeom object
5532 printf("error:Try to fill null (AliITSgeom *) object");
5536 printf("error:Try to set sensor geometry while geometry is not defined\n");
5540 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5541 fgkWaferLengthSens/2.};
5542 if(!(geom->IsShapeDefined(kSDD)))
5543 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5546 char ladderName[30];
5547 char sensorName[30];
5548 char senstivName[30];
5549 const Int_t kNLay = 2;
5550 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5551 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5554 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5556 Int_t firstSDDmod = startMod;
5557 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5558 /////////////////////////////////////////
5559 snprintf(layerName, 30, "ITSsddLayer%i_1",iLay+3);
5560 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5562 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5563 TGeoVolume *layVolume = layNode->GetVolume();
5564 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5566 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5567 /////////////////////////////////////////
5568 snprintf(ladderName, 30, "ITSsddLadd_%i", iLadd);
5569 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5571 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5572 TGeoVolume *laddVolume = laddNode->GetVolume();
5573 TGeoHMatrix laddMatrix(layMatrix);
5574 laddMatrix.Multiply(laddNode->GetMatrix());
5576 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5577 /////////////////////////////////////////
5578 snprintf(sensorName, 30, "ITSsddSensor_%i",iDet);
5579 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5581 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5582 TGeoVolume *detVolume = detNode->GetVolume();
5583 TGeoHMatrix detMatrix(laddMatrix);
5584 detMatrix.Multiply(detNode->GetMatrix());
5586 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5588 TGeoVolume *wafVolume = wafNode->GetVolume();
5589 TGeoHMatrix wafMatrix(detMatrix);
5590 detMatrix.Multiply(wafNode->GetMatrix());
5591 //--------------------------------------------------------
5592 snprintf(senstivName, 30, "%s%s", fgSDDsensitiveVolName3,"_1");
5593 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5595 TGeoHMatrix sensMatrix(wafMatrix);
5596 sensMatrix.Multiply(sensitivNode->GetMatrix());
5598 // Sticking to the convention for local wafer coordinate
5600 if (iDet >= kNDet[iLay]/2) {
5601 // TGeoRotation rotY("",0,180,0);
5602 TGeoRotation rotY("",-180,-180,0);
5603 sensMatrix.Multiply(&rotY);
5605 // Creating the matrix in AliITSgeom for
5606 // this sensitive volume :
5607 Double_t *trans = sensMatrix.GetTranslation();
5608 Double_t *r = sensMatrix.GetRotationMatrix();
5609 Double_t rot[10] = {r[0],r[1],r[2],
5611 r[6],r[7],r[8], 1.0};
5612 //rot[9]!=0.0 => not a unity matrix
5613 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5615 // iLadd+1, iDet+1 because ladd. and det. start at +1
5620 printf("Error (ExportSensorGeometry) %s not found !\n",
5623 printf("Error (ExportSensorGeometry) %s not found !\n",
5626 printf("Error (ExportSensorGeometry) %s not found !\n",
5630 printf("Error (ExportSensorGeometry) %s not found !\n",
5634 printf("Error (ExportSensorGeometry) %s not found !\n",
5638 return (startMod-firstSDDmod);
5642 //________________________________________________________________________
5643 Int_t AliITSv11GeometrySDD::
5644 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5646 // Function which gives the layer, ladder and det.
5647 // index of the current volume. To be used in
5648 // AliITS::StepManager()
5651 if (gGeoManager->GetLevel()<3) return kFALSE;
5652 // Get the det index :
5653 TGeoNode *node = gGeoManager->GetMother(2);
5654 if (!node) return kFALSE;
5655 det = node->GetNumber()+1;
5657 // Get the ladder index :
5658 node = gGeoManager->GetMother(3);
5659 if (!node) return kFALSE;
5660 ladd = node->GetNumber()+1;
5662 // Get the layer index :
5663 if (node->GetNdaughters()==fgkLay3Ndet)
5664 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5671 //________________________________________________________________________
5672 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5673 Double_t r2max, Double_t z2,
5674 Double_t section, Int_t nDiv)
5676 // Creates a cone along z where the section is approximately constant
5677 // with z. This is for simulation of cables, because a cone with a constant
5678 // radius difference would show a quantity of matter increasing with z...
5679 // The max radius of the created Pcon is evolving linearly, the min radius
5680 // is calculated at several steps (nDiv).
5681 // z2 > z1 (required by the Pcon)
5683 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5685 Double_t dr = (r2max-r1max)/nDiv;
5686 Double_t dz = (z2-z1)/nDiv;
5687 Double_t r1minI, r2minI, r1maxI, r2maxI;
5690 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5691 Double_t cosAlpha = (z2-z1)/lZ;
5693 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5694 myPcon->DefineSection(0, z1, r1minI, r1max);
5696 for (Int_t i=0; i<nDiv; i++) {
5700 r1maxI = r1max + i*dr;
5701 r2maxI = r1maxI + dr;
5703 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5704 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5710 //________________________________________________________________________
5711 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5712 Double_t refZ1, Double_t refZ2) {
5713 // just a helping function
5714 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5717 //________________________________________________________________________
5718 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5719 Int_t nLay3, Int_t nLay4,
5720 Double_t r1, Double_t z1,
5721 Double_t r2, Double_t z2) {
5723 // Create some cables portions from SDD modules grouped
5724 // and attached at the border of the SSD cone
5726 TGeoMedium *copper = GetMedium("COPPER$");
5727 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5728 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5730 char titleCable[30];
5731 snprintf(titleCable,30,"cableSDDport%i",(Int_t)angle);
5734 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5735 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5736 Double_t width = section/thickness;
5737 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5738 +fgkSectionGlassPerMod);
5740 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5741 +fgkSectionGlassPerMod);
5743 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5744 +fgkSectionGlassPerMod);
5746 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5747 Double_t cosAlpha = (z2-z1)/hypothenus;
5748 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5749 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5750 angle *= TMath::DegToRad();
5751 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5752 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5753 Double_t pos1[3] = {x1,y1,z1};
5754 Double_t pos2[3] = {x2,y2,z2};
5755 Double_t zVect[3] = {0,0,1};
5757 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5758 cable.SetNLayers(3);
5759 cable.SetLayer(0, thickPlast, plastic, kYellow);
5760 cable.SetLayer(1, thickCu, copper, kRed);
5761 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5763 cable.AddCheckPoint( mother, 0, pos1, zVect );
5764 cable.AddCheckPoint( mother, 1, pos2, zVect );
5765 cable.SetInitialNode(mother);
5766 cable.CreateAndInsertCableSegment(1);
5773 //________________________________________________________________________
5774 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth)
5777 // Creates and inserts the SDD cables running on SDD and SSD cones
5780 // moth : the TGeoVolume owing the volume structure
5783 // Created: ??? Ludovic Gaudichet
5784 // Updated: 15 Mar 2008 Mario Sitta
5785 // Updated: 14 Apr 2008 Mario Sitta Overlap fixes
5786 // Updated: 09 May 2008 Mario Sitta SSD overlap fixes
5789 TGeoMedium *copper = GetMedium("COPPER$");
5790 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5791 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5792 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5795 //==================================
5797 //==================================
5799 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5800 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5802 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5803 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5804 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5806 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5807 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5808 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5810 // Do not use hardcoded numbers, get them from real shapes - M.S. 15/03/08
5811 TGeoVolume *sddCone = gGeoManager->GetVolume("SDDCarbonFiberCone");
5812 TGeoPcon *sddConeShape = (TGeoPcon*)sddCone->GetShape();
5814 TGeoVolume *sddCylinder = gGeoManager->GetVolume("SDDCarbonFiberCylinder");
5815 TGeoTube *sddCylinderShape = (TGeoTube*)sddCylinder->GetShape();
5817 // (were fgkConeSDDr1, fgkConeSDDr2, fgkConeSDDz1, fgkConeSDDz2 hardcoded)
5818 Double_t coneSDDr1 = sddConeShape->GetRmin(5);
5819 Double_t coneSDDr2 = sddConeShape->GetRmin(3);
5821 Double_t coneSDDz1 = sddConeShape->GetZ(9) - sddConeShape->GetZ(5) +
5822 sddCylinderShape->GetDz();
5823 Double_t coneSDDz2 = sddConeShape->GetZ(9) - sddConeShape->GetZ(3) +
5824 sddCylinderShape->GetDz();
5826 // Calculate z1, z2 thanks to R1 and R2
5827 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, coneSDDr1, coneSDDr2,
5828 coneSDDz1, coneSDDz2);
5829 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, coneSDDr1, coneSDDr2,
5830 coneSDDz1, coneSDDz2);
5831 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, coneSDDr1, coneSDDr2,
5832 coneSDDz1, coneSDDz2);
5834 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5836 //==================================
5837 // first set of cones : cables from layer 3
5838 //==================================
5840 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5841 fgkSDDCableR2, sddCableZ2,
5842 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5844 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5845 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0),
5846 pcon1all->GetRmax(0));
5848 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5849 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax,
5850 pcon1all->GetRmax(1));
5852 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container",
5853 pcon1container, airSDD);
5854 vpcon1container->SetVisibility(kFALSE);
5856 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5857 fgkSDDCableR2, sddCableZ2,
5858 sectionLay3Plastic, 3);
5860 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast",
5861 pcon1plast, plastic);
5862 vpcon1plast->SetLineColor(kYellow);
5863 vpcon1container->AddNode(vpcon1plast, 0);
5865 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5866 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5867 fgkSDDCableR2 - dr1a, sddCableZ2,
5870 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu",
5872 vpcon1Cu->SetLineColor(kRed);
5873 vpcon1container->AddNode(vpcon1Cu, 0);
5875 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5876 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5877 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5878 sectionLay3Glass, 3);
5880 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass",
5881 pcon1glass, opticalFiber);
5882 vpcon1glass->SetLineColor(kGreen);
5883 vpcon1container->AddNode(vpcon1glass, 0);
5885 moth->AddNode(vpcon1container, 1);
5886 moth->AddNode(vpcon1container, 2, rotCableSDD);
5888 //==================================
5889 // 2nd set of cones : cables from layer 3 and layer 4
5890 //==================================
5892 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5893 fgkSDDCableR3, sddCableZ3,
5894 sectionLay3Plastic+sectionLay4Plastic+
5895 sectionLay3Cu+sectionLay4Cu+
5896 sectionLay3Glass+sectionLay4Glass, 1);
5898 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5899 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0),
5900 pcon2all->GetRmax(0));
5902 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5903 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax,
5904 pcon2all->GetRmax(1));
5907 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container",
5908 pcon2container, airSDD);
5909 vpcon2container->SetVisibility(kFALSE);
5911 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5912 fgkSDDCableR3, sddCableZ3,
5914 sectionLay4Plastic, 3);
5916 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast",
5917 pcon2plast, plastic);
5918 vpcon2plast->SetLineColor(kYellow);
5919 vpcon2container->AddNode(vpcon2plast, 0);
5921 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5922 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5923 fgkSDDCableR3 - dr2a, sddCableZ3,
5924 sectionLay3Cu+sectionLay4Cu, 3);
5926 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu",
5928 vpcon2Cu->SetLineColor(kRed);
5929 vpcon2container->AddNode(vpcon2Cu, 0);
5931 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5932 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5933 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5935 sectionLay4Glass, 3);
5937 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass",
5938 pcon2glass, opticalFiber);
5939 vpcon2glass->SetLineColor(kGreen);
5940 vpcon2container->AddNode(vpcon2glass, 0);
5942 moth->AddNode(vpcon2container, 1);
5943 moth->AddNode(vpcon2container, 2, rotCableSDD);
5945 //==================================
5946 // intermediate cylinder
5947 //==================================
5949 // (was fgkSDDCableDZint hardcoded)
5950 Double_t sddCableDZint = (sddConeShape->GetZ(9) - sddConeShape->GetZ(0) +
5951 sddCylinderShape->GetDz()) - sddCableZ3;
5953 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl",
5954 pcon2container->GetRmin(1),
5955 pcon2container->GetRmax(1),
5958 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",
5960 vInterCyl->SetVisibility(kFALSE);
5962 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5963 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5964 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5966 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5967 rmaxCylPlast, sddCableDZint/2);
5969 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast",
5970 interCylPlast, plastic);
5971 vInterCylPlast->SetLineColor(kYellow);
5972 vInterCyl->AddNode(vInterCylPlast, 0);
5974 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5975 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5976 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5978 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5979 rmaxCylCu, sddCableDZint/2);
5981 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu",
5982 interCylCu, copper);
5983 vInterCylCu->SetLineColor(kRed);
5984 vInterCyl->AddNode(vInterCylCu, 0);
5986 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5987 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5988 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5990 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5991 rmaxCylGlass, sddCableDZint/2);
5993 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",
5994 interCylGlass,opticalFiber);
5995 vInterCylGlass->SetLineColor(kGreen);
5996 vInterCyl->AddNode(vInterCylGlass, 0);
5998 moth->AddNode(vInterCyl, 1, new TGeoTranslation(0, 0,
5999 sddCableZ3+sddCableDZint/2));
6000 moth->AddNode(vInterCyl, 2, new TGeoTranslation(0, 0,
6001 -sddCableZ3-sddCableDZint/2));
6003 //==================================
6004 // cable cone on the SSD cone
6005 //==================================
6007 Double_t sddCableR4 = rmaxCylPlast;
6008 Double_t sddCableZ4 = sddCableZ3 + sddCableDZint;
6010 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
6011 fgkSDDCableR5, fgkSDDCableZ5,
6014 sectionLay3Cu+sectionLay4Cu+
6015 sectionLay3Glass+sectionLay4Glass, 1);
6017 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
6018 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0),
6019 pcon3all->GetRmax(0));
6021 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
6022 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax,
6023 pcon3all->GetRmax(1));
6026 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container",
6027 pcon3container, airSDD);
6028 vpcon3container->SetVisibility(kFALSE);
6030 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
6031 fgkSDDCableR5, fgkSDDCableZ5,
6033 sectionLay4Plastic, 3);
6035 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast",
6036 pcon3plast, plastic);
6037 vpcon3plast->SetLineColor(kYellow);
6038 vpcon3container->AddNode(vpcon3plast, 0);
6040 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
6041 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
6042 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
6043 sectionLay3Cu+sectionLay4Cu, 3);
6045 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu",
6047 vpcon3Cu->SetLineColor(kRed);
6048 vpcon3container->AddNode(vpcon3Cu, 0);
6050 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
6051 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
6052 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
6053 sectionLay3Glass+sectionLay4Glass, 3);
6055 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass",
6056 pcon3glass,opticalFiber);
6057 vpcon3glass->SetLineColor(kGreen);
6058 vpcon3container->AddNode(vpcon3glass, 0);
6060 moth->AddNode(vpcon3container, 1);
6061 moth->AddNode(vpcon3container, 2, rotCableSDD);
6063 //==================================
6064 // cables that are grouped at the end of SSD cones
6065 //==================================
6067 // Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
6068 // Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
6069 Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
6070 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
6072 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
6074 // Add some hardcoded shifts to avoid overlaps with SSD pathc panels
6075 CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
6076 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
6078 CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
6079 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6081 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
6082 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6084 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
6085 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6087 CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
6088 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
6090 CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
6091 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6093 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
6094 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6096 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
6097 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6099 CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
6100 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
6102 CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
6103 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6105 CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
6106 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6108 CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
6109 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6111 CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
6112 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6114 moth->AddNode(endConeSDDCable, 1, 0);
6116 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
6117 reflect->ReflectZ(kTRUE);
6118 moth->AddNode(endConeSDDCable, 2, reflect);