1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 //*************************************************************************
19 // SDD geometry, based on ROOT geometrical modeler
22 // This geometry has no dependence with aliroot, you can run it with root
23 // only, provided that the AliITSv11GeomCable classes are also compiled
25 // Ludovic Gaudichet gaudichet@to.infn.it
26 //*************************************************************************
32 // General Root includes
35 // Root Geometry includes
36 #include <TGeoManager.h>
37 #include <TGeoVolume.h>
42 #include <TGeoCompositeShape.h>
43 #include <TGeoMatrix.h>
47 #include "AliITSgeom.h"
48 #include "AliITSgeomSDD.h"
49 #include "AliITSv11GeometrySDD.h"
50 #include "AliITSv11GeomCableFlat.h"
51 #include "AliITSv11GeomCableRound.h"
53 const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName3 = "ITSsddSensitivL3";
54 const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName4 = "ITSsddSensitivL4";
55 const Double_t AliITSv11GeometrySDD::fgkSegmentLength = 37.2*2*fgkmm;
56 const Double_t AliITSv11GeometrySDD::fgkLadderWidth = 50.0*fgkmm;
57 const Double_t AliITSv11GeometrySDD::fgkLadderHeight = 30.0*fgkmm;
58 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDW = 3.5*fgkmm;
59 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH = 3.*fgkmm;
61 const Double_t AliITSv11GeometrySDD::fgkLadderBeamRadius = 0.6*fgkmm;
62 const Double_t AliITSv11GeometrySDD::fgkLadderLa = 3.*fgkmm;
63 const Double_t AliITSv11GeometrySDD::fgkLadderHa = 0.721979*fgkmm;
64 const Double_t AliITSv11GeometrySDD::fgkLadderLb = 3.7*fgkmm;
65 const Double_t AliITSv11GeometrySDD::fgkLadderHb = 0.890428*fgkmm;
66 const Double_t AliITSv11GeometrySDD::fgkLadderl = 0.25*fgkmm;
68 const Double_t AliITSv11GeometrySDD::fgkBottomBeamAngle = 56.5;
69 const Double_t AliITSv11GeometrySDD::fgkBeamSidePhi = 65;
71 const Double_t AliITSv11GeometrySDD::fgkLadWaferSep = 2*fgkmm;
72 const Double_t AliITSv11GeometrySDD::fgkPinSuppWidth = 2.5*fgkmm;
73 const Double_t AliITSv11GeometrySDD::fgkPinSuppHeight = 2.*fgkmm;
74 const Double_t AliITSv11GeometrySDD::fgkPinSuppRmax = 2.5/2.*fgkmm;
75 const Double_t AliITSv11GeometrySDD::fgkPinR = 1.5/2.*fgkmm;
76 const Double_t AliITSv11GeometrySDD::fgkPinSuppLength = 5.*fgkmm;
77 const Double_t AliITSv11GeometrySDD::fgkPinSuppThickness = 0.5*fgkmm;
78 const Double_t AliITSv11GeometrySDD::fgkPinSuppConeAngle = 4;
79 const Double_t AliITSv11GeometrySDD::fgkPinDXminOnSensor = (39./2.)*fgkmm;
80 const Double_t AliITSv11GeometrySDD::fgkPinPinDDXOnSensor = 3*fgkmm;
81 const Double_t AliITSv11GeometrySDD::fgkPinDYOnSensor = (52.5/2.)*fgkmm;
83 // parameters from ALR-0752/3
84 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHeight = 3.2*fgkmm;
85 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppMaxLength = 14*fgkmm;
86 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthExt = 0.4*fgkmm;
87 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthIn = 0.65*fgkmm;
88 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHoleDiam = 2*fgkmm;
89 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppFulWidth = 5.15*fgkmm;
90 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppTongW = 0.8*fgkmm;
91 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAngle = 22.5;
92 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppSlitL = 4.9*fgkmm;
93 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAxeDist = 3.05*fgkmm;
94 const Double_t AliITSv11GeometrySDD::fgkCoolPipeInnerDiam = 1.84*fgkmm;
95 const Double_t AliITSv11GeometrySDD::fgkCoolPipeOuterDiam = 2.*fgkmm;
97 const Double_t AliITSv11GeometrySDD::fgkBTBthick = 0.25 *fgkmm;
98 const Double_t AliITSv11GeometrySDD::fgkBTBlength = 55. *fgkmm;
99 const Double_t AliITSv11GeometrySDD::fgkBTBwidth = 18*fgkmm;
100 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBottom = 4*fgkmm;
101 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase = 1.2*fgkmm;
102 const Double_t AliITSv11GeometrySDD::fgkRadiusAminBTB = 1. *fgkmm;
103 const Double_t AliITSv11GeometrySDD::fgkRadiusBminBTB = 0.53 *fgkmm;
104 const Double_t AliITSv11GeometrySDD::fgkBTBHoleLength = 15 *fgkmm;
105 const Double_t AliITSv11GeometrySDD::fgkBTBHolewidth = 6 *fgkmm;
106 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefX = 10 *fgkmm;
107 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefY = 6.5 *fgkmm;
109 const Double_t AliITSv11GeometrySDD::fgkLay3Rmin = 145.*fgkmm;
110 const Double_t AliITSv11GeometrySDD::fgkLay3Rmax = 200.*fgkmm;
111 const Double_t AliITSv11GeometrySDD::fgkLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
112 const Double_t AliITSv11GeometrySDD::fgkLay3LadderLength = 524.*fgkmm;
113 const Double_t AliITSv11GeometrySDD::fgkLay3DetShortRadius = 146.0*fgkmm;
114 const Double_t AliITSv11GeometrySDD::fgkLay3DetLongRadius = 152.0*fgkmm;
115 const Double_t AliITSv11GeometrySDD::fgkLay3LaddTopCornerEnd = 15.6*fgkmm;
116 const Int_t AliITSv11GeometrySDD::fgkLay3Ndet = 6;
117 const Int_t AliITSv11GeometrySDD::fgkLay3Nladd = 14;
118 const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH = 7.5*fgkmm;
120 const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 234.8*fgkmm;
121 const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 286.*fgkmm;
122 const Double_t AliITSv11GeometrySDD::fgkLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
123 const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength = 671.*fgkmm;
124 const Double_t AliITSv11GeometrySDD::fgkLay4DetShortRadius = 235.0*fgkmm;
125 const Double_t AliITSv11GeometrySDD::fgkLay4DetLongRadius = 240.5*fgkmm;
126 const Double_t AliITSv11GeometrySDD::fgkLay4LaddTopCornerEnd = 15.6*fgkmm;
127 const Int_t AliITSv11GeometrySDD::fgkLay4Ndet = 8;
128 const Int_t AliITSv11GeometrySDD::fgkLay4Nladd = 22;
129 const Double_t AliITSv11GeometrySDD::fgkLay4CoolPipeSuppH = 7.5*fgkmm;
131 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay3 = fgkLay3DetShortRadius;
132 const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay4 = fgkLay4DetShortRadius;
133 const Double_t AliITSv11GeometrySDD::fgkDistEndLaddCardsLadd = 0.*fgkmm;
136 const Double_t AliITSv11GeometrySDD::fgkHybridAngle = 46; // approx !!!
137 // Origine taken at the hybrid corner :
138 const Double_t AliITSv11GeometrySDD::fgkHybridLength = 65*fgkmm;
139 const Double_t AliITSv11GeometrySDD::fgkHybridWidth = 41*fgkmm;
140 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleRad = 1.05*fgkmm;
141 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleZ = 2.5*fgkmm;
142 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleX = fgkHybridWidth-23.599*fgkmm;
144 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleDZ = 9.698*fgkmm;
145 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHolePasDX = 10.754*fgkmm;
146 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleAmbDX = 9.122*fgkmm;
147 // center of ships to the border
148 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ4 = fgkHybridLength-(4.654 )*fgkmm-fgkHybFLlowHoleDZ/2;
149 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ3 = fgkHybridLength-(4.654+15. )*fgkmm-fgkHybFLlowHoleDZ/2;
150 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ2 = fgkHybridLength-(4.654+15.*2)*fgkmm-fgkHybFLlowHoleDZ/2;
151 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ1 = fgkHybridLength-(4.654+15.*3)*fgkmm-fgkHybFLlowHoleDZ/2;
152 const Double_t AliITSv11GeometrySDD::fgkHybFLlowPasX = fgkHybridWidth-32.775*fgkmm;
153 const Double_t AliITSv11GeometrySDD::fgkHybFLlowAmbX = fgkHybridWidth-20.791*fgkmm;
154 const Double_t AliITSv11GeometrySDD::fgkHybChipsDZ = 9.221*fgkmm;
155 const Double_t AliITSv11GeometrySDD::fgkHybPascalDX = 10.245*fgkmm;
156 const Double_t AliITSv11GeometrySDD::fgkHybAmbraDX = 8.51*fgkmm;
157 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperWidth = 15.012*fgkmm;
158 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperLength = 59.878*fgkmm;
159 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAlDZ = 11.183*fgkmm;
160 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAldx = 2.307*fgkmm;
162 const Double_t AliITSv11GeometrySDD::fgkmu = 1*fgkmicron; // 1*fgkmicron; // can be increase for checking thin objects
163 const Double_t AliITSv11GeometrySDD::fgkHybridThBridgeThick = 0.25*fgkmm; // ???
164 const Double_t AliITSv11GeometrySDD::fgkHybAlThick = 30*fgkmu;
165 const Double_t AliITSv11GeometrySDD::fgkHybUpThick = 20*fgkmu;
166 const Double_t AliITSv11GeometrySDD::fgkHybGlueScrnThick = 50*fgkmu; // ??? ?????
167 const Double_t AliITSv11GeometrySDD::fgkHybGlueLowThick = 90*fgkmu;
168 const Double_t AliITSv11GeometrySDD::fgkHybGlueUpThick = 90*fgkmu; // sur ?????
169 const Double_t AliITSv11GeometrySDD::fgkHybAlCCThick = 12*fgkmu;
170 const Double_t AliITSv11GeometrySDD::fgkHybUpCCThick = 12*fgkmu;
171 const Double_t AliITSv11GeometrySDD::fgkHybChipThick = 150*fgkmu;
172 const Double_t AliITSv11GeometrySDD::fgkHybGlueAgThick = 50*fgkmu; // ??? ????
173 const Double_t AliITSv11GeometrySDD::fgkHybUnderNiThick = 20*fgkmu; // ??? ????
174 const Int_t AliITSv11GeometrySDD::fgkNHybSMD = 25;
175 const Double_t AliITSv11GeometrySDD::fgkHybSMDposX[fgkNHybSMD] =
176 {2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,21.40*fgkmm,
177 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
178 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,17.09*fgkmm,21.40*fgkmm,
179 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
180 1.63*fgkmm,5.22*fgkmm,13.59*fgkmm,21.40*fgkmm};
181 const Double_t AliITSv11GeometrySDD::fgkHybSMDposZ[fgkNHybSMD] =
182 { 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm,
183 17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,
184 32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,
185 47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,
186 62.68*fgkmm,62.06*fgkmm,62.06*fgkmm,62.06*fgkmm};
187 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleW = 0.954*fgkmm;
188 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleL = 0.47 *fgkmm;
189 const Double_t AliITSv11GeometrySDD::fgkHybSMDendW = 1.132*fgkmm;
190 const Double_t AliITSv11GeometrySDD::fgkHybSMDendL = 0.925*fgkmm;
191 const Double_t AliITSv11GeometrySDD::fgkHybSMDheight = 400.*fgkmu; // ??? ????!!!!!!!
193 const Double_t AliITSv11GeometrySDD::fgkWaferThickness = 300.*fgkmu;
194 const Double_t AliITSv11GeometrySDD::fgkWaferWidth = 72.5 *fgkmm;
195 const Double_t AliITSv11GeometrySDD::fgkWaferLength = 87.6 *fgkmm;
196 const Double_t AliITSv11GeometrySDD::fgkWaferThickSens = 299.8*fgkmu;
197 const Double_t AliITSv11GeometrySDD::fgkWaferWidthSens = 70.17*fgkmm;
198 // 256 anodes times 294 microns of pitch
199 const Double_t AliITSv11GeometrySDD::fgkWaferLengthSens = 256*294*fgkmicron;
201 const Double_t AliITSv11GeometrySDD::fgkDigitCablWidth = 18.4*fgkmm;
202 const Double_t AliITSv11GeometrySDD::fgkDigitCablAlThick = (30+30*8./10.)*fgkmicron; // will probably change
203 const Double_t AliITSv11GeometrySDD::fgkDigitCablPolyThick = (20+12)*fgkmicron; // will probably change
205 const Double_t AliITSv11GeometrySDD::fgkWaHVcableAlThick = 30*2./10.*fgkmu; // will probably change // Al ratio is random !!!
206 const Double_t AliITSv11GeometrySDD::fgkWaHVcablePolyThick = 175*fgkmu; // will probably change
207 const Double_t AliITSv11GeometrySDD::fgkWaHVcableLength = 67.08*fgkmm;
208 const Double_t AliITSv11GeometrySDD::fgkWaHVcableWitdh = 17.4*fgkmm; // check !!!
209 const Double_t AliITSv11GeometrySDD::fgkWaHVcableDW = 5.24*fgkmm; //5.24*fgkmm;// check !!!
211 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLX = 5. *fgkmm;
212 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLZ = 5. *fgkmm;
213 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLY = 150. *fgkmu;
214 const Double_t AliITSv11GeometrySDD::fgkGlassDXOnSensor = 26.28*fgkmm; // check !!!
215 const Double_t AliITSv11GeometrySDD::fgkGlassDZOnSensor = 22.50*fgkmm; // check !!!
217 const Double_t AliITSv11GeometrySDD::fgkTransitHVAlThick = 30*2./10.*fgkmu; // check // will probably change //Al ratio is random
218 const Double_t AliITSv11GeometrySDD::fgkTransitHVPolyThick = 100*fgkmu; // check // will probably change
219 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLX = 71.46*fgkmm; // check !!!
220 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLZ = 21.3*fgkmm;
221 const Double_t AliITSv11GeometrySDD::fgkTransitHVBondingLZ = 3.6*fgkmm;
222 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailLength = 27*fgkmm; // ???, not yet fixed ...
223 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailWidth = 26*fgkmm;
224 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailXpos = 8*fgkmm; //8*fgkmm // ???, a mesurer !!!
225 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLZ = 10.34*fgkmm;
226 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLeftZ = 4.11*fgkmm;
227 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideRightZ = 3.5*fgkmm; // ???, a mesurer !!!
229 const Double_t AliITSv11GeometrySDD::fgkLongHVcablePolyThick= (20+30+125+30+20+30+125+30+20)*fgkmu; // check // will probably change
230 const Double_t AliITSv11GeometrySDD::fgkLongHVcableAlThick = (30+30*2/10+30)*fgkmu; // check // will probably change
231 const Double_t AliITSv11GeometrySDD::fgkLongHVcableSeparation = 600*fgkmicron;
233 const Double_t AliITSv11GeometrySDD::fgkRubyDX = 14.*fgkmm;
234 const Double_t AliITSv11GeometrySDD::fgkRubyZladd3 = 250*fgkmm;
235 const Double_t AliITSv11GeometrySDD::fgkRubyZladd4 = 325*fgkmm;
237 // the stesalite ladder foot at its end
238 const Double_t AliITSv11GeometrySDD::fgkLadFootX = 60.*fgkmm;
239 const Double_t AliITSv11GeometrySDD::fgkLadFootZ = 20.*fgkmm;
240 const Double_t AliITSv11GeometrySDD::fgkLadFootY = 8.*fgkmm;
241 const Double_t AliITSv11GeometrySDD::fgkLadFootMiddleY = 4.5*fgkmm;
242 const Double_t AliITSv11GeometrySDD::fgkLadBox1X = 23.*fgkmm;
243 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintX = 6.*fgkmm;
244 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintY = 1.*fgkmm;
245 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintBorder = 4.*fgkmm;
246 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleZ = 8.*fgkmm;
247 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleX = 9.*fgkmm;
248 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleY = 6.5*fgkmm;
249 const Double_t AliITSv11GeometrySDD::fgkRubyCageAxisShift = 0.5*fgkmm;
250 const Double_t AliITSv11GeometrySDD::fgkScrewM4diam = 4.*fgkmm;
252 const Double_t AliITSv11GeometrySDD::fgkRubyScrewShiftToCenterY = 0.1;
253 const Double_t AliITSv11GeometrySDD::fgkRubyHoleDiam = 0.5;
255 // the U cooling pipe and its heat exchanger in end-ladder cards system
256 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay3 = 138*fgkmm;
257 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay4 = 150*fgkmm;
258 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUwidth = 59*fgkmm;
259 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeRadius = 5*fgkmm;
260 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeInnerDiam = 2.8*fgkmm;
261 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeOuterDiam = 3.*fgkmm;
262 //--- The al body of the cooling syst.of the heat exchanger :
263 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay3 = 112.*fgkmm; //
264 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay4 = 125.*fgkmm; //
265 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmX = 4.75*fgkmm; // the arms of the U cooling tube
266 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmY = 6.8*fgkmm;
267 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDY = 1.03*fgkmm; // shift in Y of the arms from the axis
268 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDX = 0.125*fgkmm;// shift in X of the arms from the axis
269 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZpos = 8.9*fgkmm; //
272 const Double_t AliITSv11GeometrySDD::fgkLVcardX = 26.525*fgkmm;
273 const Double_t AliITSv11GeometrySDD::fgkLVcardY = 44.95*fgkmm;
274 const Double_t AliITSv11GeometrySDD::fgkLVcardZ = 1.*fgkmm; // all except Cu layer //???
275 const Double_t AliITSv11GeometrySDD::fgkLVcardCuZ = 0.1*fgkmm; //???
277 const Double_t AliITSv11GeometrySDD::fgkLVChip0X = 16.525*fgkmm;
278 const Double_t AliITSv11GeometrySDD::fgkLVChip0Y = 10.8*fgkmm;
279 const Double_t AliITSv11GeometrySDD::fgkLVChip0Z = 3.5*fgkmm; // all except si layer //???
280 const Double_t AliITSv11GeometrySDD::fgkLVChip0SiZ = 0.2*fgkmm; //???????????????????????????????????????????????????
281 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosX = 13.*fgkmm; //19.95*fgkmm; ???
282 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosY = 10.3*fgkmm;
284 const Double_t AliITSv11GeometrySDD::fgkLVChip1X = 6.00*fgkmm;
285 const Double_t AliITSv11GeometrySDD::fgkLVChip1Y = 6.00*fgkmm;
286 const Double_t AliITSv11GeometrySDD::fgkLVChip1Z = 1*fgkmm; // ???
287 const Double_t AliITSv11GeometrySDD::fgkLVChip1SiZ = 0.2*fgkmm; // ???
288 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosX = 18.*fgkmm;
289 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosY = 27.6*fgkmm;
291 const Double_t AliITSv11GeometrySDD::fgkLVChip2X = 6.00*fgkmm;
292 const Double_t AliITSv11GeometrySDD::fgkLVChip2Y = 6.00*fgkmm;
293 const Double_t AliITSv11GeometrySDD::fgkLVChip2Z = 1*fgkmm; // ???
294 const Double_t AliITSv11GeometrySDD::fgkLVChip2SiZ = 0.2*fgkmm; //???
295 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosX = 18.0*fgkmm;
296 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosY = 39.0*fgkmm;
298 const Double_t AliITSv11GeometrySDD::fgkLVChip3X = 4.01*fgkmm;
299 const Double_t AliITSv11GeometrySDD::fgkLVChip3Y = 4.01*fgkmm;
300 const Double_t AliITSv11GeometrySDD::fgkLVChip3Z = 1*fgkmm; // ???
301 const Double_t AliITSv11GeometrySDD::fgkLVChip3SiZ = 0.2*fgkmm;
302 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosX = 20.7*fgkmm;
303 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosY = 21.4*fgkmm;
305 const Double_t AliITSv11GeometrySDD::fgkLVcoolX1 = 17.25*fgkmm;
306 const Double_t AliITSv11GeometrySDD::fgkLVcoolY1 = 8.7*fgkmm;
307 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ1 = 1.*fgkmm;
309 const Double_t AliITSv11GeometrySDD::fgkLVcoolX2 = 3.5*fgkmm;
310 const Double_t AliITSv11GeometrySDD::fgkLVcoolY2 = 8.7*fgkmm;
311 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ2 = 2.3*fgkmm;
313 const Double_t AliITSv11GeometrySDD::fgkLVcoolX3 = 4.75*fgkmm;
314 const Double_t AliITSv11GeometrySDD::fgkLVcoolY3 = 3.1*fgkmm; //+0.1=glue
315 const Double_t AliITSv11GeometrySDD::fgkLVcoolPosY = 6.5*fgkmm;
318 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramX = 54.01*fgkmm;
319 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramY = 40.89*fgkmm;
320 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramZ = 0.7*fgkmm; // ???
322 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1X = 6.8*fgkmm;
323 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Z = 1.*fgkmm; // ???
324 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Ymid = 4.1*fgkmm;
325 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Yend = 0.95*fgkmm; // doesn't take into account the soldering
326 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosX = 13.1*fgkmm;
327 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosY = 14.5*fgkmm;
329 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2X = 6.8*fgkmm;
330 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Z = 1.*fgkmm; // ???
331 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Ymid = 2.9*fgkmm;
332 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Yend = 0.95*fgkmm;
333 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosX = -12.6*fgkmm;
334 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosY = 16.54*fgkmm;
336 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xmid = 3.0*fgkmm;
337 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xend = 0.91*fgkmm;
338 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Z = 2.*fgkmm; // ???
339 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Y = 3.43*fgkmm;
341 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX1 = 14.6*fgkmm;
342 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX2 = 7.2*fgkmm;
343 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX3 = 2.52*fgkmm;
344 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX4 = -4.96*fgkmm;
345 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX5 = -13.82*fgkmm;
346 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY1 = 6.27*fgkmm;
347 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY2 = 0.7*fgkmm;
348 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY3 = 9.1*fgkmm;
350 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1X = 14.*fgkmm;
351 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Y = 9.5*fgkmm;
352 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Z = 2.*fgkmm;
353 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2X = 14.25*fgkmm;
354 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Y = 3.5*fgkmm;
355 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Z = 4.5*fgkmm;
356 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3X = 4.5*fgkmm;
357 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Y = 3.5*fgkmm;
358 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Z = 7.2*fgkmm;
359 const Double_t AliITSv11GeometrySDD::fgkHVCardCoolDY = 6.*fgkmm;
361 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX1 = 19.5*fgkmm;
362 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY1 = 2*fgkmm;
363 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX2 = 35.*fgkmm;
364 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY2 = 3.9*fgkmm;
365 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ = 17.*fgkmm;
366 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppAngle = 45;
367 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX3 = 4.5*fgkmm;
368 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY3 = 3.*fgkmm;
369 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ3 = 12.*fgkmm;
370 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppTopLen = 8.65*fgkmm;
372 // screws fixing boards to the end-ladder on the U tube
373 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadR = 1.85*fgkmm;
374 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadH = 1.5*fgkmm;
375 const Double_t AliITSv11GeometrySDD::fgkLittleScrewR = 0.7*fgkmm;
376 const Double_t AliITSv11GeometrySDD::fgkShiftLittleScrewLV = 3*fgkmm; // ???
377 const Double_t AliITSv11GeometrySDD::fgkLittleLVScrewHeadR = 1.2*fgkmm; // ???
380 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX1 = (25.50+28.50)*fgkmm; // length (first part of Carlos card)
381 const Double_t AliITSv11GeometrySDD::fgkCarlosCardY1 = 1.6*fgkmm; // thickness
382 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ1 = 40.8*fgkmm; // width
383 const Double_t AliITSv11GeometrySDD::fgkCarlosCardCuY = 0.1*fgkmm; // thickness of Cu layer (strips)
384 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX2 = 25.50*fgkmm; // length (2nd part of Carlos card)
385 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ2 = 8.20*fgkmm; // width
387 const Double_t AliITSv11GeometrySDD::fgkCarlosCardChipSiThick = 0.1*fgkmm; // ??? idem for all chips ???
388 const Double_t AliITSv11GeometrySDD::fgkCarlosCardShift = 9*fgkmm; // ??? shift in z w.r.t. heat bridge
390 // size and position of various chips on carlos end-ladder board
391 const Double_t AliITSv11GeometrySDD::fgkCarlosU1X = 13*fgkmm;
392 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Y = 1.68*fgkmm;
393 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Z = 13*fgkmm;
394 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posX = 18.4*fgkmm;
395 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posZ = -7.2*fgkmm;
397 const Double_t AliITSv11GeometrySDD::fgkCarlosU2X = 13.75*fgkmm;
398 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Y = 1.60*fgkmm;
399 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Z = 13.85*fgkmm;
400 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posX = -0.375*fgkmm;
401 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posZ = -9.725*fgkmm;
403 const Double_t AliITSv11GeometrySDD::fgkCarlosU3X = 5*fgkmm;
404 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Y = 1.*fgkmm;
405 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Z = 5*fgkmm;
406 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posX = 6.4*fgkmm;
407 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posZ = 9.9*fgkmm;
410 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posX = -12*fgkmm;
411 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posZ = 3.6*fgkmm;
413 const Double_t AliITSv11GeometrySDD::fgkCarlosU17X = 16*fgkmm;
414 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Y = 3.5*fgkmm;
415 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Z = 10.9*fgkmm;
416 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posX = -17.84*fgkmm;
417 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posZ = -10.95*fgkmm;
419 const Double_t AliITSv11GeometrySDD::fgkCarlosU35X = 4*fgkmm;
420 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Y = 1.*fgkmm;
421 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Z = 4*fgkmm;
422 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posX = -21.6*fgkmm;
423 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posZ = 2.3*fgkmm;
425 const Double_t AliITSv11GeometrySDD::fgkCarlosU36X = 6*fgkmm;
426 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Y = 1.*fgkmm;
427 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Z = 6*fgkmm;
428 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posX = -21.6*fgkmm;
429 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posZ = 9.6*fgkmm;
431 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1X = 8*fgkmm;
432 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Y = 1.7*fgkmm; // look thicker than design number (0.7) ! ???
433 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Z = 3.7*fgkmm;
434 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posX = -12*fgkmm;
435 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posZ = 10.6*fgkmm;
437 // distance from the heat bridge center to the card center :
438 const Double_t AliITSv11GeometrySDD::fgkCarlosCard2HeatBridge = fgkCarlosSuppY2/2+fgkCarlosCardY1/2+fgkCarlosU1Y+0.1*fgkmm;
440 // some pieces at the end of the carbon fiber ladder
441 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay3Len = 467.*fgkmm; // ???
442 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay4Len = 616.*fgkmm; // ???
443 const Double_t AliITSv11GeometrySDD::fgkHVguideX1 = 42.5*fgkmm;
444 const Double_t AliITSv11GeometrySDD::fgkHVguideY1 = 7.*fgkmm;
445 const Double_t AliITSv11GeometrySDD::fgkHVguideZ1 = 10.*fgkmm;
446 const Double_t AliITSv11GeometrySDD::fgkHVguideZ2 = 6.*fgkmm;
447 const Double_t AliITSv11GeometrySDD::fgkHVguideDX = -8.5*fgkmm;
448 const Double_t AliITSv11GeometrySDD::fgkHVguideSuppFullZ = 37.5*fgkmm;
450 // Cooling connector between phynox and plastic cooling water tubes
451 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeRmin = 1 *fgkmm;
452 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR1 = 2.5*fgkmm; // ???
453 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL1 = 3.*fgkmm; // ???
454 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR2 = 3.5*fgkmm; // ???
455 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL2 = 2.*fgkmm; // ???
456 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR3 = 3.*fgkmm; // ???
457 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL3 = 5 *fgkmm; // ???
460 // parameters for coding SDD cables on SDD and SSD cones
461 const Double_t AliITSv11GeometrySDD::fgkSectionCuPerMod = 3*2*0.006 + 3*2*0.0005 + 2*0.002;
462 // copper : LV + signal + HV(HV ???)
463 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)
464 - fgkSectionCuPerMod);
466 const Double_t AliITSv11GeometrySDD::fgkSectionGlassPerMod = 3*0.006; // ???
467 const Double_t AliITSv11GeometrySDD::fgkSectionCoolPolyuEL = 0.4672;
468 const Double_t AliITSv11GeometrySDD::fgkSectionCoolWaterEL = 0.3496;
469 // (sections are given in cm square)
470 const Double_t AliITSv11GeometrySDD::fgkCableBendRatio = 1.3; // ??? this factor account for the bending of cables
472 const Double_t AliITSv11GeometrySDD::fgkConeSDDr1 = 11.87574*fgkcm;
473 const Double_t AliITSv11GeometrySDD::fgkConeSDDr2 = 26.07574*fgkcm;
474 const Double_t AliITSv11GeometrySDD::fgkConeSDDz1 = 3.36066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
475 const Double_t AliITSv11GeometrySDD::fgkConeSDDz2 = 17.56066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
476 // These last parameters come from cone's code and define the slope
477 // and position of the SDD cone end. For some unknown reason, this doesn't
478 // allow to stick on the SDD cone. This has to be checked when a correct
479 // version of the cone is available ... For now 'm applying some approximative
482 const Double_t AliITSv11GeometrySDD::fgkSDDCableR1 = 16*fgkcm; // ??? // part 1 of "cable cone"
483 const Double_t AliITSv11GeometrySDD::fgkSDDCableR2 = 23*fgkcm; // ??? // part 1/2 of "cable cone"
484 const Double_t AliITSv11GeometrySDD::fgkSDDCableR3 = 26*fgkcm; // ??? // part 2 of "cable cone"
486 const Double_t AliITSv11GeometrySDD::fgkSDDCableDZint = 3.5*fgkcm;
487 const Double_t AliITSv11GeometrySDD::fgkSDDCableR5 = 37*fgkcm; // third part of "cable cone"
488 const Double_t AliITSv11GeometrySDD::fgkSDDCableZ5 = 65*fgkcm; // third part of "cable cone"
496 ClassImp(AliITSv11GeometrySDD)
498 //________________________________________________________________________
499 AliITSv11GeometrySDD::AliITSv11GeometrySDD():
502 fCoolPipeSupportL(0),
503 fCoolPipeSupportR(0),
506 fBaseThermalBridge(0),
523 fAddCoolingSyst(kTRUE),
525 fAddOnlyLadder3min(-1),
526 fAddOnlyLadder3max(-1),
527 fAddOnlyLadder4min(-1),
528 fAddOnlyLadder4max(-1),
529 fColorCarbonFiber(4),
539 fLay3LadderUnderSegDH(0),
540 fLay4LadderUnderSegDH(0),
541 fLay3LaddShortRadius(0),
542 fLay3LaddLongRadius(0),
543 fLay4LaddShortRadius(0),
544 fLay4LaddLongRadius(0)
547 // Standard constructor
553 //________________________________________________________________________
554 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
555 AliITSv11Geometry(debug),
557 fCoolPipeSupportL(0),
558 fCoolPipeSupportR(0),
561 fBaseThermalBridge(0),
578 fAddCoolingSyst(kTRUE),
580 fAddOnlyLadder3min(-1),
581 fAddOnlyLadder3max(-1),
582 fAddOnlyLadder4min(-1),
583 fAddOnlyLadder4max(-1),
584 fColorCarbonFiber(4),
594 fLay3LadderUnderSegDH(0),
595 fLay4LadderUnderSegDH(0),
596 fLay3LaddShortRadius(0),
597 fLay3LaddLongRadius(0),
598 fLay4LaddShortRadius(0),
599 fLay4LaddLongRadius(0)
602 // Constructor setting debugging level
607 //________________________________________________________________________
608 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
609 AliITSv11Geometry(s.GetDebug()),
610 fPinSupport(s.fPinSupport),
611 fCoolPipeSupportL(s.fCoolPipeSupportL),
612 fCoolPipeSupportR(s.fCoolPipeSupportR),
613 fSDDsensor3(s.fSDDsensor3),
614 fSDDsensor4(s.fSDDsensor4),
615 fBaseThermalBridge(s.fBaseThermalBridge),
617 fLadderFoot(s.fLadderFoot),
618 fCardLVR(s.fCardLVR),
619 fCardLVL(s.fCardLVL),
621 fCardCarlos(s.fCardCarlos),
622 fRaccordoL(s.fRaccordoL),
623 fDigitCableLay3A(s.fDigitCableLay3A),
624 fDigitCableLay3B(s.fDigitCableLay3B),
625 fDigitCableLay4A(s.fDigitCableLay4A),
626 fDigitCableLay4B(s.fDigitCableLay4B),
627 fMotherVol(s.fMotherVol),
628 fAddHybrids(s.fAddHybrids),
629 fAddSensors(s.fAddSensors),
630 fAddHVcables(s.fAddHVcables),
631 fAddCables(s.fAddCables),
632 fAddCoolingSyst(s.fAddCoolingSyst),
633 fCoolingOn(s.fCoolingOn),
634 fAddOnlyLadder3min(s.fAddOnlyLadder3min),
635 fAddOnlyLadder3max(s.fAddOnlyLadder3max),
636 fAddOnlyLadder4min(s.fAddOnlyLadder4min),
637 fAddOnlyLadder4max(s.fAddOnlyLadder4max),
638 fColorCarbonFiber(s.fColorCarbonFiber),
639 fColorRyton(s.fColorRyton),
640 fColorPhynox(s.fColorPhynox),
641 fColorSilicon(s.fColorSilicon),
642 fColorAl(s.fColorAl),
643 fColorPolyhamide(s.fColorPolyhamide),
644 fColorGlass(s.fColorGlass),
645 fColorSMD(s.fColorSMD),
646 fColorSMDweld(s.fColorSMDweld),
647 fColorStesalite(s.fColorStesalite),
648 fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
649 fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
650 fLay3LaddShortRadius(s.fLay3LaddShortRadius),
651 fLay3LaddLongRadius(s.fLay3LaddLongRadius),
652 fLay4LaddShortRadius(s.fLay4LaddShortRadius),
653 fLay4LaddLongRadius(s.fLay4LaddLongRadius)
656 // do only a "shallow copy" ...
660 //________________________________________________________________________
661 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
662 operator=(const AliITSv11GeometrySDD &s) {
663 // Assignment operator
664 if(&s == this) return *this;
665 fMotherVol = s.fMotherVol;
666 fAddHybrids = s.fAddHybrids;
667 fAddSensors = s.fAddSensors;
668 fAddHVcables = s.fAddHVcables;
669 fAddCables = s.fAddCables;
670 fAddCoolingSyst = s.fAddCoolingSyst;
671 fCoolingOn = s.fCoolingOn;
672 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
673 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
674 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
675 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
679 //________________________________________________________________________
680 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
681 // Look like a destructor
682 // Smell like a destructor
683 // And actually is the destructor
684 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
685 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
686 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
687 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
690 //________________________________________________________________________
691 void AliITSv11GeometrySDD::SetParameters() {
693 // Define display colors and the non constant geometry parameters
696 Double_t detLadderDist = 8*fgkmm;
698 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
699 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
701 // radius from the center to the CF ladder :
702 fLay3LaddShortRadius = (fgkLay3DetShortRadius
703 + fgkLadWaferSep+2*fgkWaferThickness
705 fLay3LaddLongRadius = (fgkLay3DetLongRadius
706 + fgkLadWaferSep+2*fgkWaferThickness
708 fLay4LaddShortRadius = (fgkLay4DetShortRadius
709 + fgkLadWaferSep+2*fgkWaferThickness
711 fLay4LaddLongRadius = (fgkLay4DetLongRadius
712 + fgkLadWaferSep+2*fgkWaferThickness
715 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
716 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
717 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
718 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
719 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
720 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
722 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
723 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
724 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
725 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
726 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
727 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
728 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
729 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
733 //________________________________________________________________________
734 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
736 // Called to get a medium, checks that it exists.
737 // If not, prints an error and returns 0
741 sprintf(ch, "ITS_%s",mediumName);
742 TGeoMedium* medium = gGeoManager->GetMedium(ch);
744 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
749 //________________________________________________________________________
750 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
751 // Get the actual number of ladder in layer 3
752 if ( (fAddOnlyLadder3min<0) ||
753 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
754 (fAddOnlyLadder3max<0) ||
755 (fAddOnlyLadder3max >= fgkLay3Nladd) )
757 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
761 //________________________________________________________________________
762 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
763 // Get the actual number of ladder in layer 4
764 if ( (fAddOnlyLadder4min<0) ||
765 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
766 (fAddOnlyLadder4max<0) ||
767 (fAddOnlyLadder4max >= fgkLay4Nladd) )
769 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
773 //________________________________________________________________________
774 void AliITSv11GeometrySDD::CreateBasicObjects() {
776 // Create basics objets which will be assembled together
777 // in Layer3 and Layer4 functions
781 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
782 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
783 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
784 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
786 fPinSupport = CreatePinSupport();
787 fCoolPipeSupportL = CreateCoolPipeSupportL();
788 fCoolPipeSupportR = CreateCoolPipeSupportR();
790 fBaseThermalBridge = CreateBaseThermalBridge();
791 fHybrid = CreateHybrid(0);
793 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
794 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
795 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
796 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
797 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
798 TGeoMedium *raccordMedium = GetMedium("INOX$"); // ??? material of raccordo ???
800 //********************************************************************
801 // pieces of the carbon fiber structure
802 //********************************************************************
803 Double_t dy = fgkLadderSegBoxDH/2;
804 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
805 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
806 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
807 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
808 Double_t dYTranslation = (fgkLadderHeight/2.
809 -0.5*fgkLadderWidth*TMath::Tan(beta)
810 -fgkLadderBeamRadius);
811 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
813 //--- the top V of the Carbon Fiber Ladder (segment)
814 TGeoArb8 *cfLaddTop1 = CreateLadderSide( "CFladdTopCornerVol1shape",
815 fgkSegmentLength/2., halfTheta,
816 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
817 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
818 cfLaddTop1,carbonFiberLadderStruct);
819 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerVol2shape",
820 fgkSegmentLength/2., halfTheta,
821 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
822 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
823 cfLaddTop2, carbonFiberLadderStruct);
824 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
825 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
826 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
829 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerVol1shape",
830 fgkSegmentLength/2., beta, -1,
831 fgkLadderLb, fgkLadderHb, fgkLadderl);
832 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
833 cfLaddSide1,carbonFiberLadderStruct);
834 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerVol2shape",
835 fgkSegmentLength/2., beta, 1,
836 fgkLadderLb, fgkLadderHb, fgkLadderl);
837 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
838 cfLaddSide2,carbonFiberLadderStruct);
839 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
840 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
841 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
842 alpha*TMath::RadToDeg());
843 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
844 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
845 -alpha*TMath::RadToDeg());
846 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
849 // Beams on the sides
850 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
851 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
852 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
853 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
854 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
855 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
856 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
858 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
859 carbonFiberLadderStruct);
860 sideBeam->SetLineColor(fColorCarbonFiber);
862 //Euler rotation : about Z, then new X, then new Z
863 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
864 -beamPhiPrime*TMath::RadToDeg(),-90);
865 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
866 beamPhiPrime*TMath::RadToDeg(), -90);
867 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
868 beamPhiPrime*TMath::RadToDeg(), -90);
869 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
870 -beamPhiPrime*TMath::RadToDeg(),-90);
872 TGeoCombiTrans *beamTransf[8];
873 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
874 TMath::Tan(halfTheta),
875 fgkLadderBeamRadius/2. - dy,
876 -3*fgkSegmentLength/8, beamRot1);
878 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
879 TMath::Tan(halfTheta),
880 fgkLadderBeamRadius/2. - dy,
881 -3*fgkSegmentLength/8, beamRot1);
882 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
884 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
885 TMath::Tan(halfTheta),
886 fgkLadderBeamRadius/2. - dy,
887 -fgkSegmentLength/8, beamRot2);
889 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
890 TMath::Tan(halfTheta),
891 fgkLadderBeamRadius/2. - dy,
892 -fgkSegmentLength/8, beamRot2);
893 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
895 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
896 TMath::Tan(halfTheta),
897 fgkLadderBeamRadius/2. - dy,
898 -3*fgkSegmentLength/8, beamRot3);
900 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
901 TMath::Tan(halfTheta),
902 fgkLadderBeamRadius/2. - dy,
903 -3*fgkSegmentLength/8, beamRot3);
904 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
906 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
907 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
908 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
909 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
911 //--- Beams of the bottom
912 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
913 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
914 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
915 bottomBeam1, carbonFiberLadderStruct);
916 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
917 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
918 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
919 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
920 bottomBeam2, carbonFiberLadderStruct);
921 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
922 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
923 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
924 - fgkLadderLb/3, 0, 180);
925 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
926 bottomBeam3, carbonFiberLadderStruct);
927 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
928 //bottomBeam3Vol->SetLineColor(2);
929 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
930 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
932 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
933 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
934 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
935 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
936 -fgkSegmentLength/2, bottomBeamRot1);
937 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
938 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
939 - dy, fgkSegmentLength/2, bottomBeamRot2);
940 // be careful for beams #3: when "reading" from -z to +z and
941 // from the bottom of the ladder, it should draw a Lambda, and not a V
942 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
943 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
944 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
945 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
946 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
947 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
949 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
950 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
951 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
952 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
953 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
954 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
955 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
956 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
957 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
958 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
959 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
960 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
961 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
962 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
963 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
964 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
965 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
966 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
967 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
970 //********************************************************************
972 //********************************************************************
974 for (Int_t i=0; i<fgkLay3Ndet; i++) {
975 sprintf(cableName, "digitCableLay3A_%i",i);
976 fDigitCableLay3A[i].SetName(cableName);
977 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
978 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
979 fDigitCableLay3A[i].SetNLayers(2);
980 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
982 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
983 sprintf(cableName, "digitCableLay3B_%i",i);
984 fDigitCableLay3B[i].SetName(cableName);
985 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
986 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
987 fDigitCableLay3B[i].SetNLayers(2);
988 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
990 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
992 for (Int_t i=0; i<fgkLay4Ndet; i++) {
993 sprintf(cableName, "digitCableLay4A_%i",i);
994 fDigitCableLay4A[i].SetName(cableName);
995 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
996 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
997 fDigitCableLay4A[i].SetNLayers(2);
998 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1000 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1001 sprintf(cableName, "digitCableLay4B_%i",i);
1002 fDigitCableLay4B[i].SetName(cableName);
1003 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
1004 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1005 fDigitCableLay4B[i].SetNLayers(2);
1006 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1008 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1010 // Well, those digit cables could also include the analog cables
1011 // which have the same width and the same path, at least in the ladder.
1012 // It will gain some computing ressources (less volumes) and some
1013 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1014 // The only thing to do is to change the names and put the correct total
1017 // some transformations and volumes used in several places
1018 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1019 0, -fgkCarlosSuppAngle, 0);
1021 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1022 fgkLittleScrewHeadH/2);
1023 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1024 littleScrewHead, stainless);
1025 fCommonVol[0]->SetLineColor(kGray);
1027 fLadderFoot = CreateLadderFoot();
1029 fCardHV = CreateHVCard(0);
1030 fCardCarlos = CreateCarlosCard(0);
1032 //==================
1033 // link beteen phynox and plastic cooling tubes
1034 //==================
1036 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1037 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1038 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1039 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1040 vwaterRac->SetLineColor(kBlue);
1042 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1043 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1044 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1045 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1046 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1047 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1048 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1049 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1050 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1051 vtube1Rac->SetLineColor(kGray);
1052 vtube2Rac->SetLineColor(kGray);
1053 vtube3Rac->SetLineColor(kGray);
1055 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1056 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1057 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1058 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1059 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1060 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1061 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1062 fRaccordoL->AddNode(vwaterRac, 1,0);
1063 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1064 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1065 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1069 //________________________________________________________________________
1070 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1072 // a debugging function for checking some possible overlaps
1074 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1075 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1076 if (fHybrid) fHybrid->CheckOverlaps(precision);
1080 //________________________________________________________________________
1081 TGeoCombiTrans *AliITSv11GeometrySDD::
1082 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1085 // return the TGeoCombiTrans which make a translation in y and z
1086 // and a rotation in phi in the global coord system
1087 // If planeSym = true, the rotation places the object symetrically
1088 // (with respect to the transverse plane) to its position in the
1089 // case planeSym = false
1092 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1093 TGeoRotation r1("",0.,0.,dphi);
1094 TGeoRotation r2("",90, 180, -90-dphi);
1096 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1097 combiTrans1->SetTranslation(t1);
1098 if (planeSym) combiTrans1->SetRotation(r1);
1099 else combiTrans1->SetRotation(r2);
1104 //________________________________________________________________________
1105 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1109 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1110 const Double_t *vect = ct->GetTranslation();
1111 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1112 ct->SetTranslation(newVect);
1116 //________________________________________________________________________
1117 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1118 // for code developpment and debugging purposes
1120 if (! fSDDsensor3) CreateBasicObjects();
1122 // moth->AddNode(fPinSupport, 1, 0);
1123 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1124 // moth->AddNode(fSDDsensor3, 1, 0);
1125 // moth->AddNode(fSDDsensor4, 1, 0);
1126 // moth->AddNode(fBaseThermalBridge, 1, 0);
1127 // moth->AddNode(fHybrid,100,0);
1128 // moth->AddNode(fLadderFoot,1,0);
1129 //moth->AddNode(fCardLVL,1,0);
1130 //moth->AddNode(fCardLVR,1,0);
1132 TGeoVolume* seg = CreateLadderSegment( 3, 0);
1133 moth->AddNode(seg, 1, 0);
1135 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1136 // moth->AddNode(lay3Ladder, 1, 0);
1138 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1139 // moth->AddNode(lay3Detectors, 1, 0);
1141 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1142 // moth->AddNode(lay3Detectors, 1, 0);
1145 // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1146 // moth->AddNode(endLadder, 1, 0);
1148 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1149 // moth->AddNode(highVCard, 1, 0);
1151 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1152 // moth->AddNode(supportRing, 1, 0);
1154 // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1155 // moth->AddNode(endLadderCards, 1, 0);
1157 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1158 // moth->AddNode(carlosCard, 1, 0);
1163 //==================================
1164 //--- test of flat cable curvature
1165 //==================================
1168 AliITSv11GeomCableFlat cable("test", 3, 0.3);
1169 cable.SetNLayers(1);
1170 cable.SetNLayers(2);
1171 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1172 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1173 cable.SetInitialNode(endLadderCards);
1175 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1184 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1185 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1186 cable.CreateAndInsertBoxCableSegment(1,angle);
1188 Double_t p3[3], p4[3];
1193 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1194 cable.CreateAndInsertCableCylSegment(2,angle);
1199 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1200 cable.CreateAndInsertCableSegment(3,angle);
1205 //________________________________________________________________________
1206 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1208 // Insert the layer 3 in the mother volume. This is a virtual volume
1209 // containing ladders of layer 3 and the supporting rings
1213 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1217 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1220 if (! fSDDsensor3) CreateBasicObjects();
1222 //====================================
1223 // First we create the central barrel
1224 //====================================
1226 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1227 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1228 TGeoVolumeAssembly *lay3Ladd2Det = CreateDetectorsAssemblyLadd2();
1229 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1230 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1231 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1232 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1233 virtualLayer3Shape, airSDD);
1235 Double_t dPhi = 360./fgkLay3Nladd;
1236 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1237 // Placing virtual ladder and detectors volumes following
1238 // ladder ordering convention
1241 Int_t iLaddMax = fgkLay3Nladd;
1242 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1243 iLaddMin = fAddOnlyLadder3min;
1244 iLaddMax = fAddOnlyLadder3max+1;
1247 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1249 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1250 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1251 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1253 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1254 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1255 TGeoCombiTrans *ctLadd;
1256 //=============================================================
1258 // Special modification for ladder 2 of layer 3:
1259 // It has been inverted (pi rotation around y axis)
1261 //=============================================================
1263 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1264 0, ladderPhi, kTRUE);
1266 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1267 0, ladderPhi, kFALSE);
1268 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1269 ///////////////////////////////////////////////////
1270 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1271 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1272 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1273 minRadiusDetBox += detectorsThick/2;
1274 TGeoCombiTrans *ctDet;
1275 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1276 0, ladderPhi, kTRUE);
1279 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1281 virtualLayer3->AddNode(lay3Ladd2Det , iLadd, ctDet);
1283 ///////////////////////////////////////////////////
1287 //====================================
1288 // Then the forward rapidity pieces
1289 // (cooling, Carlos, LV, HV ...)
1290 //====================================
1292 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1293 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1294 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1296 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1297 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1298 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1299 fgkForwardLay3Length/2.);
1301 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1302 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1303 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1306 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1307 virtualForward3Shape, airSDD);
1308 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1309 virtualForward3Shape, airSDD);
1310 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1311 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1313 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1314 fgkLay3Length/2+fgkForwardLay3Length/2);
1315 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1316 -fgkLay3Length/2-fgkForwardLay3Length/2);
1318 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1320 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1321 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1322 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1323 minRadiusDetBox += detectorsThick/2;
1325 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1327 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1328 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1329 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1330 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1332 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1333 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1340 virtualLayer3->CheckOverlaps(0.01);
1341 //virtualForward3Pos->CheckOverlaps(0.01);
1342 //virtualForward3Neg->CheckOverlaps(0.01);
1345 virtualLayer3->SetVisibility(kFALSE);
1346 //virtualForward3Pos->SetVisibility(kFALSE);
1347 //virtualForward3Neg->SetVisibility(kFALSE);
1350 moth->AddNode(virtualLayer3, 1, 0);
1351 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1352 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1356 // //________________________________________________________________________
1357 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1359 // // Insert the forward pieces of layer 3 in the mother volume.
1360 // // (cooling, Carlos, LV, HV ...)
1364 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1368 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1370 // if (! fSDDsensor3) CreateBasicObjects();
1372 // Double_t dPhi = 360./fgkLay3Nladd;
1373 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1374 // Int_t iLaddMin = 0;
1375 // Int_t iLaddMax = fgkLay3Nladd;
1376 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1377 // iLaddMin = fAddOnlyLadder3min;
1378 // iLaddMax = fAddOnlyLadder3max+1;
1380 // char rotName[30];
1383 // //=================
1385 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1386 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1387 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1389 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1390 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1391 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1392 // fgkForwardLay3Length/2.);
1394 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1395 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1396 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1399 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1400 // virtualForward3Shape, airSDD);
1401 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1402 // virtualForward3Shape, airSDD);
1403 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1404 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1406 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1407 // fgkLay3Length/2+fgkForwardLay3Length/2);
1408 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1409 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1411 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1413 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1414 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1415 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1416 // minRadiusDetBox += detectorsThick/2;
1418 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1420 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1421 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1422 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1423 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1425 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1426 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1429 // if(GetDebug(1)) {
1430 // virtualForward3Pos->CheckOverlaps(0.01);
1431 // virtualForward3Neg->CheckOverlaps(0.01);
1434 // virtualForward3Pos->SetVisibility(kFALSE);
1435 // virtualForward3Neg->SetVisibility(kFALSE);
1437 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1438 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1443 //________________________________________________________________________
1444 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1446 // Insert the end-ladder of layer 3 in the mother volume.
1447 // (cooling, Carlos, LV, HV ...)
1451 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1455 if (! fSDDsensor3) CreateBasicObjects();
1458 Int_t iLaddMax = fgkLay3Nladd;
1459 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1460 iLaddMin = fAddOnlyLadder3min;
1461 iLaddMax = fAddOnlyLadder3max+1;
1464 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1465 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1468 Double_t dPhi = 360./fgkLay3Nladd;
1469 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1471 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1473 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1475 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1477 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1479 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1480 fgkLay3Length/2, ladderPhi, kTRUE);
1481 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1482 -fgkLay3Length/2, ladderPhi, kFALSE);
1484 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1485 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1489 virtualForward3Pos->CheckOverlaps(0.01);
1490 virtualForward3Neg->CheckOverlaps(0.01);
1493 // 180deg Y rotation to compensate the cancellation of ITSD volume
1494 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1495 TGeoRotation *y180 = new TGeoRotation();
1496 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1497 moth->AddNode(virtualForward3Pos, 1, y180);
1498 moth->AddNode(virtualForward3Neg, 1, y180);
1501 //________________________________________________________________________
1502 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1504 // Insert the layer 4 in the mother volume. This is a virtual volume
1505 // containing ladders of layer 4 and the supporting rings
1509 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1515 if (! fSDDsensor3) CreateBasicObjects();
1517 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1518 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1519 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1520 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1521 virtualLayer4Shape, airSDD);
1523 //====================================
1524 // First we create the central barrel
1525 //====================================
1527 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1528 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1529 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1531 Double_t dPhi = 360./fgkLay4Nladd;
1532 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1534 // placing virtual ladder and detectors volumes following ladder
1535 // ordering convention
1538 Int_t iLaddMax = fgkLay4Nladd;
1539 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1540 iLaddMin = fAddOnlyLadder4min;
1541 iLaddMax = fAddOnlyLadder4max+1;
1543 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1545 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1546 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1547 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1549 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1550 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1551 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1552 0, ladderPhi, kTRUE);
1553 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1554 ///////////////////////////////////////////////////
1555 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1556 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1558 minRadiusDetBox = fgkLay4DetLongRadius;
1559 minRadiusDetBox += detBoxThickness/2;
1560 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1561 0, ladderPhi, kTRUE);
1562 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1563 ///////////////////////////////////////////////////
1567 //====================================
1568 // Then the pieces at forward rapidity
1569 // (cooling, Carlos, LV, HV ...)
1570 //====================================
1572 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1573 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1574 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1576 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1577 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1578 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1579 fgkForwardLay4Length/2.);
1580 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1581 virtualForward4Shape, airSDD);
1582 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1583 virtualForward4Shape, airSDD);
1584 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1585 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1587 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1588 fgkLay4Length/2+fgkForwardLay4Length/2);
1589 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1590 -fgkLay4Length/2-fgkForwardLay4Length/2);
1592 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1594 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1595 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1597 minRadiusDetBox = fgkLay4DetLongRadius;
1598 minRadiusDetBox += detBoxThickness/2;
1600 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1602 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1603 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1604 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1605 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1606 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1607 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1611 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1613 virtualLayer4->SetVisibility(kFALSE);
1614 //virtualForward4Pos->SetVisibility(kFALSE);
1615 //virtualForward4Neg->SetVisibility(kFALSE);
1617 moth->AddNode(virtualLayer4,1,0);
1618 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1619 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1623 // //________________________________________________________________________
1624 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1626 // // Insert the layer 4 in the mother volume. This is a virtual volume
1627 // // containing ladders of layer 4 and the supporting rings
1628 // // (cooling, Carlos, LV, HV ...)
1632 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1636 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1638 // if (! fSDDsensor3) CreateBasicObjects();
1640 // Double_t dPhi = 360./fgkLay4Nladd;
1641 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1643 // // placing virtual ladder and detectors volumes following ladder
1644 // // ordering convention
1645 // char rotName[20];
1646 // Int_t iLaddMin = 0;
1647 // Int_t iLaddMax = fgkLay4Nladd;
1648 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1649 // iLaddMin = fAddOnlyLadder4min;
1650 // iLaddMax = fAddOnlyLadder4max+1;
1653 // //=================
1654 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1655 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1656 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1658 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1659 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1660 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1661 // fgkForwardLay4Length/2.);
1662 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1663 // virtualForward4Shape, airSDD);
1664 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1665 // virtualForward4Shape, airSDD);
1666 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1667 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1669 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1670 // fgkLay4Length/2+fgkForwardLay4Length/2);
1671 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1672 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1674 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1676 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1677 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1678 // if (iLadd%2 != 0)
1679 // minRadiusDetBox = fgkLay4DetLongRadius;
1680 // minRadiusDetBox += detBoxThickness/2;
1682 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1684 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1685 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1686 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1687 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1688 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1689 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1692 // virtualForward4Pos->SetVisibility(kFALSE);
1693 // virtualForward4Neg->SetVisibility(kFALSE);
1695 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1696 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1700 //________________________________________________________________________
1701 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1703 // Insert the end-ladder of layer 4 in the mother volume.
1704 // (cooling, Carlos, LV, HV ...)
1708 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1712 if (! fSDDsensor3) CreateBasicObjects();
1714 // placing virtual ladder and detectors volumes following ladder
1715 // ordering convention
1717 Int_t iLaddMax = fgkLay4Nladd;
1718 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1719 iLaddMin = fAddOnlyLadder4min;
1720 iLaddMax = fAddOnlyLadder4max+1;
1723 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1724 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1727 Double_t dPhi = 360./fgkLay4Nladd;
1728 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1730 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1732 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1735 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1737 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1739 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1740 fgkLay4Length/2, ladderPhi, kTRUE);
1741 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1742 -fgkLay4Length/2, ladderPhi, kFALSE);
1743 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1744 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1747 // 180deg Y rotation to compensate the cancellation of ITSD volume
1748 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1749 TGeoRotation *y180 = new TGeoRotation();
1750 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1751 moth->AddNode(virtualForward4Pos, 1, y180);
1752 moth->AddNode(virtualForward4Neg, 1, y180);
1756 //________________________________________________________________________
1757 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1759 // return an assembly volume containing the CF ladder
1762 Int_t nDetectors = fgkLay3Ndet;
1763 Double_t ladderLength = fgkLay3LadderLength;
1764 Double_t underSegDH = fLay3LadderUnderSegDH;
1765 Double_t *sensorZPos = fLay3sensorZPos;
1766 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1767 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1771 nDetectors = fgkLay4Ndet;
1772 ladderLength = fgkLay4LadderLength;
1773 digitCableA = fDigitCableLay4A;
1774 digitCableB = fDigitCableLay4B;
1775 underSegDH = fLay4LadderUnderSegDH;
1776 sensorZPos = fLay4sensorZPos;
1779 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1781 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1782 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1784 // placing virtual ladder segment following detector ordering convention
1785 //=======================================================================
1788 // adding segment this way to create cable points in the correct order ...
1789 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1791 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1792 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1793 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1794 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1795 + fgkSegmentLength/2;
1796 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1797 underSegDH/2,segmentPos);
1799 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1801 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1803 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1804 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1805 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1806 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1807 + fgkSegmentLength/2;
1808 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1809 underSegDH/2,segmentPos);
1811 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1814 // putting virtual volume corresponding to the end of ladder
1815 //=======================================================================
1816 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1817 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1818 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1819 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1820 // Euler rotation : about Z, then new X, then new Z
1821 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1822 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1823 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1824 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1825 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1827 // creating and inserting cable segments
1828 // (check points are placed while creating segments)
1829 //=======================================================================
1831 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1833 digitCableA[iSegment].SetInitialNode(virtualLadder);
1834 digitCableB[iSegment].SetInitialNode(virtualLadder);
1836 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1837 Double_t rotation = 0;
1839 rotation = 90-fgkHybridAngle;
1840 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1842 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1846 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1847 Double_t rotation = 0;
1849 rotation = fgkHybridAngle-90;
1850 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1852 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1857 //=======================================================================
1859 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1860 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1862 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1863 char cableHVname[30];
1864 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1865 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1866 cableHV[iSegment].SetName(cableHVname);
1867 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1868 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1869 cableHV[iSegment].SetNLayers(2);
1870 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1872 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1873 cableHV[iSegment].SetInitialNode(virtualLadder);
1875 Double_t x1[3], x2[3], x3[3],
1876 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1878 x1[0] = -fgkTransitHVtailXpos;
1879 x2[0] = -fgkTransitHVtailXpos;
1880 x3[0] = -fgkTransitHVtailXpos;
1881 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1882 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1883 *fgkLongHVcableSeparation;
1884 // adjust where HV long cable starts in Y
1885 // useful if you want to let some space for alignment
1886 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1887 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1888 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1890 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1891 x2[2] = x1[2]+5*fgkmm;
1892 x3[2] = ladderLength/2-endLength;
1893 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1894 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1895 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1897 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1898 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1899 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1900 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1904 x1[0] = fgkTransitHVtailXpos;
1905 x2[0] = fgkTransitHVtailXpos;
1906 x3[0] = fgkTransitHVtailXpos;
1908 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1909 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1910 *fgkLongHVcableSeparation;
1911 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1912 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1913 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1915 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1916 x2[2] = x1[2]-5*fgkmm;
1917 x3[2] = -ladderLength/2+endLength;
1918 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1919 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1920 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1922 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1923 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1927 //**********************************
1928 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1929 return virtualLadder;
1933 //________________________________________________________________________
1934 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(const char *name,
1935 Double_t dz, Double_t angle, Double_t xSign,
1936 Double_t L, Double_t H, Double_t l) {
1937 // Create one half of the V shape corner of CF ladder
1939 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1940 cfLaddSide->SetName(name);
1942 // Points must be in clockwise order
1943 cfLaddSide->SetVertex(0, 0, 0);
1944 cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1945 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1946 cfLaddSide->SetVertex(4, 0, 0);
1947 cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1948 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1950 cfLaddSide->SetVertex(1, 0, -H);
1951 cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1952 cfLaddSide->SetVertex(5, 0, -H);
1953 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1955 cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1956 cfLaddSide->SetVertex(3, 0, -H);
1957 cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1958 cfLaddSide->SetVertex(7, 0, -H);
1964 //________________________________________________________________________
1965 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1967 // return a box containing the front-end hybrid
1970 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1972 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1973 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1974 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1975 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1976 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1977 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1978 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1979 // + upFLTotalThick + ccUpLayerTotThick);
1980 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1982 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1984 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1986 //**************************************************** media :
1987 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1988 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1989 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1990 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1991 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1992 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1993 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1994 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1995 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1996 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1997 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1999 //**************************************************** main volume :
2000 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
2001 (fgkHybridLength)/2);
2002 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
2005 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
2006 fgkHybridThBridgeThick/2,
2009 //**************************************************** Thermal bridge :
2010 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
2012 carbonFiberLadderStruct);
2013 vThermalBridge->SetLineColor(fColorCarbonFiber);
2014 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
2015 +fgkHybridThBridgeThick/2, 0);
2016 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
2018 //**************************************************** Screen layer :
2019 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
2020 fgkHybAlThick/2, fgkHybridLength/2);
2021 //here the upedex and glue layers are both assumed to be polyimide
2022 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
2024 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2026 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2027 (screenTotalThick+lowFLTotalThick)/2);
2029 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2030 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2032 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2033 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2034 +fgkHybAlThick/2, 0);
2036 TGeoTranslation hybHolePos1Tr(roundHoleX,
2037 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2038 -fgkHybridLength/2+fgkHybRndHoleZ);
2039 TGeoTranslation hybHolePos2Tr(roundHoleX,
2040 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2041 fgkHybridLength/2-fgkHybRndHoleZ);
2043 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2044 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2045 hybHolePos1->SetName("hybHolePos1");
2046 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2047 hybHolePos2->SetName("hybHolePos2");
2049 upGlueScreenTr->RegisterYourself();
2050 alScreenTr->RegisterYourself();
2051 hybHolePos1->RegisterYourself();
2052 hybHolePos2->RegisterYourself();
2055 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2056 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2057 "+sRoundHole:hybHolePos2)");
2058 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2059 vScreenAl->SetLineColor(fColorAl);
2060 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2061 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2062 "+sRoundHole:hybHolePos2)");
2063 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2064 sScreenUpGlue,polyhamideSDD);
2065 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2067 hybrid->AddNode(vScreenUpGlue, 1, 0);
2068 hybrid->AddNode(vScreenAl, 1, 0);
2070 //**************************************************** FL low layer :
2071 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2072 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2074 //here the upedex and glue layers are both assumed to be polyimide
2075 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2076 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2078 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2079 fgkHybAlThick/2, sideWidth1/2);
2081 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2082 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2083 -(fgkHybridLength-sideWidth1)/2);
2084 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2085 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2086 -(fgkHybridLength-sideWidth1)/2);
2087 upGlueBarTr1->RegisterYourself();
2088 alBarTr1->RegisterYourself();
2090 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2091 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2092 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2093 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2094 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2095 sLowUpGlueBar1, polyhamideSDD);
2096 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2098 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2099 vLowAlBar1->SetLineColor(fColorAl);
2100 hybrid->AddNode(vLowUpGlueBar1,1,0);
2101 hybrid->AddNode(vLowAlBar1,1,0);
2104 //here the upedex and glue layers are both assumed to be polyimide
2105 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2106 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2108 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2109 fgkHybAlThick/2, sideWidth2/2);
2111 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2112 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2113 (fgkHybridLength-sideWidth2)/2);
2114 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2115 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2116 (fgkHybridLength-sideWidth2)/2);
2117 upGlueBarTr2->RegisterYourself();
2118 alBarTr2->RegisterYourself();
2120 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2121 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2122 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2123 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2124 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2126 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2128 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2129 vLowAlBar2->SetLineColor(fColorAl);
2130 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2131 hybrid->AddNode(vLowAlBar2, 1, 0);
2133 if(GetDebug(3)) { // Remove compiler warning.
2134 sAlScreenLayer->InspectShape();
2135 sUpGlueScreenLayer->InspectShape();
2136 sRoundHole->InspectShape();
2137 sUpGlueBar1->InspectShape();
2138 sUpGlueBar2->InspectShape();
2139 sAlBar1->InspectShape();
2140 sAlBar2->InspectShape();
2143 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2144 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2145 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2147 lowFLpiece.SetNLayers(2);
2148 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2150 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2151 // alSDD at 80% : mostly to take into account strips of piece 3
2153 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2154 lowLayerYmin + lowFLTotalThick/2,
2155 -fgkHybridLength/2 + sideWidth1 };
2156 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2157 Double_t vZ[3] = {0,0,1};
2158 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2159 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2160 lowFLpiece.SetInitialNode(hybrid);
2161 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2162 lowFLpiece.ResetPoints();
2164 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2165 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2167 lowFLpiece.SetWidth(piece2width);
2168 lowFLpiece.SetName("lowFLpiece2");
2169 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2171 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2172 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2173 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2174 lowFLpiece.ResetPoints();
2176 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2177 - fgkHybFLlowHoleAmbDX/2;
2179 lowFLpiece.SetWidth(piece3width);
2180 lowFLpiece.SetName("lowFLpiece3");
2181 x1[0] = fgkHybridWidth/2-piece3width/2;
2183 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2184 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2185 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2187 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2188 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2189 Double_t vX[3] = {1,0,0};
2190 for (Int_t i=0; i<3; i++) {
2192 sprintf(ch, "lowFLpieceA%i", i+4);
2193 lowFLpiece.SetName(ch);
2194 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2196 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2197 x1[0] = -fgkHybridWidth/2 + piece1width;
2198 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2199 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2200 x1[2] = zPiece; x2[2] = zPiece;
2201 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2202 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2203 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2204 lowFLpiece.ResetPoints();
2206 sprintf(ch, "lowFLpieceB%i", i+4);
2207 lowFLpiece.SetName(ch);
2208 x1[0] = fgkHybridWidth/2 - piece3width;
2209 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2210 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2211 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2212 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2215 //**************************************************** chips+CC:
2216 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2217 chip.SetInitialNode(hybrid);
2219 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2220 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2221 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2222 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2224 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2225 // Here the tho CC (low+up) are merged
2226 // In fact, the last layer has a smaller surface of Al -> I put 80%
2228 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2232 for (Int_t i=0; i<4; i++) {
2233 sprintf(ch, "pascalCC%i", i);
2235 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2236 x2[0] = x1[0] + fgkHybPascalDX;
2237 x1[2] = zChips[i] - fgkHybridLength/2;
2239 chip.AddCheckPoint( hybrid, 0, x1, vX );
2240 chip.AddCheckPoint( hybrid, 1, x2, vX );
2241 chip.CreateAndInsertBoxCableSegment(1,-90);
2244 sprintf(ch, "ambraCC%i", i);
2246 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2247 x2[0] = x1[0] + fgkHybAmbraDX;
2248 chip.AddCheckPoint( hybrid, 0, x1, vX );
2249 chip.AddCheckPoint( hybrid, 1, x2, vX );
2250 chip.CreateAndInsertBoxCableSegment(1,-90);
2254 //**************************************************** CC outside chips:
2255 // I don't think there is a second aluminium layer here ...
2256 for (Int_t i = 0; i<4; i++) {
2257 sprintf(ch, "ccLayerA%i", i);
2259 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2260 ccLayer1.SetInitialNode(hybrid);
2261 ccLayer1.SetNLayers(2);
2262 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2263 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2266 x1[0] = -fgkHybridWidth/2;
2267 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2268 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2269 + fgkHybChipThick + ccUpLayerTotThick/2;
2271 x1[2] = zChips[i] - fgkHybridLength/2;
2273 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2274 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2275 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2277 sprintf(ch, "ccLayerB%i", i);
2278 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2279 ccLayer2.SetInitialNode(hybrid);
2280 ccLayer2.SetNLayers(2);
2281 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2282 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2285 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2286 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2287 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2288 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2289 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2290 ccLayer2.ResetPoints();
2291 sprintf(ch, "ccLayerC%i", i);
2292 ccLayer2.SetName(ch);
2293 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2294 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2295 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2296 + ccUpLayerTotThick/2;
2299 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2300 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2301 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2304 //**************************************************** FL UP:
2305 // (last Al layer will be a special triangular shape)
2306 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2307 fgkHybFLUpperWidth/2, flUpThick/2,
2308 fgkHybFLUpperLength/2);
2309 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2310 sFLupPolyhamide, polyhamideSDD);
2311 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2312 TGeoTranslation *trFLupPolyhamide =
2313 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2314 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2316 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2318 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2319 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2320 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2321 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2322 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2323 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2324 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2325 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2326 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2327 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2330 vAluStrip->SetLineColor(fColorAl);
2331 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2332 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2334 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2335 +flUpThick+fgkHybAlThick/2;
2336 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2337 fgkHybridWidth/2,yRotAluStrip,
2338 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2339 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2340 AddTranslationToCombiTrans(aluStripTr2,0,0,
2341 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2342 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2343 AddTranslationToCombiTrans(aluStripTr3,0,0,
2344 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2345 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2346 AddTranslationToCombiTrans(aluStripTr4,0,0,
2347 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2349 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2350 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2351 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2352 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2353 //**************************************************** SMD:
2354 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2355 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2356 fgkHybSMDheight/2,fgkHybSMDendW/2);
2357 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2359 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2360 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2361 fgkHybSMDmiddleW/2);
2362 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2363 hybSMDmiddle,medSMD);
2364 vHybSMDmiddle->SetLineColor(fColorSMD);
2365 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2366 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2367 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2368 hybSMDend,medSMDweld);
2369 vHybSMDend->SetLineColor(fColorSMDweld);
2370 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2371 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2372 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2373 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2374 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2375 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2376 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2377 for (Int_t i=0; i<fgkNHybSMD; i++) {
2378 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2379 -fgkHybridWidth/2+fgkHybSMDposX[i],
2380 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2381 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2382 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2388 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2389 hybrid->SetVisibility(kFALSE);
2393 //________________________________________________________________________
2394 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2396 // Return a TGeoVolume* containing a segment of a ladder.
2399 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2400 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2401 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2403 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2404 Double_t segmentLength = fgkSegmentLength;
2405 Double_t spaceBetweenCables = 500*fgkmicron;
2407 //*****************************************
2408 // Set parameters according to (iLay,iSeg):
2409 //*****************************************
2410 Int_t nDetectors = fgkLay3Ndet;
2411 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2412 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2413 (fgkSegmentLength*fgkLay3Ndet/2. -
2414 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2415 // sensorCenterZPos = z in segment local coord syst.
2417 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2418 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2421 } else if (iLay==4) {
2422 nDetectors = fgkLay4Ndet;
2423 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2424 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2425 (fgkSegmentLength*fgkLay4Ndet/2. -
2426 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2427 digitCableA = fDigitCableLay4A;
2428 digitCableB = fDigitCableLay4B;
2430 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2433 Double_t cableSideSign = -1;
2434 if (iSeg<nDetectors/2) cableSideSign = 1;
2435 Double_t spaceForCables = spaceBetweenCables*
2436 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2438 // gives [0-1-2-2-1-0]*spaceBetweenCables
2439 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2440 Int_t iUpdateCableMin;
2441 Int_t iUpdateCableMax;
2442 if (cableSideSign==-1) {
2443 iUpdateCableMin = nDetectors/2;
2444 iUpdateCableMax = iSeg-1;
2446 iUpdateCableMin = iSeg+1;
2447 iUpdateCableMax = nDetectors/2-1;
2451 cout << "Segment ("<< iLay <<',' << iSeg
2452 << ") : sensor z shift in local segment coord.="
2453 << sensorCenterZPos << endl;
2456 //****************************
2457 // The segment volume
2458 //****************************
2460 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2461 // likely slows down the transport of particles through the geometry
2463 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2465 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2466 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2467 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2470 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2472 virtualSeg->SetVisibility(kFALSE);
2474 //******************************
2475 // Carbon fiber structure :
2476 //******************************
2478 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2479 Int_t volumeIndex = 1;
2480 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2481 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2485 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2486 fLaddSegCommonTr[i]);
2489 //**********************************
2490 // Pine support of the sensors :
2491 //**********************************
2492 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2493 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2495 // The use of the following constructor type allow to use rotPS1 and rotPS2
2496 // (and not copy them) therefore we gain some memory
2497 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2498 - fgkLadderHeight/2.-tDY
2499 + fgkPinSuppHeight/2.,
2500 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2502 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2503 - fgkLadderHeight/2.-tDY
2504 + fgkPinSuppHeight/2.,
2505 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2506 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2508 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2509 - fgkLadderHeight/2.-tDY
2510 + fgkPinSuppHeight/2.,
2511 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2512 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2514 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2515 - fgkLadderHeight/2.-tDY
2516 + fgkPinSuppHeight/2.,
2517 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2518 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2520 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2521 - fgkLadderHeight/2. - tDY
2522 + fgkPinSuppHeight/2.,
2523 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2525 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2526 - fgkLadderHeight/2. - tDY
2527 + fgkPinSuppHeight/2.,
2528 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2529 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2531 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2532 - fgkLadderHeight/2. - tDY
2533 + fgkPinSuppHeight/2.,
2534 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2535 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2537 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2538 - fgkLadderHeight/2. - tDY
2539 + fgkPinSuppHeight/2.,
2540 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2541 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2543 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2544 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2545 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2546 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2547 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2548 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2549 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2550 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2552 TGeoMedium *pinMed = GetMedium("SDDKAPTON (POLYCH2)$"); // medium ???
2553 Double_t fgkPinHeight = 4.5*fgkmm;
2554 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2556 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2558 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2559 - fgkLadderHeight/2.-tDY
2561 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2562 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2563 virtualSeg->AddNode(pineV, 1, transPS2b);
2565 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2566 - fgkLadderHeight/2. - tDY
2568 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2569 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2570 virtualSeg->AddNode(pineV, 2, transPS6b);
2573 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2574 - fgkLadderHeight/2.-tDY
2576 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2577 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2578 virtualSeg->AddNode(pineV, 3, transPS4b);
2580 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2581 - fgkLadderHeight/2. - tDY
2583 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2584 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2585 virtualSeg->AddNode(pineV, 4, transPS8b);
2588 //******************************
2589 // Cooling pipe supports :
2590 //******************************
2591 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2592 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2593 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2594 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2596 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2597 (triangleHeight+triangleCPaxeDist/
2598 TMath::Sin(halfTheta)-coolPipeSuppH);
2599 if (fAddCoolingSyst) {
2600 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2601 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2602 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2603 -fgkLadderHeight/2. - tDY
2604 +coolPipeSuppH+fgkLadderBeamRadius,
2605 -segmentLength/2., rotCPS1);
2607 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2608 -fgkLadderHeight/2. - tDY
2609 +coolPipeSuppH+fgkLadderBeamRadius,
2610 -segmentLength/2., rotCPS1);
2611 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2613 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2614 -fgkLadderHeight/2.- tDY
2615 +coolPipeSuppH+fgkLadderBeamRadius,
2616 segmentLength/2., rotCPS2);
2618 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2619 -fgkLadderHeight/2.- tDY
2620 +coolPipeSuppH+fgkLadderBeamRadius,
2621 segmentLength/2., rotCPS2);
2622 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2624 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2625 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2626 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2627 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2630 //************************
2632 //************************
2633 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2634 -fgkLadderHeight/2. - tDY +
2635 fgkLadderBeamRadius+coolPipeSuppH, 0);
2636 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2637 -fgkLadderHeight/2.- tDY +
2638 fgkLadderBeamRadius+coolPipeSuppH, 0);
2640 if (fAddCoolingSyst) {
2641 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2642 fgkCoolPipeOuterDiam/2,
2644 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2647 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2648 coolingPipeShape, phynoxSDD );
2649 coolingPipe->SetLineColor(fColorPhynox);
2650 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2654 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2655 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2657 virtualSeg->AddNode(cooler, 1, pipeTr1);
2658 virtualSeg->AddNode(cooler, 2, pipeTr2);
2662 //**********************************
2663 // Bases of hybrid thermal bridges
2664 //**********************************
2665 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2666 // approx !!! not clear on 0752/14-A
2667 if (fAddCoolingSyst) {
2668 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2669 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2670 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2671 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2673 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2674 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2677 //*************************
2679 //*************************
2680 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2681 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2683 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2684 - shiftHyb*SinD(fgkHybridAngle) );
2685 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2686 + shiftHyb*CosD(fgkHybridAngle) );
2688 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2689 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2690 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2691 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2692 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2693 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2695 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2696 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2703 // Starting from this segment
2704 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2705 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2706 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2707 - digitCableA->GetWidth()/2;
2708 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2709 - digitCableA->GetThickness()/2;
2711 Double_t digitCableX = ( coolPipeSuppL
2712 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2713 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2714 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2715 + fgkLadderBeamRadius+coolPipeSuppH
2716 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2717 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2720 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2721 digitCableY, cableSideSign*hybDz };
2722 Double_t digitCableCenterA1[3] = {
2723 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2724 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2725 cableSideSign*segmentLength/2 };
2727 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2728 digitCableY,cableSideSign*hybDz};
2729 Double_t digitCableCenterB1[3]={
2730 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2731 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2732 cableSideSign*segmentLength/2 };
2734 Double_t vZ[3] = {0,0,1};
2735 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2736 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2737 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2738 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2740 // Updating the other cables
2741 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2743 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2745 digitCableA[iCable].GetPoint( 1, coord);
2746 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2747 digitCableB[iCable].GetPoint( 1, coord);
2748 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2752 //**********************************
2753 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2758 //________________________________________________________________________
2759 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2761 // Create a pine support and its pine
2762 // axis of rotation is the cone axis, center in its middle
2764 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?
2766 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2767 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2768 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2769 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2770 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2771 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2772 fgkPinSuppHeight/2.+0.00001);
2773 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2775 if(GetDebug(3)){// Remove compiler warning.
2776 cone->InspectShape();
2777 tong->InspectShape();
2778 hole->InspectShape();
2781 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2782 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2783 tongTrans->RegisterYourself();
2784 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2785 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2786 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2788 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2790 pinSupport->SetLineColor(fColorRyton);
2796 //________________________________________________________________________
2797 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2799 // Create half of the cooling pipe support (ALR-0752/3)
2802 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2804 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2805 side1->SetName("ITSsddCPSside1");
2806 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2807 side1->SetVertex( 1, 0, fgkCoolPipeSuppWidthExt/2.);
2808 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2809 fgkCoolPipeSuppWidthExt/2.);
2810 side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX,
2811 -fgkCoolPipeSuppWidthExt/2.);
2812 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2813 side1->SetVertex( 5, 0, fgkCoolPipeSuppWidthExt/2.);
2814 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2815 fgkCoolPipeSuppWidthExt/2.);
2816 side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2.,
2817 -fgkCoolPipeSuppWidthExt/2.);
2819 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2820 - fgkCoolPipeSuppAxeDist
2821 + fgkCoolPipeSuppWidthExt/2., 0);
2822 side1Tr->RegisterYourself();
2823 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2824 - fgkCoolPipeSuppAxeDist
2825 + fgkCoolPipeSuppWidthExt*3/2.
2826 + fgkCoolPipeSuppWidthIn,0);
2827 side2Tr->RegisterYourself();
2829 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2830 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2831 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2832 TGeoTranslation *middleTr =
2833 new TGeoTranslation("ITSsddCPStr3",
2834 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2835 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2836 +fgkCoolPipeSuppWidthIn/2., 0);
2837 middleTr->RegisterYourself();
2839 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2840 fgkCoolPipeSuppTongW/4.,
2841 (fgkCoolPipeSuppFulWidth
2842 - 2*fgkCoolPipeSuppWidthExt
2843 - fgkCoolPipeSuppWidthIn)/2,
2844 fgkCoolPipeSuppHeight/2.);
2846 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2847 fgkCoolPipeSuppTongW/4.,
2848 - fgkCoolPipeSuppAxeDist
2849 + fgkCoolPipeSuppFulWidth
2850 - axeBox->GetDY(), 0);
2851 axeBoxTr->RegisterYourself();
2853 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2854 fgkCoolPipeSuppTongW/4.);
2856 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2857 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2858 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2859 axeTrans->RegisterYourself();
2860 //delete axeRot; // make the code crash, no idea of why !!!
2863 middle->InspectShape();
2864 axe->InspectShape();
2867 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2869 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2870 "ITSsddCoolPipeSuppShapeL",
2871 "ITSsddCPSmiddle:ITSsddCPStr3"
2872 "+ITSsddCPSside1:ITSsddCPStr1"
2873 "+ITSsddCPSside1:ITSsddCPStr2"
2874 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2875 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2876 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2877 coolPipeSuppShape, rytonSDD);
2879 coolPipeSupp->SetLineColor(fColorRyton);
2881 return coolPipeSupp;
2885 //________________________________________________________________________
2886 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2888 //Create half of the cooling pipe support (ALR-0752/3)
2891 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2893 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2894 side1->SetName("ITSsddCPSside1R");
2895 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2896 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2897 -fgkCoolPipeSuppWidthExt/2.);
2898 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2899 fgkCoolPipeSuppWidthExt/2.);
2900 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2901 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2902 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2903 -fgkCoolPipeSuppWidthExt/2.);
2904 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2905 fgkCoolPipeSuppWidthExt/2.);
2906 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2908 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2909 - fgkCoolPipeSuppAxeDist
2910 + fgkCoolPipeSuppWidthExt/2., 0);
2911 side1Tr->RegisterYourself();
2912 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2913 - fgkCoolPipeSuppAxeDist
2914 + fgkCoolPipeSuppWidthExt*3/2.
2915 + fgkCoolPipeSuppWidthIn, 0);
2916 side2Tr->RegisterYourself();
2918 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2919 (fgkCoolPipeSuppMaxLength/2.
2920 - fgkCoolPipeSuppSlitL)/2.,
2921 fgkCoolPipeSuppWidthIn/2.,
2922 fgkCoolPipeSuppHeight/2.);
2923 TGeoTranslation *middleTr =
2924 new TGeoTranslation("ITSsddCPStr3R",
2925 -( fgkCoolPipeSuppMaxLength/2.
2926 -fgkCoolPipeSuppSlitL)/2.,
2927 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2928 + fgkCoolPipeSuppWidthIn/2.,0);
2929 middleTr->RegisterYourself();
2931 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2932 fgkCoolPipeSuppTongW/4.,
2933 (fgkCoolPipeSuppFulWidth
2934 - 2*fgkCoolPipeSuppWidthExt
2935 - fgkCoolPipeSuppWidthIn)/2,
2936 fgkCoolPipeSuppHeight/2.);
2938 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2939 - fgkCoolPipeSuppTongW/4.,
2940 - fgkCoolPipeSuppAxeDist
2941 + fgkCoolPipeSuppFulWidth
2942 - axeBox->GetDY(),0);
2943 axeBoxTr->RegisterYourself();
2945 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2946 fgkCoolPipeSuppTongW/4.);
2948 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2949 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2950 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2951 axeTrans->RegisterYourself();
2955 middle->InspectShape();
2956 axe->InspectShape();
2959 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2960 "ITSsddCoolPipeSuppShapeR",
2961 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2962 "+ITSsddCPSside1R:ITSsddCPStr1R"
2963 "+ITSsddCPSside1R:ITSsddCPStr2R"
2964 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2965 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2967 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2968 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2969 coolPipeSuppShape, rytonSDD);
2970 coolPipeSupp->SetLineColor(fColorRyton);
2972 return coolPipeSupp;
2975 //________________________________________________________________________
2976 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2978 // based on ALR 0752/8
2981 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2983 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2984 - (fgkRadiusAminBTB+fgkBTBthick);
2985 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2986 fgkBTBthick/2., fgkBTBlength/2.);
2987 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2988 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2989 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2990 base1Tr->RegisterYourself();
2992 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2994 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2995 fgkBTBthick/2., fgkBTBlength/2.);
2996 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2997 fgkBTBaxisAtoBottom - base2width/2.,
2998 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2999 base2Tr->RegisterYourself();
3001 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
3002 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
3003 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
3004 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
3005 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
3006 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
3007 sideTr1->RegisterYourself();
3008 sideTr2->RegisterYourself();
3010 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
3011 fgkBTBthick/2., fgkBTBHoleLength/2.);
3012 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
3013 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3014 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3015 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
3016 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
3017 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3018 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3019 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
3020 holeTr1->RegisterYourself();
3021 holeTr2->RegisterYourself();
3023 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
3024 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3025 fgkRadiusAminBTB, radiusAmaxBTB,
3026 fgkBTBlength/2., 0., 180.);
3027 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3028 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3029 fgkBTBlength/2., 270., 360.);
3030 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3031 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3033 roundTr1->RegisterYourself();
3035 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3036 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3037 fgkBTBlength/2., 180., 270.);
3038 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3039 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3041 roundTr2->RegisterYourself();
3043 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3044 "ITSsddBaseThermalBridgeShape",
3045 "ITSsddBTBbase1:ITSsddBTBtr1"
3046 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3047 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3048 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3049 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3050 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3051 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3052 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3053 "+ ITSsddBTBmainAxis");
3055 if(GetDebug(3)){// Remove compiler warning.
3056 base1->InspectShape();
3057 base2->InspectShape();
3058 side->InspectShape();
3059 hole->InspectShape();
3060 mainAxis->InspectShape();
3061 round1->InspectShape();
3062 round2->InspectShape();
3065 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3066 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3068 carbonFiberLadderStruct);
3070 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3071 return vBaseThermalBridge;
3075 //________________________________________________________________________
3076 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3078 // Return an assembly containing a end of a CF ladder.
3081 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3082 TGeoMedium *stesalite = GetMedium("G10FR4$");
3083 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3084 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3086 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3087 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3088 Double_t underSegDH = fLay3LadderUnderSegDH;
3089 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3090 // footDZ is also where to place the ruby's center in local Z
3091 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3094 } else if (iLay==4) {
3095 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3096 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3097 underSegDH = fLay4LadderUnderSegDH;
3098 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3099 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3101 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3105 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3106 + underSegDH/2); //space under ladder segment
3107 // here tDY is not the same as for the segment because the end ladder
3108 // does not have a space under it, inside the general ladder volume.
3109 Double_t segmentLength = fgkSegmentLength;
3110 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3112 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3114 //**********************************
3115 // coding real matter :
3116 //**********************************
3117 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3118 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3119 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3120 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3122 //--- The 3 V shape corners of the Carbon Fiber Ladder
3124 TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape",
3125 topCornerLength/2., halfTheta, -1,
3126 fgkLadderLa, fgkLadderHa, fgkLadderl);
3127 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1",
3128 cfLaddTop1,carbonFiberLadderStruct);
3129 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3130 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape",
3131 topCornerLength/2., halfTheta, 1,
3132 fgkLadderLa, fgkLadderHa, fgkLadderl);
3133 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3134 cfLaddTop2,carbonFiberLadderStruct);
3135 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3136 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3137 -(length-topCornerLength)/2.);
3138 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3139 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3142 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape",
3143 length/2., beta, -1,
3144 fgkLadderLb, fgkLadderHb, fgkLadderl);
3145 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3146 cfLaddSide1,carbonFiberLadderStruct);
3147 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3148 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape",
3150 fgkLadderLb, fgkLadderHb, fgkLadderl);
3151 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3152 cfLaddSide2,carbonFiberLadderStruct);
3153 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3154 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3155 TMath::Tan(beta) - fgkLadderBeamRadius );
3157 // because center of the triangle doesn't correspond to virtual vol. center
3158 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3159 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3160 alpha*TMath::RadToDeg());
3161 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3162 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3163 -alpha*TMath::RadToDeg());
3164 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3165 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3166 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3167 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3168 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3171 // Beams on the sides
3172 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3173 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3175 //Euler rotation : about Z, then new X, then new Z
3176 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3177 -beamPhiPrime*TMath::RadToDeg(), -90);
3178 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3179 beamPhiPrime*TMath::RadToDeg(), -90);
3180 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3181 beamPhiPrime*TMath::RadToDeg(), -90);
3182 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3183 -beamPhiPrime*TMath::RadToDeg(), -90);
3184 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3185 TMath::Tan(halfTheta),
3186 fgkLadderBeamRadius/2. + tDY,
3187 -length/2 + segmentLength/8, beamRot1);
3188 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3189 TMath::Tan(halfTheta),
3190 fgkLadderBeamRadius/2.+tDY,
3191 -length/2 + 3*segmentLength/8, beamRot2);
3192 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3193 TMath::Tan(halfTheta),
3194 fgkLadderBeamRadius/2.+tDY,
3195 -length/2 + segmentLength/8, beamRot3);
3196 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3197 TMath::Tan(halfTheta),
3198 fgkLadderBeamRadius/2. + tDY,
3199 -length/2+3*segmentLength/8, beamRot4);
3201 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3202 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3203 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3204 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3206 //--- Beams of the bottom
3207 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3209 /* Not there actually
3210 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3211 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3212 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3213 bottomBeam1, carbonFiberLadderStruct);
3214 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3216 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3217 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3218 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3219 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3221 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3222 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3223 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3224 bottomBeam2, carbonFiberLadderStruct);
3225 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3226 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3227 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3228 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3230 //**********************************
3231 //the cooling pipe supports
3232 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3233 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3235 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3236 (triangleHeight+triangleCPaxeDist/
3237 TMath::Sin(halfTheta)-coolPipeSuppH);
3239 if (fAddCoolingSyst) {
3240 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3241 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3242 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3243 -fgkLadderHeight/2.+ tDY +
3244 coolPipeSuppH+fgkLadderBeamRadius,
3245 -length/2., rotCPS1);
3246 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3247 -fgkLadderHeight/2.+ tDY +
3248 coolPipeSuppH+fgkLadderBeamRadius,
3249 -length/2., rotCPS2);
3251 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3252 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3255 //**********************************
3256 //--- The stesalite foot of the ladder
3258 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3259 - fgkLadFootY/2+fgkLadFingerPrintY;
3261 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3262 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3264 //=====================================
3267 if (fAddCoolingSyst) {
3269 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3270 -fgkLadderHeight/2.+ tDY +
3271 coolPipeSuppH + fgkLadderBeamRadius,
3272 -length/2.+coolPipeEndLen/2.);
3273 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3274 -fgkLadderHeight/2. + tDY +
3275 fgkLadderBeamRadius + coolPipeSuppH,
3276 -length/2.+coolPipeEndLen/2.);
3278 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3279 fgkCoolPipeOuterDiam/2,
3281 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3284 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3285 coolingPipeShape, phynoxSDD );
3286 coolingPipe->SetLineColor(fColorPhynox);
3287 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3290 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3291 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3293 virtualEnd->AddNode(cooler, 1, pipeTr1);
3294 virtualEnd->AddNode(cooler, 2, pipeTr2);
3298 //=====================================
3299 //--- HV cable guide
3302 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3303 fgkHVguideY1/2,fgkHVguideZ1/2);
3304 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3306 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3307 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3308 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3309 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3311 //=====================================
3313 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3314 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3315 -fgkLadderHeight/2.+ tDY +
3316 coolPipeSuppH+fgkLadderBeamRadius,
3317 -length/2.+coolPipeEndLen+raccordFullLen/2);
3318 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3319 -fgkLadderHeight/2.+ tDY +
3320 coolPipeSuppH+fgkLadderBeamRadius,
3321 -length/2.+coolPipeEndLen+raccordFullLen/2);
3323 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3324 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3326 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3331 //________________________________________________________________________
3332 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3334 //--- The stesalite foot of the ladder
3336 // The 2 screw holes on the left part
3337 // the small holes at each corner of the ruby cage (diam 2mm)
3338 // the really small level difference of 0.3mm on the bottom
3341 TGeoMedium *stesalite = GetMedium("G10FR4$");
3343 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3345 Double_t epsilon = 2e-10;
3346 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3348 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3349 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3350 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3351 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3353 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3354 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3355 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3358 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3359 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3361 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3362 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3363 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3365 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3366 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3367 rubyScrewHoleLen/2);
3369 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3370 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3371 fgkLadFootX/2-rubyScrewHoleLen/2,
3372 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3374 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3375 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3378 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3379 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3380 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3382 ladFootBox1Tr->RegisterYourself();
3383 ladFingerPrintTr->RegisterYourself();
3384 rubyCageHoleTr->RegisterYourself();
3385 rubyScrewHoleTr->RegisterYourself();
3386 rubyHoleTr->RegisterYourself();
3388 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3389 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3390 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3391 "+rubyHole:rubyHoleTr)");
3392 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3393 footRightPart,stesalite);
3394 vFootRightPart->SetLineColor(fColorStesalite);
3396 virtualFoot->AddNode(vFootRightPart, 1, 0);
3399 //--- This was the right part of the foot, now let's do the middle
3400 //--- and the right parts
3402 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3403 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3405 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3406 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3407 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3409 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3410 vFootMiddle->SetLineColor(fColorStesalite);
3411 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3414 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3415 (fgkLadFootY-fgkLadFingerPrintY)/2,
3417 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3418 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3419 -fgkLadFingerPrintY/2, 0);
3420 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3422 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3423 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3426 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3429 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3430 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3432 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3433 vFootLeft->SetLineColor(fColorStesalite);
3434 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3436 if(GetDebug(3)){ // Remove compiler warning.
3437 ladFingerPrint->InspectShape();
3438 ladFootBox1->InspectShape();
3439 rubyCageHole->InspectShape();
3440 rubyScrewHole->InspectShape();
3441 rubyHole->InspectShape();
3447 //________________________________________________________________________
3448 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3450 // return an assembly containing the CARLOS end-ladder board
3451 // and the heat bridge
3455 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3456 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3457 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3458 TGeoMedium *copper = GetMedium("COPPER$");
3459 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3460 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3462 //=========================================
3463 // cooling support of the Carlos card (HeatBridge):
3464 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3466 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3468 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3470 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3471 supCarlosBoard1, alCu12SDD);
3472 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3473 supCarlosBoard2, alCu12SDD);
3474 vSupCarlosBoard1->SetLineColor(4);
3475 vSupCarlosBoard2->SetLineColor(4);
3478 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3479 // shift of the main planes in the direction of their width
3480 // the center is fixed at the center of the 2 small fixing arms on each sides.
3483 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3484 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3485 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3486 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3488 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3489 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3492 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3496 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3497 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3499 //=========================================
3500 // fixing arm of the cooling support :
3501 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3503 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3504 supCarlosBoard3, alCu12SDD);
3505 vSupCarlosBoard3->SetLineColor(4);
3508 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3510 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3511 littleScrew, stainless);
3512 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3513 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3514 fgkLittleScrewHeadR-0.07, rotScrew);
3515 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3516 fgkLittleScrewHeadR+0.07, rotScrew);
3517 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3518 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3520 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3521 0, fgkCarlosSuppAngle, 0);
3522 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3523 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3524 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3525 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3526 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3527 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3530 //=========================================
3531 // screws fixing the board on the U tube
3532 Double_t aaa = fgkCarlosSuppY3; // ???
3533 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3534 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3535 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3536 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3537 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3538 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3540 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3542 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3543 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3544 screw1y,screw1z, CarlosSuppRot);
3546 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3547 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3548 screw1z,screw1y, CarlosSuppRot);
3550 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3551 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3552 screw1y,screw1z, CarlosSuppRot);
3554 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3555 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3556 screw1z,screw1y, CarlosSuppRot);
3558 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3559 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3560 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3561 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3563 //=========================================
3565 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3566 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3567 card1.SetNLayers(2);
3568 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3569 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3570 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3571 p1[0] = -fgkCarlosCardX1/2;
3572 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3573 p1[2] = fgkCarlosCardShift;
3574 p2[0] = fgkCarlosCardX1/2;
3575 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3576 p2[2] = fgkCarlosCardShift;
3577 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3578 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3579 card1.CreateAndInsertBoxCableSegment(1,90);
3581 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3582 card2.SetNLayers(2);
3583 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3584 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3585 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3587 p1[0] = -fgkCarlosCardX1/2;
3588 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3589 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3591 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3592 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3593 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3594 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3595 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3596 card2.CreateAndInsertBoxCableSegment(1,90);
3598 //=========================================
3599 // some chips on the board
3601 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3603 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3604 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3605 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3607 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3608 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3609 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3611 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3612 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3613 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3614 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3615 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3616 u1.CreateAndInsertBoxCableSegment(1,90);
3619 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3621 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3622 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3623 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3625 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3626 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3627 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3629 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3630 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3631 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3632 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3633 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3634 u2.CreateAndInsertBoxCableSegment(1,90);
3637 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3639 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3640 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3641 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3643 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3644 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3646 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3648 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3650 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3651 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3652 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3653 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3655 //--- U4 is like U3 (?)
3656 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3657 u4Trans->RotateX(90);
3658 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3659 fgkCarlosCardShift + fgkCarlosU4posZ);
3660 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3663 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3665 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3666 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3667 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3669 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3670 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3671 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3673 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3674 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3675 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3676 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3677 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3678 u17.CreateAndInsertBoxCableSegment(1,90);
3681 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3683 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3684 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3685 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3687 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3688 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3689 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3691 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3692 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3693 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3694 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3695 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3696 u35.CreateAndInsertBoxCableSegment(1,90);
3699 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3701 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3702 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3703 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3705 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3706 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3707 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3709 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3710 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3711 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3712 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3713 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3714 u36.CreateAndInsertBoxCableSegment(1,90);
3717 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3719 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3720 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3721 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3723 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3724 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3725 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3727 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3728 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3729 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3730 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3731 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3732 qz1.CreateAndInsertBoxCableSegment(1,90);
3734 return assemblySupCarlos;
3737 //________________________________________________________________________
3738 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3740 // Creates the assemblies containing the LV cards (left and right)
3743 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3744 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3745 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3746 TGeoMedium *copper = GetMedium("COPPER$");
3747 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3748 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3750 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3751 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3753 // we are going to use flat cable class to create multilayer box,
3754 // then we can use the pointers to created volumes to place them elsewhere
3755 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3757 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3758 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3759 cardLV.SetNLayers(2);
3760 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3761 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3762 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3764 p1[1] = fgkLVcardY/2;
3767 p2[1] = fgkLVcardY/2;
3769 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3770 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3771 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3772 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3773 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3774 fCardLVR->AddNode(boxVol, 1, trCard);
3776 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3777 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3778 chipO.SetNLayers(2);
3779 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3780 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3781 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3782 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3783 p1[1] = fgkLVChip0PosY;
3784 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3786 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3787 p2[1] = fgkLVChip0PosY;
3788 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3789 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3790 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3791 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3792 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3794 carLVfullThick/2+chip0fullThick/2, rotAdd);
3795 fCardLVR->AddNode(boxVol, 1, trCard);
3797 // put also this chip on the other side of the card
3798 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3800 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3801 fCardLVL->AddNode(boxVol, 2, trCard);
3802 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3804 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3805 fCardLVR->AddNode(boxVol, 2, trCard);
3807 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3808 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3809 chip1.SetNLayers(2);
3810 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3811 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3812 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3813 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3814 p1[1] = fgkLVChip1PosY;
3815 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3817 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3818 p2[1] = fgkLVChip1PosY;
3819 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3820 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3821 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3822 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3823 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3825 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3826 fCardLVR->AddNode(boxVol, 1, trCard);
3828 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3829 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3830 chip2.SetNLayers(2);
3831 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3832 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3833 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3834 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3835 p1[1] = fgkLVChip2PosY;
3836 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3837 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3838 p2[1] = fgkLVChip2PosY;
3839 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3840 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3841 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3842 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3843 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3845 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3846 fCardLVR->AddNode(boxVol, 1, trCard);
3848 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3849 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3850 chip3.SetNLayers(2);
3851 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3852 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3853 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3854 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3855 p1[1] = fgkLVChip3PosY;
3856 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3857 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3858 p2[1] = fgkLVChip3PosY;
3859 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3860 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3861 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3862 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3863 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3865 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3866 fCardLVR->AddNode(boxVol, 1, trCard);
3868 // the Al pieces for heat exchange :
3869 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3870 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3872 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3873 (fgkLVcoolX1/2+fgkLVcoolX2),
3874 fgkLVcoolPosY+fgkLVcoolY1/2,
3875 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3876 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3877 (fgkLVcoolX1/2+fgkLVcoolX2),
3878 fgkLVcoolPosY+fgkLVcoolY1/2,
3879 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3881 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3883 vAlLVcooling1->SetLineColor(2);
3886 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3887 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3888 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3890 fgkLVcoolPosY+fgkLVcoolY1/2,
3891 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3892 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3894 fgkLVcoolPosY+fgkLVcoolY1/2,
3895 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3897 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3899 vAlLVcooling2->SetLineColor(2);
3902 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3904 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3905 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3906 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3908 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3910 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3911 vAlLVcooling3->SetLineColor(2);
3913 //=== screw fixing th LV card to the U cooling tube :
3914 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3916 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3917 littleScrew, stainless);
3918 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3920 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3922 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3924 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3925 0, fgkLittleLVScrewHeadR,
3926 fgkLittleScrewHeadH/2);
3927 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3928 littleScrewHead, stainless);
3929 vLittleScrewHead->SetLineColor(kGray);
3930 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3931 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3932 fgkShiftLittleScrewLV,
3934 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3936 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3937 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3938 fgkShiftLittleScrewLV,
3940 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3942 // adding the cooling pieces to the left card
3943 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3944 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3945 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3946 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3947 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3949 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3950 -(fgkLVcoolX1/2+fgkLVcoolX2),
3951 fgkLVcoolPosY+fgkLVcoolY1/2,
3952 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3953 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3954 -(fgkLVcoolX1/2+fgkLVcoolX2),
3955 fgkLVcoolPosY+fgkLVcoolY1/2,
3956 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3957 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3959 fgkLVcoolPosY+fgkLVcoolY1/2,
3960 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3961 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3963 fgkLVcoolPosY+fgkLVcoolY1/2,
3964 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3966 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3968 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3970 // and to the right card
3971 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3972 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3973 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3974 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3975 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3980 //________________________________________________________________________
3981 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3983 // return an assembly containing the HV card
3987 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3988 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3989 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3990 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3991 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3992 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3994 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3996 //====================================
3997 //--- the card itself
3998 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
3999 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
4000 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
4001 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
4003 highVCard->AddNode(vCeramicCard, 1, 0);
4006 //====================================
4010 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
4011 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
4012 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
4015 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
4016 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
4017 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
4019 vCapa1End->SetLineColor(18);// grey silver
4020 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
4021 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4022 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
4023 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4025 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
4026 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
4027 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4029 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
4030 capa1->AddNode(vCapa1Middle, 1,0);
4031 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4032 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4034 highVCard->AddNode(capa1, 1, capa1PosTr);
4037 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4038 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4039 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4042 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4043 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4044 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4046 vCapa2End->SetLineColor(18);// grey silver
4047 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4048 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4049 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4050 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4052 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4053 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4054 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4056 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4057 capa2->AddNode(vCapa2Middle, 1,0);
4058 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4059 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4061 highVCard->AddNode(capa2, 1, capa2PosTr);
4064 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4065 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4066 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4069 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4070 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4071 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4073 vCapa3End->SetLineColor(18);// grey silver
4075 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4076 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4077 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4078 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4080 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4081 capa3->AddNode(vCapa3Middle, 1,0);
4082 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4083 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4085 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4086 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4087 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4089 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4090 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4091 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4093 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4094 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4095 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4097 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4098 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4099 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4101 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4102 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4103 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4105 highVCard->AddNode(capa3, 1, capa3PosTr1);
4106 highVCard->AddNode(capa3, 2, capa3PosTr2);
4107 highVCard->AddNode(capa3, 3, capa3PosTr3);
4108 highVCard->AddNode(capa3, 4, capa3PosTr4);
4109 highVCard->AddNode(capa3, 5, capa3PosTr5);
4111 //====================================
4112 //--- connexions to LV card
4114 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4115 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4116 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4117 Double_t fgkConnexLVHVx = 3*fgkmm;
4118 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4119 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4121 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4122 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4123 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4124 fgkConnexLVHVdiam1/2,
4125 fgkConnexLVHVdiam2/2,
4126 fgkConnexLVHVlen/2);
4127 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4128 connexLVHVmetal, stainless);
4129 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4130 connexLVHVplastic, plastic);
4131 vConnexLVHVmetal->SetLineColor(10);// white
4132 vConnexLVHVplast->SetLineColor(12); // dark grey
4134 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4135 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4136 connexion->AddNode(vConnexLVHVplast, 1, 0);
4138 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4139 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4140 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4141 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4143 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4144 fgkConnexLVHVy1+fgkConnexLVHVdy,
4145 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4146 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4147 fgkConnexLVHVy1+fgkConnexLVHVdy,
4148 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4150 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4151 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4152 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4153 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4154 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4155 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4157 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4158 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4159 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4160 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4161 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4162 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4164 highVCard->AddNode(connexion, 1, trConnexion1);
4165 highVCard->AddNode(connexion, 2, trConnexion2);
4166 highVCard->AddNode(connexion, 3, trConnexion3);
4167 highVCard->AddNode(connexion, 4, trConnexion4);
4168 highVCard->AddNode(connexion, 5, trConnexion5);
4169 highVCard->AddNode(connexion, 6, trConnexion6);
4170 highVCard->AddNode(connexion, 7, trConnexion7);
4171 highVCard->AddNode(connexion, 8, trConnexion8);
4173 //====================================
4174 //--- cooling pieces
4176 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4177 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4180 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4181 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4183 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4184 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4186 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4188 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4190 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4192 // This last volume contains the screw used for fixing
4193 // the card to the cooling tube ...
4194 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4196 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4197 littleScrewHV, stainless);
4199 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4200 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4202 vCardHVcool1->SetLineColor(2); //red
4203 vCardHVcool2->SetLineColor(2); //red
4204 vCardHVcool3->SetLineColor(2); //red
4206 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4207 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4208 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4209 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4210 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4211 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4212 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4213 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4215 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4216 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4218 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4219 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4220 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4221 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4223 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4224 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4225 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4226 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4228 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4229 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4231 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4232 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4233 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4234 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4236 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4237 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4238 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4239 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4241 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4242 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4244 //====================================
4246 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4247 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4248 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4249 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4251 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4252 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4253 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4254 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4257 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4258 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4264 //________________________________________________________________________
4265 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4267 // return an assembly containing the LV, HV and Carlos cards of one ladder
4268 // and their cooling system
4271 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4272 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4273 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4275 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4277 //=*********************************
4278 //--- The rounded pipe for the end ladder card coooling
4280 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4281 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4285 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4286 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4290 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4291 endLadderPipe.SetNLayers(2);
4292 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4293 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4295 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4296 // of the U colling pipe in its center
4298 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4299 Double_t vectA[3] = {0,0,1};
4301 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4302 Double_t vectB[3] = {0,0,1};
4304 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4305 Double_t vectC[3] = {1,0,0};
4307 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4308 Double_t vectD[3] = {-1,0,0};
4310 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4311 Double_t vectE[3] = {0,0,-1};
4313 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4314 Double_t vectF[3] = {0,0,-1};
4316 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4317 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4318 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4319 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4320 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4321 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4323 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4324 //endLadderPipe.CreateAndInsertCableSegment( 1);
4325 endLadderPipe.CreateAndInsertTubeSegment( 1);
4326 //endLadderPipe.CreateAndInsertCableSegment( 2);
4327 endLadderPipe.CreateAndInsertTorusSegment( 2);
4328 //endLadderPipe.CreateAndInsertCableSegment( 3);
4329 endLadderPipe.CreateAndInsertTubeSegment( 3);
4330 //endLadderPipe.CreateAndInsertCableSegment( 4);
4331 endLadderPipe.CreateAndInsertTorusSegment( 4);
4332 //endLadderPipe.CreateAndInsertCableSegment( 5);
4333 endLadderPipe.CreateAndInsertTubeSegment( 5);
4335 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4336 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4337 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4338 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4340 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4341 - fgkEndLadPipeArmBoxDX,
4342 fgkEndLadPipeArmBoxDY,0);
4343 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4344 fgkEndLadPipeArmBoxDX,
4345 fgkEndLadPipeArmBoxDY,0);
4346 endLadPipeArmBoxDY1->RegisterYourself();
4347 endLadPipeArmBoxDY2->RegisterYourself();
4349 if(GetDebug(3)) { // Remove compiler warning.
4350 endLadPipeArmBox->InspectShape();
4351 endLadPipeArmTube->InspectShape();
4354 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4355 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4356 "- endLadPipeArmTube");
4357 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4358 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4359 "- endLadPipeArmTube");
4361 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4362 endLadPipeArm1, alCu12SDD);
4363 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4364 endLadPipeArm2, alCu12SDD);
4365 vEndLadPipeArm1->SetLineColor(2);
4366 vEndLadPipeArm2->SetLineColor(2);
4368 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4369 +fgkEndLadPipeArmZpos);
4371 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4372 -fgkEndLadPipeUwidth/2,0,armZ);
4373 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4374 fgkEndLadPipeUwidth/2,0,armZ);
4376 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4377 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4379 //=*********************************
4381 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4382 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4384 Double_t spaceBetweenCards = 0.2*fgkmm;
4386 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4387 +fgkEndLadPipeArmBoxDX);
4388 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4389 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4391 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4394 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4395 +coolUzPos+1.25*fgkmm;
4396 // Position in z of the first LVB with respect to the start of the cooling
4397 // rectangular arm, coming (from inside of the ladder)
4398 // The cards are added one after the other
4400 for (Int_t iCard=0; iCard<nCards; iCard++) {
4402 Double_t cardLVzShift = firstLVCardZ +
4403 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4405 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4406 cardLVyShift, cardLVzShift);
4407 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4408 cardLVyShift, cardLVzShift);
4410 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4411 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4414 //=*********************************
4416 TGeoVolumeAssembly *cardHV = fCardHV;
4418 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4419 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4421 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4422 -(fgkHVCardCeramZ)/2);
4424 for (Int_t iCard=0; iCard<nCards; iCard++) {
4426 Double_t fact = iCard*2.+1.;
4427 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4428 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4429 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4430 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4433 //=*********************************
4436 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4437 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4438 // 0, -fgkCarlosSuppAngle, 0);
4440 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4441 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4442 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4443 // position in z of the first Carlos board, coming from inside of the ladder
4445 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4446 fgkEndLadPipeArmBoxDY);
4448 for (Int_t iCard=0; iCard<nCards; iCard++) {
4450 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4451 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4452 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4453 (TGeoRotation*) fCommonTr[0]);
4455 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4458 return endLadderCards;
4462 //________________________________________________________________________
4463 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4465 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4466 // and their cooling system
4467 // This is the code actually used for the end ladder cards
4470 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4471 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4472 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4473 TGeoMedium *copper = GetMedium("COPPER$");
4474 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4475 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4476 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
4477 TGeoMedium *polyurethane = GetMedium("POLYURETHANE$");
4479 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4480 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4482 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4483 Double_t deltaZcables = 0;
4484 // reference radius corresponding to local y=0
4487 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4488 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4490 rREF = fgkEndLaddCardsShortRadiusLay4;
4491 deltaZcables = 2.8*fgkmm;
4494 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4495 +fgkEndLadPipeArmBoxDX);
4496 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4497 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4499 Double_t rMin = rREF + cardLVyShift;
4500 // (The LV card is defining rMin because it is the lower object)
4502 Double_t thickTotCable = 0.5;
4504 //==================================
4505 //--- The Pcon container
4507 // minimum angle of the Pcon :
4508 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4509 (rREF-fgkEndLadPipeArmY/2) );
4510 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4511 Double_t phi0 = 90-dphi/2;
4512 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4513 // of the U colling pipe in its center
4514 Double_t zMax = endLadPipeUlength+coolUzPos;
4515 Double_t rMax = rMin + fgkLVcardY;
4516 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4517 Double_t cablesRadius = rMax-0.5;
4519 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4520 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4521 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4522 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4523 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4524 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4525 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4526 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4527 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4528 // the following is quite dirty but works for the moment ...
4529 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4530 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4532 // The next parameters define the shape of the Pcon at its end and where cables
4534 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4535 Double_t cableSectionR2 = rMax;
4536 Double_t cableSectionZ1 = zMax + 23.6*fgkmm + 3.0*fgkcm + deltaZcables;
4537 Double_t cableSectionZ2 = zMax + 23.6*fgkmm + 4.0*fgkcm + deltaZcables;
4538 // Those numbers are to be fixed to stick the maximum to the SDD cone
4539 // (hardcoded numbers are ugly, but it's easier to find where to stop)
4541 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4542 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4544 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4545 //endLadderCards->SetVisibility(kFALSE);
4547 //=*********************************
4548 //--- The rounded pipe for the end ladder card cooling
4550 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4551 endLadderPipe.SetNLayers(2);
4552 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4553 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4555 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4556 Double_t vectA[3] = {0,0,1};
4558 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4559 Double_t vectB[3] = {0,0,1};
4561 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4562 Double_t vectC[3] = {1,0,0};
4564 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4565 Double_t vectD[3] = {-1,0,0};
4567 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4568 Double_t vectE[3] = {0,0,-1};
4570 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4571 Double_t vectF[3] = {0,0,-1};
4573 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4574 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4575 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4576 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4577 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4578 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4580 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4581 //endLadderPipe.CreateAndInsertCableSegment( 1);
4582 endLadderPipe.CreateAndInsertTubeSegment( 1);
4583 //endLadderPipe.CreateAndInsertCableSegment( 2);
4584 endLadderPipe.CreateAndInsertTorusSegment( 2);
4585 //endLadderPipe.CreateAndInsertCableSegment( 3);
4586 endLadderPipe.CreateAndInsertTubeSegment( 3);
4587 //endLadderPipe.CreateAndInsertCableSegment( 4);
4588 endLadderPipe.CreateAndInsertTorusSegment( 4);
4589 //endLadderPipe.CreateAndInsertCableSegment( 5);
4590 endLadderPipe.CreateAndInsertTubeSegment( 5);
4592 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4593 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4594 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4595 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4597 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4598 - fgkEndLadPipeArmBoxDX,
4599 fgkEndLadPipeArmBoxDY,0);
4600 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4601 fgkEndLadPipeArmBoxDX,
4602 fgkEndLadPipeArmBoxDY,0);
4603 endLadPipeArmBoxDY1->RegisterYourself();
4604 endLadPipeArmBoxDY2->RegisterYourself();
4606 if(GetDebug(3)) { // Remove compiler warning.
4607 endLadPipeArmBox->InspectShape();
4608 endLadPipeArmTube->InspectShape();
4611 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4612 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4613 "- endLadPipeArmTube");
4614 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4615 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4616 "- endLadPipeArmTube");
4618 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4619 endLadPipeArm1, alCu12SDD);
4620 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4621 endLadPipeArm2, alCu12SDD);
4622 vEndLadPipeArm1->SetLineColor(2);
4623 vEndLadPipeArm2->SetLineColor(2);
4625 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4626 +fgkEndLadPipeArmZpos);
4628 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4629 -fgkEndLadPipeUwidth/2,rREF,armZ);
4630 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4631 fgkEndLadPipeUwidth/2,rREF,armZ);
4633 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4634 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4636 //=*********************************
4638 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4639 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4641 Double_t spaceBetweenCards = 0.2*fgkmm;
4644 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4647 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4648 +coolUzPos+1.25*fgkmm;
4649 // Position in z of the first LVB with respect to the start of the cooling
4650 // rectangular arm, coming (from inside of the ladder)
4651 // The cards are added one after the other
4653 for (Int_t iCard=0; iCard<nCards; iCard++) {
4655 Double_t cardLVzShift = firstLVCardZ +
4656 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4658 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4659 cardLVyShift+rREF, cardLVzShift);
4660 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4661 cardLVyShift+rREF, cardLVzShift);
4663 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4664 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4667 //=*********************************
4669 TGeoVolumeAssembly *cardHV = fCardHV;
4671 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4672 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4673 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4675 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4676 -(fgkHVCardCeramZ)/2);
4678 for (Int_t iCard=0; iCard<nCards; iCard++) {
4680 Double_t fact = iCard*2.+1.;
4681 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4682 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4683 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4684 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4687 //=*********************************
4690 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4691 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4692 // 0, -fgkCarlosSuppAngle, 0);
4694 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4695 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4696 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4697 // position in z of the first Carlos board, coming from inside of the ladder
4699 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4700 fgkEndLadPipeArmBoxDY);
4702 for (Int_t iCard=0; iCard<nCards; iCard++) {
4704 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4705 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4706 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4707 (TGeoRotation*) fCommonTr[0]);
4709 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4713 //=*********************************
4717 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4718 + fgkSectionGlassPerMod)*nCards;
4719 // We fix thickness, then width is calculated accordingly
4720 Double_t width = sectionV/thickTotCable;
4721 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4722 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4723 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4724 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4725 Double_t thickGlass = thickTotCable - thickCu - thickPlast;
4727 Double_t thickCoolPolyu = fgkSectionCoolPolyuEL/width;
4728 Double_t thickCoolWater = fgkSectionCoolWaterEL/width;
4730 Double_t totalThick = thickTotCable + thickCoolPolyu + thickCoolWater;
4732 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,totalThick);
4733 cable.SetNLayers(5);
4734 cable.SetLayer(0, thickCu, copper, kRed);
4735 cable.SetLayer(1, thickPlast, plastic, kYellow);
4736 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4737 cable.SetLayer(3, thickCoolPolyu, polyurethane, kGray);
4738 cable.SetLayer(4, thickCoolWater, coolerMediumSDD, kBlue);
4740 Double_t zVect[3]={0,0,1};
4741 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4742 +spaceBetweenCarlsoCards)/2 + 2.9;
4743 // the 2.9cm is for taking into account carlos card angle...
4745 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4746 cableSectionR2,cableSectionZ1,cableSectionZ2);
4748 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4749 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4750 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4751 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4752 cable.SetInitialNode(endLadderCards);
4753 cable.CreateAndInsertCableSegment(1);
4755 return endLadderCards;
4758 //________________________________________________________________________
4759 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4761 // return an assembly of the support rings, attaching the ladders to the cone
4767 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4768 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4771 //**********************************
4774 Double_t fgkRubyCageX = 9*fgkmm;
4775 Double_t fgkRubyCageY = 5.5*fgkmm;
4776 Double_t fgkRubyCageZ = 8*fgkmm;
4777 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4778 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4779 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4780 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4781 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4783 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4786 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4788 // pieces common to both square and V cages
4789 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4790 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4792 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4793 fgkRubyCageHoleDX/2+epsilon);
4795 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4796 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4797 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4798 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4799 trScrewHole->RegisterYourself();
4801 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4802 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4803 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4804 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4805 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4806 trScrewHoleFoot->RegisterYourself();
4809 // pieces which differ
4810 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4812 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4813 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4815 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4816 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4817 trRubyCageVInternBox->RegisterYourself();
4819 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4820 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4821 fgkRubyCageInternSide/4);
4823 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4824 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4825 +epsilon,0,0, rotV );
4826 trRubyCageVInternTriangl->RegisterYourself();
4829 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4830 "rubyCageBox-(rubyCageInternBox"
4831 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4833 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4834 rubyCageSquare, stainless);
4835 vRubyCageSquare->SetLineColor(10);
4837 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4838 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4839 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4840 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4841 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4842 vRubyCageV->SetLineColor(10);
4844 if(GetDebug(3)) { // Remove compiler warning.
4845 rubyCageBox->InspectShape();
4846 rubyCageInternBox->InspectShape();
4847 screwHole->InspectShape();
4848 screwHoleFoot->InspectShape();
4849 rubyCageVInternBox->InspectShape();
4850 rubyCageVInternTriangl->InspectShape();
4853 supportRing->AddNode(vRubyCageSquare, 0, 0);
4854 //supportRing->AddNode(vRubyCageV, 0, 0);
4860 //________________________________________________________________________
4861 void AliITSv11GeometrySDD::CreateSDDsensor() {
4863 // return a box containing the SDD sensor
4866 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4867 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4868 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4869 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4870 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4871 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4874 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4875 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4876 // width : in the beam direction !
4878 Double_t sensoxBoxLength = ( fgkWaferLength +
4879 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4880 // Makes life easier to include the space for the WA HV cable on both sides
4881 Double_t sensoxBoxThick = fgkWaferThickness +
4882 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4884 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4885 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4887 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4888 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4890 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4891 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4894 //****************************
4896 //****************************
4898 // we need 2 different sensor objects, because they have to have different names
4899 // This is required for the step manager
4901 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4902 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4905 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4906 wafer3->SetLineColor(fColorSilicon);
4907 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4908 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4909 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4910 sensVol3->SetLineColor(fColorSilicon+5);
4911 wafer3->AddNode(sensVol3, 1, 0);
4912 fSDDsensor3->AddNode(wafer3, 1, 0);
4914 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4915 wafer4->SetLineColor(fColorSilicon);
4916 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4917 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4918 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4919 sensVol4->SetLineColor(fColorSilicon+5);
4920 wafer4->AddNode(sensVol4, 1, 0);
4921 fSDDsensor4->AddNode(wafer4, 1, 0);
4924 //****************************
4926 //****************************
4927 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4928 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4929 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4930 vGlass->SetLineColor(fColorGlass);
4931 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4932 fgkWaferThickness/2+fgkSensorGlassLY/2,
4933 fgkGlassDZOnSensor);
4934 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4935 fgkWaferThickness/2+fgkSensorGlassLY/2,
4936 fgkGlassDZOnSensor);
4937 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4938 fgkWaferThickness/2+fgkSensorGlassLY/2,
4939 -fgkGlassDZOnSensor);
4940 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4941 fgkWaferThickness/2+fgkSensorGlassLY/2,
4942 -fgkGlassDZOnSensor);
4943 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4944 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4945 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4946 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4948 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4949 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4950 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4951 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4953 //****************************
4954 // Wrap-around cable
4955 //****************************
4957 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4958 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4959 waHVCable.SetNLayers(2);
4960 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4961 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4962 waHVCable.SetInitialNode(fSDDsensor3);
4964 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4965 x1[0] = -fgkWaHVcableLength/2;
4967 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4969 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4972 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4973 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4974 TGeoCombiTrans *ctSegment = 0;
4975 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4976 fSDDsensor4->AddNode(segment, 1, ctSegment);
4980 waHVCable.SetName("ITSsddWaHVCableD");
4981 waHVCable.ResetPoints();
4982 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4983 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4984 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
4985 fSDDsensor4->AddNode(segment, 1, ctSegment);
4987 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
4989 waHVCableFold.SetPhi(180,360);
4990 waHVCableFold.SetNLayers(2);
4991 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
4992 polyhamideSDD, fColorPolyhamide);
4993 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4994 waHVCableFold.SetInitialNode(fSDDsensor3);
4997 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
4999 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5000 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5001 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
5002 fSDDsensor4->AddNode(segment, 1, ctSegment);
5005 //****************************
5007 //****************************
5008 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
5009 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
5010 /(2.*fgkTransitHVHeadLZ);
5011 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
5012 headRadius-fgkTransitHVHeadLZ)
5015 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
5016 fgkTransitHVPolyThick/2,
5018 headPoly->SetName("headPoly");
5019 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
5020 -fgkTransitHVPolyThick/2);
5021 headPolyTr->SetName("headPolyTr");
5022 headPolyTr->RegisterYourself();
5024 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
5025 fgkTransitHVAlThick/2,
5027 headAl->SetName("headAl");
5028 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
5029 -fgkTransitHVPolyThick
5030 -fgkTransitHVAlThick/2);
5031 headAlTr->SetName("headAlTr");
5032 headAlTr->RegisterYourself();
5034 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
5035 (headRadius-fgkTransitHVHeadLZ)/2,
5036 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
5037 cache->SetName("cache");
5039 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5040 (headRadius-fgkTransitHVHeadLZ)/2,
5041 -(fgkTransitHVPolyThick
5042 +fgkTransitHVAlThick)/2);
5043 headCacheTr->SetName("cacheTr");
5044 headCacheTr->RegisterYourself();
5046 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5047 "headPoly:headPolyTr-cache:cacheTr");
5048 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5049 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5050 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5051 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5052 "headAl:headAlTr-cache:cacheTr");
5053 TGeoVolume *vHeadAlComp = new TGeoVolume(
5054 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5055 vHeadAlComp->SetLineColor(fColorAl);
5058 // TGeoRotation rotHead("",0,90,0);
5059 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5060 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5062 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5063 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5064 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5067 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5068 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5069 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5070 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5073 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5074 fgkTransitHVBondingLZ,
5075 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5076 transitHVCable.SetNLayers(2);
5077 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5079 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5080 transitHVCable.SetInitialNode(fSDDsensor3);
5082 x1[0] = -fgkTransitHVHeadLX/2;
5084 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5088 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5089 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5090 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5091 fSDDsensor4->AddNode(segment, 1, ctSegment);
5093 transitHVCable.ResetPoints();
5094 transitHVCable.SetName("ITSsddHVtransitTail");
5095 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5096 x1[0] = fgkTransitHVtailXpos;
5097 x2[0] = fgkTransitHVtailXpos;
5098 x1[2] = -fgkTransitHVBondingLZ/2;
5099 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5100 Double_t vZ[3] = {0,0,1};
5101 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5102 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5103 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5104 fSDDsensor4->AddNode(segment, 1, ctSegment);
5107 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5108 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5109 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5110 fgkTransitHVsideLZ);
5111 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5112 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5113 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5114 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5115 fgkTransitHVsideLZ);
5116 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5117 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5119 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5120 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5121 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5122 fgkTransitHVsideLZ);
5123 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5124 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5125 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5126 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5127 fgkTransitHVsideLZ);
5128 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5129 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5131 // sideRight is not there actually
5132 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5133 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5134 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5135 // fgkTransitHVsideLZ);
5136 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5137 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5138 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5139 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5140 // fgkTransitHVsideLZ);
5141 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5142 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5144 // TGeoRotation rotSide("",0,-90,0);
5145 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5146 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5147 // -fgkTransitHVBondingLZ/2,&rotSide);
5148 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5149 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5150 // -fgkTransitHVBondingLZ/2, &rotSide);
5151 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5152 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5153 // -fgkTransitHVBondingLZ/2, &rotSide);
5154 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5155 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5156 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5157 // -fgkTransitHVBondingLZ/2,rotSide);
5158 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5159 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5160 -fgkTransitHVBondingLZ/2, rotSide);
5161 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5162 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5163 -fgkTransitHVBondingLZ/2, rotSide);
5165 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5166 sideLeft,polyhamideSDD);
5167 vSideLeft->SetLineColor(fColorPolyhamide);
5168 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5170 vSideLeftAl->SetLineColor(fColorAl);
5172 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5173 // sideRight,polyhamideSDD);
5174 // vSideRight->SetLineColor(fColorPolyhamide);
5176 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5177 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5178 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5180 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5181 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5182 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5185 //****************************
5187 fSDDsensor3->CheckOverlaps(0.01);
5188 fSDDsensor4->CheckOverlaps(0.01);
5191 fSDDsensor3->SetVisibility(kFALSE);
5192 fSDDsensor4->SetVisibility(kFALSE);
5196 //________________________________________________________________________
5197 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5199 // return a box volume containing the detectors
5202 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5204 Int_t nDetectors = fgkLay3Ndet;
5205 Double_t ladderLength = fgkLay3LadderLength;
5206 Double_t *sensorZPos = fLay3sensorZPos;
5210 nDetectors = fgkLay4Ndet;
5211 ladderLength = fgkLay4LadderLength;
5212 sensorZPos = fLay4sensorZPos;
5214 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5218 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5219 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5221 sprintf(name,"ITSsddDetBox%i",iLay);
5222 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5223 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5224 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5226 for (Int_t i=0; i<nDetectors; i++) {
5227 Double_t localZ = sensorZPos[i];
5228 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5229 if (iLay==3) if (i%2!=0) localY = -localY;
5230 if (iLay==4) if (i%2==0) localY = -localY;
5231 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5233 if (i >= nDetectors/2) {
5234 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5235 sensorPos->SetName(name);
5236 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5239 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5240 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5242 sensorPos->SetName(name);
5243 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5247 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5248 virtualDet->SetVisibility(kFALSE);
5253 //________________________________________________________________________
5254 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5256 // return a box volume containing the detectors
5259 Int_t nDetectors = fgkLay3Ndet;
5260 Double_t ladderLength = fgkLay3LadderLength;
5261 Double_t *sensorZPos = fLay3sensorZPos;
5262 TGeoVolume *sensorSDD = fSDDsensor3;
5266 nDetectors = fgkLay4Ndet;
5267 ladderLength = fgkLay4LadderLength;
5268 sensorZPos = fLay4sensorZPos;
5269 sensorSDD = fSDDsensor4;
5271 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5275 sprintf(name,"ITSsddDetBox%i",iLay);
5277 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5279 for (Int_t i=0; i<nDetectors; i++) {
5280 Double_t localZ = sensorZPos[i];
5281 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5282 if (iLay==3) if (i%2!=0) localY = -localY;
5283 if (iLay==4) if (i%2==0) localY = -localY;
5284 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5286 if (i >= nDetectors/2) {
5287 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5288 sensorPos->SetName(name);
5289 virtualDet->AddNode(sensorSDD, i, sensorPos);
5292 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5293 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5295 sensorPos->SetName(name);
5296 virtualDet->AddNode(sensorSDD, i, sensorPos);
5300 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5305 //________________________________________________________________________
5306 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssemblyLadd2() {
5308 // return a box volume containing the detectors
5309 // Special case for Layer 3 Ladder 2 which is rotated (cannot simply
5310 // rotate the standard volume, because the module numbering would be wrong)
5311 // M.Sitta 25 Nov 2009
5314 Int_t nDetectors = fgkLay3Ndet;
5315 Double_t *sensorZPos = fLay3sensorZPos;
5316 TGeoVolume *sensorSDD = fSDDsensor3;
5319 sprintf(name,"ITSsddDetBoxLadd2");
5321 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5323 for (Int_t i=0; i<nDetectors; i++) {
5324 Double_t localZ = (-1.)*sensorZPos[nDetectors-1-i];
5325 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5326 if (i%2==0) localY = -localY;
5327 sprintf(name, "ITSsddLayLadd2SensorPos%i", i);
5329 if (i >= nDetectors/2) {
5330 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5331 sensorPos->SetName(name);
5332 virtualDet->AddNode(sensorSDD, i, sensorPos);
5335 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5336 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5338 sensorPos->SetName(name);
5339 virtualDet->AddNode(sensorSDD, i, sensorPos);
5343 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5348 //________________________________________________________________________
5349 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5352 // export the geometry in a AliITSgeom object
5357 printf("error:Try to fill null (AliITSgeom *) object");
5361 printf("error:Try to set sensor geometry while geometry is not defined\n");
5365 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5366 fgkWaferLengthSens/2.};
5367 if(!(geom->IsShapeDefined(kSDD)))
5368 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5371 char ladderName[30];
5372 char sensorName[30];
5373 char senstivName[30];
5374 const Int_t kNLay = 2;
5375 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5376 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5379 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5381 Int_t firstSDDmod = startMod;
5382 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5383 /////////////////////////////////////////
5384 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5385 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5387 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5388 TGeoVolume *layVolume = layNode->GetVolume();
5389 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5391 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5392 /////////////////////////////////////////
5393 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5394 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5396 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5397 TGeoVolume *laddVolume = laddNode->GetVolume();
5398 TGeoHMatrix laddMatrix(layMatrix);
5399 laddMatrix.Multiply(laddNode->GetMatrix());
5401 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5402 /////////////////////////////////////////
5403 sprintf(sensorName, "ITSsddSensor_%i",iDet);
5404 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5406 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5407 TGeoVolume *detVolume = detNode->GetVolume();
5408 TGeoHMatrix detMatrix(laddMatrix);
5409 detMatrix.Multiply(detNode->GetMatrix());
5411 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5413 TGeoVolume *wafVolume = wafNode->GetVolume();
5414 TGeoHMatrix wafMatrix(detMatrix);
5415 detMatrix.Multiply(wafNode->GetMatrix());
5416 //--------------------------------------------------------
5417 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5418 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5420 TGeoHMatrix sensMatrix(wafMatrix);
5421 sensMatrix.Multiply(sensitivNode->GetMatrix());
5423 // Sticking to the convention for local wafer coordinate
5425 if (iDet >= kNDet[iLay]/2) {
5426 // TGeoRotation rotY("",0,180,0);
5427 TGeoRotation rotY("",-180,-180,0);
5428 sensMatrix.Multiply(&rotY);
5430 // Creating the matrix in AliITSgeom for
5431 // this sensitive volume :
5432 Double_t *trans = sensMatrix.GetTranslation();
5433 Double_t *r = sensMatrix.GetRotationMatrix();
5434 Double_t rot[10] = {r[0],r[1],r[2],
5436 r[6],r[7],r[8], 1.0};
5437 //rot[9]!=0.0 => not a unity matrix
5438 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5440 // iLadd+1, iDet+1 because ladd. and det. start at +1
5445 printf("Error (ExportSensorGeometry) %s not found !\n",
5448 printf("Error (ExportSensorGeometry) %s not found !\n",
5451 printf("Error (ExportSensorGeometry) %s not found !\n",
5455 printf("Error (ExportSensorGeometry) %s not found !\n",
5459 printf("Error (ExportSensorGeometry) %s not found !\n",
5463 return (startMod-firstSDDmod);
5467 //________________________________________________________________________
5468 Int_t AliITSv11GeometrySDD::
5469 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5471 // Function which gives the layer, ladder and det.
5472 // index of the current volume. To be used in
5473 // AliITS::StepManager()
5476 if (gGeoManager->GetLevel()<3) return kFALSE;
5477 // Get the det index :
5478 TGeoNode *node = gGeoManager->GetMother(2);
5479 if (!node) return kFALSE;
5480 det = node->GetNumber()+1;
5482 // Get the ladder index :
5483 node = gGeoManager->GetMother(3);
5484 if (!node) return kFALSE;
5485 ladd = node->GetNumber()+1;
5487 // Get the layer index :
5488 if (node->GetNdaughters()==fgkLay3Ndet)
5489 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5496 //________________________________________________________________________
5497 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5498 Double_t r2max, Double_t z2,
5499 Double_t section, Int_t nDiv)
5501 // Creates a cone along z where the section is approximately constant
5502 // with z. This is for simulation of cables, because a cone with a constant
5503 // radius difference would show a quantity of matter increasing with z...
5504 // The max radius of the created Pcon is evolving linearly, the min radius
5505 // is calculated at several steps (nDiv).
5506 // z2 > z1 (required by the Pcon)
5508 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5510 Double_t dr = (r2max-r1max)/nDiv;
5511 Double_t dz = (z2-z1)/nDiv;
5512 Double_t r1minI, r2minI, r1maxI, r2maxI;
5515 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5516 Double_t cosAlpha = (z2-z1)/lZ;
5518 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5519 myPcon->DefineSection(0, z1, r1minI, r1max);
5521 for (Int_t i=0; i<nDiv; i++) {
5525 r1maxI = r1max + i*dr;
5526 r2maxI = r1maxI + dr;
5528 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5529 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5535 //________________________________________________________________________
5536 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5537 Double_t refZ1, Double_t refZ2) {
5538 // just a helping function
5539 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5542 //________________________________________________________________________
5543 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5544 Int_t nLay3, Int_t nLay4,
5545 Double_t r1, Double_t z1,
5546 Double_t r2, Double_t z2) {
5548 // Create some cables portions from SDD modules grouped
5549 // and attached at the border of the SSD cone
5551 TGeoMedium *copper = GetMedium("COPPER$");
5552 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5553 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5555 char titleCable[30];
5556 sprintf(titleCable,"cableSDDport%i",(Int_t)angle);
5559 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5560 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5561 Double_t width = section/thickness;
5562 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5563 +fgkSectionGlassPerMod);
5565 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5566 +fgkSectionGlassPerMod);
5568 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5569 +fgkSectionGlassPerMod);
5571 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5572 Double_t cosAlpha = (z2-z1)/hypothenus;
5573 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5574 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5575 angle *= TMath::DegToRad();
5576 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5577 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5578 Double_t pos1[3] = {x1,y1,z1};
5579 Double_t pos2[3] = {x2,y2,z2};
5580 Double_t zVect[3] = {0,0,1};
5582 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5583 cable.SetNLayers(3);
5584 cable.SetLayer(0, thickPlast, plastic, kYellow);
5585 cable.SetLayer(1, thickCu, copper, kRed);
5586 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5588 cable.AddCheckPoint( mother, 0, pos1, zVect );
5589 cable.AddCheckPoint( mother, 1, pos2, zVect );
5590 cable.SetInitialNode(mother);
5591 cable.CreateAndInsertCableSegment(1);
5598 //________________________________________________________________________
5599 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth)
5602 // Creates and inserts the SDD cables running on SDD and SSD cones
5605 // moth : the TGeoVolume owing the volume structure
5608 // Created: ??? Ludovic Gaudichet
5609 // Updated: 15 Mar 2008 Mario Sitta
5610 // Updated: 14 Apr 2008 Mario Sitta Overlap fixes
5611 // Updated: 09 May 2008 Mario Sitta SSD overlap fixes
5614 TGeoMedium *copper = GetMedium("COPPER$");
5615 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5616 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5617 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5620 //==================================
5622 //==================================
5624 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5625 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5627 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5628 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5629 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5631 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5632 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5633 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5635 // Do not use hardcoded numbers, get them from real shapes - M.S. 15/03/08
5636 TGeoVolume *sddCone = gGeoManager->GetVolume("SDDCarbonFiberCone");
5637 TGeoPcon *sddConeShape = (TGeoPcon*)sddCone->GetShape();
5639 TGeoVolume *sddCylinder = gGeoManager->GetVolume("SDDCarbonFiberCylinder");
5640 TGeoTube *sddCylinderShape = (TGeoTube*)sddCylinder->GetShape();
5642 // (were fgkConeSDDr1, fgkConeSDDr2, fgkConeSDDz1, fgkConeSDDz2 hardcoded)
5643 Double_t coneSDDr1 = sddConeShape->GetRmin(5);
5644 Double_t coneSDDr2 = sddConeShape->GetRmin(3);
5646 Double_t coneSDDz1 = sddConeShape->GetZ(9) - sddConeShape->GetZ(5) +
5647 sddCylinderShape->GetDz();
5648 Double_t coneSDDz2 = sddConeShape->GetZ(9) - sddConeShape->GetZ(3) +
5649 sddCylinderShape->GetDz();
5651 // Calculate z1, z2 thanks to R1 and R2
5652 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, coneSDDr1, coneSDDr2,
5653 coneSDDz1, coneSDDz2);
5654 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, coneSDDr1, coneSDDr2,
5655 coneSDDz1, coneSDDz2);
5656 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, coneSDDr1, coneSDDr2,
5657 coneSDDz1, coneSDDz2);
5659 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5661 //==================================
5662 // first set of cones : cables from layer 3
5663 //==================================
5665 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5666 fgkSDDCableR2, sddCableZ2,
5667 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5669 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5670 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0),
5671 pcon1all->GetRmax(0));
5673 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5674 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax,
5675 pcon1all->GetRmax(1));
5677 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container",
5678 pcon1container, airSDD);
5679 vpcon1container->SetVisibility(kFALSE);
5681 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5682 fgkSDDCableR2, sddCableZ2,
5683 sectionLay3Plastic, 3);
5685 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast",
5686 pcon1plast, plastic);
5687 vpcon1plast->SetLineColor(kYellow);
5688 vpcon1container->AddNode(vpcon1plast, 0);
5690 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5691 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5692 fgkSDDCableR2 - dr1a, sddCableZ2,
5695 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu",
5697 vpcon1Cu->SetLineColor(kRed);
5698 vpcon1container->AddNode(vpcon1Cu, 0);
5700 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5701 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5702 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5703 sectionLay3Glass, 3);
5705 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass",
5706 pcon1glass, opticalFiber);
5707 vpcon1glass->SetLineColor(kGreen);
5708 vpcon1container->AddNode(vpcon1glass, 0);
5710 moth->AddNode(vpcon1container, 1);
5711 moth->AddNode(vpcon1container, 2, rotCableSDD);
5713 //==================================
5714 // 2nd set of cones : cables from layer 3 and layer 4
5715 //==================================
5717 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5718 fgkSDDCableR3, sddCableZ3,
5719 sectionLay3Plastic+sectionLay4Plastic+
5720 sectionLay3Cu+sectionLay4Cu+
5721 sectionLay3Glass+sectionLay4Glass, 1);
5723 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5724 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0),
5725 pcon2all->GetRmax(0));
5727 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5728 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax,
5729 pcon2all->GetRmax(1));
5732 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container",
5733 pcon2container, airSDD);
5734 vpcon2container->SetVisibility(kFALSE);
5736 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5737 fgkSDDCableR3, sddCableZ3,
5739 sectionLay4Plastic, 3);
5741 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast",
5742 pcon2plast, plastic);
5743 vpcon2plast->SetLineColor(kYellow);
5744 vpcon2container->AddNode(vpcon2plast, 0);
5746 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5747 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5748 fgkSDDCableR3 - dr2a, sddCableZ3,
5749 sectionLay3Cu+sectionLay4Cu, 3);
5751 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu",
5753 vpcon2Cu->SetLineColor(kRed);
5754 vpcon2container->AddNode(vpcon2Cu, 0);
5756 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5757 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5758 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5760 sectionLay4Glass, 3);
5762 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass",
5763 pcon2glass, opticalFiber);
5764 vpcon2glass->SetLineColor(kGreen);
5765 vpcon2container->AddNode(vpcon2glass, 0);
5767 moth->AddNode(vpcon2container, 1);
5768 moth->AddNode(vpcon2container, 2, rotCableSDD);
5770 //==================================
5771 // intermediate cylinder
5772 //==================================
5774 // (was fgkSDDCableDZint hardcoded)
5775 Double_t sddCableDZint = (sddConeShape->GetZ(9) - sddConeShape->GetZ(0) +
5776 sddCylinderShape->GetDz()) - sddCableZ3;
5778 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl",
5779 pcon2container->GetRmin(1),
5780 pcon2container->GetRmax(1),
5783 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",
5785 vInterCyl->SetVisibility(kFALSE);
5787 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5788 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5789 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5791 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5792 rmaxCylPlast, sddCableDZint/2);
5794 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast",
5795 interCylPlast, plastic);
5796 vInterCylPlast->SetLineColor(kYellow);
5797 vInterCyl->AddNode(vInterCylPlast, 0);
5799 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5800 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5801 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5803 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5804 rmaxCylCu, sddCableDZint/2);
5806 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu",
5807 interCylCu, copper);
5808 vInterCylCu->SetLineColor(kRed);
5809 vInterCyl->AddNode(vInterCylCu, 0);
5811 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5812 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5813 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5815 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5816 rmaxCylGlass, sddCableDZint/2);
5818 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",
5819 interCylGlass,opticalFiber);
5820 vInterCylGlass->SetLineColor(kGreen);
5821 vInterCyl->AddNode(vInterCylGlass, 0);
5823 moth->AddNode(vInterCyl, 1, new TGeoTranslation(0, 0,
5824 sddCableZ3+sddCableDZint/2));
5825 moth->AddNode(vInterCyl, 2, new TGeoTranslation(0, 0,
5826 -sddCableZ3-sddCableDZint/2));
5828 //==================================
5829 // cable cone on the SSD cone
5830 //==================================
5832 Double_t sddCableR4 = rmaxCylPlast;
5833 Double_t sddCableZ4 = sddCableZ3 + sddCableDZint;
5835 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5836 fgkSDDCableR5, fgkSDDCableZ5,
5839 sectionLay3Cu+sectionLay4Cu+
5840 sectionLay3Glass+sectionLay4Glass, 1);
5842 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5843 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0),
5844 pcon3all->GetRmax(0));
5846 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5847 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax,
5848 pcon3all->GetRmax(1));
5851 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container",
5852 pcon3container, airSDD);
5853 vpcon3container->SetVisibility(kFALSE);
5855 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5856 fgkSDDCableR5, fgkSDDCableZ5,
5858 sectionLay4Plastic, 3);
5860 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast",
5861 pcon3plast, plastic);
5862 vpcon3plast->SetLineColor(kYellow);
5863 vpcon3container->AddNode(vpcon3plast, 0);
5865 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5866 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5867 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5868 sectionLay3Cu+sectionLay4Cu, 3);
5870 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu",
5872 vpcon3Cu->SetLineColor(kRed);
5873 vpcon3container->AddNode(vpcon3Cu, 0);
5875 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5876 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5877 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5878 sectionLay3Glass+sectionLay4Glass, 3);
5880 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass",
5881 pcon3glass,opticalFiber);
5882 vpcon3glass->SetLineColor(kGreen);
5883 vpcon3container->AddNode(vpcon3glass, 0);
5885 moth->AddNode(vpcon3container, 1);
5886 moth->AddNode(vpcon3container, 2, rotCableSDD);
5888 //==================================
5889 // cables that are grouped at the end of SSD cones
5890 //==================================
5892 // Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
5893 // Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
5894 Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
5895 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
5897 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5899 // Add some hardcoded shifts to avoid overlaps with SSD pathc panels
5900 CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
5901 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5903 CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
5904 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5906 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5907 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5909 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5910 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5912 CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
5913 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5915 CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
5916 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5918 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5919 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5921 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5922 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5924 CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
5925 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5927 CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
5928 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5930 CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
5931 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5933 CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
5934 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5936 CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
5937 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5939 moth->AddNode(endConeSDDCable, 1, 0);
5941 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5942 reflect->ReflectZ(kTRUE);
5943 moth->AddNode(endConeSDDCable, 2, reflect);