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 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1227 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1228 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1229 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1230 virtualLayer3Shape, airSDD);
1232 Double_t dPhi = 360./fgkLay3Nladd;
1233 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1234 // Placing virtual ladder and detectors volumes following
1235 // ladder ordering convention
1238 Int_t iLaddMax = fgkLay3Nladd;
1239 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1240 iLaddMin = fAddOnlyLadder3min;
1241 iLaddMax = fAddOnlyLadder3max+1;
1244 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1246 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1247 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1248 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1250 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1251 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1252 TGeoCombiTrans *ctLadd;
1253 //=============================================================
1255 // Special modification for ladder 2 of layer 3:
1256 // It has been inverted (pi rotation around y axis)
1258 //=============================================================
1260 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1261 0, ladderPhi, kTRUE);
1263 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1264 0, ladderPhi, kFALSE);
1265 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1266 ///////////////////////////////////////////////////
1267 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1268 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1269 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1270 minRadiusDetBox += detectorsThick/2;
1271 TGeoCombiTrans *ctDet;
1273 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1274 0, ladderPhi, kTRUE);
1276 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1277 0, ladderPhi, kFALSE);
1279 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1280 ///////////////////////////////////////////////////
1284 //====================================
1285 // Then the forward rapidity pieces
1286 // (cooling, Carlos, LV, HV ...)
1287 //====================================
1289 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1290 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1291 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1293 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1294 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1295 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1296 fgkForwardLay3Length/2.);
1298 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1299 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1300 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1303 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1304 virtualForward3Shape, airSDD);
1305 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1306 virtualForward3Shape, airSDD);
1307 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1308 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1310 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1311 fgkLay3Length/2+fgkForwardLay3Length/2);
1312 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1313 -fgkLay3Length/2-fgkForwardLay3Length/2);
1315 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1317 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1318 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1319 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1320 minRadiusDetBox += detectorsThick/2;
1322 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1324 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1325 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1326 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1327 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1329 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1330 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1337 virtualLayer3->CheckOverlaps(0.01);
1338 //virtualForward3Pos->CheckOverlaps(0.01);
1339 //virtualForward3Neg->CheckOverlaps(0.01);
1342 virtualLayer3->SetVisibility(kFALSE);
1343 //virtualForward3Pos->SetVisibility(kFALSE);
1344 //virtualForward3Neg->SetVisibility(kFALSE);
1347 moth->AddNode(virtualLayer3, 1, 0);
1348 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1349 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1353 // //________________________________________________________________________
1354 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1356 // // Insert the forward pieces of layer 3 in the mother volume.
1357 // // (cooling, Carlos, LV, HV ...)
1361 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1365 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1367 // if (! fSDDsensor3) CreateBasicObjects();
1369 // Double_t dPhi = 360./fgkLay3Nladd;
1370 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1371 // Int_t iLaddMin = 0;
1372 // Int_t iLaddMax = fgkLay3Nladd;
1373 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1374 // iLaddMin = fAddOnlyLadder3min;
1375 // iLaddMax = fAddOnlyLadder3max+1;
1377 // char rotName[30];
1380 // //=================
1382 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1383 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1384 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1386 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1387 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1388 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1389 // fgkForwardLay3Length/2.);
1391 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1392 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1393 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1396 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1397 // virtualForward3Shape, airSDD);
1398 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1399 // virtualForward3Shape, airSDD);
1400 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1401 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1403 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1404 // fgkLay3Length/2+fgkForwardLay3Length/2);
1405 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1406 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1408 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1410 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1411 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1412 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1413 // minRadiusDetBox += detectorsThick/2;
1415 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1417 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1418 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1419 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1420 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1422 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1423 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1426 // if(GetDebug(1)) {
1427 // virtualForward3Pos->CheckOverlaps(0.01);
1428 // virtualForward3Neg->CheckOverlaps(0.01);
1431 // virtualForward3Pos->SetVisibility(kFALSE);
1432 // virtualForward3Neg->SetVisibility(kFALSE);
1434 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1435 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1440 //________________________________________________________________________
1441 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1443 // Insert the end-ladder of layer 3 in the mother volume.
1444 // (cooling, Carlos, LV, HV ...)
1448 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1452 if (! fSDDsensor3) CreateBasicObjects();
1455 Int_t iLaddMax = fgkLay3Nladd;
1456 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1457 iLaddMin = fAddOnlyLadder3min;
1458 iLaddMax = fAddOnlyLadder3max+1;
1461 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1462 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1465 Double_t dPhi = 360./fgkLay3Nladd;
1466 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1468 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1470 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1472 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1474 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1476 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1477 fgkLay3Length/2, ladderPhi, kTRUE);
1478 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1479 -fgkLay3Length/2, ladderPhi, kFALSE);
1481 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1482 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1486 virtualForward3Pos->CheckOverlaps(0.01);
1487 virtualForward3Neg->CheckOverlaps(0.01);
1490 // 180deg Y rotation to compensate the cancellation of ITSD volume
1491 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1492 TGeoRotation *y180 = new TGeoRotation();
1493 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1494 moth->AddNode(virtualForward3Pos, 1, y180);
1495 moth->AddNode(virtualForward3Neg, 1, y180);
1498 //________________________________________________________________________
1499 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1501 // Insert the layer 4 in the mother volume. This is a virtual volume
1502 // containing ladders of layer 4 and the supporting rings
1506 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1512 if (! fSDDsensor3) CreateBasicObjects();
1514 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1515 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1516 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1517 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1518 virtualLayer4Shape, airSDD);
1520 //====================================
1521 // First we create the central barrel
1522 //====================================
1524 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1525 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1526 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1528 Double_t dPhi = 360./fgkLay4Nladd;
1529 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1531 // placing virtual ladder and detectors volumes following ladder
1532 // ordering convention
1535 Int_t iLaddMax = fgkLay4Nladd;
1536 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1537 iLaddMin = fAddOnlyLadder4min;
1538 iLaddMax = fAddOnlyLadder4max+1;
1540 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1542 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1543 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1544 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1546 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1547 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1548 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1549 0, ladderPhi, kTRUE);
1550 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1551 ///////////////////////////////////////////////////
1552 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1553 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1555 minRadiusDetBox = fgkLay4DetLongRadius;
1556 minRadiusDetBox += detBoxThickness/2;
1557 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1558 0, ladderPhi, kTRUE);
1559 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1560 ///////////////////////////////////////////////////
1564 //====================================
1565 // Then the pieces at forward rapidity
1566 // (cooling, Carlos, LV, HV ...)
1567 //====================================
1569 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1570 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1571 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1573 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1574 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1575 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1576 fgkForwardLay4Length/2.);
1577 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1578 virtualForward4Shape, airSDD);
1579 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1580 virtualForward4Shape, airSDD);
1581 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1582 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1584 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1585 fgkLay4Length/2+fgkForwardLay4Length/2);
1586 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1587 -fgkLay4Length/2-fgkForwardLay4Length/2);
1589 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1591 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1592 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1594 minRadiusDetBox = fgkLay4DetLongRadius;
1595 minRadiusDetBox += detBoxThickness/2;
1597 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1599 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1600 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1601 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1602 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1603 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1604 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1608 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1610 virtualLayer4->SetVisibility(kFALSE);
1611 //virtualForward4Pos->SetVisibility(kFALSE);
1612 //virtualForward4Neg->SetVisibility(kFALSE);
1614 moth->AddNode(virtualLayer4,1,0);
1615 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1616 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1620 // //________________________________________________________________________
1621 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1623 // // Insert the layer 4 in the mother volume. This is a virtual volume
1624 // // containing ladders of layer 4 and the supporting rings
1625 // // (cooling, Carlos, LV, HV ...)
1629 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1633 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1635 // if (! fSDDsensor3) CreateBasicObjects();
1637 // Double_t dPhi = 360./fgkLay4Nladd;
1638 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1640 // // placing virtual ladder and detectors volumes following ladder
1641 // // ordering convention
1642 // char rotName[20];
1643 // Int_t iLaddMin = 0;
1644 // Int_t iLaddMax = fgkLay4Nladd;
1645 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1646 // iLaddMin = fAddOnlyLadder4min;
1647 // iLaddMax = fAddOnlyLadder4max+1;
1650 // //=================
1651 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1652 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1653 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1655 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1656 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1657 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1658 // fgkForwardLay4Length/2.);
1659 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1660 // virtualForward4Shape, airSDD);
1661 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1662 // virtualForward4Shape, airSDD);
1663 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1664 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1666 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1667 // fgkLay4Length/2+fgkForwardLay4Length/2);
1668 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1669 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1671 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1673 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1674 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1675 // if (iLadd%2 != 0)
1676 // minRadiusDetBox = fgkLay4DetLongRadius;
1677 // minRadiusDetBox += detBoxThickness/2;
1679 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1681 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1682 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1683 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1684 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1685 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1686 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1689 // virtualForward4Pos->SetVisibility(kFALSE);
1690 // virtualForward4Neg->SetVisibility(kFALSE);
1692 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1693 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1697 //________________________________________________________________________
1698 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1700 // Insert the end-ladder of layer 4 in the mother volume.
1701 // (cooling, Carlos, LV, HV ...)
1705 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1709 if (! fSDDsensor3) CreateBasicObjects();
1711 // placing virtual ladder and detectors volumes following ladder
1712 // ordering convention
1714 Int_t iLaddMax = fgkLay4Nladd;
1715 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1716 iLaddMin = fAddOnlyLadder4min;
1717 iLaddMax = fAddOnlyLadder4max+1;
1720 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1721 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1724 Double_t dPhi = 360./fgkLay4Nladd;
1725 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1727 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1729 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1732 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1734 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1736 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1737 fgkLay4Length/2, ladderPhi, kTRUE);
1738 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1739 -fgkLay4Length/2, ladderPhi, kFALSE);
1740 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1741 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1744 // 180deg Y rotation to compensate the cancellation of ITSD volume
1745 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1746 TGeoRotation *y180 = new TGeoRotation();
1747 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1748 moth->AddNode(virtualForward4Pos, 1, y180);
1749 moth->AddNode(virtualForward4Neg, 1, y180);
1753 //________________________________________________________________________
1754 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1756 // return an assembly volume containing the CF ladder
1759 Int_t nDetectors = fgkLay3Ndet;
1760 Double_t ladderLength = fgkLay3LadderLength;
1761 Double_t underSegDH = fLay3LadderUnderSegDH;
1762 Double_t *sensorZPos = fLay3sensorZPos;
1763 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1764 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1768 nDetectors = fgkLay4Ndet;
1769 ladderLength = fgkLay4LadderLength;
1770 digitCableA = fDigitCableLay4A;
1771 digitCableB = fDigitCableLay4B;
1772 underSegDH = fLay4LadderUnderSegDH;
1773 sensorZPos = fLay4sensorZPos;
1776 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1778 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1779 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1781 // placing virtual ladder segment following detector ordering convention
1782 //=======================================================================
1785 // adding segment this way to create cable points in the correct order ...
1786 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1788 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1789 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1790 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1791 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1792 + fgkSegmentLength/2;
1793 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1794 underSegDH/2,segmentPos);
1796 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1798 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1800 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1801 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1802 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1803 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1804 + fgkSegmentLength/2;
1805 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1806 underSegDH/2,segmentPos);
1808 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1811 // putting virtual volume corresponding to the end of ladder
1812 //=======================================================================
1813 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1814 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1815 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1816 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1817 // Euler rotation : about Z, then new X, then new Z
1818 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1819 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1820 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1821 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1822 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1824 // creating and inserting cable segments
1825 // (check points are placed while creating segments)
1826 //=======================================================================
1828 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1830 digitCableA[iSegment].SetInitialNode(virtualLadder);
1831 digitCableB[iSegment].SetInitialNode(virtualLadder);
1833 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1834 Double_t rotation = 0;
1836 rotation = 90-fgkHybridAngle;
1837 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1839 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1843 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1844 Double_t rotation = 0;
1846 rotation = fgkHybridAngle-90;
1847 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1849 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1854 //=======================================================================
1856 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1857 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1859 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1860 char cableHVname[30];
1861 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1862 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1863 cableHV[iSegment].SetName(cableHVname);
1864 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1865 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1866 cableHV[iSegment].SetNLayers(2);
1867 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1869 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1870 cableHV[iSegment].SetInitialNode(virtualLadder);
1872 Double_t x1[3], x2[3], x3[3],
1873 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1875 x1[0] = -fgkTransitHVtailXpos;
1876 x2[0] = -fgkTransitHVtailXpos;
1877 x3[0] = -fgkTransitHVtailXpos;
1878 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1879 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1880 *fgkLongHVcableSeparation;
1881 // adjust where HV long cable starts in Y
1882 // useful if you want to let some space for alignment
1883 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1884 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1885 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1887 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1888 x2[2] = x1[2]+5*fgkmm;
1889 x3[2] = ladderLength/2-endLength;
1890 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1891 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1892 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1894 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1895 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1896 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1897 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1901 x1[0] = fgkTransitHVtailXpos;
1902 x2[0] = fgkTransitHVtailXpos;
1903 x3[0] = fgkTransitHVtailXpos;
1905 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1906 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1907 *fgkLongHVcableSeparation;
1908 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1909 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1910 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1912 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1913 x2[2] = x1[2]-5*fgkmm;
1914 x3[2] = -ladderLength/2+endLength;
1915 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1916 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1917 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1919 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1920 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1924 //**********************************
1925 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1926 return virtualLadder;
1930 //________________________________________________________________________
1931 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(const char *name,
1932 Double_t dz, Double_t angle, Double_t xSign,
1933 Double_t L, Double_t H, Double_t l) {
1934 // Create one half of the V shape corner of CF ladder
1936 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1937 cfLaddSide->SetName(name);
1939 // Points must be in clockwise order
1940 cfLaddSide->SetVertex(0, 0, 0);
1941 cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1942 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1943 cfLaddSide->SetVertex(4, 0, 0);
1944 cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1945 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1947 cfLaddSide->SetVertex(1, 0, -H);
1948 cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1949 cfLaddSide->SetVertex(5, 0, -H);
1950 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1952 cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1953 cfLaddSide->SetVertex(3, 0, -H);
1954 cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1955 cfLaddSide->SetVertex(7, 0, -H);
1961 //________________________________________________________________________
1962 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1964 // return a box containing the front-end hybrid
1967 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1969 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1970 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1971 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1972 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1973 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1974 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1975 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1976 // + upFLTotalThick + ccUpLayerTotThick);
1977 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1979 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1981 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1983 //**************************************************** media :
1984 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1985 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1986 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1987 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1988 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1989 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1990 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1991 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1992 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1993 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1994 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1996 //**************************************************** main volume :
1997 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
1998 (fgkHybridLength)/2);
1999 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
2002 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
2003 fgkHybridThBridgeThick/2,
2006 //**************************************************** Thermal bridge :
2007 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
2009 carbonFiberLadderStruct);
2010 vThermalBridge->SetLineColor(fColorCarbonFiber);
2011 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
2012 +fgkHybridThBridgeThick/2, 0);
2013 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
2015 //**************************************************** Screen layer :
2016 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
2017 fgkHybAlThick/2, fgkHybridLength/2);
2018 //here the upedex and glue layers are both assumed to be polyimide
2019 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
2021 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2023 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2024 (screenTotalThick+lowFLTotalThick)/2);
2026 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2027 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2029 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2030 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2031 +fgkHybAlThick/2, 0);
2033 TGeoTranslation hybHolePos1Tr(roundHoleX,
2034 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2035 -fgkHybridLength/2+fgkHybRndHoleZ);
2036 TGeoTranslation hybHolePos2Tr(roundHoleX,
2037 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2038 fgkHybridLength/2-fgkHybRndHoleZ);
2040 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2041 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2042 hybHolePos1->SetName("hybHolePos1");
2043 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2044 hybHolePos2->SetName("hybHolePos2");
2046 upGlueScreenTr->RegisterYourself();
2047 alScreenTr->RegisterYourself();
2048 hybHolePos1->RegisterYourself();
2049 hybHolePos2->RegisterYourself();
2052 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2053 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2054 "+sRoundHole:hybHolePos2)");
2055 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2056 vScreenAl->SetLineColor(fColorAl);
2057 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2058 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2059 "+sRoundHole:hybHolePos2)");
2060 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2061 sScreenUpGlue,polyhamideSDD);
2062 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2064 hybrid->AddNode(vScreenUpGlue, 1, 0);
2065 hybrid->AddNode(vScreenAl, 1, 0);
2067 //**************************************************** FL low layer :
2068 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2069 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2071 //here the upedex and glue layers are both assumed to be polyimide
2072 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2073 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2075 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2076 fgkHybAlThick/2, sideWidth1/2);
2078 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2079 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2080 -(fgkHybridLength-sideWidth1)/2);
2081 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2082 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2083 -(fgkHybridLength-sideWidth1)/2);
2084 upGlueBarTr1->RegisterYourself();
2085 alBarTr1->RegisterYourself();
2087 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2088 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2089 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2090 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2091 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2092 sLowUpGlueBar1, polyhamideSDD);
2093 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2095 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2096 vLowAlBar1->SetLineColor(fColorAl);
2097 hybrid->AddNode(vLowUpGlueBar1,1,0);
2098 hybrid->AddNode(vLowAlBar1,1,0);
2101 //here the upedex and glue layers are both assumed to be polyimide
2102 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2103 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2105 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2106 fgkHybAlThick/2, sideWidth2/2);
2108 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2109 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2110 (fgkHybridLength-sideWidth2)/2);
2111 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2112 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2113 (fgkHybridLength-sideWidth2)/2);
2114 upGlueBarTr2->RegisterYourself();
2115 alBarTr2->RegisterYourself();
2117 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2118 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2119 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2120 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2121 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2123 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2125 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2126 vLowAlBar2->SetLineColor(fColorAl);
2127 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2128 hybrid->AddNode(vLowAlBar2, 1, 0);
2130 if(GetDebug(3)) { // Remove compiler warning.
2131 sAlScreenLayer->InspectShape();
2132 sUpGlueScreenLayer->InspectShape();
2133 sRoundHole->InspectShape();
2134 sUpGlueBar1->InspectShape();
2135 sUpGlueBar2->InspectShape();
2136 sAlBar1->InspectShape();
2137 sAlBar2->InspectShape();
2140 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2141 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2142 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2144 lowFLpiece.SetNLayers(2);
2145 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2147 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2148 // alSDD at 80% : mostly to take into account strips of piece 3
2150 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2151 lowLayerYmin + lowFLTotalThick/2,
2152 -fgkHybridLength/2 + sideWidth1 };
2153 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2154 Double_t vZ[3] = {0,0,1};
2155 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2156 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2157 lowFLpiece.SetInitialNode(hybrid);
2158 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2159 lowFLpiece.ResetPoints();
2161 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2162 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2164 lowFLpiece.SetWidth(piece2width);
2165 lowFLpiece.SetName("lowFLpiece2");
2166 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2168 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2169 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2170 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2171 lowFLpiece.ResetPoints();
2173 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2174 - fgkHybFLlowHoleAmbDX/2;
2176 lowFLpiece.SetWidth(piece3width);
2177 lowFLpiece.SetName("lowFLpiece3");
2178 x1[0] = fgkHybridWidth/2-piece3width/2;
2180 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2181 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2182 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2184 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2185 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2186 Double_t vX[3] = {1,0,0};
2187 for (Int_t i=0; i<3; i++) {
2189 sprintf(ch, "lowFLpieceA%i", i+4);
2190 lowFLpiece.SetName(ch);
2191 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2193 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2194 x1[0] = -fgkHybridWidth/2 + piece1width;
2195 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2196 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2197 x1[2] = zPiece; x2[2] = zPiece;
2198 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2199 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2200 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2201 lowFLpiece.ResetPoints();
2203 sprintf(ch, "lowFLpieceB%i", i+4);
2204 lowFLpiece.SetName(ch);
2205 x1[0] = fgkHybridWidth/2 - piece3width;
2206 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2207 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2208 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2209 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2212 //**************************************************** chips+CC:
2213 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2214 chip.SetInitialNode(hybrid);
2216 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2217 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2218 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2219 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2221 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2222 // Here the tho CC (low+up) are merged
2223 // In fact, the last layer has a smaller surface of Al -> I put 80%
2225 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2229 for (Int_t i=0; i<4; i++) {
2230 sprintf(ch, "pascalCC%i", i);
2232 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2233 x2[0] = x1[0] + fgkHybPascalDX;
2234 x1[2] = zChips[i] - fgkHybridLength/2;
2236 chip.AddCheckPoint( hybrid, 0, x1, vX );
2237 chip.AddCheckPoint( hybrid, 1, x2, vX );
2238 chip.CreateAndInsertBoxCableSegment(1,-90);
2241 sprintf(ch, "ambraCC%i", i);
2243 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2244 x2[0] = x1[0] + fgkHybAmbraDX;
2245 chip.AddCheckPoint( hybrid, 0, x1, vX );
2246 chip.AddCheckPoint( hybrid, 1, x2, vX );
2247 chip.CreateAndInsertBoxCableSegment(1,-90);
2251 //**************************************************** CC outside chips:
2252 // I don't think there is a second aluminium layer here ...
2253 for (Int_t i = 0; i<4; i++) {
2254 sprintf(ch, "ccLayerA%i", i);
2256 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2257 ccLayer1.SetInitialNode(hybrid);
2258 ccLayer1.SetNLayers(2);
2259 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2260 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2263 x1[0] = -fgkHybridWidth/2;
2264 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2265 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2266 + fgkHybChipThick + ccUpLayerTotThick/2;
2268 x1[2] = zChips[i] - fgkHybridLength/2;
2270 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2271 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2272 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2274 sprintf(ch, "ccLayerB%i", i);
2275 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2276 ccLayer2.SetInitialNode(hybrid);
2277 ccLayer2.SetNLayers(2);
2278 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2279 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2282 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2283 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2284 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2285 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2286 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2287 ccLayer2.ResetPoints();
2288 sprintf(ch, "ccLayerC%i", i);
2289 ccLayer2.SetName(ch);
2290 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2291 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2292 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2293 + ccUpLayerTotThick/2;
2296 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2297 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2298 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2301 //**************************************************** FL UP:
2302 // (last Al layer will be a special triangular shape)
2303 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2304 fgkHybFLUpperWidth/2, flUpThick/2,
2305 fgkHybFLUpperLength/2);
2306 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2307 sFLupPolyhamide, polyhamideSDD);
2308 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2309 TGeoTranslation *trFLupPolyhamide =
2310 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2311 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2313 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2315 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2316 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2317 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2318 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2319 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2320 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2321 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2322 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2323 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2324 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2327 vAluStrip->SetLineColor(fColorAl);
2328 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2329 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2331 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2332 +flUpThick+fgkHybAlThick/2;
2333 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2334 fgkHybridWidth/2,yRotAluStrip,
2335 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2336 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2337 AddTranslationToCombiTrans(aluStripTr2,0,0,
2338 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2339 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2340 AddTranslationToCombiTrans(aluStripTr3,0,0,
2341 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2342 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2343 AddTranslationToCombiTrans(aluStripTr4,0,0,
2344 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2346 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2347 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2348 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2349 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2350 //**************************************************** SMD:
2351 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2352 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2353 fgkHybSMDheight/2,fgkHybSMDendW/2);
2354 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2356 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2357 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2358 fgkHybSMDmiddleW/2);
2359 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2360 hybSMDmiddle,medSMD);
2361 vHybSMDmiddle->SetLineColor(fColorSMD);
2362 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2363 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2364 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2365 hybSMDend,medSMDweld);
2366 vHybSMDend->SetLineColor(fColorSMDweld);
2367 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2368 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2369 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2370 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2371 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2372 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2373 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2374 for (Int_t i=0; i<fgkNHybSMD; i++) {
2375 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2376 -fgkHybridWidth/2+fgkHybSMDposX[i],
2377 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2378 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2379 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2385 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2386 hybrid->SetVisibility(kFALSE);
2390 //________________________________________________________________________
2391 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2393 // Return a TGeoVolume* containing a segment of a ladder.
2396 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2397 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2398 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2400 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2401 Double_t segmentLength = fgkSegmentLength;
2402 Double_t spaceBetweenCables = 500*fgkmicron;
2404 //*****************************************
2405 // Set parameters according to (iLay,iSeg):
2406 //*****************************************
2407 Int_t nDetectors = fgkLay3Ndet;
2408 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2409 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2410 (fgkSegmentLength*fgkLay3Ndet/2. -
2411 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2412 // sensorCenterZPos = z in segment local coord syst.
2414 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2415 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2418 } else if (iLay==4) {
2419 nDetectors = fgkLay4Ndet;
2420 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2421 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2422 (fgkSegmentLength*fgkLay4Ndet/2. -
2423 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2424 digitCableA = fDigitCableLay4A;
2425 digitCableB = fDigitCableLay4B;
2427 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2430 Double_t cableSideSign = -1;
2431 if (iSeg<nDetectors/2) cableSideSign = 1;
2432 Double_t spaceForCables = spaceBetweenCables*
2433 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2435 // gives [0-1-2-2-1-0]*spaceBetweenCables
2436 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2437 Int_t iUpdateCableMin;
2438 Int_t iUpdateCableMax;
2439 if (cableSideSign==-1) {
2440 iUpdateCableMin = nDetectors/2;
2441 iUpdateCableMax = iSeg-1;
2443 iUpdateCableMin = iSeg+1;
2444 iUpdateCableMax = nDetectors/2-1;
2448 cout << "Segment ("<< iLay <<',' << iSeg
2449 << ") : sensor z shift in local segment coord.="
2450 << sensorCenterZPos << endl;
2453 //****************************
2454 // The segment volume
2455 //****************************
2457 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2458 // likely slows down the transport of particles through the geometry
2460 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2462 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2463 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2464 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2467 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2469 virtualSeg->SetVisibility(kFALSE);
2471 //******************************
2472 // Carbon fiber structure :
2473 //******************************
2475 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2476 Int_t volumeIndex = 1;
2477 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2478 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2482 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2483 fLaddSegCommonTr[i]);
2486 //**********************************
2487 // Pine support of the sensors :
2488 //**********************************
2489 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2490 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2492 // The use of the following constructor type allow to use rotPS1 and rotPS2
2493 // (and not copy them) therefore we gain some memory
2494 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2495 - fgkLadderHeight/2.-tDY
2496 + fgkPinSuppHeight/2.,
2497 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2499 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2500 - fgkLadderHeight/2.-tDY
2501 + fgkPinSuppHeight/2.,
2502 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2503 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2505 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2506 - fgkLadderHeight/2.-tDY
2507 + fgkPinSuppHeight/2.,
2508 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2509 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2511 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2512 - fgkLadderHeight/2.-tDY
2513 + fgkPinSuppHeight/2.,
2514 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2515 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2517 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2518 - fgkLadderHeight/2. - tDY
2519 + fgkPinSuppHeight/2.,
2520 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2522 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2523 - fgkLadderHeight/2. - tDY
2524 + fgkPinSuppHeight/2.,
2525 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2526 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2528 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2529 - fgkLadderHeight/2. - tDY
2530 + fgkPinSuppHeight/2.,
2531 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2532 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2534 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2535 - fgkLadderHeight/2. - tDY
2536 + fgkPinSuppHeight/2.,
2537 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2538 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2540 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2541 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2542 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2543 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2544 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2545 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2546 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2547 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2549 TGeoMedium *pinMed = GetMedium("SDDKAPTON (POLYCH2)$"); // medium ???
2550 Double_t fgkPinHeight = 4.5*fgkmm;
2551 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2553 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2555 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2556 - fgkLadderHeight/2.-tDY
2558 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2559 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2560 virtualSeg->AddNode(pineV, 1, transPS2b);
2562 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2563 - fgkLadderHeight/2. - tDY
2565 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2566 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2567 virtualSeg->AddNode(pineV, 2, transPS6b);
2570 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2571 - fgkLadderHeight/2.-tDY
2573 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2574 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2575 virtualSeg->AddNode(pineV, 3, transPS4b);
2577 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2578 - fgkLadderHeight/2. - tDY
2580 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2581 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2582 virtualSeg->AddNode(pineV, 4, transPS8b);
2585 //******************************
2586 // Cooling pipe supports :
2587 //******************************
2588 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2589 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2590 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2591 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2593 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2594 (triangleHeight+triangleCPaxeDist/
2595 TMath::Sin(halfTheta)-coolPipeSuppH);
2596 if (fAddCoolingSyst) {
2597 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2598 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2599 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2600 -fgkLadderHeight/2. - tDY
2601 +coolPipeSuppH+fgkLadderBeamRadius,
2602 -segmentLength/2., rotCPS1);
2604 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2605 -fgkLadderHeight/2. - tDY
2606 +coolPipeSuppH+fgkLadderBeamRadius,
2607 -segmentLength/2., rotCPS1);
2608 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2610 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2611 -fgkLadderHeight/2.- tDY
2612 +coolPipeSuppH+fgkLadderBeamRadius,
2613 segmentLength/2., rotCPS2);
2615 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2616 -fgkLadderHeight/2.- tDY
2617 +coolPipeSuppH+fgkLadderBeamRadius,
2618 segmentLength/2., rotCPS2);
2619 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2621 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2622 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2623 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2624 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2627 //************************
2629 //************************
2630 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2631 -fgkLadderHeight/2. - tDY +
2632 fgkLadderBeamRadius+coolPipeSuppH, 0);
2633 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2634 -fgkLadderHeight/2.- tDY +
2635 fgkLadderBeamRadius+coolPipeSuppH, 0);
2637 if (fAddCoolingSyst) {
2638 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2639 fgkCoolPipeOuterDiam/2,
2641 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2644 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2645 coolingPipeShape, phynoxSDD );
2646 coolingPipe->SetLineColor(fColorPhynox);
2647 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2651 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2652 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2654 virtualSeg->AddNode(cooler, 1, pipeTr1);
2655 virtualSeg->AddNode(cooler, 2, pipeTr2);
2659 //**********************************
2660 // Bases of hybrid thermal bridges
2661 //**********************************
2662 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2663 // approx !!! not clear on 0752/14-A
2664 if (fAddCoolingSyst) {
2665 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2666 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2667 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2668 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2670 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2671 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2674 //*************************
2676 //*************************
2677 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2678 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2680 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2681 - shiftHyb*SinD(fgkHybridAngle) );
2682 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2683 + shiftHyb*CosD(fgkHybridAngle) );
2685 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2686 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2687 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2688 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2689 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2690 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2692 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2693 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2700 // Starting from this segment
2701 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2702 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2703 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2704 - digitCableA->GetWidth()/2;
2705 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2706 - digitCableA->GetThickness()/2;
2708 Double_t digitCableX = ( coolPipeSuppL
2709 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2710 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2711 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2712 + fgkLadderBeamRadius+coolPipeSuppH
2713 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2714 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2717 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2718 digitCableY, cableSideSign*hybDz };
2719 Double_t digitCableCenterA1[3] = {
2720 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2721 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2722 cableSideSign*segmentLength/2 };
2724 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2725 digitCableY,cableSideSign*hybDz};
2726 Double_t digitCableCenterB1[3]={
2727 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2728 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2729 cableSideSign*segmentLength/2 };
2731 Double_t vZ[3] = {0,0,1};
2732 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2733 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2734 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2735 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2737 // Updating the other cables
2738 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2740 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2742 digitCableA[iCable].GetPoint( 1, coord);
2743 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2744 digitCableB[iCable].GetPoint( 1, coord);
2745 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2749 //**********************************
2750 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2755 //________________________________________________________________________
2756 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2758 // Create a pine support and its pine
2759 // axis of rotation is the cone axis, center in its middle
2761 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?
2763 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2764 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2765 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2766 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2767 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2768 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2769 fgkPinSuppHeight/2.+0.00001);
2770 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2772 if(GetDebug(3)){// Remove compiler warning.
2773 cone->InspectShape();
2774 tong->InspectShape();
2775 hole->InspectShape();
2778 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2779 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2780 tongTrans->RegisterYourself();
2781 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2782 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2783 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2785 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2787 pinSupport->SetLineColor(fColorRyton);
2793 //________________________________________________________________________
2794 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2796 // Create half of the cooling pipe support (ALR-0752/3)
2799 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2801 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2802 side1->SetName("ITSsddCPSside1");
2803 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2804 side1->SetVertex( 1, 0, fgkCoolPipeSuppWidthExt/2.);
2805 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2806 fgkCoolPipeSuppWidthExt/2.);
2807 side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX,
2808 -fgkCoolPipeSuppWidthExt/2.);
2809 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2810 side1->SetVertex( 5, 0, fgkCoolPipeSuppWidthExt/2.);
2811 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2812 fgkCoolPipeSuppWidthExt/2.);
2813 side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2.,
2814 -fgkCoolPipeSuppWidthExt/2.);
2816 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2817 - fgkCoolPipeSuppAxeDist
2818 + fgkCoolPipeSuppWidthExt/2., 0);
2819 side1Tr->RegisterYourself();
2820 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2821 - fgkCoolPipeSuppAxeDist
2822 + fgkCoolPipeSuppWidthExt*3/2.
2823 + fgkCoolPipeSuppWidthIn,0);
2824 side2Tr->RegisterYourself();
2826 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2827 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2828 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2829 TGeoTranslation *middleTr =
2830 new TGeoTranslation("ITSsddCPStr3",
2831 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2832 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2833 +fgkCoolPipeSuppWidthIn/2., 0);
2834 middleTr->RegisterYourself();
2836 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2837 fgkCoolPipeSuppTongW/4.,
2838 (fgkCoolPipeSuppFulWidth
2839 - 2*fgkCoolPipeSuppWidthExt
2840 - fgkCoolPipeSuppWidthIn)/2,
2841 fgkCoolPipeSuppHeight/2.);
2843 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2844 fgkCoolPipeSuppTongW/4.,
2845 - fgkCoolPipeSuppAxeDist
2846 + fgkCoolPipeSuppFulWidth
2847 - axeBox->GetDY(), 0);
2848 axeBoxTr->RegisterYourself();
2850 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2851 fgkCoolPipeSuppTongW/4.);
2853 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2854 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2855 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2856 axeTrans->RegisterYourself();
2857 //delete axeRot; // make the code crash, no idea of why !!!
2860 middle->InspectShape();
2861 axe->InspectShape();
2864 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2866 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2867 "ITSsddCoolPipeSuppShapeL",
2868 "ITSsddCPSmiddle:ITSsddCPStr3"
2869 "+ITSsddCPSside1:ITSsddCPStr1"
2870 "+ITSsddCPSside1:ITSsddCPStr2"
2871 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2872 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2873 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2874 coolPipeSuppShape, rytonSDD);
2876 coolPipeSupp->SetLineColor(fColorRyton);
2878 return coolPipeSupp;
2882 //________________________________________________________________________
2883 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2885 //Create half of the cooling pipe support (ALR-0752/3)
2888 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2890 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2891 side1->SetName("ITSsddCPSside1R");
2892 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2893 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2894 -fgkCoolPipeSuppWidthExt/2.);
2895 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2896 fgkCoolPipeSuppWidthExt/2.);
2897 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2898 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2899 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2900 -fgkCoolPipeSuppWidthExt/2.);
2901 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2902 fgkCoolPipeSuppWidthExt/2.);
2903 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2905 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2906 - fgkCoolPipeSuppAxeDist
2907 + fgkCoolPipeSuppWidthExt/2., 0);
2908 side1Tr->RegisterYourself();
2909 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2910 - fgkCoolPipeSuppAxeDist
2911 + fgkCoolPipeSuppWidthExt*3/2.
2912 + fgkCoolPipeSuppWidthIn, 0);
2913 side2Tr->RegisterYourself();
2915 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2916 (fgkCoolPipeSuppMaxLength/2.
2917 - fgkCoolPipeSuppSlitL)/2.,
2918 fgkCoolPipeSuppWidthIn/2.,
2919 fgkCoolPipeSuppHeight/2.);
2920 TGeoTranslation *middleTr =
2921 new TGeoTranslation("ITSsddCPStr3R",
2922 -( fgkCoolPipeSuppMaxLength/2.
2923 -fgkCoolPipeSuppSlitL)/2.,
2924 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2925 + fgkCoolPipeSuppWidthIn/2.,0);
2926 middleTr->RegisterYourself();
2928 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2929 fgkCoolPipeSuppTongW/4.,
2930 (fgkCoolPipeSuppFulWidth
2931 - 2*fgkCoolPipeSuppWidthExt
2932 - fgkCoolPipeSuppWidthIn)/2,
2933 fgkCoolPipeSuppHeight/2.);
2935 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2936 - fgkCoolPipeSuppTongW/4.,
2937 - fgkCoolPipeSuppAxeDist
2938 + fgkCoolPipeSuppFulWidth
2939 - axeBox->GetDY(),0);
2940 axeBoxTr->RegisterYourself();
2942 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2943 fgkCoolPipeSuppTongW/4.);
2945 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2946 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2947 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2948 axeTrans->RegisterYourself();
2952 middle->InspectShape();
2953 axe->InspectShape();
2956 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2957 "ITSsddCoolPipeSuppShapeR",
2958 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2959 "+ITSsddCPSside1R:ITSsddCPStr1R"
2960 "+ITSsddCPSside1R:ITSsddCPStr2R"
2961 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2962 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2964 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2965 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2966 coolPipeSuppShape, rytonSDD);
2967 coolPipeSupp->SetLineColor(fColorRyton);
2969 return coolPipeSupp;
2972 //________________________________________________________________________
2973 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2975 // based on ALR 0752/8
2978 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2980 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2981 - (fgkRadiusAminBTB+fgkBTBthick);
2982 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2983 fgkBTBthick/2., fgkBTBlength/2.);
2984 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2985 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2986 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2987 base1Tr->RegisterYourself();
2989 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2991 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2992 fgkBTBthick/2., fgkBTBlength/2.);
2993 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2994 fgkBTBaxisAtoBottom - base2width/2.,
2995 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2996 base2Tr->RegisterYourself();
2998 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
2999 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
3000 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
3001 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
3002 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
3003 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
3004 sideTr1->RegisterYourself();
3005 sideTr2->RegisterYourself();
3007 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
3008 fgkBTBthick/2., fgkBTBHoleLength/2.);
3009 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
3010 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3011 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3012 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
3013 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
3014 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3015 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3016 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
3017 holeTr1->RegisterYourself();
3018 holeTr2->RegisterYourself();
3020 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
3021 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3022 fgkRadiusAminBTB, radiusAmaxBTB,
3023 fgkBTBlength/2., 0., 180.);
3024 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3025 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3026 fgkBTBlength/2., 270., 360.);
3027 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3028 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3030 roundTr1->RegisterYourself();
3032 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3033 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3034 fgkBTBlength/2., 180., 270.);
3035 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3036 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3038 roundTr2->RegisterYourself();
3040 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3041 "ITSsddBaseThermalBridgeShape",
3042 "ITSsddBTBbase1:ITSsddBTBtr1"
3043 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3044 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3045 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3046 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3047 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3048 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3049 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3050 "+ ITSsddBTBmainAxis");
3052 if(GetDebug(3)){// Remove compiler warning.
3053 base1->InspectShape();
3054 base2->InspectShape();
3055 side->InspectShape();
3056 hole->InspectShape();
3057 mainAxis->InspectShape();
3058 round1->InspectShape();
3059 round2->InspectShape();
3062 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3063 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3065 carbonFiberLadderStruct);
3067 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3068 return vBaseThermalBridge;
3072 //________________________________________________________________________
3073 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3075 // Return an assembly containing a end of a CF ladder.
3078 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3079 TGeoMedium *stesalite = GetMedium("G10FR4$");
3080 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3081 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3083 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3084 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3085 Double_t underSegDH = fLay3LadderUnderSegDH;
3086 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3087 // footDZ is also where to place the ruby's center in local Z
3088 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3091 } else if (iLay==4) {
3092 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3093 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3094 underSegDH = fLay4LadderUnderSegDH;
3095 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3096 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3098 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3102 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3103 + underSegDH/2); //space under ladder segment
3104 // here tDY is not the same as for the segment because the end ladder
3105 // does not have a space under it, inside the general ladder volume.
3106 Double_t segmentLength = fgkSegmentLength;
3107 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3109 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3111 //**********************************
3112 // coding real matter :
3113 //**********************************
3114 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3115 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3116 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3117 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3119 //--- The 3 V shape corners of the Carbon Fiber Ladder
3121 TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape",
3122 topCornerLength/2., halfTheta, -1,
3123 fgkLadderLa, fgkLadderHa, fgkLadderl);
3124 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1",
3125 cfLaddTop1,carbonFiberLadderStruct);
3126 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3127 TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape",
3128 topCornerLength/2., halfTheta, 1,
3129 fgkLadderLa, fgkLadderHa, fgkLadderl);
3130 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3131 cfLaddTop2,carbonFiberLadderStruct);
3132 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3133 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3134 -(length-topCornerLength)/2.);
3135 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3136 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3139 TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape",
3140 length/2., beta, -1,
3141 fgkLadderLb, fgkLadderHb, fgkLadderl);
3142 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3143 cfLaddSide1,carbonFiberLadderStruct);
3144 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3145 TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape",
3147 fgkLadderLb, fgkLadderHb, fgkLadderl);
3148 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3149 cfLaddSide2,carbonFiberLadderStruct);
3150 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3151 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3152 TMath::Tan(beta) - fgkLadderBeamRadius );
3154 // because center of the triangle doesn't correspond to virtual vol. center
3155 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3156 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3157 alpha*TMath::RadToDeg());
3158 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3159 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3160 -alpha*TMath::RadToDeg());
3161 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3162 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3163 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3164 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3165 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3168 // Beams on the sides
3169 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3170 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3172 //Euler rotation : about Z, then new X, then new Z
3173 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3174 -beamPhiPrime*TMath::RadToDeg(), -90);
3175 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3176 beamPhiPrime*TMath::RadToDeg(), -90);
3177 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3178 beamPhiPrime*TMath::RadToDeg(), -90);
3179 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3180 -beamPhiPrime*TMath::RadToDeg(), -90);
3181 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3182 TMath::Tan(halfTheta),
3183 fgkLadderBeamRadius/2. + tDY,
3184 -length/2 + segmentLength/8, beamRot1);
3185 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3186 TMath::Tan(halfTheta),
3187 fgkLadderBeamRadius/2.+tDY,
3188 -length/2 + 3*segmentLength/8, beamRot2);
3189 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3190 TMath::Tan(halfTheta),
3191 fgkLadderBeamRadius/2.+tDY,
3192 -length/2 + segmentLength/8, beamRot3);
3193 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3194 TMath::Tan(halfTheta),
3195 fgkLadderBeamRadius/2. + tDY,
3196 -length/2+3*segmentLength/8, beamRot4);
3198 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3199 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3200 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3201 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3203 //--- Beams of the bottom
3204 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3206 /* Not there actually
3207 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3208 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3209 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3210 bottomBeam1, carbonFiberLadderStruct);
3211 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3213 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3214 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3215 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3216 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3218 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3219 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3220 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3221 bottomBeam2, carbonFiberLadderStruct);
3222 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3223 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3224 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3225 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3227 //**********************************
3228 //the cooling pipe supports
3229 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3230 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3232 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3233 (triangleHeight+triangleCPaxeDist/
3234 TMath::Sin(halfTheta)-coolPipeSuppH);
3236 if (fAddCoolingSyst) {
3237 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3238 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3239 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3240 -fgkLadderHeight/2.+ tDY +
3241 coolPipeSuppH+fgkLadderBeamRadius,
3242 -length/2., rotCPS1);
3243 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3244 -fgkLadderHeight/2.+ tDY +
3245 coolPipeSuppH+fgkLadderBeamRadius,
3246 -length/2., rotCPS2);
3248 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3249 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3252 //**********************************
3253 //--- The stesalite foot of the ladder
3255 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3256 - fgkLadFootY/2+fgkLadFingerPrintY;
3258 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3259 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3261 //=====================================
3264 if (fAddCoolingSyst) {
3266 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3267 -fgkLadderHeight/2.+ tDY +
3268 coolPipeSuppH + fgkLadderBeamRadius,
3269 -length/2.+coolPipeEndLen/2.);
3270 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3271 -fgkLadderHeight/2. + tDY +
3272 fgkLadderBeamRadius + coolPipeSuppH,
3273 -length/2.+coolPipeEndLen/2.);
3275 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3276 fgkCoolPipeOuterDiam/2,
3278 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3281 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3282 coolingPipeShape, phynoxSDD );
3283 coolingPipe->SetLineColor(fColorPhynox);
3284 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3287 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3288 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3290 virtualEnd->AddNode(cooler, 1, pipeTr1);
3291 virtualEnd->AddNode(cooler, 2, pipeTr2);
3295 //=====================================
3296 //--- HV cable guide
3299 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3300 fgkHVguideY1/2,fgkHVguideZ1/2);
3301 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3303 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3304 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3305 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3306 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3308 //=====================================
3310 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3311 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3312 -fgkLadderHeight/2.+ tDY +
3313 coolPipeSuppH+fgkLadderBeamRadius,
3314 -length/2.+coolPipeEndLen+raccordFullLen/2);
3315 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3316 -fgkLadderHeight/2.+ tDY +
3317 coolPipeSuppH+fgkLadderBeamRadius,
3318 -length/2.+coolPipeEndLen+raccordFullLen/2);
3320 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3321 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3323 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3328 //________________________________________________________________________
3329 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3331 //--- The stesalite foot of the ladder
3333 // The 2 screw holes on the left part
3334 // the small holes at each corner of the ruby cage (diam 2mm)
3335 // the really small level difference of 0.3mm on the bottom
3338 TGeoMedium *stesalite = GetMedium("G10FR4$");
3340 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3342 Double_t epsilon = 2e-10;
3343 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3345 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3346 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3347 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3348 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3350 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3351 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3352 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3355 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3356 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3358 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3359 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3360 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3362 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3363 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3364 rubyScrewHoleLen/2);
3366 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3367 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3368 fgkLadFootX/2-rubyScrewHoleLen/2,
3369 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3371 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3372 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3375 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3376 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3377 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3379 ladFootBox1Tr->RegisterYourself();
3380 ladFingerPrintTr->RegisterYourself();
3381 rubyCageHoleTr->RegisterYourself();
3382 rubyScrewHoleTr->RegisterYourself();
3383 rubyHoleTr->RegisterYourself();
3385 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3386 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3387 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3388 "+rubyHole:rubyHoleTr)");
3389 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3390 footRightPart,stesalite);
3391 vFootRightPart->SetLineColor(fColorStesalite);
3393 virtualFoot->AddNode(vFootRightPart, 1, 0);
3396 //--- This was the right part of the foot, now let's do the middle
3397 //--- and the right parts
3399 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3400 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3402 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3403 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3404 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3406 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3407 vFootMiddle->SetLineColor(fColorStesalite);
3408 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3411 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3412 (fgkLadFootY-fgkLadFingerPrintY)/2,
3414 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3415 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3416 -fgkLadFingerPrintY/2, 0);
3417 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3419 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3420 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3423 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3426 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3427 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3429 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3430 vFootLeft->SetLineColor(fColorStesalite);
3431 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3433 if(GetDebug(3)){ // Remove compiler warning.
3434 ladFingerPrint->InspectShape();
3435 ladFootBox1->InspectShape();
3436 rubyCageHole->InspectShape();
3437 rubyScrewHole->InspectShape();
3438 rubyHole->InspectShape();
3444 //________________________________________________________________________
3445 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3447 // return an assembly containing the CARLOS end-ladder board
3448 // and the heat bridge
3452 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3453 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3454 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3455 TGeoMedium *copper = GetMedium("COPPER$");
3456 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3457 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3459 //=========================================
3460 // cooling support of the Carlos card (HeatBridge):
3461 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3463 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3465 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3467 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3468 supCarlosBoard1, alCu12SDD);
3469 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3470 supCarlosBoard2, alCu12SDD);
3471 vSupCarlosBoard1->SetLineColor(4);
3472 vSupCarlosBoard2->SetLineColor(4);
3475 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3476 // shift of the main planes in the direction of their width
3477 // the center is fixed at the center of the 2 small fixing arms on each sides.
3480 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3481 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3482 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3483 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3485 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3486 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3489 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3493 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3494 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3496 //=========================================
3497 // fixing arm of the cooling support :
3498 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3500 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3501 supCarlosBoard3, alCu12SDD);
3502 vSupCarlosBoard3->SetLineColor(4);
3505 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3507 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3508 littleScrew, stainless);
3509 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3510 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3511 fgkLittleScrewHeadR-0.07, rotScrew);
3512 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3513 fgkLittleScrewHeadR+0.07, rotScrew);
3514 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3515 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3517 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3518 0, fgkCarlosSuppAngle, 0);
3519 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3520 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3521 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3522 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3523 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3524 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3527 //=========================================
3528 // screws fixing the board on the U tube
3529 Double_t aaa = fgkCarlosSuppY3; // ???
3530 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3531 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3532 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3533 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3534 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3535 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3537 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3539 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3540 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3541 screw1y,screw1z, CarlosSuppRot);
3543 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3544 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3545 screw1z,screw1y, CarlosSuppRot);
3547 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3548 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3549 screw1y,screw1z, CarlosSuppRot);
3551 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3552 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3553 screw1z,screw1y, CarlosSuppRot);
3555 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3556 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3557 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3558 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3560 //=========================================
3562 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3563 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3564 card1.SetNLayers(2);
3565 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3566 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3567 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3568 p1[0] = -fgkCarlosCardX1/2;
3569 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3570 p1[2] = fgkCarlosCardShift;
3571 p2[0] = fgkCarlosCardX1/2;
3572 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3573 p2[2] = fgkCarlosCardShift;
3574 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3575 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3576 card1.CreateAndInsertBoxCableSegment(1,90);
3578 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3579 card2.SetNLayers(2);
3580 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3581 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3582 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3584 p1[0] = -fgkCarlosCardX1/2;
3585 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3586 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3588 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3589 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3590 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3591 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3592 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3593 card2.CreateAndInsertBoxCableSegment(1,90);
3595 //=========================================
3596 // some chips on the board
3598 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3600 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3601 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3602 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3604 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3605 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3606 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3608 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3609 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3610 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3611 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3612 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3613 u1.CreateAndInsertBoxCableSegment(1,90);
3616 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3618 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3619 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3620 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3622 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3623 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3624 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3626 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3627 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3628 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3629 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3630 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3631 u2.CreateAndInsertBoxCableSegment(1,90);
3634 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3636 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3637 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3638 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3640 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3641 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3643 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3645 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3647 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3648 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3649 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3650 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3652 //--- U4 is like U3 (?)
3653 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3654 u4Trans->RotateX(90);
3655 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3656 fgkCarlosCardShift + fgkCarlosU4posZ);
3657 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3660 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3662 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3663 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3664 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3666 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3667 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3668 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3670 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3671 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3672 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3673 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3674 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3675 u17.CreateAndInsertBoxCableSegment(1,90);
3678 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3680 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3681 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3682 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3684 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3685 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3686 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3688 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3689 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3690 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3691 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3692 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3693 u35.CreateAndInsertBoxCableSegment(1,90);
3696 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3698 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3699 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3700 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3702 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3703 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3704 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3706 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3707 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3708 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3709 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3710 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3711 u36.CreateAndInsertBoxCableSegment(1,90);
3714 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3716 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3717 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3718 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3720 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3721 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3722 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3724 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3725 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3726 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3727 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3728 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3729 qz1.CreateAndInsertBoxCableSegment(1,90);
3731 return assemblySupCarlos;
3734 //________________________________________________________________________
3735 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3737 // Creates the assemblies containing the LV cards (left and right)
3740 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3741 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3742 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3743 TGeoMedium *copper = GetMedium("COPPER$");
3744 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3745 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3747 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3748 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3750 // we are going to use flat cable class to create multilayer box,
3751 // then we can use the pointers to created volumes to place them elsewhere
3752 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3754 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3755 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3756 cardLV.SetNLayers(2);
3757 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3758 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3759 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3761 p1[1] = fgkLVcardY/2;
3764 p2[1] = fgkLVcardY/2;
3766 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3767 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3768 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3769 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3770 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3771 fCardLVR->AddNode(boxVol, 1, trCard);
3773 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3774 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3775 chipO.SetNLayers(2);
3776 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3777 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3778 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3779 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3780 p1[1] = fgkLVChip0PosY;
3781 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3783 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3784 p2[1] = fgkLVChip0PosY;
3785 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3786 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3787 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3788 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3789 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3791 carLVfullThick/2+chip0fullThick/2, rotAdd);
3792 fCardLVR->AddNode(boxVol, 1, trCard);
3794 // put also this chip on the other side of the card
3795 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3797 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3798 fCardLVL->AddNode(boxVol, 2, trCard);
3799 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3801 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3802 fCardLVR->AddNode(boxVol, 2, trCard);
3804 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3805 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3806 chip1.SetNLayers(2);
3807 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3808 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3809 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3810 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3811 p1[1] = fgkLVChip1PosY;
3812 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3814 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3815 p2[1] = fgkLVChip1PosY;
3816 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3817 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3818 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3819 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3820 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3822 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3823 fCardLVR->AddNode(boxVol, 1, trCard);
3825 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3826 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3827 chip2.SetNLayers(2);
3828 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3829 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3830 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3831 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3832 p1[1] = fgkLVChip2PosY;
3833 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3834 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3835 p2[1] = fgkLVChip2PosY;
3836 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3837 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3838 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3839 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3840 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3842 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3843 fCardLVR->AddNode(boxVol, 1, trCard);
3845 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3846 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3847 chip3.SetNLayers(2);
3848 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3849 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3850 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3851 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3852 p1[1] = fgkLVChip3PosY;
3853 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3854 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3855 p2[1] = fgkLVChip3PosY;
3856 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3857 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3858 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3859 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3860 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3862 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3863 fCardLVR->AddNode(boxVol, 1, trCard);
3865 // the Al pieces for heat exchange :
3866 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3867 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3869 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3870 (fgkLVcoolX1/2+fgkLVcoolX2),
3871 fgkLVcoolPosY+fgkLVcoolY1/2,
3872 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3873 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3874 (fgkLVcoolX1/2+fgkLVcoolX2),
3875 fgkLVcoolPosY+fgkLVcoolY1/2,
3876 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3878 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3880 vAlLVcooling1->SetLineColor(2);
3883 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3884 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3885 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3887 fgkLVcoolPosY+fgkLVcoolY1/2,
3888 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3889 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3891 fgkLVcoolPosY+fgkLVcoolY1/2,
3892 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3894 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3896 vAlLVcooling2->SetLineColor(2);
3899 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3901 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3902 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3903 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3905 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3907 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3908 vAlLVcooling3->SetLineColor(2);
3910 //=== screw fixing th LV card to the U cooling tube :
3911 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3913 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3914 littleScrew, stainless);
3915 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3917 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3919 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3921 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3922 0, fgkLittleLVScrewHeadR,
3923 fgkLittleScrewHeadH/2);
3924 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3925 littleScrewHead, stainless);
3926 vLittleScrewHead->SetLineColor(kGray);
3927 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3928 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3929 fgkShiftLittleScrewLV,
3931 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3933 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3934 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3935 fgkShiftLittleScrewLV,
3937 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3939 // adding the cooling pieces to the left card
3940 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3941 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3942 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3943 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3944 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3946 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3947 -(fgkLVcoolX1/2+fgkLVcoolX2),
3948 fgkLVcoolPosY+fgkLVcoolY1/2,
3949 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3950 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3951 -(fgkLVcoolX1/2+fgkLVcoolX2),
3952 fgkLVcoolPosY+fgkLVcoolY1/2,
3953 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3954 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3956 fgkLVcoolPosY+fgkLVcoolY1/2,
3957 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3958 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3960 fgkLVcoolPosY+fgkLVcoolY1/2,
3961 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3963 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3965 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3967 // and to the right card
3968 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3969 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3970 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3971 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3972 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3977 //________________________________________________________________________
3978 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3980 // return an assembly containing the HV card
3984 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3985 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3986 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3987 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3988 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3989 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3991 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3993 //====================================
3994 //--- the card itself
3995 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
3996 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
3997 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
3998 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
4000 highVCard->AddNode(vCeramicCard, 1, 0);
4003 //====================================
4007 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
4008 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
4009 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
4012 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
4013 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
4014 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
4016 vCapa1End->SetLineColor(18);// grey silver
4017 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
4018 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4019 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
4020 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4022 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
4023 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
4024 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4026 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
4027 capa1->AddNode(vCapa1Middle, 1,0);
4028 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4029 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4031 highVCard->AddNode(capa1, 1, capa1PosTr);
4034 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4035 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4036 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4039 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4040 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4041 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4043 vCapa2End->SetLineColor(18);// grey silver
4044 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4045 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4046 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4047 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4049 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4050 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4051 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4053 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4054 capa2->AddNode(vCapa2Middle, 1,0);
4055 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4056 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4058 highVCard->AddNode(capa2, 1, capa2PosTr);
4061 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4062 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4063 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4066 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4067 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4068 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4070 vCapa3End->SetLineColor(18);// grey silver
4072 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4073 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4074 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4075 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4077 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4078 capa3->AddNode(vCapa3Middle, 1,0);
4079 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4080 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4082 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4083 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4084 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4086 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4087 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4088 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4090 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4091 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4092 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4094 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4095 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4096 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4098 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4099 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4100 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4102 highVCard->AddNode(capa3, 1, capa3PosTr1);
4103 highVCard->AddNode(capa3, 2, capa3PosTr2);
4104 highVCard->AddNode(capa3, 3, capa3PosTr3);
4105 highVCard->AddNode(capa3, 4, capa3PosTr4);
4106 highVCard->AddNode(capa3, 5, capa3PosTr5);
4108 //====================================
4109 //--- connexions to LV card
4111 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4112 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4113 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4114 Double_t fgkConnexLVHVx = 3*fgkmm;
4115 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4116 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4118 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4119 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4120 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4121 fgkConnexLVHVdiam1/2,
4122 fgkConnexLVHVdiam2/2,
4123 fgkConnexLVHVlen/2);
4124 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4125 connexLVHVmetal, stainless);
4126 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4127 connexLVHVplastic, plastic);
4128 vConnexLVHVmetal->SetLineColor(10);// white
4129 vConnexLVHVplast->SetLineColor(12); // dark grey
4131 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4132 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4133 connexion->AddNode(vConnexLVHVplast, 1, 0);
4135 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4136 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4137 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4138 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4140 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4141 fgkConnexLVHVy1+fgkConnexLVHVdy,
4142 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4143 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4144 fgkConnexLVHVy1+fgkConnexLVHVdy,
4145 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4147 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4148 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4149 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4150 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4151 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4152 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4154 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4155 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4156 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4157 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4158 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4159 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4161 highVCard->AddNode(connexion, 1, trConnexion1);
4162 highVCard->AddNode(connexion, 2, trConnexion2);
4163 highVCard->AddNode(connexion, 3, trConnexion3);
4164 highVCard->AddNode(connexion, 4, trConnexion4);
4165 highVCard->AddNode(connexion, 5, trConnexion5);
4166 highVCard->AddNode(connexion, 6, trConnexion6);
4167 highVCard->AddNode(connexion, 7, trConnexion7);
4168 highVCard->AddNode(connexion, 8, trConnexion8);
4170 //====================================
4171 //--- cooling pieces
4173 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4174 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4177 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4178 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4180 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4181 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4183 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4185 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4187 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4189 // This last volume contains the screw used for fixing
4190 // the card to the cooling tube ...
4191 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4193 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4194 littleScrewHV, stainless);
4196 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4197 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4199 vCardHVcool1->SetLineColor(2); //red
4200 vCardHVcool2->SetLineColor(2); //red
4201 vCardHVcool3->SetLineColor(2); //red
4203 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4204 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4205 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4206 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4207 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4208 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4209 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4210 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4212 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4213 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4215 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4216 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4217 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4218 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4220 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4221 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4222 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4223 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4225 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4226 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4228 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4229 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4230 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4231 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4233 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4234 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4235 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4236 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4238 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4239 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4241 //====================================
4243 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4244 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4245 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4246 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4248 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4249 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4250 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4251 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4254 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4255 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4261 //________________________________________________________________________
4262 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4264 // return an assembly containing the LV, HV and Carlos cards of one ladder
4265 // and their cooling system
4268 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4269 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4270 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4272 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4274 //=*********************************
4275 //--- The rounded pipe for the end ladder card coooling
4277 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4278 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4282 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4283 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4287 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4288 endLadderPipe.SetNLayers(2);
4289 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4290 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4292 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4293 // of the U colling pipe in its center
4295 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4296 Double_t vectA[3] = {0,0,1};
4298 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4299 Double_t vectB[3] = {0,0,1};
4301 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4302 Double_t vectC[3] = {1,0,0};
4304 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4305 Double_t vectD[3] = {-1,0,0};
4307 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4308 Double_t vectE[3] = {0,0,-1};
4310 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4311 Double_t vectF[3] = {0,0,-1};
4313 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4314 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4315 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4316 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4317 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4318 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4320 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4321 //endLadderPipe.CreateAndInsertCableSegment( 1);
4322 endLadderPipe.CreateAndInsertTubeSegment( 1);
4323 //endLadderPipe.CreateAndInsertCableSegment( 2);
4324 endLadderPipe.CreateAndInsertTorusSegment( 2);
4325 //endLadderPipe.CreateAndInsertCableSegment( 3);
4326 endLadderPipe.CreateAndInsertTubeSegment( 3);
4327 //endLadderPipe.CreateAndInsertCableSegment( 4);
4328 endLadderPipe.CreateAndInsertTorusSegment( 4);
4329 //endLadderPipe.CreateAndInsertCableSegment( 5);
4330 endLadderPipe.CreateAndInsertTubeSegment( 5);
4332 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4333 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4334 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4335 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4337 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4338 - fgkEndLadPipeArmBoxDX,
4339 fgkEndLadPipeArmBoxDY,0);
4340 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4341 fgkEndLadPipeArmBoxDX,
4342 fgkEndLadPipeArmBoxDY,0);
4343 endLadPipeArmBoxDY1->RegisterYourself();
4344 endLadPipeArmBoxDY2->RegisterYourself();
4346 if(GetDebug(3)) { // Remove compiler warning.
4347 endLadPipeArmBox->InspectShape();
4348 endLadPipeArmTube->InspectShape();
4351 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4352 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4353 "- endLadPipeArmTube");
4354 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4355 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4356 "- endLadPipeArmTube");
4358 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4359 endLadPipeArm1, alCu12SDD);
4360 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4361 endLadPipeArm2, alCu12SDD);
4362 vEndLadPipeArm1->SetLineColor(2);
4363 vEndLadPipeArm2->SetLineColor(2);
4365 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4366 +fgkEndLadPipeArmZpos);
4368 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4369 -fgkEndLadPipeUwidth/2,0,armZ);
4370 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4371 fgkEndLadPipeUwidth/2,0,armZ);
4373 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4374 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4376 //=*********************************
4378 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4379 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4381 Double_t spaceBetweenCards = 0.2*fgkmm;
4383 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4384 +fgkEndLadPipeArmBoxDX);
4385 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4386 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4388 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4391 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4392 +coolUzPos+1.25*fgkmm;
4393 // Position in z of the first LVB with respect to the start of the cooling
4394 // rectangular arm, coming (from inside of the ladder)
4395 // The cards are added one after the other
4397 for (Int_t iCard=0; iCard<nCards; iCard++) {
4399 Double_t cardLVzShift = firstLVCardZ +
4400 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4402 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4403 cardLVyShift, cardLVzShift);
4404 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4405 cardLVyShift, cardLVzShift);
4407 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4408 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4411 //=*********************************
4413 TGeoVolumeAssembly *cardHV = fCardHV;
4415 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4416 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4418 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4419 -(fgkHVCardCeramZ)/2);
4421 for (Int_t iCard=0; iCard<nCards; iCard++) {
4423 Double_t fact = iCard*2.+1.;
4424 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4425 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4426 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4427 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4430 //=*********************************
4433 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4434 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4435 // 0, -fgkCarlosSuppAngle, 0);
4437 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4438 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4439 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4440 // position in z of the first Carlos board, coming from inside of the ladder
4442 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4443 fgkEndLadPipeArmBoxDY);
4445 for (Int_t iCard=0; iCard<nCards; iCard++) {
4447 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4448 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4449 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4450 (TGeoRotation*) fCommonTr[0]);
4452 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4455 return endLadderCards;
4459 //________________________________________________________________________
4460 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4462 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4463 // and their cooling system
4464 // This is the code actually used for the end ladder cards
4467 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4468 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4469 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4470 TGeoMedium *copper = GetMedium("COPPER$");
4471 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4472 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4473 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4475 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4476 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4478 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4479 // reference radius corresponding to local y=0
4482 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4483 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4485 rREF = fgkEndLaddCardsShortRadiusLay4;
4488 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4489 +fgkEndLadPipeArmBoxDX);
4490 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4491 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4493 Double_t rMin = rREF + cardLVyShift;
4494 // (The LV card is defining rMin because it is the lower object)
4496 Double_t thickTotCable = 0.5;
4498 //==================================
4499 //--- The Pcon container
4501 // minimum angle of the Pcon :
4502 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4503 (rREF-fgkEndLadPipeArmY/2) );
4504 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4505 Double_t phi0 = 90-dphi/2;
4506 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4507 // of the U colling pipe in its center
4508 Double_t zMax = endLadPipeUlength+coolUzPos;
4509 Double_t rMax = rMin + fgkLVcardY;
4510 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4511 Double_t cablesRadius = rMax-0.5;
4513 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4514 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4515 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4516 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4517 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4518 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4519 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4520 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4521 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4522 // the following is quite dirty but works for the moment ...
4523 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4524 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4526 // The next parameters define the shape of the Pcon at its end and where cables
4528 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4529 Double_t cableSectionR2 = rMax;
4530 Double_t cableSectionZ1 = zMax + 6.3*fgkmm + 2.5*fgkcm;
4531 Double_t cableSectionZ2 = zMax + 7.3*fgkmm + 4*fgkcm;
4532 // Those 6.3 and 7.3 are to be fixed to stick the maximum to the SDD cone
4533 // (I'm waiting for the new cone)
4535 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4536 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4538 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4539 //endLadderCards->SetVisibility(kFALSE);
4541 //=*********************************
4542 //--- The rounded pipe for the end ladder card cooling
4544 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4545 endLadderPipe.SetNLayers(2);
4546 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4547 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4549 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4550 Double_t vectA[3] = {0,0,1};
4552 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4553 Double_t vectB[3] = {0,0,1};
4555 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4556 Double_t vectC[3] = {1,0,0};
4558 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4559 Double_t vectD[3] = {-1,0,0};
4561 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4562 Double_t vectE[3] = {0,0,-1};
4564 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4565 Double_t vectF[3] = {0,0,-1};
4567 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4568 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4569 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4570 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4571 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4572 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4574 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4575 //endLadderPipe.CreateAndInsertCableSegment( 1);
4576 endLadderPipe.CreateAndInsertTubeSegment( 1);
4577 //endLadderPipe.CreateAndInsertCableSegment( 2);
4578 endLadderPipe.CreateAndInsertTorusSegment( 2);
4579 //endLadderPipe.CreateAndInsertCableSegment( 3);
4580 endLadderPipe.CreateAndInsertTubeSegment( 3);
4581 //endLadderPipe.CreateAndInsertCableSegment( 4);
4582 endLadderPipe.CreateAndInsertTorusSegment( 4);
4583 //endLadderPipe.CreateAndInsertCableSegment( 5);
4584 endLadderPipe.CreateAndInsertTubeSegment( 5);
4586 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4587 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4588 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4589 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4591 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4592 - fgkEndLadPipeArmBoxDX,
4593 fgkEndLadPipeArmBoxDY,0);
4594 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4595 fgkEndLadPipeArmBoxDX,
4596 fgkEndLadPipeArmBoxDY,0);
4597 endLadPipeArmBoxDY1->RegisterYourself();
4598 endLadPipeArmBoxDY2->RegisterYourself();
4600 if(GetDebug(3)) { // Remove compiler warning.
4601 endLadPipeArmBox->InspectShape();
4602 endLadPipeArmTube->InspectShape();
4605 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4606 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4607 "- endLadPipeArmTube");
4608 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4609 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4610 "- endLadPipeArmTube");
4612 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4613 endLadPipeArm1, alCu12SDD);
4614 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4615 endLadPipeArm2, alCu12SDD);
4616 vEndLadPipeArm1->SetLineColor(2);
4617 vEndLadPipeArm2->SetLineColor(2);
4619 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4620 +fgkEndLadPipeArmZpos);
4622 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4623 -fgkEndLadPipeUwidth/2,rREF,armZ);
4624 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4625 fgkEndLadPipeUwidth/2,rREF,armZ);
4627 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4628 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4630 //=*********************************
4632 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4633 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4635 Double_t spaceBetweenCards = 0.2*fgkmm;
4638 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4641 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4642 +coolUzPos+1.25*fgkmm;
4643 // Position in z of the first LVB with respect to the start of the cooling
4644 // rectangular arm, coming (from inside of the ladder)
4645 // The cards are added one after the other
4647 for (Int_t iCard=0; iCard<nCards; iCard++) {
4649 Double_t cardLVzShift = firstLVCardZ +
4650 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4652 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4653 cardLVyShift+rREF, cardLVzShift);
4654 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4655 cardLVyShift+rREF, cardLVzShift);
4657 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4658 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4661 //=*********************************
4663 TGeoVolumeAssembly *cardHV = fCardHV;
4665 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4666 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4667 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4669 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4670 -(fgkHVCardCeramZ)/2);
4672 for (Int_t iCard=0; iCard<nCards; iCard++) {
4674 Double_t fact = iCard*2.+1.;
4675 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4676 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4677 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4678 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4681 //=*********************************
4684 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4685 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4686 // 0, -fgkCarlosSuppAngle, 0);
4688 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4689 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4690 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4691 // position in z of the first Carlos board, coming from inside of the ladder
4693 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4694 fgkEndLadPipeArmBoxDY);
4696 for (Int_t iCard=0; iCard<nCards; iCard++) {
4698 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4699 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4700 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4701 (TGeoRotation*) fCommonTr[0]);
4703 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4707 //=*********************************
4711 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4712 + fgkSectionGlassPerMod)*nCards;
4713 // We fix thickness, then width is calculated accordingly
4714 Double_t width = sectionV/thickTotCable;
4715 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4716 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4717 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4718 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4719 Double_t thickGlass = thickTotCable - thickCu - thickPlast;
4721 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4722 cable.SetNLayers(3);
4723 cable.SetLayer(0, thickCu, copper, kRed);
4724 cable.SetLayer(1, thickPlast, plastic, kYellow);
4725 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4727 Double_t zVect[3]={0,0,1};
4728 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4729 +spaceBetweenCarlsoCards)/2 + 2.9;
4730 // the 2.9cm is for taking into account carlos card angle...
4732 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4733 cableSectionR2,cableSectionZ1,cableSectionZ2);
4735 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4736 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4737 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4738 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4739 cable.SetInitialNode(endLadderCards);
4740 cable.CreateAndInsertCableSegment(1);
4742 return endLadderCards;
4745 //________________________________________________________________________
4746 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4748 // return an assembly of the support rings, attaching the ladders to the cone
4754 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4755 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4758 //**********************************
4761 Double_t fgkRubyCageX = 9*fgkmm;
4762 Double_t fgkRubyCageY = 5.5*fgkmm;
4763 Double_t fgkRubyCageZ = 8*fgkmm;
4764 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4765 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4766 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4767 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4768 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4770 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4773 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4775 // pieces common to both square and V cages
4776 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4777 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4779 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4780 fgkRubyCageHoleDX/2+epsilon);
4782 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4783 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4784 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4785 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4786 trScrewHole->RegisterYourself();
4788 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4789 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4790 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4791 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4792 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4793 trScrewHoleFoot->RegisterYourself();
4796 // pieces which differ
4797 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4799 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4800 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4802 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4803 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4804 trRubyCageVInternBox->RegisterYourself();
4806 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4807 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4808 fgkRubyCageInternSide/4);
4810 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4811 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4812 +epsilon,0,0, rotV );
4813 trRubyCageVInternTriangl->RegisterYourself();
4816 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4817 "rubyCageBox-(rubyCageInternBox"
4818 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4820 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4821 rubyCageSquare, stainless);
4822 vRubyCageSquare->SetLineColor(10);
4824 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4825 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4826 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4827 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4828 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4829 vRubyCageV->SetLineColor(10);
4831 if(GetDebug(3)) { // Remove compiler warning.
4832 rubyCageBox->InspectShape();
4833 rubyCageInternBox->InspectShape();
4834 screwHole->InspectShape();
4835 screwHoleFoot->InspectShape();
4836 rubyCageVInternBox->InspectShape();
4837 rubyCageVInternTriangl->InspectShape();
4840 supportRing->AddNode(vRubyCageSquare, 0, 0);
4841 //supportRing->AddNode(vRubyCageV, 0, 0);
4847 //________________________________________________________________________
4848 void AliITSv11GeometrySDD::CreateSDDsensor() {
4850 // return a box containing the SDD sensor
4853 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4854 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4855 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4856 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4857 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4858 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4861 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4862 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4863 // width : in the beam direction !
4865 Double_t sensoxBoxLength = ( fgkWaferLength +
4866 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4867 // Makes life easier to include the space for the WA HV cable on both sides
4868 Double_t sensoxBoxThick = fgkWaferThickness +
4869 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4871 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4872 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4874 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4875 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4877 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4878 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4881 //****************************
4883 //****************************
4885 // we need 2 different sensor objects, because they have to have different names
4886 // This is required for the step manager
4888 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4889 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4892 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4893 wafer3->SetLineColor(fColorSilicon);
4894 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4895 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4896 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4897 sensVol3->SetLineColor(fColorSilicon+5);
4898 wafer3->AddNode(sensVol3, 1, 0);
4899 fSDDsensor3->AddNode(wafer3, 1, 0);
4901 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4902 wafer4->SetLineColor(fColorSilicon);
4903 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4904 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4905 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4906 sensVol4->SetLineColor(fColorSilicon+5);
4907 wafer4->AddNode(sensVol4, 1, 0);
4908 fSDDsensor4->AddNode(wafer4, 1, 0);
4911 //****************************
4913 //****************************
4914 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4915 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4916 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4917 vGlass->SetLineColor(fColorGlass);
4918 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4919 fgkWaferThickness/2+fgkSensorGlassLY/2,
4920 fgkGlassDZOnSensor);
4921 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4922 fgkWaferThickness/2+fgkSensorGlassLY/2,
4923 fgkGlassDZOnSensor);
4924 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4925 fgkWaferThickness/2+fgkSensorGlassLY/2,
4926 -fgkGlassDZOnSensor);
4927 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4928 fgkWaferThickness/2+fgkSensorGlassLY/2,
4929 -fgkGlassDZOnSensor);
4930 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4931 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4932 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4933 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4935 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4936 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4937 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4938 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4940 //****************************
4941 // Wrap-around cable
4942 //****************************
4944 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4945 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4946 waHVCable.SetNLayers(2);
4947 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4948 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4949 waHVCable.SetInitialNode(fSDDsensor3);
4951 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4952 x1[0] = -fgkWaHVcableLength/2;
4954 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4956 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4959 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4960 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4961 TGeoCombiTrans *ctSegment = 0;
4962 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4963 fSDDsensor4->AddNode(segment, 1, ctSegment);
4967 waHVCable.SetName("ITSsddWaHVCableD");
4968 waHVCable.ResetPoints();
4969 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4970 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4971 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
4972 fSDDsensor4->AddNode(segment, 1, ctSegment);
4974 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
4976 waHVCableFold.SetPhi(180,360);
4977 waHVCableFold.SetNLayers(2);
4978 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
4979 polyhamideSDD, fColorPolyhamide);
4980 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4981 waHVCableFold.SetInitialNode(fSDDsensor3);
4984 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
4986 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4987 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4988 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
4989 fSDDsensor4->AddNode(segment, 1, ctSegment);
4992 //****************************
4994 //****************************
4995 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
4996 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
4997 /(2.*fgkTransitHVHeadLZ);
4998 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
4999 headRadius-fgkTransitHVHeadLZ)
5002 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
5003 fgkTransitHVPolyThick/2,
5005 headPoly->SetName("headPoly");
5006 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
5007 -fgkTransitHVPolyThick/2);
5008 headPolyTr->SetName("headPolyTr");
5009 headPolyTr->RegisterYourself();
5011 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
5012 fgkTransitHVAlThick/2,
5014 headAl->SetName("headAl");
5015 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
5016 -fgkTransitHVPolyThick
5017 -fgkTransitHVAlThick/2);
5018 headAlTr->SetName("headAlTr");
5019 headAlTr->RegisterYourself();
5021 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
5022 (headRadius-fgkTransitHVHeadLZ)/2,
5023 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
5024 cache->SetName("cache");
5026 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5027 (headRadius-fgkTransitHVHeadLZ)/2,
5028 -(fgkTransitHVPolyThick
5029 +fgkTransitHVAlThick)/2);
5030 headCacheTr->SetName("cacheTr");
5031 headCacheTr->RegisterYourself();
5033 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5034 "headPoly:headPolyTr-cache:cacheTr");
5035 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5036 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5037 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5038 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5039 "headAl:headAlTr-cache:cacheTr");
5040 TGeoVolume *vHeadAlComp = new TGeoVolume(
5041 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5042 vHeadAlComp->SetLineColor(fColorAl);
5045 // TGeoRotation rotHead("",0,90,0);
5046 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5047 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5049 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5050 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5051 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5054 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5055 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5056 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5057 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5060 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5061 fgkTransitHVBondingLZ,
5062 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5063 transitHVCable.SetNLayers(2);
5064 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5066 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5067 transitHVCable.SetInitialNode(fSDDsensor3);
5069 x1[0] = -fgkTransitHVHeadLX/2;
5071 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5075 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5076 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5077 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5078 fSDDsensor4->AddNode(segment, 1, ctSegment);
5080 transitHVCable.ResetPoints();
5081 transitHVCable.SetName("ITSsddHVtransitTail");
5082 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5083 x1[0] = fgkTransitHVtailXpos;
5084 x2[0] = fgkTransitHVtailXpos;
5085 x1[2] = -fgkTransitHVBondingLZ/2;
5086 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5087 Double_t vZ[3] = {0,0,1};
5088 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5089 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5090 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5091 fSDDsensor4->AddNode(segment, 1, ctSegment);
5094 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5095 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5096 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5097 fgkTransitHVsideLZ);
5098 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5099 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5100 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5101 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5102 fgkTransitHVsideLZ);
5103 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5104 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5106 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5107 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5108 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5109 fgkTransitHVsideLZ);
5110 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5111 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5112 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5113 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5114 fgkTransitHVsideLZ);
5115 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5116 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5118 // sideRight is not there actually
5119 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5120 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5121 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5122 // fgkTransitHVsideLZ);
5123 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5124 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5125 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5126 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5127 // fgkTransitHVsideLZ);
5128 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5129 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5131 // TGeoRotation rotSide("",0,-90,0);
5132 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5133 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5134 // -fgkTransitHVBondingLZ/2,&rotSide);
5135 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5136 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5137 // -fgkTransitHVBondingLZ/2, &rotSide);
5138 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5139 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5140 // -fgkTransitHVBondingLZ/2, &rotSide);
5141 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5142 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5143 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5144 // -fgkTransitHVBondingLZ/2,rotSide);
5145 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5146 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5147 -fgkTransitHVBondingLZ/2, rotSide);
5148 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5149 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5150 -fgkTransitHVBondingLZ/2, rotSide);
5152 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5153 sideLeft,polyhamideSDD);
5154 vSideLeft->SetLineColor(fColorPolyhamide);
5155 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5157 vSideLeftAl->SetLineColor(fColorAl);
5159 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5160 // sideRight,polyhamideSDD);
5161 // vSideRight->SetLineColor(fColorPolyhamide);
5163 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5164 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5165 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5167 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5168 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5169 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5172 //****************************
5174 fSDDsensor3->CheckOverlaps(0.01);
5175 fSDDsensor4->CheckOverlaps(0.01);
5178 fSDDsensor3->SetVisibility(kFALSE);
5179 fSDDsensor4->SetVisibility(kFALSE);
5183 //________________________________________________________________________
5184 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5186 // return a box volume containing the detectors
5189 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5191 Int_t nDetectors = fgkLay3Ndet;
5192 Double_t ladderLength = fgkLay3LadderLength;
5193 Double_t *sensorZPos = fLay3sensorZPos;
5197 nDetectors = fgkLay4Ndet;
5198 ladderLength = fgkLay4LadderLength;
5199 sensorZPos = fLay4sensorZPos;
5201 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5205 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5206 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5208 sprintf(name,"ITSsddDetBox%i",iLay);
5209 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5210 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5211 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5213 for (Int_t i=0; i<nDetectors; i++) {
5214 Double_t localZ = sensorZPos[i];
5215 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5216 if (iLay==3) if (i%2!=0) localY = -localY;
5217 if (iLay==4) if (i%2==0) localY = -localY;
5218 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5220 if (i >= nDetectors/2) {
5221 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5222 sensorPos->SetName(name);
5223 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5226 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5227 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5229 sensorPos->SetName(name);
5230 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5234 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5235 virtualDet->SetVisibility(kFALSE);
5240 //________________________________________________________________________
5241 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5243 // return a box volume containing the detectors
5246 Int_t nDetectors = fgkLay3Ndet;
5247 Double_t ladderLength = fgkLay3LadderLength;
5248 Double_t *sensorZPos = fLay3sensorZPos;
5249 TGeoVolume *sensorSDD = fSDDsensor3;
5253 nDetectors = fgkLay4Ndet;
5254 ladderLength = fgkLay4LadderLength;
5255 sensorZPos = fLay4sensorZPos;
5256 sensorSDD = fSDDsensor4;
5258 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5262 sprintf(name,"ITSsddDetBox%i",iLay);
5264 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5266 for (Int_t i=0; i<nDetectors; i++) {
5267 Double_t localZ = sensorZPos[i];
5268 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5269 if (iLay==3) if (i%2!=0) localY = -localY;
5270 if (iLay==4) if (i%2==0) localY = -localY;
5271 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5273 if (i >= nDetectors/2) {
5274 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5275 sensorPos->SetName(name);
5276 virtualDet->AddNode(sensorSDD, i, sensorPos);
5279 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5280 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5282 sensorPos->SetName(name);
5283 virtualDet->AddNode(sensorSDD, i, sensorPos);
5287 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5292 //________________________________________________________________________
5293 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5296 // export the geometry in a AliITSgeom object
5301 printf("error:Try to fill null (AliITSgeom *) object");
5305 printf("error:Try to set sensor geometry while geometry is not defined\n");
5309 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5310 fgkWaferLengthSens/2.};
5311 if(!(geom->IsShapeDefined(kSDD)))
5312 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5315 char ladderName[30];
5316 char sensorName[30];
5317 char senstivName[30];
5318 const Int_t kNLay = 2;
5319 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5320 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5323 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5325 Int_t firstSDDmod = startMod;
5326 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5327 /////////////////////////////////////////
5328 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5329 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5331 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5332 TGeoVolume *layVolume = layNode->GetVolume();
5333 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5335 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5336 /////////////////////////////////////////
5337 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5338 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5340 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5341 TGeoVolume *laddVolume = laddNode->GetVolume();
5342 TGeoHMatrix laddMatrix(layMatrix);
5343 laddMatrix.Multiply(laddNode->GetMatrix());
5345 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5346 /////////////////////////////////////////
5347 sprintf(sensorName, "ITSsddSensor_%i",iDet);
5348 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5350 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5351 TGeoVolume *detVolume = detNode->GetVolume();
5352 TGeoHMatrix detMatrix(laddMatrix);
5353 detMatrix.Multiply(detNode->GetMatrix());
5355 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5357 TGeoVolume *wafVolume = wafNode->GetVolume();
5358 TGeoHMatrix wafMatrix(detMatrix);
5359 detMatrix.Multiply(wafNode->GetMatrix());
5360 //--------------------------------------------------------
5361 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5362 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5364 TGeoHMatrix sensMatrix(wafMatrix);
5365 sensMatrix.Multiply(sensitivNode->GetMatrix());
5367 // Sticking to the convention for local wafer coordinate
5369 if (iDet >= kNDet[iLay]/2) {
5370 // TGeoRotation rotY("",0,180,0);
5371 TGeoRotation rotY("",-180,-180,0);
5372 sensMatrix.Multiply(&rotY);
5374 // Creating the matrix in AliITSgeom for
5375 // this sensitive volume :
5376 Double_t *trans = sensMatrix.GetTranslation();
5377 Double_t *r = sensMatrix.GetRotationMatrix();
5378 Double_t rot[10] = {r[0],r[1],r[2],
5380 r[6],r[7],r[8], 1.0};
5381 //rot[9]!=0.0 => not a unity matrix
5382 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5384 // iLadd+1, iDet+1 because ladd. and det. start at +1
5389 printf("Error (ExportSensorGeometry) %s not found !\n",
5392 printf("Error (ExportSensorGeometry) %s not found !\n",
5395 printf("Error (ExportSensorGeometry) %s not found !\n",
5399 printf("Error (ExportSensorGeometry) %s not found !\n",
5403 printf("Error (ExportSensorGeometry) %s not found !\n",
5407 return (startMod-firstSDDmod);
5411 //________________________________________________________________________
5412 Int_t AliITSv11GeometrySDD::
5413 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5415 // Function which gives the layer, ladder and det.
5416 // index of the current volume. To be used in
5417 // AliITS::StepManager()
5420 if (gGeoManager->GetLevel()<3) return kFALSE;
5421 // Get the det index :
5422 TGeoNode *node = gGeoManager->GetMother(2);
5423 if (!node) return kFALSE;
5424 det = node->GetNumber()+1;
5426 // Get the ladder index :
5427 node = gGeoManager->GetMother(3);
5428 if (!node) return kFALSE;
5429 ladd = node->GetNumber()+1;
5431 // Get the layer index :
5432 if (node->GetNdaughters()==fgkLay3Ndet)
5433 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5440 //________________________________________________________________________
5441 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5442 Double_t r2max, Double_t z2,
5443 Double_t section, Int_t nDiv)
5445 // Creates a cone along z where the section is approximately constant
5446 // with z. This is for simulation of cables, because a cone with a constant
5447 // radius difference would show a quantity of matter increasing with z...
5448 // The max radius of the created Pcon is evolving linearly, the min radius
5449 // is calculated at several steps (nDiv).
5450 // z2 > z1 (required by the Pcon)
5452 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5454 Double_t dr = (r2max-r1max)/nDiv;
5455 Double_t dz = (z2-z1)/nDiv;
5456 Double_t r1minI, r2minI, r1maxI, r2maxI;
5459 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5460 Double_t cosAlpha = (z2-z1)/lZ;
5462 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5463 myPcon->DefineSection(0, z1, r1minI, r1max);
5465 for (Int_t i=0; i<nDiv; i++) {
5469 r1maxI = r1max + i*dr;
5470 r2maxI = r1maxI + dr;
5472 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5473 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5479 //________________________________________________________________________
5480 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5481 Double_t refZ1, Double_t refZ2) {
5482 // just a helping function
5483 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5486 //________________________________________________________________________
5487 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5488 Int_t nLay3, Int_t nLay4,
5489 Double_t r1, Double_t z1,
5490 Double_t r2, Double_t z2) {
5492 // Create some cables portions from SDD modules grouped
5493 // and attached at the border of the SSD cone
5495 TGeoMedium *copper = GetMedium("COPPER$");
5496 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5497 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5499 char titleCable[30];
5500 sprintf(titleCable,"cableSDDport%i",(Int_t)angle);
5503 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5504 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5505 Double_t width = section/thickness;
5506 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5507 +fgkSectionGlassPerMod);
5509 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5510 +fgkSectionGlassPerMod);
5512 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5513 +fgkSectionGlassPerMod);
5515 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5516 Double_t cosAlpha = (z2-z1)/hypothenus;
5517 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5518 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5519 angle *= TMath::DegToRad();
5520 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5521 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5522 Double_t pos1[3] = {x1,y1,z1};
5523 Double_t pos2[3] = {x2,y2,z2};
5524 Double_t zVect[3] = {0,0,1};
5526 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5527 cable.SetNLayers(3);
5528 cable.SetLayer(0, thickPlast, plastic, kYellow);
5529 cable.SetLayer(1, thickCu, copper, kRed);
5530 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5532 cable.AddCheckPoint( mother, 0, pos1, zVect );
5533 cable.AddCheckPoint( mother, 1, pos2, zVect );
5534 cable.SetInitialNode(mother);
5535 cable.CreateAndInsertCableSegment(1);
5542 //________________________________________________________________________
5543 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth)
5546 // Creates and inserts the SDD cables running on SDD and SSD cones
5549 // moth : the TGeoVolume owing the volume structure
5552 // Created: ??? Ludovic Gaudichet
5553 // Updated: 15 Mar 2008 Mario Sitta
5554 // Updated: 14 Apr 2008 Mario Sitta Overlap fixes
5555 // Updated: 09 May 2008 Mario Sitta SSD overlap fixes
5558 TGeoMedium *copper = GetMedium("COPPER$");
5559 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5560 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5561 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5564 //==================================
5566 //==================================
5568 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5569 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5571 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5572 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5573 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5575 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5576 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5577 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5579 // Do not use hardcoded numbers, get them from real shapes - M.S. 15/03/08
5580 TGeoVolume *sddCone = gGeoManager->GetVolume("SDDCarbonFiberCone");
5581 TGeoPcon *sddConeShape = (TGeoPcon*)sddCone->GetShape();
5583 TGeoVolume *sddCylinder = gGeoManager->GetVolume("SDDCarbonFiberCylinder");
5584 TGeoTube *sddCylinderShape = (TGeoTube*)sddCylinder->GetShape();
5586 // (were fgkConeSDDr1, fgkConeSDDr2, fgkConeSDDz1, fgkConeSDDz2 hardcoded)
5587 Double_t coneSDDr1 = sddConeShape->GetRmin(5);
5588 Double_t coneSDDr2 = sddConeShape->GetRmin(3);
5590 Double_t coneSDDz1 = sddConeShape->GetZ(9) - sddConeShape->GetZ(5) +
5591 sddCylinderShape->GetDz();
5592 Double_t coneSDDz2 = sddConeShape->GetZ(9) - sddConeShape->GetZ(3) +
5593 sddCylinderShape->GetDz();
5595 // Calculate z1, z2 thanks to R1 and R2
5596 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, coneSDDr1, coneSDDr2,
5597 coneSDDz1, coneSDDz2);
5598 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, coneSDDr1, coneSDDr2,
5599 coneSDDz1, coneSDDz2);
5600 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, coneSDDr1, coneSDDr2,
5601 coneSDDz1, coneSDDz2);
5603 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5605 //==================================
5606 // first set of cones : cables from layer 3
5607 //==================================
5609 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5610 fgkSDDCableR2, sddCableZ2,
5611 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5613 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5614 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0),
5615 pcon1all->GetRmax(0));
5617 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5618 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax,
5619 pcon1all->GetRmax(1));
5621 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container",
5622 pcon1container, airSDD);
5623 vpcon1container->SetVisibility(kFALSE);
5625 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5626 fgkSDDCableR2, sddCableZ2,
5627 sectionLay3Plastic, 3);
5629 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast",
5630 pcon1plast, plastic);
5631 vpcon1plast->SetLineColor(kYellow);
5632 vpcon1container->AddNode(vpcon1plast, 0);
5634 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5635 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5636 fgkSDDCableR2 - dr1a, sddCableZ2,
5639 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu",
5641 vpcon1Cu->SetLineColor(kRed);
5642 vpcon1container->AddNode(vpcon1Cu, 0);
5644 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5645 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5646 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5647 sectionLay3Glass, 3);
5649 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass",
5650 pcon1glass, opticalFiber);
5651 vpcon1glass->SetLineColor(kGreen);
5652 vpcon1container->AddNode(vpcon1glass, 0);
5654 moth->AddNode(vpcon1container, 1);
5655 moth->AddNode(vpcon1container, 2, rotCableSDD);
5657 //==================================
5658 // 2nd set of cones : cables from layer 3 and layer 4
5659 //==================================
5661 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5662 fgkSDDCableR3, sddCableZ3,
5663 sectionLay3Plastic+sectionLay4Plastic+
5664 sectionLay3Cu+sectionLay4Cu+
5665 sectionLay3Glass+sectionLay4Glass, 1);
5667 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5668 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0),
5669 pcon2all->GetRmax(0));
5671 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5672 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax,
5673 pcon2all->GetRmax(1));
5676 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container",
5677 pcon2container, airSDD);
5678 vpcon2container->SetVisibility(kFALSE);
5680 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5681 fgkSDDCableR3, sddCableZ3,
5683 sectionLay4Plastic, 3);
5685 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast",
5686 pcon2plast, plastic);
5687 vpcon2plast->SetLineColor(kYellow);
5688 vpcon2container->AddNode(vpcon2plast, 0);
5690 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5691 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5692 fgkSDDCableR3 - dr2a, sddCableZ3,
5693 sectionLay3Cu+sectionLay4Cu, 3);
5695 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu",
5697 vpcon2Cu->SetLineColor(kRed);
5698 vpcon2container->AddNode(vpcon2Cu, 0);
5700 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5701 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5702 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5704 sectionLay4Glass, 3);
5706 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass",
5707 pcon2glass, opticalFiber);
5708 vpcon2glass->SetLineColor(kGreen);
5709 vpcon2container->AddNode(vpcon2glass, 0);
5711 moth->AddNode(vpcon2container, 1);
5712 moth->AddNode(vpcon2container, 2, rotCableSDD);
5714 //==================================
5715 // intermediate cylinder
5716 //==================================
5718 // (was fgkSDDCableDZint hardcoded)
5719 Double_t sddCableDZint = (sddConeShape->GetZ(9) - sddConeShape->GetZ(0) +
5720 sddCylinderShape->GetDz()) - sddCableZ3;
5722 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl",
5723 pcon2container->GetRmin(1),
5724 pcon2container->GetRmax(1),
5727 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",
5729 vInterCyl->SetVisibility(kFALSE);
5731 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5732 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5733 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5735 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5736 rmaxCylPlast, sddCableDZint/2);
5738 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast",
5739 interCylPlast, plastic);
5740 vInterCylPlast->SetLineColor(kYellow);
5741 vInterCyl->AddNode(vInterCylPlast, 0);
5743 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5744 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5745 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5747 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5748 rmaxCylCu, sddCableDZint/2);
5750 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu",
5751 interCylCu, copper);
5752 vInterCylCu->SetLineColor(kRed);
5753 vInterCyl->AddNode(vInterCylCu, 0);
5755 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5756 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5757 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5759 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5760 rmaxCylGlass, sddCableDZint/2);
5762 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",
5763 interCylGlass,opticalFiber);
5764 vInterCylGlass->SetLineColor(kGreen);
5765 vInterCyl->AddNode(vInterCylGlass, 0);
5767 moth->AddNode(vInterCyl, 1, new TGeoTranslation(0, 0,
5768 sddCableZ3+sddCableDZint/2));
5769 moth->AddNode(vInterCyl, 2, new TGeoTranslation(0, 0,
5770 -sddCableZ3-sddCableDZint/2));
5772 //==================================
5773 // cable cone on the SSD cone
5774 //==================================
5776 Double_t sddCableR4 = rmaxCylPlast;
5777 Double_t sddCableZ4 = sddCableZ3 + sddCableDZint;
5779 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5780 fgkSDDCableR5, fgkSDDCableZ5,
5783 sectionLay3Cu+sectionLay4Cu+
5784 sectionLay3Glass+sectionLay4Glass, 1);
5786 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5787 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0),
5788 pcon3all->GetRmax(0));
5790 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5791 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax,
5792 pcon3all->GetRmax(1));
5795 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container",
5796 pcon3container, airSDD);
5797 vpcon3container->SetVisibility(kFALSE);
5799 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5800 fgkSDDCableR5, fgkSDDCableZ5,
5802 sectionLay4Plastic, 3);
5804 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast",
5805 pcon3plast, plastic);
5806 vpcon3plast->SetLineColor(kYellow);
5807 vpcon3container->AddNode(vpcon3plast, 0);
5809 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5810 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5811 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5812 sectionLay3Cu+sectionLay4Cu, 3);
5814 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu",
5816 vpcon3Cu->SetLineColor(kRed);
5817 vpcon3container->AddNode(vpcon3Cu, 0);
5819 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5820 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5821 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5822 sectionLay3Glass+sectionLay4Glass, 3);
5824 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass",
5825 pcon3glass,opticalFiber);
5826 vpcon3glass->SetLineColor(kGreen);
5827 vpcon3container->AddNode(vpcon3glass, 0);
5829 moth->AddNode(vpcon3container, 1);
5830 moth->AddNode(vpcon3container, 2, rotCableSDD);
5832 //==================================
5833 // cables that are grouped at the end of SSD cones
5834 //==================================
5836 // Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
5837 // Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
5838 Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
5839 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
5841 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5843 // Add some hardcoded shifts to avoid overlaps with SSD pathc panels
5844 CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
5845 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5847 CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
5848 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5850 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5851 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5853 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5854 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5856 CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
5857 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5859 CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
5860 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5862 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5863 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5865 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5866 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5868 CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
5869 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5871 CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
5872 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5874 CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
5875 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5877 CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
5878 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5880 CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
5881 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5883 moth->AddNode(endConeSDDCable, 1, 0);
5885 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5886 reflect->ReflectZ(kTRUE);
5887 moth->AddNode(endConeSDDCable, 2, reflect);