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 // (sections are given in cm square)
468 const Double_t AliITSv11GeometrySDD::fgkCableBendRatio = 1.3; // ??? this factor account for the bending of cables
470 const Double_t AliITSv11GeometrySDD::fgkConeSDDr1 = 11.87574*fgkcm;
471 const Double_t AliITSv11GeometrySDD::fgkConeSDDr2 = 26.07574*fgkcm;
472 const Double_t AliITSv11GeometrySDD::fgkConeSDDz1 = 3.36066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
473 const Double_t AliITSv11GeometrySDD::fgkConeSDDz2 = 17.56066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
474 // These last parameters come from cone's code and define the slope
475 // and position of the SDD cone end. For some unknown reason, this doesn't
476 // allow to stick on the SDD cone. This has to be checked when a correct
477 // version of the cone is available ... For now 'm applying some approximative
480 const Double_t AliITSv11GeometrySDD::fgkSDDCableR1 = 16*fgkcm; // ??? // part 1 of "cable cone"
481 const Double_t AliITSv11GeometrySDD::fgkSDDCableR2 = 23*fgkcm; // ??? // part 1/2 of "cable cone"
482 const Double_t AliITSv11GeometrySDD::fgkSDDCableR3 = 26*fgkcm; // ??? // part 2 of "cable cone"
484 const Double_t AliITSv11GeometrySDD::fgkSDDCableDZint = 3.5*fgkcm;
485 const Double_t AliITSv11GeometrySDD::fgkSDDCableR5 = 37*fgkcm; // third part of "cable cone"
486 const Double_t AliITSv11GeometrySDD::fgkSDDCableZ5 = 65*fgkcm; // third part of "cable cone"
494 ClassImp(AliITSv11GeometrySDD)
496 //________________________________________________________________________
497 AliITSv11GeometrySDD::AliITSv11GeometrySDD():
500 fCoolPipeSupportL(0),
501 fCoolPipeSupportR(0),
504 fBaseThermalBridge(0),
521 fAddCoolingSyst(kTRUE),
523 fAddOnlyLadder3min(-1),
524 fAddOnlyLadder3max(-1),
525 fAddOnlyLadder4min(-1),
526 fAddOnlyLadder4max(-1),
527 fColorCarbonFiber(4),
537 fLay3LadderUnderSegDH(0),
538 fLay4LadderUnderSegDH(0),
539 fLay3LaddShortRadius(0),
540 fLay3LaddLongRadius(0),
541 fLay4LaddShortRadius(0),
542 fLay4LaddLongRadius(0)
545 // Standard constructor
551 //________________________________________________________________________
552 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
553 AliITSv11Geometry(debug),
555 fCoolPipeSupportL(0),
556 fCoolPipeSupportR(0),
559 fBaseThermalBridge(0),
576 fAddCoolingSyst(kTRUE),
578 fAddOnlyLadder3min(-1),
579 fAddOnlyLadder3max(-1),
580 fAddOnlyLadder4min(-1),
581 fAddOnlyLadder4max(-1),
582 fColorCarbonFiber(4),
592 fLay3LadderUnderSegDH(0),
593 fLay4LadderUnderSegDH(0),
594 fLay3LaddShortRadius(0),
595 fLay3LaddLongRadius(0),
596 fLay4LaddShortRadius(0),
597 fLay4LaddLongRadius(0)
600 // Constructor setting debugging level
605 //________________________________________________________________________
606 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
607 AliITSv11Geometry(s.GetDebug()),
608 fPinSupport(s.fPinSupport),
609 fCoolPipeSupportL(s.fCoolPipeSupportL),
610 fCoolPipeSupportR(s.fCoolPipeSupportR),
611 fSDDsensor3(s.fSDDsensor3),
612 fSDDsensor4(s.fSDDsensor4),
613 fBaseThermalBridge(s.fBaseThermalBridge),
615 fLadderFoot(s.fLadderFoot),
616 fCardLVR(s.fCardLVR),
617 fCardLVL(s.fCardLVL),
619 fCardCarlos(s.fCardCarlos),
620 fRaccordoL(s.fRaccordoL),
621 fDigitCableLay3A(s.fDigitCableLay3A),
622 fDigitCableLay3B(s.fDigitCableLay3B),
623 fDigitCableLay4A(s.fDigitCableLay4A),
624 fDigitCableLay4B(s.fDigitCableLay4B),
625 fMotherVol(s.fMotherVol),
626 fAddHybrids(s.fAddHybrids),
627 fAddSensors(s.fAddSensors),
628 fAddHVcables(s.fAddHVcables),
629 fAddCables(s.fAddCables),
630 fAddCoolingSyst(s.fAddCoolingSyst),
631 fCoolingOn(s.fCoolingOn),
632 fAddOnlyLadder3min(s.fAddOnlyLadder3min),
633 fAddOnlyLadder3max(s.fAddOnlyLadder3max),
634 fAddOnlyLadder4min(s.fAddOnlyLadder4min),
635 fAddOnlyLadder4max(s.fAddOnlyLadder4max),
636 fColorCarbonFiber(s.fColorCarbonFiber),
637 fColorRyton(s.fColorRyton),
638 fColorPhynox(s.fColorPhynox),
639 fColorSilicon(s.fColorSilicon),
640 fColorAl(s.fColorAl),
641 fColorPolyhamide(s.fColorPolyhamide),
642 fColorGlass(s.fColorGlass),
643 fColorSMD(s.fColorSMD),
644 fColorSMDweld(s.fColorSMDweld),
645 fColorStesalite(s.fColorStesalite),
646 fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
647 fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
648 fLay3LaddShortRadius(s.fLay3LaddShortRadius),
649 fLay3LaddLongRadius(s.fLay3LaddLongRadius),
650 fLay4LaddShortRadius(s.fLay4LaddShortRadius),
651 fLay4LaddLongRadius(s.fLay4LaddLongRadius)
654 // do only a "shallow copy" ...
658 //________________________________________________________________________
659 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
660 operator=(const AliITSv11GeometrySDD &s) {
661 // Assignment operator
662 if(&s == this) return *this;
663 fMotherVol = s.fMotherVol;
664 fAddHybrids = s.fAddHybrids;
665 fAddSensors = s.fAddSensors;
666 fAddHVcables = s.fAddHVcables;
667 fAddCables = s.fAddCables;
668 fAddCoolingSyst = s.fAddCoolingSyst;
669 fCoolingOn = s.fCoolingOn;
670 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
671 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
672 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
673 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
677 //________________________________________________________________________
678 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
679 // Look like a destructor
680 // Smell like a destructor
681 // And actually is the destructor
682 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
683 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
684 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
685 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
688 //________________________________________________________________________
689 void AliITSv11GeometrySDD::SetParameters() {
691 // Define display colors and the non constant geometry parameters
694 Double_t detLadderDist = 8*fgkmm;
696 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
697 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
699 // radius from the center to the CF ladder :
700 fLay3LaddShortRadius = (fgkLay3DetShortRadius
701 + fgkLadWaferSep+2*fgkWaferThickness
703 fLay3LaddLongRadius = (fgkLay3DetLongRadius
704 + fgkLadWaferSep+2*fgkWaferThickness
706 fLay4LaddShortRadius = (fgkLay4DetShortRadius
707 + fgkLadWaferSep+2*fgkWaferThickness
709 fLay4LaddLongRadius = (fgkLay4DetLongRadius
710 + fgkLadWaferSep+2*fgkWaferThickness
713 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
714 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
715 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
716 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
717 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
718 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
720 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
721 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
722 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
723 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
724 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
725 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
726 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
727 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
731 //________________________________________________________________________
732 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
734 // Called to get a medium, checks that it exists.
735 // If not, prints an error and returns 0
739 sprintf(ch, "ITS_%s",mediumName);
740 TGeoMedium* medium = gGeoManager->GetMedium(ch);
742 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
747 //________________________________________________________________________
748 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
749 // Get the actual number of ladder in layer 3
750 if ( (fAddOnlyLadder3min<0) ||
751 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
752 (fAddOnlyLadder3max<0) ||
753 (fAddOnlyLadder3max >= fgkLay3Nladd) )
755 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
759 //________________________________________________________________________
760 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
761 // Get the actual number of ladder in layer 4
762 if ( (fAddOnlyLadder4min<0) ||
763 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
764 (fAddOnlyLadder4max<0) ||
765 (fAddOnlyLadder4max >= fgkLay4Nladd) )
767 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
771 //________________________________________________________________________
772 void AliITSv11GeometrySDD::CreateBasicObjects() {
774 // Create basics objets which will be assembled together
775 // in Layer3 and Layer4 functions
779 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
780 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
781 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
782 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
784 fPinSupport = CreatePinSupport();
785 fCoolPipeSupportL = CreateCoolPipeSupportL();
786 fCoolPipeSupportR = CreateCoolPipeSupportR();
788 fBaseThermalBridge = CreateBaseThermalBridge();
789 fHybrid = CreateHybrid(0);
791 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
792 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
793 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
794 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
795 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
796 TGeoMedium *raccordMedium = GetMedium("INOX$"); // ??? material of raccordo ???
798 //********************************************************************
799 // pieces of the carbon fiber structure
800 //********************************************************************
801 Double_t dy = fgkLadderSegBoxDH/2;
802 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
803 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
804 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
805 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
806 Double_t dYTranslation = (fgkLadderHeight/2.
807 -0.5*fgkLadderWidth*TMath::Tan(beta)
808 -fgkLadderBeamRadius);
809 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
811 //--- the top V of the Carbon Fiber Ladder (segment)
812 TGeoArb8 *cfLaddTop1 = CreateLadderSide( "CFladdTopCornerVol1shape",
813 fgkSegmentLength/2., halfTheta,
814 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
815 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
816 cfLaddTop1,carbonFiberLadderStruct);
817 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerVol2shape",
818 fgkSegmentLength/2., halfTheta,
819 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
820 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
821 cfLaddTop2, carbonFiberLadderStruct);
822 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
823 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
824 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
827 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerVol1shape",
828 fgkSegmentLength/2., beta, -1,
829 fgkLadderLb, fgkLadderHb, fgkLadderl);
830 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
831 cfLaddSide1,carbonFiberLadderStruct);
832 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerVol2shape",
833 fgkSegmentLength/2., beta, 1,
834 fgkLadderLb, fgkLadderHb, fgkLadderl);
835 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
836 cfLaddSide2,carbonFiberLadderStruct);
837 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
838 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
839 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
840 alpha*TMath::RadToDeg());
841 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
842 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
843 -alpha*TMath::RadToDeg());
844 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
847 // Beams on the sides
848 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
849 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
850 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
851 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
852 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
853 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
854 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
856 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
857 carbonFiberLadderStruct);
858 sideBeam->SetLineColor(fColorCarbonFiber);
860 //Euler rotation : about Z, then new X, then new Z
861 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
862 -beamPhiPrime*TMath::RadToDeg(),-90);
863 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
864 beamPhiPrime*TMath::RadToDeg(), -90);
865 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
866 beamPhiPrime*TMath::RadToDeg(), -90);
867 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
868 -beamPhiPrime*TMath::RadToDeg(),-90);
870 TGeoCombiTrans *beamTransf[8];
871 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
872 TMath::Tan(halfTheta),
873 fgkLadderBeamRadius/2. - dy,
874 -3*fgkSegmentLength/8, beamRot1);
876 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
877 TMath::Tan(halfTheta),
878 fgkLadderBeamRadius/2. - dy,
879 -3*fgkSegmentLength/8, beamRot1);
880 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
882 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
883 TMath::Tan(halfTheta),
884 fgkLadderBeamRadius/2. - dy,
885 -fgkSegmentLength/8, beamRot2);
887 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
888 TMath::Tan(halfTheta),
889 fgkLadderBeamRadius/2. - dy,
890 -fgkSegmentLength/8, beamRot2);
891 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
893 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
894 TMath::Tan(halfTheta),
895 fgkLadderBeamRadius/2. - dy,
896 -3*fgkSegmentLength/8, beamRot3);
898 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
899 TMath::Tan(halfTheta),
900 fgkLadderBeamRadius/2. - dy,
901 -3*fgkSegmentLength/8, beamRot3);
902 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
904 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
905 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
906 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
907 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
909 //--- Beams of the bottom
910 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
911 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
912 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
913 bottomBeam1, carbonFiberLadderStruct);
914 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
915 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
916 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
917 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
918 bottomBeam2, carbonFiberLadderStruct);
919 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
920 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
921 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
922 - fgkLadderLb/3, 0, 180);
923 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
924 bottomBeam3, carbonFiberLadderStruct);
925 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
926 //bottomBeam3Vol->SetLineColor(2);
927 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
928 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
930 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
931 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
932 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
933 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
934 -fgkSegmentLength/2, bottomBeamRot1);
935 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
936 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
937 - dy, fgkSegmentLength/2, bottomBeamRot2);
938 // be careful for beams #3: when "reading" from -z to +z and
939 // from the bottom of the ladder, it should draw a Lambda, and not a V
940 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
941 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
942 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
943 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
944 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
945 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
947 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
948 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
949 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
950 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
951 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
952 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
953 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
954 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
955 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
956 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
957 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
958 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
959 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
960 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
961 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
962 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
963 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
964 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
965 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
968 //********************************************************************
970 //********************************************************************
972 for (Int_t i=0; i<fgkLay3Ndet; i++) {
973 sprintf(cableName, "digitCableLay3A_%i",i);
974 fDigitCableLay3A[i].SetName(cableName);
975 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
976 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
977 fDigitCableLay3A[i].SetNLayers(2);
978 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
980 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
981 sprintf(cableName, "digitCableLay3B_%i",i);
982 fDigitCableLay3B[i].SetName(cableName);
983 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
984 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
985 fDigitCableLay3B[i].SetNLayers(2);
986 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
988 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
990 for (Int_t i=0; i<fgkLay4Ndet; i++) {
991 sprintf(cableName, "digitCableLay4A_%i",i);
992 fDigitCableLay4A[i].SetName(cableName);
993 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
994 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
995 fDigitCableLay4A[i].SetNLayers(2);
996 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
998 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
999 sprintf(cableName, "digitCableLay4B_%i",i);
1000 fDigitCableLay4B[i].SetName(cableName);
1001 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
1002 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1003 fDigitCableLay4B[i].SetNLayers(2);
1004 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1006 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1008 // Well, those digit cables could also include the analog cables
1009 // which have the same width and the same path, at least in the ladder.
1010 // It will gain some computing ressources (less volumes) and some
1011 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1012 // The only thing to do is to change the names and put the correct total
1015 // some transformations and volumes used in several places
1016 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1017 0, -fgkCarlosSuppAngle, 0);
1019 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1020 fgkLittleScrewHeadH/2);
1021 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1022 littleScrewHead, stainless);
1023 fCommonVol[0]->SetLineColor(kGray);
1025 fLadderFoot = CreateLadderFoot();
1027 fCardHV = CreateHVCard(0);
1028 fCardCarlos = CreateCarlosCard(0);
1030 //==================
1031 // link beteen phynox and plastic cooling tubes
1032 //==================
1034 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1035 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1036 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1037 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1038 vwaterRac->SetLineColor(kBlue);
1040 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1041 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1042 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1043 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1044 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1045 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1046 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1047 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1048 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1049 vtube1Rac->SetLineColor(kGray);
1050 vtube2Rac->SetLineColor(kGray);
1051 vtube3Rac->SetLineColor(kGray);
1053 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1054 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1055 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1056 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1057 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1058 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1059 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1060 fRaccordoL->AddNode(vwaterRac, 1,0);
1061 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1062 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1063 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1067 //________________________________________________________________________
1068 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1070 // a debugging function for checking some possible overlaps
1072 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1073 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1074 if (fHybrid) fHybrid->CheckOverlaps(precision);
1078 //________________________________________________________________________
1079 TGeoCombiTrans *AliITSv11GeometrySDD::
1080 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1083 // return the TGeoCombiTrans which make a translation in y and z
1084 // and a rotation in phi in the global coord system
1085 // If planeSym = true, the rotation places the object symetrically
1086 // (with respect to the transverse plane) to its position in the
1087 // case planeSym = false
1090 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1091 TGeoRotation r1("",0.,0.,dphi);
1092 TGeoRotation r2("",90, 180, -90-dphi);
1094 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1095 combiTrans1->SetTranslation(t1);
1096 if (planeSym) combiTrans1->SetRotation(r1);
1097 else combiTrans1->SetRotation(r2);
1102 //________________________________________________________________________
1103 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1107 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1108 const Double_t *vect = ct->GetTranslation();
1109 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1110 ct->SetTranslation(newVect);
1114 //________________________________________________________________________
1115 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1116 // for code developpment and debugging purposes
1118 if (! fSDDsensor3) CreateBasicObjects();
1120 // moth->AddNode(fPinSupport, 1, 0);
1121 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1122 // moth->AddNode(fSDDsensor3, 1, 0);
1123 // moth->AddNode(fSDDsensor4, 1, 0);
1124 // moth->AddNode(fBaseThermalBridge, 1, 0);
1125 // moth->AddNode(fHybrid,100,0);
1126 // moth->AddNode(fLadderFoot,1,0);
1127 //moth->AddNode(fCardLVL,1,0);
1128 //moth->AddNode(fCardLVR,1,0);
1130 TGeoVolume* seg = CreateLadderSegment( 3, 0);
1131 moth->AddNode(seg, 1, 0);
1133 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1134 // moth->AddNode(lay3Ladder, 1, 0);
1136 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1137 // moth->AddNode(lay3Detectors, 1, 0);
1139 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1140 // moth->AddNode(lay3Detectors, 1, 0);
1143 // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1144 // moth->AddNode(endLadder, 1, 0);
1146 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1147 // moth->AddNode(highVCard, 1, 0);
1149 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1150 // moth->AddNode(supportRing, 1, 0);
1152 // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1153 // moth->AddNode(endLadderCards, 1, 0);
1155 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1156 // moth->AddNode(carlosCard, 1, 0);
1161 //==================================
1162 //--- test of flat cable curvature
1163 //==================================
1166 AliITSv11GeomCableFlat cable("test", 3, 0.3);
1167 cable.SetNLayers(1);
1168 cable.SetNLayers(2);
1169 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1170 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1171 cable.SetInitialNode(endLadderCards);
1173 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1182 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1183 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1184 cable.CreateAndInsertBoxCableSegment(1,angle);
1186 Double_t p3[3], p4[3];
1191 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1192 cable.CreateAndInsertCableCylSegment(2,angle);
1197 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1198 cable.CreateAndInsertCableSegment(3,angle);
1203 //________________________________________________________________________
1204 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1206 // Insert the layer 3 in the mother volume. This is a virtual volume
1207 // containing ladders of layer 3 and the supporting rings
1211 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1215 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1218 if (! fSDDsensor3) CreateBasicObjects();
1220 //====================================
1221 // First we create the central barrel
1222 //====================================
1224 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1225 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1226 TGeoVolumeAssembly *lay3Ladd2Det = CreateDetectorsAssemblyLadd2();
1227 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1228 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1229 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1230 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1231 virtualLayer3Shape, airSDD);
1233 Double_t dPhi = 360./fgkLay3Nladd;
1234 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1235 // Placing virtual ladder and detectors volumes following
1236 // ladder ordering convention
1239 Int_t iLaddMax = fgkLay3Nladd;
1240 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1241 iLaddMin = fAddOnlyLadder3min;
1242 iLaddMax = fAddOnlyLadder3max+1;
1245 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1247 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1248 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1249 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1251 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1252 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1253 TGeoCombiTrans *ctLadd;
1254 //=============================================================
1256 // Special modification for ladder 2 of layer 3:
1257 // It has been inverted (pi rotation around y axis)
1259 //=============================================================
1261 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1262 0, ladderPhi, kTRUE);
1264 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1265 0, ladderPhi, kFALSE);
1266 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1267 ///////////////////////////////////////////////////
1268 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1269 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1270 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1271 minRadiusDetBox += detectorsThick/2;
1272 TGeoCombiTrans *ctDet;
1273 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1274 0, ladderPhi, kTRUE);
1277 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1279 virtualLayer3->AddNode(lay3Ladd2Det , iLadd, ctDet);
1281 ///////////////////////////////////////////////////
1285 //====================================
1286 // Then the forward rapidity pieces
1287 // (cooling, Carlos, LV, HV ...)
1288 //====================================
1290 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1291 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1292 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1294 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1295 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1296 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1297 fgkForwardLay3Length/2.);
1299 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1300 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1301 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1304 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1305 virtualForward3Shape, airSDD);
1306 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1307 virtualForward3Shape, airSDD);
1308 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1309 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1311 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1312 fgkLay3Length/2+fgkForwardLay3Length/2);
1313 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1314 -fgkLay3Length/2-fgkForwardLay3Length/2);
1316 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1318 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1319 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1320 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1321 minRadiusDetBox += detectorsThick/2;
1323 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1325 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1326 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1327 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1328 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1330 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1331 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1338 virtualLayer3->CheckOverlaps(0.01);
1339 //virtualForward3Pos->CheckOverlaps(0.01);
1340 //virtualForward3Neg->CheckOverlaps(0.01);
1343 virtualLayer3->SetVisibility(kFALSE);
1344 //virtualForward3Pos->SetVisibility(kFALSE);
1345 //virtualForward3Neg->SetVisibility(kFALSE);
1348 moth->AddNode(virtualLayer3, 1, 0);
1349 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1350 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1354 // //________________________________________________________________________
1355 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1357 // // Insert the forward pieces of layer 3 in the mother volume.
1358 // // (cooling, Carlos, LV, HV ...)
1362 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1366 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1368 // if (! fSDDsensor3) CreateBasicObjects();
1370 // Double_t dPhi = 360./fgkLay3Nladd;
1371 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1372 // Int_t iLaddMin = 0;
1373 // Int_t iLaddMax = fgkLay3Nladd;
1374 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1375 // iLaddMin = fAddOnlyLadder3min;
1376 // iLaddMax = fAddOnlyLadder3max+1;
1378 // char rotName[30];
1381 // //=================
1383 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1384 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1385 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1387 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1388 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1389 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1390 // fgkForwardLay3Length/2.);
1392 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1393 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1394 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1397 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1398 // virtualForward3Shape, airSDD);
1399 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1400 // virtualForward3Shape, airSDD);
1401 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1402 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1404 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1405 // fgkLay3Length/2+fgkForwardLay3Length/2);
1406 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1407 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1409 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1411 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1412 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1413 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1414 // minRadiusDetBox += detectorsThick/2;
1416 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1418 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1419 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1420 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1421 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1423 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1424 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1427 // if(GetDebug(1)) {
1428 // virtualForward3Pos->CheckOverlaps(0.01);
1429 // virtualForward3Neg->CheckOverlaps(0.01);
1432 // virtualForward3Pos->SetVisibility(kFALSE);
1433 // virtualForward3Neg->SetVisibility(kFALSE);
1435 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1436 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1441 //________________________________________________________________________
1442 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1444 // Insert the end-ladder of layer 3 in the mother volume.
1445 // (cooling, Carlos, LV, HV ...)
1449 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1453 if (! fSDDsensor3) CreateBasicObjects();
1456 Int_t iLaddMax = fgkLay3Nladd;
1457 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1458 iLaddMin = fAddOnlyLadder3min;
1459 iLaddMax = fAddOnlyLadder3max+1;
1462 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1463 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1466 Double_t dPhi = 360./fgkLay3Nladd;
1467 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1469 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1471 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1473 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1475 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1477 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1478 fgkLay3Length/2, ladderPhi, kTRUE);
1479 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1480 -fgkLay3Length/2, ladderPhi, kFALSE);
1482 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1483 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1487 virtualForward3Pos->CheckOverlaps(0.01);
1488 virtualForward3Neg->CheckOverlaps(0.01);
1491 // 180deg Y rotation to compensate the cancellation of ITSD volume
1492 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1493 TGeoRotation *y180 = new TGeoRotation();
1494 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1495 moth->AddNode(virtualForward3Pos, 1, y180);
1496 moth->AddNode(virtualForward3Neg, 1, y180);
1499 //________________________________________________________________________
1500 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1502 // Insert the layer 4 in the mother volume. This is a virtual volume
1503 // containing ladders of layer 4 and the supporting rings
1507 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1513 if (! fSDDsensor3) CreateBasicObjects();
1515 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1516 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1517 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1518 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1519 virtualLayer4Shape, airSDD);
1521 //====================================
1522 // First we create the central barrel
1523 //====================================
1525 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1526 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1527 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1529 Double_t dPhi = 360./fgkLay4Nladd;
1530 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1532 // placing virtual ladder and detectors volumes following ladder
1533 // ordering convention
1536 Int_t iLaddMax = fgkLay4Nladd;
1537 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1538 iLaddMin = fAddOnlyLadder4min;
1539 iLaddMax = fAddOnlyLadder4max+1;
1541 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1543 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1544 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1545 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1547 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1548 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1549 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1550 0, ladderPhi, kTRUE);
1551 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1552 ///////////////////////////////////////////////////
1553 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1554 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1556 minRadiusDetBox = fgkLay4DetLongRadius;
1557 minRadiusDetBox += detBoxThickness/2;
1558 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1559 0, ladderPhi, kTRUE);
1560 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1561 ///////////////////////////////////////////////////
1565 //====================================
1566 // Then the pieces at forward rapidity
1567 // (cooling, Carlos, LV, HV ...)
1568 //====================================
1570 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1571 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1572 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1574 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1575 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1576 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1577 fgkForwardLay4Length/2.);
1578 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1579 virtualForward4Shape, airSDD);
1580 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1581 virtualForward4Shape, airSDD);
1582 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1583 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1585 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1586 fgkLay4Length/2+fgkForwardLay4Length/2);
1587 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1588 -fgkLay4Length/2-fgkForwardLay4Length/2);
1590 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1592 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1593 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1595 minRadiusDetBox = fgkLay4DetLongRadius;
1596 minRadiusDetBox += detBoxThickness/2;
1598 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1600 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1601 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1602 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1603 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1604 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1605 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1609 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1611 virtualLayer4->SetVisibility(kFALSE);
1612 //virtualForward4Pos->SetVisibility(kFALSE);
1613 //virtualForward4Neg->SetVisibility(kFALSE);
1615 moth->AddNode(virtualLayer4,1,0);
1616 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1617 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1621 // //________________________________________________________________________
1622 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1624 // // Insert the layer 4 in the mother volume. This is a virtual volume
1625 // // containing ladders of layer 4 and the supporting rings
1626 // // (cooling, Carlos, LV, HV ...)
1630 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1634 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1636 // if (! fSDDsensor3) CreateBasicObjects();
1638 // Double_t dPhi = 360./fgkLay4Nladd;
1639 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1641 // // placing virtual ladder and detectors volumes following ladder
1642 // // ordering convention
1643 // char rotName[20];
1644 // Int_t iLaddMin = 0;
1645 // Int_t iLaddMax = fgkLay4Nladd;
1646 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1647 // iLaddMin = fAddOnlyLadder4min;
1648 // iLaddMax = fAddOnlyLadder4max+1;
1651 // //=================
1652 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1653 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1654 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1656 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1657 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1658 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1659 // fgkForwardLay4Length/2.);
1660 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1661 // virtualForward4Shape, airSDD);
1662 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1663 // virtualForward4Shape, airSDD);
1664 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1665 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1667 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1668 // fgkLay4Length/2+fgkForwardLay4Length/2);
1669 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1670 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1672 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1674 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1675 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1676 // if (iLadd%2 != 0)
1677 // minRadiusDetBox = fgkLay4DetLongRadius;
1678 // minRadiusDetBox += detBoxThickness/2;
1680 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1682 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1683 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1684 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1685 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1686 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1687 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1690 // virtualForward4Pos->SetVisibility(kFALSE);
1691 // virtualForward4Neg->SetVisibility(kFALSE);
1693 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1694 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1698 //________________________________________________________________________
1699 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1701 // Insert the end-ladder of layer 4 in the mother volume.
1702 // (cooling, Carlos, LV, HV ...)
1706 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1710 if (! fSDDsensor3) CreateBasicObjects();
1712 // placing virtual ladder and detectors volumes following ladder
1713 // ordering convention
1715 Int_t iLaddMax = fgkLay4Nladd;
1716 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1717 iLaddMin = fAddOnlyLadder4min;
1718 iLaddMax = fAddOnlyLadder4max+1;
1721 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1722 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1725 Double_t dPhi = 360./fgkLay4Nladd;
1726 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1728 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1730 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1733 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1735 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1737 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1738 fgkLay4Length/2, ladderPhi, kTRUE);
1739 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1740 -fgkLay4Length/2, ladderPhi, kFALSE);
1741 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1742 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1745 // 180deg Y rotation to compensate the cancellation of ITSD volume
1746 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1747 TGeoRotation *y180 = new TGeoRotation();
1748 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1749 moth->AddNode(virtualForward4Pos, 1, y180);
1750 moth->AddNode(virtualForward4Neg, 1, y180);
1754 //________________________________________________________________________
1755 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1757 // return an assembly volume containing the CF ladder
1760 Int_t nDetectors = fgkLay3Ndet;
1761 Double_t ladderLength = fgkLay3LadderLength;
1762 Double_t underSegDH = fLay3LadderUnderSegDH;
1763 Double_t *sensorZPos = fLay3sensorZPos;
1764 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1765 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1769 nDetectors = fgkLay4Ndet;
1770 ladderLength = fgkLay4LadderLength;
1771 digitCableA = fDigitCableLay4A;
1772 digitCableB = fDigitCableLay4B;
1773 underSegDH = fLay4LadderUnderSegDH;
1774 sensorZPos = fLay4sensorZPos;
1777 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1779 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1780 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1782 // placing virtual ladder segment following detector ordering convention
1783 //=======================================================================
1786 // adding segment this way to create cable points in the correct order ...
1787 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1789 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1790 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1791 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1792 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1793 + fgkSegmentLength/2;
1794 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1795 underSegDH/2,segmentPos);
1797 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1799 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1801 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1802 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1803 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1804 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1805 + fgkSegmentLength/2;
1806 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1807 underSegDH/2,segmentPos);
1809 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1812 // putting virtual volume corresponding to the end of ladder
1813 //=======================================================================
1814 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1815 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1816 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1817 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1818 // Euler rotation : about Z, then new X, then new Z
1819 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1820 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1821 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1822 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1823 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1825 // creating and inserting cable segments
1826 // (check points are placed while creating segments)
1827 //=======================================================================
1829 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1831 digitCableA[iSegment].SetInitialNode(virtualLadder);
1832 digitCableB[iSegment].SetInitialNode(virtualLadder);
1834 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1835 Double_t rotation = 0;
1837 rotation = 90-fgkHybridAngle;
1838 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1840 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1844 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1845 Double_t rotation = 0;
1847 rotation = fgkHybridAngle-90;
1848 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1850 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1855 //=======================================================================
1857 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1858 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1860 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1861 char cableHVname[30];
1862 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1863 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1864 cableHV[iSegment].SetName(cableHVname);
1865 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1866 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1867 cableHV[iSegment].SetNLayers(2);
1868 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1870 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1871 cableHV[iSegment].SetInitialNode(virtualLadder);
1873 Double_t x1[3], x2[3], x3[3],
1874 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1876 x1[0] = -fgkTransitHVtailXpos;
1877 x2[0] = -fgkTransitHVtailXpos;
1878 x3[0] = -fgkTransitHVtailXpos;
1879 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1880 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1881 *fgkLongHVcableSeparation;
1882 // adjust where HV long cable starts in Y
1883 // useful if you want to let some space for alignment
1884 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1885 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1886 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1888 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1889 x2[2] = x1[2]+5*fgkmm;
1890 x3[2] = ladderLength/2-endLength;
1891 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1892 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1893 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1895 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1896 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1897 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1898 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1902 x1[0] = fgkTransitHVtailXpos;
1903 x2[0] = fgkTransitHVtailXpos;
1904 x3[0] = fgkTransitHVtailXpos;
1906 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1907 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1908 *fgkLongHVcableSeparation;
1909 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1910 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1911 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1913 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1914 x2[2] = x1[2]-5*fgkmm;
1915 x3[2] = -ladderLength/2+endLength;
1916 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1917 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1918 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1920 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1921 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1925 //**********************************
1926 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1927 return virtualLadder;
1931 //________________________________________________________________________
1932 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(const char *name,
1933 Double_t dz, Double_t angle, Double_t xSign,
1934 Double_t L, Double_t H, Double_t l) {
1935 // Create one half of the V shape corner of CF ladder
1937 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1938 cfLaddSide->SetName(name);
1940 // Points must be in clockwise order
1941 cfLaddSide->SetVertex(0, 0, 0);
1942 cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1943 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1944 cfLaddSide->SetVertex(4, 0, 0);
1945 cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1946 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1948 cfLaddSide->SetVertex(1, 0, -H);
1949 cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1950 cfLaddSide->SetVertex(5, 0, -H);
1951 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1953 cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1954 cfLaddSide->SetVertex(3, 0, -H);
1955 cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1956 cfLaddSide->SetVertex(7, 0, -H);
1962 //________________________________________________________________________
1963 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1965 // return a box containing the front-end hybrid
1968 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1970 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1971 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1972 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1973 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1974 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1975 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1976 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1977 // + upFLTotalThick + ccUpLayerTotThick);
1978 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1980 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1982 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1984 //**************************************************** media :
1985 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1986 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1987 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1988 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1989 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1990 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1991 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1992 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1993 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1994 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1995 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1997 //**************************************************** main volume :
1998 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
1999 (fgkHybridLength)/2);
2000 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
2003 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
2004 fgkHybridThBridgeThick/2,
2007 //**************************************************** Thermal bridge :
2008 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
2010 carbonFiberLadderStruct);
2011 vThermalBridge->SetLineColor(fColorCarbonFiber);
2012 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
2013 +fgkHybridThBridgeThick/2, 0);
2014 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
2016 //**************************************************** Screen layer :
2017 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
2018 fgkHybAlThick/2, fgkHybridLength/2);
2019 //here the upedex and glue layers are both assumed to be polyimide
2020 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
2022 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2024 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2025 (screenTotalThick+lowFLTotalThick)/2);
2027 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2028 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2030 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2031 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2032 +fgkHybAlThick/2, 0);
2034 TGeoTranslation hybHolePos1Tr(roundHoleX,
2035 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2036 -fgkHybridLength/2+fgkHybRndHoleZ);
2037 TGeoTranslation hybHolePos2Tr(roundHoleX,
2038 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2039 fgkHybridLength/2-fgkHybRndHoleZ);
2041 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2042 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2043 hybHolePos1->SetName("hybHolePos1");
2044 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2045 hybHolePos2->SetName("hybHolePos2");
2047 upGlueScreenTr->RegisterYourself();
2048 alScreenTr->RegisterYourself();
2049 hybHolePos1->RegisterYourself();
2050 hybHolePos2->RegisterYourself();
2053 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2054 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2055 "+sRoundHole:hybHolePos2)");
2056 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2057 vScreenAl->SetLineColor(fColorAl);
2058 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2059 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2060 "+sRoundHole:hybHolePos2)");
2061 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2062 sScreenUpGlue,polyhamideSDD);
2063 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2065 hybrid->AddNode(vScreenUpGlue, 1, 0);
2066 hybrid->AddNode(vScreenAl, 1, 0);
2068 //**************************************************** FL low layer :
2069 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2070 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2072 //here the upedex and glue layers are both assumed to be polyimide
2073 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2074 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2076 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2077 fgkHybAlThick/2, sideWidth1/2);
2079 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2080 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2081 -(fgkHybridLength-sideWidth1)/2);
2082 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2083 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2084 -(fgkHybridLength-sideWidth1)/2);
2085 upGlueBarTr1->RegisterYourself();
2086 alBarTr1->RegisterYourself();
2088 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2089 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2090 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2091 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2092 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2093 sLowUpGlueBar1, polyhamideSDD);
2094 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2096 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2097 vLowAlBar1->SetLineColor(fColorAl);
2098 hybrid->AddNode(vLowUpGlueBar1,1,0);
2099 hybrid->AddNode(vLowAlBar1,1,0);
2102 //here the upedex and glue layers are both assumed to be polyimide
2103 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2104 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2106 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2107 fgkHybAlThick/2, sideWidth2/2);
2109 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2110 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2111 (fgkHybridLength-sideWidth2)/2);
2112 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2113 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2114 (fgkHybridLength-sideWidth2)/2);
2115 upGlueBarTr2->RegisterYourself();
2116 alBarTr2->RegisterYourself();
2118 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2119 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2120 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2121 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2122 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2124 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2126 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2127 vLowAlBar2->SetLineColor(fColorAl);
2128 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2129 hybrid->AddNode(vLowAlBar2, 1, 0);
2131 if(GetDebug(3)) { // Remove compiler warning.
2132 sAlScreenLayer->InspectShape();
2133 sUpGlueScreenLayer->InspectShape();
2134 sRoundHole->InspectShape();
2135 sUpGlueBar1->InspectShape();
2136 sUpGlueBar2->InspectShape();
2137 sAlBar1->InspectShape();
2138 sAlBar2->InspectShape();
2141 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2142 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2143 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2145 lowFLpiece.SetNLayers(2);
2146 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2148 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2149 // alSDD at 80% : mostly to take into account strips of piece 3
2151 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2152 lowLayerYmin + lowFLTotalThick/2,
2153 -fgkHybridLength/2 + sideWidth1 };
2154 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2155 Double_t vZ[3] = {0,0,1};
2156 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2157 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2158 lowFLpiece.SetInitialNode(hybrid);
2159 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2160 lowFLpiece.ResetPoints();
2162 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2163 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2165 lowFLpiece.SetWidth(piece2width);
2166 lowFLpiece.SetName("lowFLpiece2");
2167 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2169 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2170 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2171 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2172 lowFLpiece.ResetPoints();
2174 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2175 - fgkHybFLlowHoleAmbDX/2;
2177 lowFLpiece.SetWidth(piece3width);
2178 lowFLpiece.SetName("lowFLpiece3");
2179 x1[0] = fgkHybridWidth/2-piece3width/2;
2181 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2182 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2183 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2185 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2186 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2187 Double_t vX[3] = {1,0,0};
2188 for (Int_t i=0; i<3; i++) {
2190 sprintf(ch, "lowFLpieceA%i", i+4);
2191 lowFLpiece.SetName(ch);
2192 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2194 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2195 x1[0] = -fgkHybridWidth/2 + piece1width;
2196 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2197 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2198 x1[2] = zPiece; x2[2] = zPiece;
2199 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2200 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2201 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2202 lowFLpiece.ResetPoints();
2204 sprintf(ch, "lowFLpieceB%i", i+4);
2205 lowFLpiece.SetName(ch);
2206 x1[0] = fgkHybridWidth/2 - piece3width;
2207 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2208 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2209 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2210 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2213 //**************************************************** chips+CC:
2214 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2215 chip.SetInitialNode(hybrid);
2217 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2218 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2219 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2220 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2222 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2223 // Here the tho CC (low+up) are merged
2224 // In fact, the last layer has a smaller surface of Al -> I put 80%
2226 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2230 for (Int_t i=0; i<4; i++) {
2231 sprintf(ch, "pascalCC%i", i);
2233 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2234 x2[0] = x1[0] + fgkHybPascalDX;
2235 x1[2] = zChips[i] - fgkHybridLength/2;
2237 chip.AddCheckPoint( hybrid, 0, x1, vX );
2238 chip.AddCheckPoint( hybrid, 1, x2, vX );
2239 chip.CreateAndInsertBoxCableSegment(1,-90);
2242 sprintf(ch, "ambraCC%i", i);
2244 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2245 x2[0] = x1[0] + fgkHybAmbraDX;
2246 chip.AddCheckPoint( hybrid, 0, x1, vX );
2247 chip.AddCheckPoint( hybrid, 1, x2, vX );
2248 chip.CreateAndInsertBoxCableSegment(1,-90);
2252 //**************************************************** CC outside chips:
2253 // I don't think there is a second aluminium layer here ...
2254 for (Int_t i = 0; i<4; i++) {
2255 sprintf(ch, "ccLayerA%i", i);
2257 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2258 ccLayer1.SetInitialNode(hybrid);
2259 ccLayer1.SetNLayers(2);
2260 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2261 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2264 x1[0] = -fgkHybridWidth/2;
2265 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2266 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2267 + fgkHybChipThick + ccUpLayerTotThick/2;
2269 x1[2] = zChips[i] - fgkHybridLength/2;
2271 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2272 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2273 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2275 sprintf(ch, "ccLayerB%i", i);
2276 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2277 ccLayer2.SetInitialNode(hybrid);
2278 ccLayer2.SetNLayers(2);
2279 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2280 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2283 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2284 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2285 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2286 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2287 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2288 ccLayer2.ResetPoints();
2289 sprintf(ch, "ccLayerC%i", i);
2290 ccLayer2.SetName(ch);
2291 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2292 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2293 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2294 + ccUpLayerTotThick/2;
2297 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2298 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2299 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2302 //**************************************************** FL UP:
2303 // (last Al layer will be a special triangular shape)
2304 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2305 fgkHybFLUpperWidth/2, flUpThick/2,
2306 fgkHybFLUpperLength/2);
2307 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2308 sFLupPolyhamide, polyhamideSDD);
2309 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2310 TGeoTranslation *trFLupPolyhamide =
2311 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2312 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2314 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2316 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2317 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2318 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2319 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2320 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2321 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2322 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2323 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2324 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2325 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2328 vAluStrip->SetLineColor(fColorAl);
2329 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2330 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2332 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2333 +flUpThick+fgkHybAlThick/2;
2334 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2335 fgkHybridWidth/2,yRotAluStrip,
2336 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2337 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2338 AddTranslationToCombiTrans(aluStripTr2,0,0,
2339 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2340 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2341 AddTranslationToCombiTrans(aluStripTr3,0,0,
2342 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2343 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2344 AddTranslationToCombiTrans(aluStripTr4,0,0,
2345 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2347 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2348 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2349 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2350 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2351 //**************************************************** SMD:
2352 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2353 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2354 fgkHybSMDheight/2,fgkHybSMDendW/2);
2355 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2357 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2358 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2359 fgkHybSMDmiddleW/2);
2360 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2361 hybSMDmiddle,medSMD);
2362 vHybSMDmiddle->SetLineColor(fColorSMD);
2363 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2364 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2365 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2366 hybSMDend,medSMDweld);
2367 vHybSMDend->SetLineColor(fColorSMDweld);
2368 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2369 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2370 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2371 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2372 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2373 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2374 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2375 for (Int_t i=0; i<fgkNHybSMD; i++) {
2376 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2377 -fgkHybridWidth/2+fgkHybSMDposX[i],
2378 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2379 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2380 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2386 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2387 hybrid->SetVisibility(kFALSE);
2391 //________________________________________________________________________
2392 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2394 // Return a TGeoVolume* containing a segment of a ladder.
2397 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2398 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2399 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2401 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2402 Double_t segmentLength = fgkSegmentLength;
2403 Double_t spaceBetweenCables = 500*fgkmicron;
2405 //*****************************************
2406 // Set parameters according to (iLay,iSeg):
2407 //*****************************************
2408 Int_t nDetectors = fgkLay3Ndet;
2409 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2410 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2411 (fgkSegmentLength*fgkLay3Ndet/2. -
2412 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2413 // sensorCenterZPos = z in segment local coord syst.
2415 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2416 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2419 } else if (iLay==4) {
2420 nDetectors = fgkLay4Ndet;
2421 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2422 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2423 (fgkSegmentLength*fgkLay4Ndet/2. -
2424 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2425 digitCableA = fDigitCableLay4A;
2426 digitCableB = fDigitCableLay4B;
2428 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2431 Double_t cableSideSign = -1;
2432 if (iSeg<nDetectors/2) cableSideSign = 1;
2433 Double_t spaceForCables = spaceBetweenCables*
2434 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2436 // gives [0-1-2-2-1-0]*spaceBetweenCables
2437 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2438 Int_t iUpdateCableMin;
2439 Int_t iUpdateCableMax;
2440 if (cableSideSign==-1) {
2441 iUpdateCableMin = nDetectors/2;
2442 iUpdateCableMax = iSeg-1;
2444 iUpdateCableMin = iSeg+1;
2445 iUpdateCableMax = nDetectors/2-1;
2449 cout << "Segment ("<< iLay <<',' << iSeg
2450 << ") : sensor z shift in local segment coord.="
2451 << sensorCenterZPos << endl;
2454 //****************************
2455 // The segment volume
2456 //****************************
2458 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2459 // likely slows down the transport of particles through the geometry
2461 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2463 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2464 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2465 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2468 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2470 virtualSeg->SetVisibility(kFALSE);
2472 //******************************
2473 // Carbon fiber structure :
2474 //******************************
2476 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2477 Int_t volumeIndex = 1;
2478 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2479 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2483 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2484 fLaddSegCommonTr[i]);
2487 //**********************************
2488 // Pine support of the sensors :
2489 //**********************************
2490 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2491 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2493 // The use of the following constructor type allow to use rotPS1 and rotPS2
2494 // (and not copy them) therefore we gain some memory
2495 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2496 - fgkLadderHeight/2.-tDY
2497 + fgkPinSuppHeight/2.,
2498 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2500 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2501 - fgkLadderHeight/2.-tDY
2502 + fgkPinSuppHeight/2.,
2503 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2504 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2506 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2507 - fgkLadderHeight/2.-tDY
2508 + fgkPinSuppHeight/2.,
2509 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2510 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2512 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2513 - fgkLadderHeight/2.-tDY
2514 + fgkPinSuppHeight/2.,
2515 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2516 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2518 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2519 - fgkLadderHeight/2. - tDY
2520 + fgkPinSuppHeight/2.,
2521 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2523 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2524 - fgkLadderHeight/2. - tDY
2525 + fgkPinSuppHeight/2.,
2526 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2527 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2529 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2530 - fgkLadderHeight/2. - tDY
2531 + fgkPinSuppHeight/2.,
2532 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2533 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2535 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2536 - fgkLadderHeight/2. - tDY
2537 + fgkPinSuppHeight/2.,
2538 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2539 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2541 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2542 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2543 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2544 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2545 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2546 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2547 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2548 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2550 TGeoMedium *pinMed = GetMedium("SDDKAPTON (POLYCH2)$"); // medium ???
2551 Double_t fgkPinHeight = 4.5*fgkmm;
2552 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2554 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2556 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2557 - fgkLadderHeight/2.-tDY
2559 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2560 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2561 virtualSeg->AddNode(pineV, 1, transPS2b);
2563 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2564 - fgkLadderHeight/2. - tDY
2566 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2567 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2568 virtualSeg->AddNode(pineV, 2, transPS6b);
2571 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2572 - fgkLadderHeight/2.-tDY
2574 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2575 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2576 virtualSeg->AddNode(pineV, 3, transPS4b);
2578 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2579 - fgkLadderHeight/2. - tDY
2581 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2582 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2583 virtualSeg->AddNode(pineV, 4, transPS8b);
2586 //******************************
2587 // Cooling pipe supports :
2588 //******************************
2589 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2590 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2591 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2592 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2594 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2595 (triangleHeight+triangleCPaxeDist/
2596 TMath::Sin(halfTheta)-coolPipeSuppH);
2597 if (fAddCoolingSyst) {
2598 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2599 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2600 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2601 -fgkLadderHeight/2. - tDY
2602 +coolPipeSuppH+fgkLadderBeamRadius,
2603 -segmentLength/2., rotCPS1);
2605 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2606 -fgkLadderHeight/2. - tDY
2607 +coolPipeSuppH+fgkLadderBeamRadius,
2608 -segmentLength/2., rotCPS1);
2609 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2611 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2612 -fgkLadderHeight/2.- tDY
2613 +coolPipeSuppH+fgkLadderBeamRadius,
2614 segmentLength/2., rotCPS2);
2616 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2617 -fgkLadderHeight/2.- tDY
2618 +coolPipeSuppH+fgkLadderBeamRadius,
2619 segmentLength/2., rotCPS2);
2620 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2622 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2623 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2624 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2625 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2628 //************************
2630 //************************
2631 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2632 -fgkLadderHeight/2. - tDY +
2633 fgkLadderBeamRadius+coolPipeSuppH, 0);
2634 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2635 -fgkLadderHeight/2.- tDY +
2636 fgkLadderBeamRadius+coolPipeSuppH, 0);
2638 if (fAddCoolingSyst) {
2639 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2640 fgkCoolPipeOuterDiam/2,
2642 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2645 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2646 coolingPipeShape, phynoxSDD );
2647 coolingPipe->SetLineColor(fColorPhynox);
2648 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2652 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2653 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2655 virtualSeg->AddNode(cooler, 1, pipeTr1);
2656 virtualSeg->AddNode(cooler, 2, pipeTr2);
2660 //**********************************
2661 // Bases of hybrid thermal bridges
2662 //**********************************
2663 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2664 // approx !!! not clear on 0752/14-A
2665 if (fAddCoolingSyst) {
2666 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2667 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2668 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2669 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2671 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2672 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2675 //*************************
2677 //*************************
2678 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2679 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2681 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2682 - shiftHyb*SinD(fgkHybridAngle) );
2683 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2684 + shiftHyb*CosD(fgkHybridAngle) );
2686 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2687 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2688 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2689 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2690 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2691 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2693 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2694 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2701 // Starting from this segment
2702 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2703 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2704 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2705 - digitCableA->GetWidth()/2;
2706 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2707 - digitCableA->GetThickness()/2;
2709 Double_t digitCableX = ( coolPipeSuppL
2710 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2711 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2712 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2713 + fgkLadderBeamRadius+coolPipeSuppH
2714 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2715 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2718 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2719 digitCableY, cableSideSign*hybDz };
2720 Double_t digitCableCenterA1[3] = {
2721 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2722 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2723 cableSideSign*segmentLength/2 };
2725 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2726 digitCableY,cableSideSign*hybDz};
2727 Double_t digitCableCenterB1[3]={
2728 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2729 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2730 cableSideSign*segmentLength/2 };
2732 Double_t vZ[3] = {0,0,1};
2733 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2734 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2735 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2736 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2738 // Updating the other cables
2739 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2741 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2743 digitCableA[iCable].GetPoint( 1, coord);
2744 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2745 digitCableB[iCable].GetPoint( 1, coord);
2746 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2750 //**********************************
2751 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2756 //________________________________________________________________________
2757 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2759 // Create a pine support and its pine
2760 // axis of rotation is the cone axis, center in its middle
2762 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?
2764 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2765 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2766 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2767 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2768 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2769 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2770 fgkPinSuppHeight/2.+0.00001);
2771 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2773 if(GetDebug(3)){// Remove compiler warning.
2774 cone->InspectShape();
2775 tong->InspectShape();
2776 hole->InspectShape();
2779 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2780 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2781 tongTrans->RegisterYourself();
2782 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2783 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2784 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2786 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2788 pinSupport->SetLineColor(fColorRyton);
2794 //________________________________________________________________________
2795 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2797 // Create half of the cooling pipe support (ALR-0752/3)
2800 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2802 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2803 side1->SetName("ITSsddCPSside1");
2804 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2805 side1->SetVertex( 1, 0, fgkCoolPipeSuppWidthExt/2.);
2806 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2807 fgkCoolPipeSuppWidthExt/2.);
2808 side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX,
2809 -fgkCoolPipeSuppWidthExt/2.);
2810 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2811 side1->SetVertex( 5, 0, fgkCoolPipeSuppWidthExt/2.);
2812 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2813 fgkCoolPipeSuppWidthExt/2.);
2814 side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2.,
2815 -fgkCoolPipeSuppWidthExt/2.);
2817 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2818 - fgkCoolPipeSuppAxeDist
2819 + fgkCoolPipeSuppWidthExt/2., 0);
2820 side1Tr->RegisterYourself();
2821 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2822 - fgkCoolPipeSuppAxeDist
2823 + fgkCoolPipeSuppWidthExt*3/2.
2824 + fgkCoolPipeSuppWidthIn,0);
2825 side2Tr->RegisterYourself();
2827 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2828 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2829 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2830 TGeoTranslation *middleTr =
2831 new TGeoTranslation("ITSsddCPStr3",
2832 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2833 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2834 +fgkCoolPipeSuppWidthIn/2., 0);
2835 middleTr->RegisterYourself();
2837 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2838 fgkCoolPipeSuppTongW/4.,
2839 (fgkCoolPipeSuppFulWidth
2840 - 2*fgkCoolPipeSuppWidthExt
2841 - fgkCoolPipeSuppWidthIn)/2,
2842 fgkCoolPipeSuppHeight/2.);
2844 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2845 fgkCoolPipeSuppTongW/4.,
2846 - fgkCoolPipeSuppAxeDist
2847 + fgkCoolPipeSuppFulWidth
2848 - axeBox->GetDY(), 0);
2849 axeBoxTr->RegisterYourself();
2851 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2852 fgkCoolPipeSuppTongW/4.);
2854 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2855 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2856 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2857 axeTrans->RegisterYourself();
2858 //delete axeRot; // make the code crash, no idea of why !!!
2861 middle->InspectShape();
2862 axe->InspectShape();
2865 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2867 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2868 "ITSsddCoolPipeSuppShapeL",
2869 "ITSsddCPSmiddle:ITSsddCPStr3"
2870 "+ITSsddCPSside1:ITSsddCPStr1"
2871 "+ITSsddCPSside1:ITSsddCPStr2"
2872 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2873 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2874 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2875 coolPipeSuppShape, rytonSDD);
2877 coolPipeSupp->SetLineColor(fColorRyton);
2879 return coolPipeSupp;
2883 //________________________________________________________________________
2884 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2886 //Create half of the cooling pipe support (ALR-0752/3)
2889 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2891 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2892 side1->SetName("ITSsddCPSside1R");
2893 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2894 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2895 -fgkCoolPipeSuppWidthExt/2.);
2896 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2897 fgkCoolPipeSuppWidthExt/2.);
2898 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2899 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2900 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2901 -fgkCoolPipeSuppWidthExt/2.);
2902 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2903 fgkCoolPipeSuppWidthExt/2.);
2904 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2906 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2907 - fgkCoolPipeSuppAxeDist
2908 + fgkCoolPipeSuppWidthExt/2., 0);
2909 side1Tr->RegisterYourself();
2910 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2911 - fgkCoolPipeSuppAxeDist
2912 + fgkCoolPipeSuppWidthExt*3/2.
2913 + fgkCoolPipeSuppWidthIn, 0);
2914 side2Tr->RegisterYourself();
2916 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2917 (fgkCoolPipeSuppMaxLength/2.
2918 - fgkCoolPipeSuppSlitL)/2.,
2919 fgkCoolPipeSuppWidthIn/2.,
2920 fgkCoolPipeSuppHeight/2.);
2921 TGeoTranslation *middleTr =
2922 new TGeoTranslation("ITSsddCPStr3R",
2923 -( fgkCoolPipeSuppMaxLength/2.
2924 -fgkCoolPipeSuppSlitL)/2.,
2925 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2926 + fgkCoolPipeSuppWidthIn/2.,0);
2927 middleTr->RegisterYourself();
2929 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2930 fgkCoolPipeSuppTongW/4.,
2931 (fgkCoolPipeSuppFulWidth
2932 - 2*fgkCoolPipeSuppWidthExt
2933 - fgkCoolPipeSuppWidthIn)/2,
2934 fgkCoolPipeSuppHeight/2.);
2936 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2937 - fgkCoolPipeSuppTongW/4.,
2938 - fgkCoolPipeSuppAxeDist
2939 + fgkCoolPipeSuppFulWidth
2940 - axeBox->GetDY(),0);
2941 axeBoxTr->RegisterYourself();
2943 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2944 fgkCoolPipeSuppTongW/4.);
2946 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2947 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2948 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2949 axeTrans->RegisterYourself();
2953 middle->InspectShape();
2954 axe->InspectShape();
2957 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2958 "ITSsddCoolPipeSuppShapeR",
2959 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2960 "+ITSsddCPSside1R:ITSsddCPStr1R"
2961 "+ITSsddCPSside1R:ITSsddCPStr2R"
2962 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2963 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2965 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2966 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2967 coolPipeSuppShape, rytonSDD);
2968 coolPipeSupp->SetLineColor(fColorRyton);
2970 return coolPipeSupp;
2973 //________________________________________________________________________
2974 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2976 // based on ALR 0752/8
2979 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2981 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2982 - (fgkRadiusAminBTB+fgkBTBthick);
2983 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2984 fgkBTBthick/2., fgkBTBlength/2.);
2985 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2986 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2987 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2988 base1Tr->RegisterYourself();
2990 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2992 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2993 fgkBTBthick/2., fgkBTBlength/2.);
2994 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2995 fgkBTBaxisAtoBottom - base2width/2.,
2996 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2997 base2Tr->RegisterYourself();
2999 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
3000 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
3001 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
3002 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
3003 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
3004 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
3005 sideTr1->RegisterYourself();
3006 sideTr2->RegisterYourself();
3008 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
3009 fgkBTBthick/2., fgkBTBHoleLength/2.);
3010 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
3011 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3012 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3013 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
3014 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
3015 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3016 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3017 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
3018 holeTr1->RegisterYourself();
3019 holeTr2->RegisterYourself();
3021 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
3022 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3023 fgkRadiusAminBTB, radiusAmaxBTB,
3024 fgkBTBlength/2., 0., 180.);
3025 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3026 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3027 fgkBTBlength/2., 270., 360.);
3028 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3029 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3031 roundTr1->RegisterYourself();
3033 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3034 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3035 fgkBTBlength/2., 180., 270.);
3036 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3037 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3039 roundTr2->RegisterYourself();
3041 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3042 "ITSsddBaseThermalBridgeShape",
3043 "ITSsddBTBbase1:ITSsddBTBtr1"
3044 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3045 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3046 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3047 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3048 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3049 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3050 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3051 "+ ITSsddBTBmainAxis");
3053 if(GetDebug(3)){// Remove compiler warning.
3054 base1->InspectShape();
3055 base2->InspectShape();
3056 side->InspectShape();
3057 hole->InspectShape();
3058 mainAxis->InspectShape();
3059 round1->InspectShape();
3060 round2->InspectShape();
3063 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3064 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3066 carbonFiberLadderStruct);
3068 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3069 return vBaseThermalBridge;
3073 //________________________________________________________________________
3074 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3076 // Return an assembly containing a end of a CF ladder.
3079 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3080 TGeoMedium *stesalite = GetMedium("G10FR4$");
3081 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3082 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3084 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3085 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3086 Double_t underSegDH = fLay3LadderUnderSegDH;
3087 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3088 // footDZ is also where to place the ruby's center in local Z
3089 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3092 } else if (iLay==4) {
3093 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3094 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3095 underSegDH = fLay4LadderUnderSegDH;
3096 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3097 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3099 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3103 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3104 + underSegDH/2); //space under ladder segment
3105 // here tDY is not the same as for the segment because the end ladder
3106 // does not have a space under it, inside the general ladder volume.
3107 Double_t segmentLength = fgkSegmentLength;
3108 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3110 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3112 //**********************************
3113 // coding real matter :
3114 //**********************************
3115 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3116 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3117 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3118 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3120 //--- The 3 V shape corners of the Carbon Fiber Ladder
3122 TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape",
3123 topCornerLength/2., halfTheta, -1,
3124 fgkLadderLa, fgkLadderHa, fgkLadderl);
3125 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1",
3126 cfLaddTop1,carbonFiberLadderStruct);
3127 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3128 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape",
3129 topCornerLength/2., halfTheta, 1,
3130 fgkLadderLa, fgkLadderHa, fgkLadderl);
3131 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3132 cfLaddTop2,carbonFiberLadderStruct);
3133 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3134 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3135 -(length-topCornerLength)/2.);
3136 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3137 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3140 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape",
3141 length/2., beta, -1,
3142 fgkLadderLb, fgkLadderHb, fgkLadderl);
3143 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3144 cfLaddSide1,carbonFiberLadderStruct);
3145 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3146 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape",
3148 fgkLadderLb, fgkLadderHb, fgkLadderl);
3149 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3150 cfLaddSide2,carbonFiberLadderStruct);
3151 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3152 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3153 TMath::Tan(beta) - fgkLadderBeamRadius );
3155 // because center of the triangle doesn't correspond to virtual vol. center
3156 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3157 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3158 alpha*TMath::RadToDeg());
3159 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3160 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3161 -alpha*TMath::RadToDeg());
3162 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3163 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3164 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3165 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3166 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3169 // Beams on the sides
3170 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3171 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3173 //Euler rotation : about Z, then new X, then new Z
3174 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3175 -beamPhiPrime*TMath::RadToDeg(), -90);
3176 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3177 beamPhiPrime*TMath::RadToDeg(), -90);
3178 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3179 beamPhiPrime*TMath::RadToDeg(), -90);
3180 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3181 -beamPhiPrime*TMath::RadToDeg(), -90);
3182 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3183 TMath::Tan(halfTheta),
3184 fgkLadderBeamRadius/2. + tDY,
3185 -length/2 + segmentLength/8, beamRot1);
3186 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3187 TMath::Tan(halfTheta),
3188 fgkLadderBeamRadius/2.+tDY,
3189 -length/2 + 3*segmentLength/8, beamRot2);
3190 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3191 TMath::Tan(halfTheta),
3192 fgkLadderBeamRadius/2.+tDY,
3193 -length/2 + segmentLength/8, beamRot3);
3194 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3195 TMath::Tan(halfTheta),
3196 fgkLadderBeamRadius/2. + tDY,
3197 -length/2+3*segmentLength/8, beamRot4);
3199 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3200 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3201 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3202 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3204 //--- Beams of the bottom
3205 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3207 /* Not there actually
3208 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3209 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3210 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3211 bottomBeam1, carbonFiberLadderStruct);
3212 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3214 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3215 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3216 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3217 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3219 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3220 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3221 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3222 bottomBeam2, carbonFiberLadderStruct);
3223 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3224 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3225 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3226 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3228 //**********************************
3229 //the cooling pipe supports
3230 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3231 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3233 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3234 (triangleHeight+triangleCPaxeDist/
3235 TMath::Sin(halfTheta)-coolPipeSuppH);
3237 if (fAddCoolingSyst) {
3238 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3239 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3240 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3241 -fgkLadderHeight/2.+ tDY +
3242 coolPipeSuppH+fgkLadderBeamRadius,
3243 -length/2., rotCPS1);
3244 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3245 -fgkLadderHeight/2.+ tDY +
3246 coolPipeSuppH+fgkLadderBeamRadius,
3247 -length/2., rotCPS2);
3249 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3250 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3253 //**********************************
3254 //--- The stesalite foot of the ladder
3256 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3257 - fgkLadFootY/2+fgkLadFingerPrintY;
3259 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3260 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3262 //=====================================
3265 if (fAddCoolingSyst) {
3267 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3268 -fgkLadderHeight/2.+ tDY +
3269 coolPipeSuppH + fgkLadderBeamRadius,
3270 -length/2.+coolPipeEndLen/2.);
3271 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3272 -fgkLadderHeight/2. + tDY +
3273 fgkLadderBeamRadius + coolPipeSuppH,
3274 -length/2.+coolPipeEndLen/2.);
3276 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3277 fgkCoolPipeOuterDiam/2,
3279 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3282 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3283 coolingPipeShape, phynoxSDD );
3284 coolingPipe->SetLineColor(fColorPhynox);
3285 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3288 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3289 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3291 virtualEnd->AddNode(cooler, 1, pipeTr1);
3292 virtualEnd->AddNode(cooler, 2, pipeTr2);
3296 //=====================================
3297 //--- HV cable guide
3300 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3301 fgkHVguideY1/2,fgkHVguideZ1/2);
3302 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3304 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3305 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3306 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3307 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3309 //=====================================
3311 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3312 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3313 -fgkLadderHeight/2.+ tDY +
3314 coolPipeSuppH+fgkLadderBeamRadius,
3315 -length/2.+coolPipeEndLen+raccordFullLen/2);
3316 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3317 -fgkLadderHeight/2.+ tDY +
3318 coolPipeSuppH+fgkLadderBeamRadius,
3319 -length/2.+coolPipeEndLen+raccordFullLen/2);
3321 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3322 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3324 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3329 //________________________________________________________________________
3330 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3332 //--- The stesalite foot of the ladder
3334 // The 2 screw holes on the left part
3335 // the small holes at each corner of the ruby cage (diam 2mm)
3336 // the really small level difference of 0.3mm on the bottom
3339 TGeoMedium *stesalite = GetMedium("G10FR4$");
3341 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3343 Double_t epsilon = 2e-10;
3344 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3346 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3347 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3348 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3349 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3351 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3352 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3353 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3356 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3357 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3359 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3360 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3361 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3363 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3364 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3365 rubyScrewHoleLen/2);
3367 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3368 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3369 fgkLadFootX/2-rubyScrewHoleLen/2,
3370 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3372 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3373 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3376 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3377 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3378 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3380 ladFootBox1Tr->RegisterYourself();
3381 ladFingerPrintTr->RegisterYourself();
3382 rubyCageHoleTr->RegisterYourself();
3383 rubyScrewHoleTr->RegisterYourself();
3384 rubyHoleTr->RegisterYourself();
3386 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3387 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3388 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3389 "+rubyHole:rubyHoleTr)");
3390 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3391 footRightPart,stesalite);
3392 vFootRightPart->SetLineColor(fColorStesalite);
3394 virtualFoot->AddNode(vFootRightPart, 1, 0);
3397 //--- This was the right part of the foot, now let's do the middle
3398 //--- and the right parts
3400 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3401 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3403 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3404 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3405 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3407 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3408 vFootMiddle->SetLineColor(fColorStesalite);
3409 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3412 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3413 (fgkLadFootY-fgkLadFingerPrintY)/2,
3415 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3416 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3417 -fgkLadFingerPrintY/2, 0);
3418 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3420 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3421 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3424 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3427 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3428 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3430 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3431 vFootLeft->SetLineColor(fColorStesalite);
3432 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3434 if(GetDebug(3)){ // Remove compiler warning.
3435 ladFingerPrint->InspectShape();
3436 ladFootBox1->InspectShape();
3437 rubyCageHole->InspectShape();
3438 rubyScrewHole->InspectShape();
3439 rubyHole->InspectShape();
3445 //________________________________________________________________________
3446 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3448 // return an assembly containing the CARLOS end-ladder board
3449 // and the heat bridge
3453 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3454 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3455 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3456 TGeoMedium *copper = GetMedium("COPPER$");
3457 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3458 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3460 //=========================================
3461 // cooling support of the Carlos card (HeatBridge):
3462 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3464 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3466 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3468 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3469 supCarlosBoard1, alCu12SDD);
3470 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3471 supCarlosBoard2, alCu12SDD);
3472 vSupCarlosBoard1->SetLineColor(4);
3473 vSupCarlosBoard2->SetLineColor(4);
3476 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3477 // shift of the main planes in the direction of their width
3478 // the center is fixed at the center of the 2 small fixing arms on each sides.
3481 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3482 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3483 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3484 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3486 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3487 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3490 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3494 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3495 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3497 //=========================================
3498 // fixing arm of the cooling support :
3499 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3501 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3502 supCarlosBoard3, alCu12SDD);
3503 vSupCarlosBoard3->SetLineColor(4);
3506 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3508 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3509 littleScrew, stainless);
3510 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3511 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3512 fgkLittleScrewHeadR-0.07, rotScrew);
3513 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3514 fgkLittleScrewHeadR+0.07, rotScrew);
3515 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3516 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3518 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3519 0, fgkCarlosSuppAngle, 0);
3520 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3521 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3522 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3523 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3524 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3525 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3528 //=========================================
3529 // screws fixing the board on the U tube
3530 Double_t aaa = fgkCarlosSuppY3; // ???
3531 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3532 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3533 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3534 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3535 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3536 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3538 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3540 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3541 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3542 screw1y,screw1z, CarlosSuppRot);
3544 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3545 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3546 screw1z,screw1y, CarlosSuppRot);
3548 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3549 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3550 screw1y,screw1z, CarlosSuppRot);
3552 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3553 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3554 screw1z,screw1y, CarlosSuppRot);
3556 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3557 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3558 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3559 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3561 //=========================================
3563 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3564 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3565 card1.SetNLayers(2);
3566 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3567 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3568 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3569 p1[0] = -fgkCarlosCardX1/2;
3570 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3571 p1[2] = fgkCarlosCardShift;
3572 p2[0] = fgkCarlosCardX1/2;
3573 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3574 p2[2] = fgkCarlosCardShift;
3575 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3576 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3577 card1.CreateAndInsertBoxCableSegment(1,90);
3579 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3580 card2.SetNLayers(2);
3581 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3582 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3583 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3585 p1[0] = -fgkCarlosCardX1/2;
3586 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3587 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3589 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3590 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3591 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3592 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3593 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3594 card2.CreateAndInsertBoxCableSegment(1,90);
3596 //=========================================
3597 // some chips on the board
3599 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3601 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3602 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3603 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3605 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3606 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3607 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3609 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3610 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3611 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3612 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3613 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3614 u1.CreateAndInsertBoxCableSegment(1,90);
3617 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3619 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3620 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3621 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3623 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3624 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3625 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3627 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3628 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3629 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3630 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3631 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3632 u2.CreateAndInsertBoxCableSegment(1,90);
3635 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3637 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3638 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3639 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3641 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3642 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3644 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3646 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3648 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3649 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3650 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3651 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3653 //--- U4 is like U3 (?)
3654 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3655 u4Trans->RotateX(90);
3656 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3657 fgkCarlosCardShift + fgkCarlosU4posZ);
3658 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3661 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3663 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3664 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3665 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3667 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3668 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3669 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3671 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3672 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3673 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3674 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3675 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3676 u17.CreateAndInsertBoxCableSegment(1,90);
3679 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3681 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3682 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3683 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3685 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3686 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3687 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3689 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3690 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3691 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3692 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3693 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3694 u35.CreateAndInsertBoxCableSegment(1,90);
3697 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3699 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3700 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3701 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3703 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3704 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3705 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3707 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3708 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3709 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3710 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3711 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3712 u36.CreateAndInsertBoxCableSegment(1,90);
3715 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3717 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3718 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3719 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3721 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3722 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3723 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3725 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3726 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3727 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3728 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3729 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3730 qz1.CreateAndInsertBoxCableSegment(1,90);
3732 return assemblySupCarlos;
3735 //________________________________________________________________________
3736 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3738 // Creates the assemblies containing the LV cards (left and right)
3741 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3742 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3743 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3744 TGeoMedium *copper = GetMedium("COPPER$");
3745 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3746 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3748 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3749 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3751 // we are going to use flat cable class to create multilayer box,
3752 // then we can use the pointers to created volumes to place them elsewhere
3753 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3755 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3756 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3757 cardLV.SetNLayers(2);
3758 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3759 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3760 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3762 p1[1] = fgkLVcardY/2;
3765 p2[1] = fgkLVcardY/2;
3767 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3768 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3769 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3770 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3771 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3772 fCardLVR->AddNode(boxVol, 1, trCard);
3774 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3775 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3776 chipO.SetNLayers(2);
3777 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3778 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3779 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3780 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3781 p1[1] = fgkLVChip0PosY;
3782 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3784 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3785 p2[1] = fgkLVChip0PosY;
3786 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3787 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3788 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3789 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3790 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3792 carLVfullThick/2+chip0fullThick/2, rotAdd);
3793 fCardLVR->AddNode(boxVol, 1, trCard);
3795 // put also this chip on the other side of the card
3796 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3798 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3799 fCardLVL->AddNode(boxVol, 2, trCard);
3800 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3802 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3803 fCardLVR->AddNode(boxVol, 2, trCard);
3805 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3806 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3807 chip1.SetNLayers(2);
3808 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3809 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3810 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3811 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3812 p1[1] = fgkLVChip1PosY;
3813 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3815 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3816 p2[1] = fgkLVChip1PosY;
3817 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3818 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3819 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3820 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3821 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3823 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3824 fCardLVR->AddNode(boxVol, 1, trCard);
3826 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3827 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3828 chip2.SetNLayers(2);
3829 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3830 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3831 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3832 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3833 p1[1] = fgkLVChip2PosY;
3834 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3835 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3836 p2[1] = fgkLVChip2PosY;
3837 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3838 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3839 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3840 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3841 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3843 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3844 fCardLVR->AddNode(boxVol, 1, trCard);
3846 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3847 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3848 chip3.SetNLayers(2);
3849 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3850 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3851 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3852 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3853 p1[1] = fgkLVChip3PosY;
3854 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3855 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3856 p2[1] = fgkLVChip3PosY;
3857 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3858 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3859 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3860 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3861 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3863 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3864 fCardLVR->AddNode(boxVol, 1, trCard);
3866 // the Al pieces for heat exchange :
3867 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3868 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3870 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3871 (fgkLVcoolX1/2+fgkLVcoolX2),
3872 fgkLVcoolPosY+fgkLVcoolY1/2,
3873 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3874 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3875 (fgkLVcoolX1/2+fgkLVcoolX2),
3876 fgkLVcoolPosY+fgkLVcoolY1/2,
3877 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3879 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3881 vAlLVcooling1->SetLineColor(2);
3884 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3885 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3886 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3888 fgkLVcoolPosY+fgkLVcoolY1/2,
3889 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3890 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3892 fgkLVcoolPosY+fgkLVcoolY1/2,
3893 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3895 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3897 vAlLVcooling2->SetLineColor(2);
3900 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3902 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3903 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3904 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3906 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3908 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3909 vAlLVcooling3->SetLineColor(2);
3911 //=== screw fixing th LV card to the U cooling tube :
3912 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3914 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3915 littleScrew, stainless);
3916 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3918 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3920 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3922 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3923 0, fgkLittleLVScrewHeadR,
3924 fgkLittleScrewHeadH/2);
3925 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3926 littleScrewHead, stainless);
3927 vLittleScrewHead->SetLineColor(kGray);
3928 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3929 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3930 fgkShiftLittleScrewLV,
3932 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3934 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3935 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3936 fgkShiftLittleScrewLV,
3938 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3940 // adding the cooling pieces to the left card
3941 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3942 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3943 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3944 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3945 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3947 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3948 -(fgkLVcoolX1/2+fgkLVcoolX2),
3949 fgkLVcoolPosY+fgkLVcoolY1/2,
3950 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3951 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3952 -(fgkLVcoolX1/2+fgkLVcoolX2),
3953 fgkLVcoolPosY+fgkLVcoolY1/2,
3954 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3955 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3957 fgkLVcoolPosY+fgkLVcoolY1/2,
3958 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3959 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3961 fgkLVcoolPosY+fgkLVcoolY1/2,
3962 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3964 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3966 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3968 // and to the right card
3969 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3970 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3971 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3972 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3973 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3978 //________________________________________________________________________
3979 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3981 // return an assembly containing the HV card
3985 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3986 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3987 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3988 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3989 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3990 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3992 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3994 //====================================
3995 //--- the card itself
3996 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
3997 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
3998 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
3999 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
4001 highVCard->AddNode(vCeramicCard, 1, 0);
4004 //====================================
4008 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
4009 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
4010 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
4013 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
4014 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
4015 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
4017 vCapa1End->SetLineColor(18);// grey silver
4018 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
4019 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4020 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
4021 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4023 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
4024 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
4025 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4027 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
4028 capa1->AddNode(vCapa1Middle, 1,0);
4029 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4030 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4032 highVCard->AddNode(capa1, 1, capa1PosTr);
4035 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4036 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4037 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4040 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4041 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4042 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4044 vCapa2End->SetLineColor(18);// grey silver
4045 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4046 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4047 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4048 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4050 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4051 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4052 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4054 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4055 capa2->AddNode(vCapa2Middle, 1,0);
4056 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4057 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4059 highVCard->AddNode(capa2, 1, capa2PosTr);
4062 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4063 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4064 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4067 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4068 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4069 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4071 vCapa3End->SetLineColor(18);// grey silver
4073 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4074 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4075 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4076 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4078 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4079 capa3->AddNode(vCapa3Middle, 1,0);
4080 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4081 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4083 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4084 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4085 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4087 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4088 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4089 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4091 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4092 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4093 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4095 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4096 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4097 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4099 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4100 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4101 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4103 highVCard->AddNode(capa3, 1, capa3PosTr1);
4104 highVCard->AddNode(capa3, 2, capa3PosTr2);
4105 highVCard->AddNode(capa3, 3, capa3PosTr3);
4106 highVCard->AddNode(capa3, 4, capa3PosTr4);
4107 highVCard->AddNode(capa3, 5, capa3PosTr5);
4109 //====================================
4110 //--- connexions to LV card
4112 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4113 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4114 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4115 Double_t fgkConnexLVHVx = 3*fgkmm;
4116 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4117 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4119 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4120 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4121 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4122 fgkConnexLVHVdiam1/2,
4123 fgkConnexLVHVdiam2/2,
4124 fgkConnexLVHVlen/2);
4125 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4126 connexLVHVmetal, stainless);
4127 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4128 connexLVHVplastic, plastic);
4129 vConnexLVHVmetal->SetLineColor(10);// white
4130 vConnexLVHVplast->SetLineColor(12); // dark grey
4132 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4133 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4134 connexion->AddNode(vConnexLVHVplast, 1, 0);
4136 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4137 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4138 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4139 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4141 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4142 fgkConnexLVHVy1+fgkConnexLVHVdy,
4143 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4144 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4145 fgkConnexLVHVy1+fgkConnexLVHVdy,
4146 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4148 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4149 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4150 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4151 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4152 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4153 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4155 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4156 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4157 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4158 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4159 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4160 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4162 highVCard->AddNode(connexion, 1, trConnexion1);
4163 highVCard->AddNode(connexion, 2, trConnexion2);
4164 highVCard->AddNode(connexion, 3, trConnexion3);
4165 highVCard->AddNode(connexion, 4, trConnexion4);
4166 highVCard->AddNode(connexion, 5, trConnexion5);
4167 highVCard->AddNode(connexion, 6, trConnexion6);
4168 highVCard->AddNode(connexion, 7, trConnexion7);
4169 highVCard->AddNode(connexion, 8, trConnexion8);
4171 //====================================
4172 //--- cooling pieces
4174 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4175 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4178 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4179 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4181 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4182 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4184 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4186 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4188 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4190 // This last volume contains the screw used for fixing
4191 // the card to the cooling tube ...
4192 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4194 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4195 littleScrewHV, stainless);
4197 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4198 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4200 vCardHVcool1->SetLineColor(2); //red
4201 vCardHVcool2->SetLineColor(2); //red
4202 vCardHVcool3->SetLineColor(2); //red
4204 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4205 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4206 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4207 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4208 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4209 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4210 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4211 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4213 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4214 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4216 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4217 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4218 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4219 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4221 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4222 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4223 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4224 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4226 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4227 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4229 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4230 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4231 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4232 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4234 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4235 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4236 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4237 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4239 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4240 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4242 //====================================
4244 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4245 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4246 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4247 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4249 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4250 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4251 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4252 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4255 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4256 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4262 //________________________________________________________________________
4263 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4265 // return an assembly containing the LV, HV and Carlos cards of one ladder
4266 // and their cooling system
4269 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4270 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4271 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4273 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4275 //=*********************************
4276 //--- The rounded pipe for the end ladder card coooling
4278 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4279 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4283 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4284 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4288 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4289 endLadderPipe.SetNLayers(2);
4290 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4291 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4293 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4294 // of the U colling pipe in its center
4296 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4297 Double_t vectA[3] = {0,0,1};
4299 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4300 Double_t vectB[3] = {0,0,1};
4302 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4303 Double_t vectC[3] = {1,0,0};
4305 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4306 Double_t vectD[3] = {-1,0,0};
4308 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4309 Double_t vectE[3] = {0,0,-1};
4311 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4312 Double_t vectF[3] = {0,0,-1};
4314 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4315 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4316 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4317 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4318 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4319 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4321 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4322 //endLadderPipe.CreateAndInsertCableSegment( 1);
4323 endLadderPipe.CreateAndInsertTubeSegment( 1);
4324 //endLadderPipe.CreateAndInsertCableSegment( 2);
4325 endLadderPipe.CreateAndInsertTorusSegment( 2);
4326 //endLadderPipe.CreateAndInsertCableSegment( 3);
4327 endLadderPipe.CreateAndInsertTubeSegment( 3);
4328 //endLadderPipe.CreateAndInsertCableSegment( 4);
4329 endLadderPipe.CreateAndInsertTorusSegment( 4);
4330 //endLadderPipe.CreateAndInsertCableSegment( 5);
4331 endLadderPipe.CreateAndInsertTubeSegment( 5);
4333 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4334 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4335 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4336 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4338 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4339 - fgkEndLadPipeArmBoxDX,
4340 fgkEndLadPipeArmBoxDY,0);
4341 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4342 fgkEndLadPipeArmBoxDX,
4343 fgkEndLadPipeArmBoxDY,0);
4344 endLadPipeArmBoxDY1->RegisterYourself();
4345 endLadPipeArmBoxDY2->RegisterYourself();
4347 if(GetDebug(3)) { // Remove compiler warning.
4348 endLadPipeArmBox->InspectShape();
4349 endLadPipeArmTube->InspectShape();
4352 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4353 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4354 "- endLadPipeArmTube");
4355 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4356 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4357 "- endLadPipeArmTube");
4359 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4360 endLadPipeArm1, alCu12SDD);
4361 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4362 endLadPipeArm2, alCu12SDD);
4363 vEndLadPipeArm1->SetLineColor(2);
4364 vEndLadPipeArm2->SetLineColor(2);
4366 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4367 +fgkEndLadPipeArmZpos);
4369 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4370 -fgkEndLadPipeUwidth/2,0,armZ);
4371 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4372 fgkEndLadPipeUwidth/2,0,armZ);
4374 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4375 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4377 //=*********************************
4379 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4380 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4382 Double_t spaceBetweenCards = 0.2*fgkmm;
4384 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4385 +fgkEndLadPipeArmBoxDX);
4386 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4387 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4389 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4392 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4393 +coolUzPos+1.25*fgkmm;
4394 // Position in z of the first LVB with respect to the start of the cooling
4395 // rectangular arm, coming (from inside of the ladder)
4396 // The cards are added one after the other
4398 for (Int_t iCard=0; iCard<nCards; iCard++) {
4400 Double_t cardLVzShift = firstLVCardZ +
4401 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4403 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4404 cardLVyShift, cardLVzShift);
4405 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4406 cardLVyShift, cardLVzShift);
4408 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4409 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4412 //=*********************************
4414 TGeoVolumeAssembly *cardHV = fCardHV;
4416 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4417 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4419 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4420 -(fgkHVCardCeramZ)/2);
4422 for (Int_t iCard=0; iCard<nCards; iCard++) {
4424 Double_t fact = iCard*2.+1.;
4425 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4426 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4427 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4428 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4431 //=*********************************
4434 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4435 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4436 // 0, -fgkCarlosSuppAngle, 0);
4438 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4439 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4440 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4441 // position in z of the first Carlos board, coming from inside of the ladder
4443 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4444 fgkEndLadPipeArmBoxDY);
4446 for (Int_t iCard=0; iCard<nCards; iCard++) {
4448 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4449 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4450 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4451 (TGeoRotation*) fCommonTr[0]);
4453 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4456 return endLadderCards;
4460 //________________________________________________________________________
4461 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4463 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4464 // and their cooling system
4465 // This is the code actually used for the end ladder cards
4468 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4469 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4470 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4471 TGeoMedium *copper = GetMedium("COPPER$");
4472 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4473 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4474 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4476 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4477 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4479 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4480 // reference radius corresponding to local y=0
4483 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4484 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4486 rREF = fgkEndLaddCardsShortRadiusLay4;
4489 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4490 +fgkEndLadPipeArmBoxDX);
4491 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4492 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4494 Double_t rMin = rREF + cardLVyShift;
4495 // (The LV card is defining rMin because it is the lower object)
4497 Double_t thickTotCable = 0.5;
4499 //==================================
4500 //--- The Pcon container
4502 // minimum angle of the Pcon :
4503 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4504 (rREF-fgkEndLadPipeArmY/2) );
4505 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4506 Double_t phi0 = 90-dphi/2;
4507 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4508 // of the U colling pipe in its center
4509 Double_t zMax = endLadPipeUlength+coolUzPos;
4510 Double_t rMax = rMin + fgkLVcardY;
4511 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4512 Double_t cablesRadius = rMax-0.5;
4514 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4515 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4516 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4517 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4518 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4519 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4520 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4521 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4522 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4523 // the following is quite dirty but works for the moment ...
4524 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4525 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4527 // The next parameters define the shape of the Pcon at its end and where cables
4529 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4530 Double_t cableSectionR2 = rMax;
4531 Double_t cableSectionZ1 = zMax + 6.3*fgkmm + 2.5*fgkcm;
4532 Double_t cableSectionZ2 = zMax + 7.3*fgkmm + 4*fgkcm;
4533 // Those 6.3 and 7.3 are to be fixed to stick the maximum to the SDD cone
4534 // (I'm waiting for the new cone)
4536 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4537 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4539 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4540 //endLadderCards->SetVisibility(kFALSE);
4542 //=*********************************
4543 //--- The rounded pipe for the end ladder card cooling
4545 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4546 endLadderPipe.SetNLayers(2);
4547 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4548 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4550 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4551 Double_t vectA[3] = {0,0,1};
4553 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4554 Double_t vectB[3] = {0,0,1};
4556 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4557 Double_t vectC[3] = {1,0,0};
4559 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4560 Double_t vectD[3] = {-1,0,0};
4562 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4563 Double_t vectE[3] = {0,0,-1};
4565 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4566 Double_t vectF[3] = {0,0,-1};
4568 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4569 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4570 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4571 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4572 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4573 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4575 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4576 //endLadderPipe.CreateAndInsertCableSegment( 1);
4577 endLadderPipe.CreateAndInsertTubeSegment( 1);
4578 //endLadderPipe.CreateAndInsertCableSegment( 2);
4579 endLadderPipe.CreateAndInsertTorusSegment( 2);
4580 //endLadderPipe.CreateAndInsertCableSegment( 3);
4581 endLadderPipe.CreateAndInsertTubeSegment( 3);
4582 //endLadderPipe.CreateAndInsertCableSegment( 4);
4583 endLadderPipe.CreateAndInsertTorusSegment( 4);
4584 //endLadderPipe.CreateAndInsertCableSegment( 5);
4585 endLadderPipe.CreateAndInsertTubeSegment( 5);
4587 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4588 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4589 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4590 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4592 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4593 - fgkEndLadPipeArmBoxDX,
4594 fgkEndLadPipeArmBoxDY,0);
4595 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4596 fgkEndLadPipeArmBoxDX,
4597 fgkEndLadPipeArmBoxDY,0);
4598 endLadPipeArmBoxDY1->RegisterYourself();
4599 endLadPipeArmBoxDY2->RegisterYourself();
4601 if(GetDebug(3)) { // Remove compiler warning.
4602 endLadPipeArmBox->InspectShape();
4603 endLadPipeArmTube->InspectShape();
4606 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4607 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4608 "- endLadPipeArmTube");
4609 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4610 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4611 "- endLadPipeArmTube");
4613 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4614 endLadPipeArm1, alCu12SDD);
4615 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4616 endLadPipeArm2, alCu12SDD);
4617 vEndLadPipeArm1->SetLineColor(2);
4618 vEndLadPipeArm2->SetLineColor(2);
4620 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4621 +fgkEndLadPipeArmZpos);
4623 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4624 -fgkEndLadPipeUwidth/2,rREF,armZ);
4625 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4626 fgkEndLadPipeUwidth/2,rREF,armZ);
4628 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4629 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4631 //=*********************************
4633 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4634 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4636 Double_t spaceBetweenCards = 0.2*fgkmm;
4639 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4642 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4643 +coolUzPos+1.25*fgkmm;
4644 // Position in z of the first LVB with respect to the start of the cooling
4645 // rectangular arm, coming (from inside of the ladder)
4646 // The cards are added one after the other
4648 for (Int_t iCard=0; iCard<nCards; iCard++) {
4650 Double_t cardLVzShift = firstLVCardZ +
4651 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4653 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4654 cardLVyShift+rREF, cardLVzShift);
4655 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4656 cardLVyShift+rREF, cardLVzShift);
4658 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4659 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4662 //=*********************************
4664 TGeoVolumeAssembly *cardHV = fCardHV;
4666 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4667 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4668 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4670 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4671 -(fgkHVCardCeramZ)/2);
4673 for (Int_t iCard=0; iCard<nCards; iCard++) {
4675 Double_t fact = iCard*2.+1.;
4676 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4677 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4678 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4679 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4682 //=*********************************
4685 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4686 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4687 // 0, -fgkCarlosSuppAngle, 0);
4689 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4690 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4691 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4692 // position in z of the first Carlos board, coming from inside of the ladder
4694 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4695 fgkEndLadPipeArmBoxDY);
4697 for (Int_t iCard=0; iCard<nCards; iCard++) {
4699 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4700 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4701 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4702 (TGeoRotation*) fCommonTr[0]);
4704 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4708 //=*********************************
4712 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4713 + fgkSectionGlassPerMod)*nCards;
4714 // We fix thickness, then width is calculated accordingly
4715 Double_t width = sectionV/thickTotCable;
4716 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4717 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4718 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4719 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4720 Double_t thickGlass = thickTotCable - thickCu - thickPlast;
4722 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4723 cable.SetNLayers(3);
4724 cable.SetLayer(0, thickCu, copper, kRed);
4725 cable.SetLayer(1, thickPlast, plastic, kYellow);
4726 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4728 Double_t zVect[3]={0,0,1};
4729 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4730 +spaceBetweenCarlsoCards)/2 + 2.9;
4731 // the 2.9cm is for taking into account carlos card angle...
4733 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4734 cableSectionR2,cableSectionZ1,cableSectionZ2);
4736 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4737 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4738 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4739 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4740 cable.SetInitialNode(endLadderCards);
4741 cable.CreateAndInsertCableSegment(1);
4743 return endLadderCards;
4746 //________________________________________________________________________
4747 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4749 // return an assembly of the support rings, attaching the ladders to the cone
4755 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4756 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4759 //**********************************
4762 Double_t fgkRubyCageX = 9*fgkmm;
4763 Double_t fgkRubyCageY = 5.5*fgkmm;
4764 Double_t fgkRubyCageZ = 8*fgkmm;
4765 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4766 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4767 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4768 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4769 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4771 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4774 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4776 // pieces common to both square and V cages
4777 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4778 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4780 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4781 fgkRubyCageHoleDX/2+epsilon);
4783 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4784 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4785 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4786 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4787 trScrewHole->RegisterYourself();
4789 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4790 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4791 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4792 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4793 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4794 trScrewHoleFoot->RegisterYourself();
4797 // pieces which differ
4798 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4800 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4801 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4803 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4804 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4805 trRubyCageVInternBox->RegisterYourself();
4807 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4808 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4809 fgkRubyCageInternSide/4);
4811 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4812 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4813 +epsilon,0,0, rotV );
4814 trRubyCageVInternTriangl->RegisterYourself();
4817 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4818 "rubyCageBox-(rubyCageInternBox"
4819 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4821 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4822 rubyCageSquare, stainless);
4823 vRubyCageSquare->SetLineColor(10);
4825 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4826 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4827 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4828 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4829 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4830 vRubyCageV->SetLineColor(10);
4832 if(GetDebug(3)) { // Remove compiler warning.
4833 rubyCageBox->InspectShape();
4834 rubyCageInternBox->InspectShape();
4835 screwHole->InspectShape();
4836 screwHoleFoot->InspectShape();
4837 rubyCageVInternBox->InspectShape();
4838 rubyCageVInternTriangl->InspectShape();
4841 supportRing->AddNode(vRubyCageSquare, 0, 0);
4842 //supportRing->AddNode(vRubyCageV, 0, 0);
4848 //________________________________________________________________________
4849 void AliITSv11GeometrySDD::CreateSDDsensor() {
4851 // return a box containing the SDD sensor
4854 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4855 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4856 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4857 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4858 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4859 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4862 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4863 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4864 // width : in the beam direction !
4866 Double_t sensoxBoxLength = ( fgkWaferLength +
4867 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4868 // Makes life easier to include the space for the WA HV cable on both sides
4869 Double_t sensoxBoxThick = fgkWaferThickness +
4870 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4872 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4873 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4875 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4876 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4878 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4879 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4882 //****************************
4884 //****************************
4886 // we need 2 different sensor objects, because they have to have different names
4887 // This is required for the step manager
4889 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4890 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4893 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4894 wafer3->SetLineColor(fColorSilicon);
4895 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4896 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4897 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4898 sensVol3->SetLineColor(fColorSilicon+5);
4899 wafer3->AddNode(sensVol3, 1, 0);
4900 fSDDsensor3->AddNode(wafer3, 1, 0);
4902 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4903 wafer4->SetLineColor(fColorSilicon);
4904 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4905 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4906 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4907 sensVol4->SetLineColor(fColorSilicon+5);
4908 wafer4->AddNode(sensVol4, 1, 0);
4909 fSDDsensor4->AddNode(wafer4, 1, 0);
4912 //****************************
4914 //****************************
4915 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4916 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4917 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4918 vGlass->SetLineColor(fColorGlass);
4919 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4920 fgkWaferThickness/2+fgkSensorGlassLY/2,
4921 fgkGlassDZOnSensor);
4922 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4923 fgkWaferThickness/2+fgkSensorGlassLY/2,
4924 fgkGlassDZOnSensor);
4925 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4926 fgkWaferThickness/2+fgkSensorGlassLY/2,
4927 -fgkGlassDZOnSensor);
4928 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4929 fgkWaferThickness/2+fgkSensorGlassLY/2,
4930 -fgkGlassDZOnSensor);
4931 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4932 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4933 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4934 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4936 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4937 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4938 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4939 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4941 //****************************
4942 // Wrap-around cable
4943 //****************************
4945 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4946 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4947 waHVCable.SetNLayers(2);
4948 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4949 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4950 waHVCable.SetInitialNode(fSDDsensor3);
4952 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4953 x1[0] = -fgkWaHVcableLength/2;
4955 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4957 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4960 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4961 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4962 TGeoCombiTrans *ctSegment = 0;
4963 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4964 fSDDsensor4->AddNode(segment, 1, ctSegment);
4968 waHVCable.SetName("ITSsddWaHVCableD");
4969 waHVCable.ResetPoints();
4970 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4971 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4972 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
4973 fSDDsensor4->AddNode(segment, 1, ctSegment);
4975 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
4977 waHVCableFold.SetPhi(180,360);
4978 waHVCableFold.SetNLayers(2);
4979 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
4980 polyhamideSDD, fColorPolyhamide);
4981 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4982 waHVCableFold.SetInitialNode(fSDDsensor3);
4985 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
4987 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4988 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4989 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
4990 fSDDsensor4->AddNode(segment, 1, ctSegment);
4993 //****************************
4995 //****************************
4996 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
4997 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
4998 /(2.*fgkTransitHVHeadLZ);
4999 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
5000 headRadius-fgkTransitHVHeadLZ)
5003 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
5004 fgkTransitHVPolyThick/2,
5006 headPoly->SetName("headPoly");
5007 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
5008 -fgkTransitHVPolyThick/2);
5009 headPolyTr->SetName("headPolyTr");
5010 headPolyTr->RegisterYourself();
5012 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
5013 fgkTransitHVAlThick/2,
5015 headAl->SetName("headAl");
5016 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
5017 -fgkTransitHVPolyThick
5018 -fgkTransitHVAlThick/2);
5019 headAlTr->SetName("headAlTr");
5020 headAlTr->RegisterYourself();
5022 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
5023 (headRadius-fgkTransitHVHeadLZ)/2,
5024 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
5025 cache->SetName("cache");
5027 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5028 (headRadius-fgkTransitHVHeadLZ)/2,
5029 -(fgkTransitHVPolyThick
5030 +fgkTransitHVAlThick)/2);
5031 headCacheTr->SetName("cacheTr");
5032 headCacheTr->RegisterYourself();
5034 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5035 "headPoly:headPolyTr-cache:cacheTr");
5036 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5037 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5038 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5039 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5040 "headAl:headAlTr-cache:cacheTr");
5041 TGeoVolume *vHeadAlComp = new TGeoVolume(
5042 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5043 vHeadAlComp->SetLineColor(fColorAl);
5046 // TGeoRotation rotHead("",0,90,0);
5047 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5048 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5050 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5051 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5052 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5055 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5056 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5057 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5058 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5061 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5062 fgkTransitHVBondingLZ,
5063 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5064 transitHVCable.SetNLayers(2);
5065 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5067 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5068 transitHVCable.SetInitialNode(fSDDsensor3);
5070 x1[0] = -fgkTransitHVHeadLX/2;
5072 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5076 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5077 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5078 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5079 fSDDsensor4->AddNode(segment, 1, ctSegment);
5081 transitHVCable.ResetPoints();
5082 transitHVCable.SetName("ITSsddHVtransitTail");
5083 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5084 x1[0] = fgkTransitHVtailXpos;
5085 x2[0] = fgkTransitHVtailXpos;
5086 x1[2] = -fgkTransitHVBondingLZ/2;
5087 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5088 Double_t vZ[3] = {0,0,1};
5089 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5090 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5091 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5092 fSDDsensor4->AddNode(segment, 1, ctSegment);
5095 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5096 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5097 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5098 fgkTransitHVsideLZ);
5099 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5100 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5101 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5102 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5103 fgkTransitHVsideLZ);
5104 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5105 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5107 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5108 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5109 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5110 fgkTransitHVsideLZ);
5111 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5112 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5113 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5114 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5115 fgkTransitHVsideLZ);
5116 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5117 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5119 // sideRight is not there actually
5120 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5121 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5122 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5123 // fgkTransitHVsideLZ);
5124 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5125 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5126 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5127 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5128 // fgkTransitHVsideLZ);
5129 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5130 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5132 // TGeoRotation rotSide("",0,-90,0);
5133 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5134 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5135 // -fgkTransitHVBondingLZ/2,&rotSide);
5136 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5137 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5138 // -fgkTransitHVBondingLZ/2, &rotSide);
5139 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5140 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5141 // -fgkTransitHVBondingLZ/2, &rotSide);
5142 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5143 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5144 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5145 // -fgkTransitHVBondingLZ/2,rotSide);
5146 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5147 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5148 -fgkTransitHVBondingLZ/2, rotSide);
5149 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5150 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5151 -fgkTransitHVBondingLZ/2, rotSide);
5153 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5154 sideLeft,polyhamideSDD);
5155 vSideLeft->SetLineColor(fColorPolyhamide);
5156 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5158 vSideLeftAl->SetLineColor(fColorAl);
5160 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5161 // sideRight,polyhamideSDD);
5162 // vSideRight->SetLineColor(fColorPolyhamide);
5164 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5165 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5166 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5168 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5169 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5170 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5173 //****************************
5175 fSDDsensor3->CheckOverlaps(0.01);
5176 fSDDsensor4->CheckOverlaps(0.01);
5179 fSDDsensor3->SetVisibility(kFALSE);
5180 fSDDsensor4->SetVisibility(kFALSE);
5184 //________________________________________________________________________
5185 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5187 // return a box volume containing the detectors
5190 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5192 Int_t nDetectors = fgkLay3Ndet;
5193 Double_t ladderLength = fgkLay3LadderLength;
5194 Double_t *sensorZPos = fLay3sensorZPos;
5198 nDetectors = fgkLay4Ndet;
5199 ladderLength = fgkLay4LadderLength;
5200 sensorZPos = fLay4sensorZPos;
5202 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5206 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5207 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5209 sprintf(name,"ITSsddDetBox%i",iLay);
5210 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5211 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5212 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5214 for (Int_t i=0; i<nDetectors; i++) {
5215 Double_t localZ = sensorZPos[i];
5216 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5217 if (iLay==3) if (i%2!=0) localY = -localY;
5218 if (iLay==4) if (i%2==0) localY = -localY;
5219 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5221 if (i >= nDetectors/2) {
5222 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5223 sensorPos->SetName(name);
5224 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5227 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5228 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5230 sensorPos->SetName(name);
5231 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5235 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5236 virtualDet->SetVisibility(kFALSE);
5241 //________________________________________________________________________
5242 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5244 // return a box volume containing the detectors
5247 Int_t nDetectors = fgkLay3Ndet;
5248 Double_t ladderLength = fgkLay3LadderLength;
5249 Double_t *sensorZPos = fLay3sensorZPos;
5250 TGeoVolume *sensorSDD = fSDDsensor3;
5254 nDetectors = fgkLay4Ndet;
5255 ladderLength = fgkLay4LadderLength;
5256 sensorZPos = fLay4sensorZPos;
5257 sensorSDD = fSDDsensor4;
5259 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5263 sprintf(name,"ITSsddDetBox%i",iLay);
5265 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5267 for (Int_t i=0; i<nDetectors; i++) {
5268 Double_t localZ = sensorZPos[i];
5269 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5270 if (iLay==3) if (i%2!=0) localY = -localY;
5271 if (iLay==4) if (i%2==0) localY = -localY;
5272 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5274 if (i >= nDetectors/2) {
5275 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5276 sensorPos->SetName(name);
5277 virtualDet->AddNode(sensorSDD, i, sensorPos);
5280 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5281 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5283 sensorPos->SetName(name);
5284 virtualDet->AddNode(sensorSDD, i, sensorPos);
5288 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5293 //________________________________________________________________________
5294 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssemblyLadd2() {
5296 // return a box volume containing the detectors
5297 // Special case for Layer 3 Ladder 2 which is rotated (cannot simply
5298 // rotate the standard volume, because the module numbering would be wrong)
5299 // M.Sitta 25 Nov 2009
5302 Int_t nDetectors = fgkLay3Ndet;
5303 Double_t *sensorZPos = fLay3sensorZPos;
5304 TGeoVolume *sensorSDD = fSDDsensor3;
5307 sprintf(name,"ITSsddDetBoxLadd2");
5309 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5311 for (Int_t i=0; i<nDetectors; i++) {
5312 Double_t localZ = (-1.)*sensorZPos[nDetectors-1-i];
5313 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5314 if (i%2==0) localY = -localY;
5315 sprintf(name, "ITSsddLayLadd2SensorPos%i", i);
5317 if (i >= nDetectors/2) {
5318 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5319 sensorPos->SetName(name);
5320 virtualDet->AddNode(sensorSDD, i, sensorPos);
5323 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5324 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5326 sensorPos->SetName(name);
5327 virtualDet->AddNode(sensorSDD, i, sensorPos);
5331 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5336 //________________________________________________________________________
5337 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5340 // export the geometry in a AliITSgeom object
5345 printf("error:Try to fill null (AliITSgeom *) object");
5349 printf("error:Try to set sensor geometry while geometry is not defined\n");
5353 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5354 fgkWaferLengthSens/2.};
5355 if(!(geom->IsShapeDefined(kSDD)))
5356 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5359 char ladderName[30];
5360 char sensorName[30];
5361 char senstivName[30];
5362 const Int_t kNLay = 2;
5363 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5364 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5367 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5369 Int_t firstSDDmod = startMod;
5370 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5371 /////////////////////////////////////////
5372 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5373 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5375 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5376 TGeoVolume *layVolume = layNode->GetVolume();
5377 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5379 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5380 /////////////////////////////////////////
5381 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5382 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5384 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5385 TGeoVolume *laddVolume = laddNode->GetVolume();
5386 TGeoHMatrix laddMatrix(layMatrix);
5387 laddMatrix.Multiply(laddNode->GetMatrix());
5389 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5390 /////////////////////////////////////////
5391 sprintf(sensorName, "ITSsddSensor_%i",iDet);
5392 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5394 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5395 TGeoVolume *detVolume = detNode->GetVolume();
5396 TGeoHMatrix detMatrix(laddMatrix);
5397 detMatrix.Multiply(detNode->GetMatrix());
5399 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5401 TGeoVolume *wafVolume = wafNode->GetVolume();
5402 TGeoHMatrix wafMatrix(detMatrix);
5403 detMatrix.Multiply(wafNode->GetMatrix());
5404 //--------------------------------------------------------
5405 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5406 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5408 TGeoHMatrix sensMatrix(wafMatrix);
5409 sensMatrix.Multiply(sensitivNode->GetMatrix());
5411 // Sticking to the convention for local wafer coordinate
5413 if (iDet >= kNDet[iLay]/2) {
5414 // TGeoRotation rotY("",0,180,0);
5415 TGeoRotation rotY("",-180,-180,0);
5416 sensMatrix.Multiply(&rotY);
5418 // Creating the matrix in AliITSgeom for
5419 // this sensitive volume :
5420 Double_t *trans = sensMatrix.GetTranslation();
5421 Double_t *r = sensMatrix.GetRotationMatrix();
5422 Double_t rot[10] = {r[0],r[1],r[2],
5424 r[6],r[7],r[8], 1.0};
5425 //rot[9]!=0.0 => not a unity matrix
5426 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5428 // iLadd+1, iDet+1 because ladd. and det. start at +1
5433 printf("Error (ExportSensorGeometry) %s not found !\n",
5436 printf("Error (ExportSensorGeometry) %s not found !\n",
5439 printf("Error (ExportSensorGeometry) %s not found !\n",
5443 printf("Error (ExportSensorGeometry) %s not found !\n",
5447 printf("Error (ExportSensorGeometry) %s not found !\n",
5451 return (startMod-firstSDDmod);
5455 //________________________________________________________________________
5456 Int_t AliITSv11GeometrySDD::
5457 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5459 // Function which gives the layer, ladder and det.
5460 // index of the current volume. To be used in
5461 // AliITS::StepManager()
5464 if (gGeoManager->GetLevel()<3) return kFALSE;
5465 // Get the det index :
5466 TGeoNode *node = gGeoManager->GetMother(2);
5467 if (!node) return kFALSE;
5468 det = node->GetNumber()+1;
5470 // Get the ladder index :
5471 node = gGeoManager->GetMother(3);
5472 if (!node) return kFALSE;
5473 ladd = node->GetNumber()+1;
5475 // Get the layer index :
5476 if (node->GetNdaughters()==fgkLay3Ndet)
5477 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5484 //________________________________________________________________________
5485 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5486 Double_t r2max, Double_t z2,
5487 Double_t section, Int_t nDiv)
5489 // Creates a cone along z where the section is approximately constant
5490 // with z. This is for simulation of cables, because a cone with a constant
5491 // radius difference would show a quantity of matter increasing with z...
5492 // The max radius of the created Pcon is evolving linearly, the min radius
5493 // is calculated at several steps (nDiv).
5494 // z2 > z1 (required by the Pcon)
5496 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5498 Double_t dr = (r2max-r1max)/nDiv;
5499 Double_t dz = (z2-z1)/nDiv;
5500 Double_t r1minI, r2minI, r1maxI, r2maxI;
5503 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5504 Double_t cosAlpha = (z2-z1)/lZ;
5506 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5507 myPcon->DefineSection(0, z1, r1minI, r1max);
5509 for (Int_t i=0; i<nDiv; i++) {
5513 r1maxI = r1max + i*dr;
5514 r2maxI = r1maxI + dr;
5516 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5517 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5523 //________________________________________________________________________
5524 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5525 Double_t refZ1, Double_t refZ2) {
5526 // just a helping function
5527 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5530 //________________________________________________________________________
5531 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5532 Int_t nLay3, Int_t nLay4,
5533 Double_t r1, Double_t z1,
5534 Double_t r2, Double_t z2) {
5536 // Create some cables portions from SDD modules grouped
5537 // and attached at the border of the SSD cone
5539 TGeoMedium *copper = GetMedium("COPPER$");
5540 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5541 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5543 char titleCable[30];
5544 sprintf(titleCable,"cableSDDport%i",(Int_t)angle);
5547 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5548 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5549 Double_t width = section/thickness;
5550 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5551 +fgkSectionGlassPerMod);
5553 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5554 +fgkSectionGlassPerMod);
5556 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5557 +fgkSectionGlassPerMod);
5559 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5560 Double_t cosAlpha = (z2-z1)/hypothenus;
5561 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5562 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5563 angle *= TMath::DegToRad();
5564 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5565 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5566 Double_t pos1[3] = {x1,y1,z1};
5567 Double_t pos2[3] = {x2,y2,z2};
5568 Double_t zVect[3] = {0,0,1};
5570 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5571 cable.SetNLayers(3);
5572 cable.SetLayer(0, thickPlast, plastic, kYellow);
5573 cable.SetLayer(1, thickCu, copper, kRed);
5574 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5576 cable.AddCheckPoint( mother, 0, pos1, zVect );
5577 cable.AddCheckPoint( mother, 1, pos2, zVect );
5578 cable.SetInitialNode(mother);
5579 cable.CreateAndInsertCableSegment(1);
5586 //________________________________________________________________________
5587 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth)
5590 // Creates and inserts the SDD cables running on SDD and SSD cones
5593 // moth : the TGeoVolume owing the volume structure
5596 // Created: ??? Ludovic Gaudichet
5597 // Updated: 15 Mar 2008 Mario Sitta
5598 // Updated: 14 Apr 2008 Mario Sitta Overlap fixes
5599 // Updated: 09 May 2008 Mario Sitta SSD overlap fixes
5602 TGeoMedium *copper = GetMedium("COPPER$");
5603 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5604 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5605 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5608 //==================================
5610 //==================================
5612 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5613 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5615 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5616 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5617 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5619 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5620 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5621 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5623 // Do not use hardcoded numbers, get them from real shapes - M.S. 15/03/08
5624 TGeoVolume *sddCone = gGeoManager->GetVolume("SDDCarbonFiberCone");
5625 TGeoPcon *sddConeShape = (TGeoPcon*)sddCone->GetShape();
5627 TGeoVolume *sddCylinder = gGeoManager->GetVolume("SDDCarbonFiberCylinder");
5628 TGeoTube *sddCylinderShape = (TGeoTube*)sddCylinder->GetShape();
5630 // (were fgkConeSDDr1, fgkConeSDDr2, fgkConeSDDz1, fgkConeSDDz2 hardcoded)
5631 Double_t coneSDDr1 = sddConeShape->GetRmin(5);
5632 Double_t coneSDDr2 = sddConeShape->GetRmin(3);
5634 Double_t coneSDDz1 = sddConeShape->GetZ(9) - sddConeShape->GetZ(5) +
5635 sddCylinderShape->GetDz();
5636 Double_t coneSDDz2 = sddConeShape->GetZ(9) - sddConeShape->GetZ(3) +
5637 sddCylinderShape->GetDz();
5639 // Calculate z1, z2 thanks to R1 and R2
5640 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, coneSDDr1, coneSDDr2,
5641 coneSDDz1, coneSDDz2);
5642 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, coneSDDr1, coneSDDr2,
5643 coneSDDz1, coneSDDz2);
5644 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, coneSDDr1, coneSDDr2,
5645 coneSDDz1, coneSDDz2);
5647 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5649 //==================================
5650 // first set of cones : cables from layer 3
5651 //==================================
5653 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5654 fgkSDDCableR2, sddCableZ2,
5655 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5657 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5658 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0),
5659 pcon1all->GetRmax(0));
5661 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5662 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax,
5663 pcon1all->GetRmax(1));
5665 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container",
5666 pcon1container, airSDD);
5667 vpcon1container->SetVisibility(kFALSE);
5669 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5670 fgkSDDCableR2, sddCableZ2,
5671 sectionLay3Plastic, 3);
5673 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast",
5674 pcon1plast, plastic);
5675 vpcon1plast->SetLineColor(kYellow);
5676 vpcon1container->AddNode(vpcon1plast, 0);
5678 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5679 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5680 fgkSDDCableR2 - dr1a, sddCableZ2,
5683 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu",
5685 vpcon1Cu->SetLineColor(kRed);
5686 vpcon1container->AddNode(vpcon1Cu, 0);
5688 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5689 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5690 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5691 sectionLay3Glass, 3);
5693 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass",
5694 pcon1glass, opticalFiber);
5695 vpcon1glass->SetLineColor(kGreen);
5696 vpcon1container->AddNode(vpcon1glass, 0);
5698 moth->AddNode(vpcon1container, 1);
5699 moth->AddNode(vpcon1container, 2, rotCableSDD);
5701 //==================================
5702 // 2nd set of cones : cables from layer 3 and layer 4
5703 //==================================
5705 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5706 fgkSDDCableR3, sddCableZ3,
5707 sectionLay3Plastic+sectionLay4Plastic+
5708 sectionLay3Cu+sectionLay4Cu+
5709 sectionLay3Glass+sectionLay4Glass, 1);
5711 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5712 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0),
5713 pcon2all->GetRmax(0));
5715 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5716 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax,
5717 pcon2all->GetRmax(1));
5720 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container",
5721 pcon2container, airSDD);
5722 vpcon2container->SetVisibility(kFALSE);
5724 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5725 fgkSDDCableR3, sddCableZ3,
5727 sectionLay4Plastic, 3);
5729 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast",
5730 pcon2plast, plastic);
5731 vpcon2plast->SetLineColor(kYellow);
5732 vpcon2container->AddNode(vpcon2plast, 0);
5734 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5735 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5736 fgkSDDCableR3 - dr2a, sddCableZ3,
5737 sectionLay3Cu+sectionLay4Cu, 3);
5739 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu",
5741 vpcon2Cu->SetLineColor(kRed);
5742 vpcon2container->AddNode(vpcon2Cu, 0);
5744 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5745 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5746 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5748 sectionLay4Glass, 3);
5750 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass",
5751 pcon2glass, opticalFiber);
5752 vpcon2glass->SetLineColor(kGreen);
5753 vpcon2container->AddNode(vpcon2glass, 0);
5755 moth->AddNode(vpcon2container, 1);
5756 moth->AddNode(vpcon2container, 2, rotCableSDD);
5758 //==================================
5759 // intermediate cylinder
5760 //==================================
5762 // (was fgkSDDCableDZint hardcoded)
5763 Double_t sddCableDZint = (sddConeShape->GetZ(9) - sddConeShape->GetZ(0) +
5764 sddCylinderShape->GetDz()) - sddCableZ3;
5766 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl",
5767 pcon2container->GetRmin(1),
5768 pcon2container->GetRmax(1),
5771 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",
5773 vInterCyl->SetVisibility(kFALSE);
5775 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5776 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5777 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5779 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5780 rmaxCylPlast, sddCableDZint/2);
5782 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast",
5783 interCylPlast, plastic);
5784 vInterCylPlast->SetLineColor(kYellow);
5785 vInterCyl->AddNode(vInterCylPlast, 0);
5787 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5788 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5789 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5791 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5792 rmaxCylCu, sddCableDZint/2);
5794 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu",
5795 interCylCu, copper);
5796 vInterCylCu->SetLineColor(kRed);
5797 vInterCyl->AddNode(vInterCylCu, 0);
5799 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5800 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5801 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5803 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5804 rmaxCylGlass, sddCableDZint/2);
5806 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",
5807 interCylGlass,opticalFiber);
5808 vInterCylGlass->SetLineColor(kGreen);
5809 vInterCyl->AddNode(vInterCylGlass, 0);
5811 moth->AddNode(vInterCyl, 1, new TGeoTranslation(0, 0,
5812 sddCableZ3+sddCableDZint/2));
5813 moth->AddNode(vInterCyl, 2, new TGeoTranslation(0, 0,
5814 -sddCableZ3-sddCableDZint/2));
5816 //==================================
5817 // cable cone on the SSD cone
5818 //==================================
5820 Double_t sddCableR4 = rmaxCylPlast;
5821 Double_t sddCableZ4 = sddCableZ3 + sddCableDZint;
5823 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5824 fgkSDDCableR5, fgkSDDCableZ5,
5827 sectionLay3Cu+sectionLay4Cu+
5828 sectionLay3Glass+sectionLay4Glass, 1);
5830 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5831 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0),
5832 pcon3all->GetRmax(0));
5834 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5835 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax,
5836 pcon3all->GetRmax(1));
5839 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container",
5840 pcon3container, airSDD);
5841 vpcon3container->SetVisibility(kFALSE);
5843 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5844 fgkSDDCableR5, fgkSDDCableZ5,
5846 sectionLay4Plastic, 3);
5848 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast",
5849 pcon3plast, plastic);
5850 vpcon3plast->SetLineColor(kYellow);
5851 vpcon3container->AddNode(vpcon3plast, 0);
5853 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5854 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5855 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5856 sectionLay3Cu+sectionLay4Cu, 3);
5858 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu",
5860 vpcon3Cu->SetLineColor(kRed);
5861 vpcon3container->AddNode(vpcon3Cu, 0);
5863 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5864 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5865 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5866 sectionLay3Glass+sectionLay4Glass, 3);
5868 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass",
5869 pcon3glass,opticalFiber);
5870 vpcon3glass->SetLineColor(kGreen);
5871 vpcon3container->AddNode(vpcon3glass, 0);
5873 moth->AddNode(vpcon3container, 1);
5874 moth->AddNode(vpcon3container, 2, rotCableSDD);
5876 //==================================
5877 // cables that are grouped at the end of SSD cones
5878 //==================================
5880 // Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
5881 // Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
5882 Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
5883 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
5885 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5887 // Add some hardcoded shifts to avoid overlaps with SSD pathc panels
5888 CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
5889 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5891 CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
5892 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5894 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5895 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5897 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5898 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5900 CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
5901 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5903 CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
5904 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5906 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5907 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5909 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5910 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5912 CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
5913 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5915 CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
5916 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5918 CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
5919 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5921 CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
5922 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5924 CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
5925 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5927 moth->AddNode(endConeSDDCable, 1, 0);
5929 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5930 reflect->ReflectZ(kTRUE);
5931 moth->AddNode(endConeSDDCable, 2, reflect);