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( fgkSegmentLength/2., halfTheta,
813 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
814 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
815 cfLaddTop1,carbonFiberLadderStruct);
816 TGeoArb8 *cfLaddTop2 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
817 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
818 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
819 cfLaddTop2, carbonFiberLadderStruct);
820 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
821 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
822 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
825 TGeoArb8 *cfLaddSide1 = CreateLadderSide( fgkSegmentLength/2., beta, -1,
826 fgkLadderLb, fgkLadderHb, fgkLadderl);
827 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
828 cfLaddSide1,carbonFiberLadderStruct);
829 TGeoArb8 *cfLaddSide2 = CreateLadderSide( fgkSegmentLength/2., beta, 1,
830 fgkLadderLb, fgkLadderHb, fgkLadderl);
831 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
832 cfLaddSide2,carbonFiberLadderStruct);
833 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
834 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
835 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
836 alpha*TMath::RadToDeg());
837 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
838 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
839 -alpha*TMath::RadToDeg());
840 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
843 // Beams on the sides
844 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
845 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
846 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
847 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
848 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
849 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
850 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
852 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
853 carbonFiberLadderStruct);
854 sideBeam->SetLineColor(fColorCarbonFiber);
856 //Euler rotation : about Z, then new X, then new Z
857 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
858 -beamPhiPrime*TMath::RadToDeg(),-90);
859 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
860 beamPhiPrime*TMath::RadToDeg(), -90);
861 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
862 beamPhiPrime*TMath::RadToDeg(), -90);
863 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
864 -beamPhiPrime*TMath::RadToDeg(),-90);
866 TGeoCombiTrans *beamTransf[8];
867 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
868 TMath::Tan(halfTheta),
869 fgkLadderBeamRadius/2. - dy,
870 -3*fgkSegmentLength/8, beamRot1);
872 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
873 TMath::Tan(halfTheta),
874 fgkLadderBeamRadius/2. - dy,
875 -3*fgkSegmentLength/8, beamRot1);
876 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
878 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
879 TMath::Tan(halfTheta),
880 fgkLadderBeamRadius/2. - dy,
881 -fgkSegmentLength/8, beamRot2);
883 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
884 TMath::Tan(halfTheta),
885 fgkLadderBeamRadius/2. - dy,
886 -fgkSegmentLength/8, beamRot2);
887 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
889 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
890 TMath::Tan(halfTheta),
891 fgkLadderBeamRadius/2. - dy,
892 -3*fgkSegmentLength/8, beamRot3);
894 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
895 TMath::Tan(halfTheta),
896 fgkLadderBeamRadius/2. - dy,
897 -3*fgkSegmentLength/8, beamRot3);
898 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
900 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
901 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
902 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
903 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
905 //--- Beams of the bottom
906 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
907 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
908 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
909 bottomBeam1, carbonFiberLadderStruct);
910 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
911 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
912 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
913 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
914 bottomBeam2, carbonFiberLadderStruct);
915 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
916 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
917 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
918 - fgkLadderLb/3, 0, 180);
919 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
920 bottomBeam3, carbonFiberLadderStruct);
921 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
922 //bottomBeam3Vol->SetLineColor(2);
923 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
924 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
926 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
927 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
928 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
929 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
930 -fgkSegmentLength/2, bottomBeamRot1);
931 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
932 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
933 - dy, fgkSegmentLength/2, bottomBeamRot2);
934 // be careful for beams #3: when "reading" from -z to +z and
935 // from the bottom of the ladder, it should draw a Lambda, and not a V
936 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
937 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
938 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
939 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
940 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
941 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
943 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
944 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
945 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
946 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
947 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
948 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
949 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
950 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
951 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
952 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
953 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
954 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
955 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
956 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
957 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
958 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
959 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
960 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
961 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
964 //********************************************************************
966 //********************************************************************
968 for (Int_t i=0; i<fgkLay3Ndet; i++) {
969 sprintf(cableName, "digitCableLay3A_%i",i);
970 fDigitCableLay3A[i].SetName(cableName);
971 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
972 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
973 fDigitCableLay3A[i].SetNLayers(2);
974 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
976 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
977 sprintf(cableName, "digitCableLay3B_%i",i);
978 fDigitCableLay3B[i].SetName(cableName);
979 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
980 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
981 fDigitCableLay3B[i].SetNLayers(2);
982 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
984 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
986 for (Int_t i=0; i<fgkLay4Ndet; i++) {
987 sprintf(cableName, "digitCableLay4A_%i",i);
988 fDigitCableLay4A[i].SetName(cableName);
989 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
990 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
991 fDigitCableLay4A[i].SetNLayers(2);
992 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
994 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
995 sprintf(cableName, "digitCableLay4B_%i",i);
996 fDigitCableLay4B[i].SetName(cableName);
997 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
998 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
999 fDigitCableLay4B[i].SetNLayers(2);
1000 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1002 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1004 // Well, those digit cables could also include the analog cables
1005 // which have the same width and the same path, at least in the ladder.
1006 // It will gain some computing ressources (less volumes) and some
1007 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1008 // The only thing to do is to change the names and put the correct total
1011 // some transformations and volumes used in several places
1012 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1013 0, -fgkCarlosSuppAngle, 0);
1015 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1016 fgkLittleScrewHeadH/2);
1017 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1018 littleScrewHead, stainless);
1019 fCommonVol[0]->SetLineColor(kGray);
1021 fLadderFoot = CreateLadderFoot();
1023 fCardHV = CreateHVCard(0);
1024 fCardCarlos = CreateCarlosCard(0);
1026 //==================
1027 // link beteen phynox and plastic cooling tubes
1028 //==================
1030 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1031 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1032 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1033 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1034 vwaterRac->SetLineColor(kBlue);
1036 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1037 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1038 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1039 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1040 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1041 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1042 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1043 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1044 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1045 vtube1Rac->SetLineColor(kGray);
1046 vtube2Rac->SetLineColor(kGray);
1047 vtube3Rac->SetLineColor(kGray);
1049 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1050 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1051 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1052 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1053 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1054 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1055 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1056 fRaccordoL->AddNode(vwaterRac, 1,0);
1057 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1058 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1059 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1063 //________________________________________________________________________
1064 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1066 // a debugging function for checking some possible overlaps
1068 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1069 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1070 if (fHybrid) fHybrid->CheckOverlaps(precision);
1074 //________________________________________________________________________
1075 TGeoCombiTrans *AliITSv11GeometrySDD::
1076 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1079 // return the TGeoCombiTrans which make a translation in y and z
1080 // and a rotation in phi in the global coord system
1081 // If planeSym = true, the rotation places the object symetrically
1082 // (with respect to the transverse plane) to its position in the
1083 // case planeSym = false
1086 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1087 TGeoRotation r1("",0.,0.,dphi);
1088 TGeoRotation r2("",90, 180, -90-dphi);
1090 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1091 combiTrans1->SetTranslation(t1);
1092 if (planeSym) combiTrans1->SetRotation(r1);
1093 else combiTrans1->SetRotation(r2);
1098 //________________________________________________________________________
1099 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1103 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1104 const Double_t *vect = ct->GetTranslation();
1105 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1106 ct->SetTranslation(newVect);
1110 //________________________________________________________________________
1111 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1112 // for code developpment and debugging purposes
1114 if (! fSDDsensor3) CreateBasicObjects();
1116 // moth->AddNode(fPinSupport, 1, 0);
1117 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1118 // moth->AddNode(fSDDsensor3, 1, 0);
1119 // moth->AddNode(fSDDsensor4, 1, 0);
1120 // moth->AddNode(fBaseThermalBridge, 1, 0);
1121 // moth->AddNode(fHybrid,100,0);
1122 // moth->AddNode(fLadderFoot,1,0);
1123 //moth->AddNode(fCardLVL,1,0);
1124 //moth->AddNode(fCardLVR,1,0);
1126 TGeoVolume* seg = CreateLadderSegment( 3, 0);
1127 moth->AddNode(seg, 1, 0);
1129 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1130 // moth->AddNode(lay3Ladder, 1, 0);
1132 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1133 // moth->AddNode(lay3Detectors, 1, 0);
1135 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1136 // moth->AddNode(lay3Detectors, 1, 0);
1139 // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1140 // moth->AddNode(endLadder, 1, 0);
1142 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1143 // moth->AddNode(highVCard, 1, 0);
1145 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1146 // moth->AddNode(supportRing, 1, 0);
1148 // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1149 // moth->AddNode(endLadderCards, 1, 0);
1151 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1152 // moth->AddNode(carlosCard, 1, 0);
1157 //==================================
1158 //--- test of flat cable curvature
1159 //==================================
1162 AliITSv11GeomCableFlat cable("test", 3, 0.3);
1163 cable.SetNLayers(1);
1164 cable.SetNLayers(2);
1165 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1166 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1167 cable.SetInitialNode(endLadderCards);
1169 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1178 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1179 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1180 cable.CreateAndInsertBoxCableSegment(1,angle);
1182 Double_t p3[3], p4[3];
1187 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1188 cable.CreateAndInsertCableCylSegment(2,angle);
1193 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1194 cable.CreateAndInsertCableSegment(3,angle);
1199 //________________________________________________________________________
1200 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1202 // Insert the layer 3 in the mother volume. This is a virtual volume
1203 // containing ladders of layer 3 and the supporting rings
1207 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1211 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1214 if (! fSDDsensor3) CreateBasicObjects();
1216 //====================================
1217 // First we create the central barrel
1218 //====================================
1220 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1221 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1222 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1223 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1224 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1225 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1226 virtualLayer3Shape, airSDD);
1228 Double_t dPhi = 360./fgkLay3Nladd;
1229 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1230 // Placing virtual ladder and detectors volumes following
1231 // ladder ordering convention
1234 Int_t iLaddMax = fgkLay3Nladd;
1235 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1236 iLaddMin = fAddOnlyLadder3min;
1237 iLaddMax = fAddOnlyLadder3max+1;
1240 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1242 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1243 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1244 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1246 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1247 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1248 TGeoCombiTrans *ctLadd;
1249 //=============================================================
1251 // Special modification for ladder 2 of layer 3:
1252 // It has been inverted (pi rotation around y axis)
1254 //=============================================================
1256 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1257 0, ladderPhi, kTRUE);
1259 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1260 0, ladderPhi, kFALSE);
1261 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1262 ///////////////////////////////////////////////////
1263 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1264 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1265 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1266 minRadiusDetBox += detectorsThick/2;
1267 TGeoCombiTrans *ctDet;
1269 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1270 0, ladderPhi, kTRUE);
1272 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1273 0, ladderPhi, kFALSE);
1275 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1276 ///////////////////////////////////////////////////
1280 //====================================
1281 // Then the forward rapidity pieces
1282 // (cooling, Carlos, LV, HV ...)
1283 //====================================
1285 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1286 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1287 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1289 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1290 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1291 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1292 fgkForwardLay3Length/2.);
1294 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1295 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1296 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1299 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1300 virtualForward3Shape, airSDD);
1301 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1302 virtualForward3Shape, airSDD);
1303 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1304 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1306 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1307 fgkLay3Length/2+fgkForwardLay3Length/2);
1308 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1309 -fgkLay3Length/2-fgkForwardLay3Length/2);
1311 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1313 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1314 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1315 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1316 minRadiusDetBox += detectorsThick/2;
1318 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1320 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1321 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1322 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1323 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1325 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1326 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1333 virtualLayer3->CheckOverlaps(0.01);
1334 //virtualForward3Pos->CheckOverlaps(0.01);
1335 //virtualForward3Neg->CheckOverlaps(0.01);
1338 virtualLayer3->SetVisibility(kFALSE);
1339 //virtualForward3Pos->SetVisibility(kFALSE);
1340 //virtualForward3Neg->SetVisibility(kFALSE);
1343 moth->AddNode(virtualLayer3, 1, 0);
1344 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1345 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1349 // //________________________________________________________________________
1350 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1352 // // Insert the forward pieces of layer 3 in the mother volume.
1353 // // (cooling, Carlos, LV, HV ...)
1357 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1361 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1363 // if (! fSDDsensor3) CreateBasicObjects();
1365 // Double_t dPhi = 360./fgkLay3Nladd;
1366 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1367 // Int_t iLaddMin = 0;
1368 // Int_t iLaddMax = fgkLay3Nladd;
1369 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1370 // iLaddMin = fAddOnlyLadder3min;
1371 // iLaddMax = fAddOnlyLadder3max+1;
1373 // char rotName[30];
1376 // //=================
1378 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1379 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1380 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1382 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1383 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1384 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1385 // fgkForwardLay3Length/2.);
1387 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1388 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1389 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1392 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1393 // virtualForward3Shape, airSDD);
1394 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1395 // virtualForward3Shape, airSDD);
1396 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1397 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1399 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1400 // fgkLay3Length/2+fgkForwardLay3Length/2);
1401 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1402 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1404 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1406 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1407 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1408 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1409 // minRadiusDetBox += detectorsThick/2;
1411 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1413 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1414 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1415 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1416 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1418 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1419 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1422 // if(GetDebug(1)) {
1423 // virtualForward3Pos->CheckOverlaps(0.01);
1424 // virtualForward3Neg->CheckOverlaps(0.01);
1427 // virtualForward3Pos->SetVisibility(kFALSE);
1428 // virtualForward3Neg->SetVisibility(kFALSE);
1430 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1431 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1436 //________________________________________________________________________
1437 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1439 // Insert the end-ladder of layer 3 in the mother volume.
1440 // (cooling, Carlos, LV, HV ...)
1444 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1448 if (! fSDDsensor3) CreateBasicObjects();
1451 Int_t iLaddMax = fgkLay3Nladd;
1452 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1453 iLaddMin = fAddOnlyLadder3min;
1454 iLaddMax = fAddOnlyLadder3max+1;
1457 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1458 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1461 Double_t dPhi = 360./fgkLay3Nladd;
1462 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1464 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1466 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1468 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1470 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1472 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1473 fgkLay3Length/2, ladderPhi, kTRUE);
1474 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1475 -fgkLay3Length/2, ladderPhi, kFALSE);
1477 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1478 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1482 virtualForward3Pos->CheckOverlaps(0.01);
1483 virtualForward3Neg->CheckOverlaps(0.01);
1486 // 180deg Y rotation to compensate the cancellation of ITSD volume
1487 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1488 TGeoRotation *y180 = new TGeoRotation();
1489 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1490 moth->AddNode(virtualForward3Pos, 1, y180);
1491 moth->AddNode(virtualForward3Neg, 1, y180);
1494 //________________________________________________________________________
1495 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1497 // Insert the layer 4 in the mother volume. This is a virtual volume
1498 // containing ladders of layer 4 and the supporting rings
1502 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1508 if (! fSDDsensor3) CreateBasicObjects();
1510 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1511 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1512 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1513 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1514 virtualLayer4Shape, airSDD);
1516 //====================================
1517 // First we create the central barrel
1518 //====================================
1520 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1521 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1522 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1524 Double_t dPhi = 360./fgkLay4Nladd;
1525 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1527 // placing virtual ladder and detectors volumes following ladder
1528 // ordering convention
1531 Int_t iLaddMax = fgkLay4Nladd;
1532 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1533 iLaddMin = fAddOnlyLadder4min;
1534 iLaddMax = fAddOnlyLadder4max+1;
1536 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1538 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1539 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1540 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1542 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1543 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1544 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1545 0, ladderPhi, kTRUE);
1546 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1547 ///////////////////////////////////////////////////
1548 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1549 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1551 minRadiusDetBox = fgkLay4DetLongRadius;
1552 minRadiusDetBox += detBoxThickness/2;
1553 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1554 0, ladderPhi, kTRUE);
1555 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1556 ///////////////////////////////////////////////////
1560 //====================================
1561 // Then the pieces at forward rapidity
1562 // (cooling, Carlos, LV, HV ...)
1563 //====================================
1565 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1566 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1567 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1569 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1570 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1571 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1572 fgkForwardLay4Length/2.);
1573 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1574 virtualForward4Shape, airSDD);
1575 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1576 virtualForward4Shape, airSDD);
1577 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1578 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1580 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1581 fgkLay4Length/2+fgkForwardLay4Length/2);
1582 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1583 -fgkLay4Length/2-fgkForwardLay4Length/2);
1585 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1587 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1588 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1590 minRadiusDetBox = fgkLay4DetLongRadius;
1591 minRadiusDetBox += detBoxThickness/2;
1593 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1595 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1596 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1597 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1598 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1599 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1600 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1604 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1606 virtualLayer4->SetVisibility(kFALSE);
1607 //virtualForward4Pos->SetVisibility(kFALSE);
1608 //virtualForward4Neg->SetVisibility(kFALSE);
1610 moth->AddNode(virtualLayer4,1,0);
1611 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1612 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1616 // //________________________________________________________________________
1617 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1619 // // Insert the layer 4 in the mother volume. This is a virtual volume
1620 // // containing ladders of layer 4 and the supporting rings
1621 // // (cooling, Carlos, LV, HV ...)
1625 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1629 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1631 // if (! fSDDsensor3) CreateBasicObjects();
1633 // Double_t dPhi = 360./fgkLay4Nladd;
1634 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1636 // // placing virtual ladder and detectors volumes following ladder
1637 // // ordering convention
1638 // char rotName[20];
1639 // Int_t iLaddMin = 0;
1640 // Int_t iLaddMax = fgkLay4Nladd;
1641 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1642 // iLaddMin = fAddOnlyLadder4min;
1643 // iLaddMax = fAddOnlyLadder4max+1;
1646 // //=================
1647 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1648 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1649 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1651 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1652 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1653 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1654 // fgkForwardLay4Length/2.);
1655 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1656 // virtualForward4Shape, airSDD);
1657 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1658 // virtualForward4Shape, airSDD);
1659 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1660 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1662 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1663 // fgkLay4Length/2+fgkForwardLay4Length/2);
1664 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1665 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1667 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1669 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1670 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1671 // if (iLadd%2 != 0)
1672 // minRadiusDetBox = fgkLay4DetLongRadius;
1673 // minRadiusDetBox += detBoxThickness/2;
1675 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1677 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1678 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1679 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1680 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1681 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1682 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1685 // virtualForward4Pos->SetVisibility(kFALSE);
1686 // virtualForward4Neg->SetVisibility(kFALSE);
1688 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1689 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1693 //________________________________________________________________________
1694 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1696 // Insert the end-ladder of layer 4 in the mother volume.
1697 // (cooling, Carlos, LV, HV ...)
1701 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1705 if (! fSDDsensor3) CreateBasicObjects();
1707 // placing virtual ladder and detectors volumes following ladder
1708 // ordering convention
1710 Int_t iLaddMax = fgkLay4Nladd;
1711 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1712 iLaddMin = fAddOnlyLadder4min;
1713 iLaddMax = fAddOnlyLadder4max+1;
1716 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1717 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1720 Double_t dPhi = 360./fgkLay4Nladd;
1721 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1723 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1725 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1728 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1730 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1732 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1733 fgkLay4Length/2, ladderPhi, kTRUE);
1734 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1735 -fgkLay4Length/2, ladderPhi, kFALSE);
1736 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1737 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1740 // 180deg Y rotation to compensate the cancellation of ITSD volume
1741 // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1742 TGeoRotation *y180 = new TGeoRotation();
1743 y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1744 moth->AddNode(virtualForward4Pos, 1, y180);
1745 moth->AddNode(virtualForward4Neg, 1, y180);
1749 //________________________________________________________________________
1750 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1752 // return an assembly volume containing the CF ladder
1755 Int_t nDetectors = fgkLay3Ndet;
1756 Double_t ladderLength = fgkLay3LadderLength;
1757 Double_t underSegDH = fLay3LadderUnderSegDH;
1758 Double_t *sensorZPos = fLay3sensorZPos;
1759 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1760 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1764 nDetectors = fgkLay4Ndet;
1765 ladderLength = fgkLay4LadderLength;
1766 digitCableA = fDigitCableLay4A;
1767 digitCableB = fDigitCableLay4B;
1768 underSegDH = fLay4LadderUnderSegDH;
1769 sensorZPos = fLay4sensorZPos;
1772 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1774 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1775 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1777 // placing virtual ladder segment following detector ordering convention
1778 //=======================================================================
1781 // adding segment this way to create cable points in the correct order ...
1782 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1784 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1785 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1786 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1787 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1788 + fgkSegmentLength/2;
1789 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1790 underSegDH/2,segmentPos);
1792 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1794 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1796 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1797 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1798 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1799 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1800 + fgkSegmentLength/2;
1801 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1802 underSegDH/2,segmentPos);
1804 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1807 // putting virtual volume corresponding to the end of ladder
1808 //=======================================================================
1809 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1810 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1811 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1812 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1813 // Euler rotation : about Z, then new X, then new Z
1814 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1815 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1816 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1817 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1818 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1820 // creating and inserting cable segments
1821 // (check points are placed while creating segments)
1822 //=======================================================================
1824 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1826 digitCableA[iSegment].SetInitialNode(virtualLadder);
1827 digitCableB[iSegment].SetInitialNode(virtualLadder);
1829 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1830 Double_t rotation = 0;
1832 rotation = 90-fgkHybridAngle;
1833 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1835 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1839 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1840 Double_t rotation = 0;
1842 rotation = fgkHybridAngle-90;
1843 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1845 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1850 //=======================================================================
1852 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1853 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1855 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1856 char cableHVname[30];
1857 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1858 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1859 cableHV[iSegment].SetName(cableHVname);
1860 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1861 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1862 cableHV[iSegment].SetNLayers(2);
1863 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1865 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1866 cableHV[iSegment].SetInitialNode(virtualLadder);
1868 Double_t x1[3], x2[3], x3[3],
1869 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1871 x1[0] = -fgkTransitHVtailXpos;
1872 x2[0] = -fgkTransitHVtailXpos;
1873 x3[0] = -fgkTransitHVtailXpos;
1874 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1875 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1876 *fgkLongHVcableSeparation;
1877 // adjust where HV long cable starts in Y
1878 // useful if you want to let some space for alignment
1879 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1880 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1881 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1883 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1884 x2[2] = x1[2]+5*fgkmm;
1885 x3[2] = ladderLength/2-endLength;
1886 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1887 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1888 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1890 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1891 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1892 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1893 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1897 x1[0] = fgkTransitHVtailXpos;
1898 x2[0] = fgkTransitHVtailXpos;
1899 x3[0] = fgkTransitHVtailXpos;
1901 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1902 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1903 *fgkLongHVcableSeparation;
1904 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1905 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1906 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1908 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1909 x2[2] = x1[2]-5*fgkmm;
1910 x3[2] = -ladderLength/2+endLength;
1911 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1912 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1913 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1915 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1916 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1920 //**********************************
1921 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1922 return virtualLadder;
1926 //________________________________________________________________________
1927 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(Double_t dz, Double_t angle,
1928 Double_t xSign, Double_t L, Double_t H, Double_t l) {
1929 // Create one half of the V shape corner of CF ladder
1931 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1932 cfLaddSide->SetVertex( 0, 0, 0);
1933 cfLaddSide->SetVertex( 1, 0, -H);
1934 cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1935 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1936 cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1937 cfLaddSide->SetVertex( 4, 0, 0);
1938 cfLaddSide->SetVertex( 5, 0, -H);
1939 cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1940 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1941 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1946 //________________________________________________________________________
1947 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1949 // return a box containing the front-end hybrid
1952 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1954 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1955 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1956 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1957 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1958 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1959 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1960 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1961 // + upFLTotalThick + ccUpLayerTotThick);
1962 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1964 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1966 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1968 //**************************************************** media :
1969 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1970 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1971 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1972 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1973 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1974 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1975 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1976 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1977 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1978 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1979 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1981 //**************************************************** main volume :
1982 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
1983 (fgkHybridLength)/2);
1984 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
1987 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
1988 fgkHybridThBridgeThick/2,
1991 //**************************************************** Thermal bridge :
1992 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
1994 carbonFiberLadderStruct);
1995 vThermalBridge->SetLineColor(fColorCarbonFiber);
1996 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
1997 +fgkHybridThBridgeThick/2, 0);
1998 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
2000 //**************************************************** Screen layer :
2001 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
2002 fgkHybAlThick/2, fgkHybridLength/2);
2003 //here the upedex and glue layers are both assumed to be polyimide
2004 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
2006 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2008 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2009 (screenTotalThick+lowFLTotalThick)/2);
2011 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2012 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2014 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2015 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2016 +fgkHybAlThick/2, 0);
2018 TGeoTranslation hybHolePos1Tr(roundHoleX,
2019 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2020 -fgkHybridLength/2+fgkHybRndHoleZ);
2021 TGeoTranslation hybHolePos2Tr(roundHoleX,
2022 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2023 fgkHybridLength/2-fgkHybRndHoleZ);
2025 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2026 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2027 hybHolePos1->SetName("hybHolePos1");
2028 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2029 hybHolePos2->SetName("hybHolePos2");
2031 upGlueScreenTr->RegisterYourself();
2032 alScreenTr->RegisterYourself();
2033 hybHolePos1->RegisterYourself();
2034 hybHolePos2->RegisterYourself();
2037 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2038 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2039 "+sRoundHole:hybHolePos2)");
2040 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2041 vScreenAl->SetLineColor(fColorAl);
2042 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2043 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2044 "+sRoundHole:hybHolePos2)");
2045 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2046 sScreenUpGlue,polyhamideSDD);
2047 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2049 hybrid->AddNode(vScreenUpGlue, 1, 0);
2050 hybrid->AddNode(vScreenAl, 1, 0);
2052 //**************************************************** FL low layer :
2053 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2054 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2056 //here the upedex and glue layers are both assumed to be polyimide
2057 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2058 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2060 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2061 fgkHybAlThick/2, sideWidth1/2);
2063 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2064 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2065 -(fgkHybridLength-sideWidth1)/2);
2066 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2067 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2068 -(fgkHybridLength-sideWidth1)/2);
2069 upGlueBarTr1->RegisterYourself();
2070 alBarTr1->RegisterYourself();
2072 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2073 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2074 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2075 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2076 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2077 sLowUpGlueBar1, polyhamideSDD);
2078 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2080 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2081 vLowAlBar1->SetLineColor(fColorAl);
2082 hybrid->AddNode(vLowUpGlueBar1,1,0);
2083 hybrid->AddNode(vLowAlBar1,1,0);
2086 //here the upedex and glue layers are both assumed to be polyimide
2087 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2088 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2090 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2091 fgkHybAlThick/2, sideWidth2/2);
2093 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2094 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2095 (fgkHybridLength-sideWidth2)/2);
2096 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2097 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2098 (fgkHybridLength-sideWidth2)/2);
2099 upGlueBarTr2->RegisterYourself();
2100 alBarTr2->RegisterYourself();
2102 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2103 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2104 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2105 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2106 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2108 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2110 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2111 vLowAlBar2->SetLineColor(fColorAl);
2112 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2113 hybrid->AddNode(vLowAlBar2, 1, 0);
2115 if(GetDebug(3)) { // Remove compiler warning.
2116 sAlScreenLayer->InspectShape();
2117 sUpGlueScreenLayer->InspectShape();
2118 sRoundHole->InspectShape();
2119 sUpGlueBar1->InspectShape();
2120 sUpGlueBar2->InspectShape();
2121 sAlBar1->InspectShape();
2122 sAlBar2->InspectShape();
2125 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2126 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2127 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2129 lowFLpiece.SetNLayers(2);
2130 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2132 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2133 // alSDD at 80% : mostly to take into account strips of piece 3
2135 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2136 lowLayerYmin + lowFLTotalThick/2,
2137 -fgkHybridLength/2 + sideWidth1 };
2138 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2139 Double_t vZ[3] = {0,0,1};
2140 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2141 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2142 lowFLpiece.SetInitialNode(hybrid);
2143 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2144 lowFLpiece.ResetPoints();
2146 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2147 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2149 lowFLpiece.SetWidth(piece2width);
2150 lowFLpiece.SetName("lowFLpiece2");
2151 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2153 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2154 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2155 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2156 lowFLpiece.ResetPoints();
2158 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2159 - fgkHybFLlowHoleAmbDX/2;
2161 lowFLpiece.SetWidth(piece3width);
2162 lowFLpiece.SetName("lowFLpiece3");
2163 x1[0] = fgkHybridWidth/2-piece3width/2;
2165 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2166 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2167 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2169 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2170 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2171 Double_t vX[3] = {1,0,0};
2172 for (Int_t i=0; i<3; i++) {
2174 sprintf(ch, "lowFLpieceA%i", i+4);
2175 lowFLpiece.SetName(ch);
2176 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2178 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2179 x1[0] = -fgkHybridWidth/2 + piece1width;
2180 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2181 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2182 x1[2] = zPiece; x2[2] = zPiece;
2183 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2184 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2185 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2186 lowFLpiece.ResetPoints();
2188 sprintf(ch, "lowFLpieceB%i", i+4);
2189 lowFLpiece.SetName(ch);
2190 x1[0] = fgkHybridWidth/2 - piece3width;
2191 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2192 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2193 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2194 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2197 //**************************************************** chips+CC:
2198 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2199 chip.SetInitialNode(hybrid);
2201 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2202 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2203 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2204 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2206 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2207 // Here the tho CC (low+up) are merged
2208 // In fact, the last layer has a smaller surface of Al -> I put 80%
2210 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2214 for (Int_t i=0; i<4; i++) {
2215 sprintf(ch, "pascalCC%i", i);
2217 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2218 x2[0] = x1[0] + fgkHybPascalDX;
2219 x1[2] = zChips[i] - fgkHybridLength/2;
2221 chip.AddCheckPoint( hybrid, 0, x1, vX );
2222 chip.AddCheckPoint( hybrid, 1, x2, vX );
2223 chip.CreateAndInsertBoxCableSegment(1,-90);
2226 sprintf(ch, "ambraCC%i", i);
2228 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2229 x2[0] = x1[0] + fgkHybAmbraDX;
2230 chip.AddCheckPoint( hybrid, 0, x1, vX );
2231 chip.AddCheckPoint( hybrid, 1, x2, vX );
2232 chip.CreateAndInsertBoxCableSegment(1,-90);
2236 //**************************************************** CC outside chips:
2237 // I don't think there is a second aluminium layer here ...
2238 for (Int_t i = 0; i<4; i++) {
2239 sprintf(ch, "ccLayerA%i", i);
2241 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2242 ccLayer1.SetInitialNode(hybrid);
2243 ccLayer1.SetNLayers(2);
2244 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2245 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2248 x1[0] = -fgkHybridWidth/2;
2249 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2250 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2251 + fgkHybChipThick + ccUpLayerTotThick/2;
2253 x1[2] = zChips[i] - fgkHybridLength/2;
2255 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2256 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2257 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2259 sprintf(ch, "ccLayerB%i", i);
2260 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2261 ccLayer2.SetInitialNode(hybrid);
2262 ccLayer2.SetNLayers(2);
2263 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2264 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2267 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2268 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2269 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2270 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2271 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2272 ccLayer2.ResetPoints();
2273 sprintf(ch, "ccLayerC%i", i);
2274 ccLayer2.SetName(ch);
2275 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2276 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2277 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2278 + ccUpLayerTotThick/2;
2281 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2282 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2283 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2286 //**************************************************** FL UP:
2287 // (last Al layer will be a special triangular shape)
2288 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2289 fgkHybFLUpperWidth/2, flUpThick/2,
2290 fgkHybFLUpperLength/2);
2291 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2292 sFLupPolyhamide, polyhamideSDD);
2293 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2294 TGeoTranslation *trFLupPolyhamide =
2295 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2296 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2298 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2300 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2301 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2302 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2303 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2304 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2305 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2306 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2307 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2308 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2309 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2312 vAluStrip->SetLineColor(fColorAl);
2313 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2314 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2316 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2317 +flUpThick+fgkHybAlThick/2;
2318 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2319 fgkHybridWidth/2,yRotAluStrip,
2320 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2321 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2322 AddTranslationToCombiTrans(aluStripTr2,0,0,
2323 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2324 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2325 AddTranslationToCombiTrans(aluStripTr3,0,0,
2326 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2327 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2328 AddTranslationToCombiTrans(aluStripTr4,0,0,
2329 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2331 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2332 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2333 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2334 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2335 //**************************************************** SMD:
2336 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2337 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2338 fgkHybSMDheight/2,fgkHybSMDendW/2);
2339 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2341 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2342 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2343 fgkHybSMDmiddleW/2);
2344 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2345 hybSMDmiddle,medSMD);
2346 vHybSMDmiddle->SetLineColor(fColorSMD);
2347 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2348 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2349 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2350 hybSMDend,medSMDweld);
2351 vHybSMDend->SetLineColor(fColorSMDweld);
2352 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2353 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2354 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2355 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2356 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2357 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2358 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2359 for (Int_t i=0; i<fgkNHybSMD; i++) {
2360 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2361 -fgkHybridWidth/2+fgkHybSMDposX[i],
2362 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2363 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2364 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2370 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2371 hybrid->SetVisibility(kFALSE);
2375 //________________________________________________________________________
2376 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2378 // Return a TGeoVolume* containing a segment of a ladder.
2381 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2382 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2383 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2385 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2386 Double_t segmentLength = fgkSegmentLength;
2387 Double_t spaceBetweenCables = 500*fgkmicron;
2389 //*****************************************
2390 // Set parameters according to (iLay,iSeg):
2391 //*****************************************
2392 Int_t nDetectors = fgkLay3Ndet;
2393 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2394 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2395 (fgkSegmentLength*fgkLay3Ndet/2. -
2396 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2397 // sensorCenterZPos = z in segment local coord syst.
2399 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2400 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2403 } else if (iLay==4) {
2404 nDetectors = fgkLay4Ndet;
2405 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2406 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2407 (fgkSegmentLength*fgkLay4Ndet/2. -
2408 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2409 digitCableA = fDigitCableLay4A;
2410 digitCableB = fDigitCableLay4B;
2412 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2415 Double_t cableSideSign = -1;
2416 if (iSeg<nDetectors/2) cableSideSign = 1;
2417 Double_t spaceForCables = spaceBetweenCables*
2418 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2420 // gives [0-1-2-2-1-0]*spaceBetweenCables
2421 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2422 Int_t iUpdateCableMin;
2423 Int_t iUpdateCableMax;
2424 if (cableSideSign==-1) {
2425 iUpdateCableMin = nDetectors/2;
2426 iUpdateCableMax = iSeg-1;
2428 iUpdateCableMin = iSeg+1;
2429 iUpdateCableMax = nDetectors/2-1;
2433 cout << "Segment ("<< iLay <<',' << iSeg
2434 << ") : sensor z shift in local segment coord.="
2435 << sensorCenterZPos << endl;
2438 //****************************
2439 // The segment volume
2440 //****************************
2442 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2443 // likely slows down the transport of particles through the geometry
2445 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2447 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2448 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2449 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2452 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2454 virtualSeg->SetVisibility(kFALSE);
2456 //******************************
2457 // Carbon fiber structure :
2458 //******************************
2460 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2461 Int_t volumeIndex = 1;
2462 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2463 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2467 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2468 fLaddSegCommonTr[i]);
2471 //**********************************
2472 // Pine support of the sensors :
2473 //**********************************
2474 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2475 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2477 // The use of the following constructor type allow to use rotPS1 and rotPS2
2478 // (and not copy them) therefore we gain some memory
2479 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2480 - fgkLadderHeight/2.-tDY
2481 + fgkPinSuppHeight/2.,
2482 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2484 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2485 - fgkLadderHeight/2.-tDY
2486 + fgkPinSuppHeight/2.,
2487 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2488 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2490 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2491 - fgkLadderHeight/2.-tDY
2492 + fgkPinSuppHeight/2.,
2493 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2494 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2496 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2497 - fgkLadderHeight/2.-tDY
2498 + fgkPinSuppHeight/2.,
2499 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2500 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2502 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2503 - fgkLadderHeight/2. - tDY
2504 + fgkPinSuppHeight/2.,
2505 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2507 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2508 - fgkLadderHeight/2. - tDY
2509 + fgkPinSuppHeight/2.,
2510 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2511 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2513 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2514 - fgkLadderHeight/2. - tDY
2515 + fgkPinSuppHeight/2.,
2516 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2517 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2519 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2520 - fgkLadderHeight/2. - tDY
2521 + fgkPinSuppHeight/2.,
2522 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2523 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2525 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2526 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2527 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2528 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2529 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2530 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2531 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2532 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2534 TGeoMedium *pinMed = GetMedium("SDDKAPTON (POLYCH2)$"); // medium ???
2535 Double_t fgkPinHeight = 4.5*fgkmm;
2536 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2538 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2540 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2541 - fgkLadderHeight/2.-tDY
2543 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2544 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2545 virtualSeg->AddNode(pineV, 1, transPS2b);
2547 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2548 - fgkLadderHeight/2. - tDY
2550 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2551 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2552 virtualSeg->AddNode(pineV, 2, transPS6b);
2555 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2556 - fgkLadderHeight/2.-tDY
2558 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2559 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2560 virtualSeg->AddNode(pineV, 3, transPS4b);
2562 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2563 - fgkLadderHeight/2. - tDY
2565 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2566 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2567 virtualSeg->AddNode(pineV, 4, transPS8b);
2570 //******************************
2571 // Cooling pipe supports :
2572 //******************************
2573 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2574 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2575 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2576 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2578 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2579 (triangleHeight+triangleCPaxeDist/
2580 TMath::Sin(halfTheta)-coolPipeSuppH);
2581 if (fAddCoolingSyst) {
2582 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2583 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2584 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2585 -fgkLadderHeight/2. - tDY
2586 +coolPipeSuppH+fgkLadderBeamRadius,
2587 -segmentLength/2., rotCPS1);
2589 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2590 -fgkLadderHeight/2. - tDY
2591 +coolPipeSuppH+fgkLadderBeamRadius,
2592 -segmentLength/2., rotCPS1);
2593 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2595 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2596 -fgkLadderHeight/2.- tDY
2597 +coolPipeSuppH+fgkLadderBeamRadius,
2598 segmentLength/2., rotCPS2);
2600 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2601 -fgkLadderHeight/2.- tDY
2602 +coolPipeSuppH+fgkLadderBeamRadius,
2603 segmentLength/2., rotCPS2);
2604 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2606 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2607 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2608 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2609 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2612 //************************
2614 //************************
2615 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2616 -fgkLadderHeight/2. - tDY +
2617 fgkLadderBeamRadius+coolPipeSuppH, 0);
2618 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2619 -fgkLadderHeight/2.- tDY +
2620 fgkLadderBeamRadius+coolPipeSuppH, 0);
2622 if (fAddCoolingSyst) {
2623 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2624 fgkCoolPipeOuterDiam/2,
2626 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2629 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2630 coolingPipeShape, phynoxSDD );
2631 coolingPipe->SetLineColor(fColorPhynox);
2632 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2636 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2637 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2639 virtualSeg->AddNode(cooler, 1, pipeTr1);
2640 virtualSeg->AddNode(cooler, 2, pipeTr2);
2644 //**********************************
2645 // Bases of hybrid thermal bridges
2646 //**********************************
2647 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2648 // approx !!! not clear on 0752/14-A
2649 if (fAddCoolingSyst) {
2650 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2651 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2652 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2653 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2655 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2656 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2659 //*************************
2661 //*************************
2662 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2663 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2665 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2666 - shiftHyb*SinD(fgkHybridAngle) );
2667 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2668 + shiftHyb*CosD(fgkHybridAngle) );
2670 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2671 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2672 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2673 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2674 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2675 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2677 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2678 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2685 // Starting from this segment
2686 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2687 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2688 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2689 - digitCableA->GetWidth()/2;
2690 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2691 - digitCableA->GetThickness()/2;
2693 Double_t digitCableX = ( coolPipeSuppL
2694 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2695 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2696 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2697 + fgkLadderBeamRadius+coolPipeSuppH
2698 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2699 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2702 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2703 digitCableY, cableSideSign*hybDz };
2704 Double_t digitCableCenterA1[3] = {
2705 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2706 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2707 cableSideSign*segmentLength/2 };
2709 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2710 digitCableY,cableSideSign*hybDz};
2711 Double_t digitCableCenterB1[3]={
2712 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2713 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2714 cableSideSign*segmentLength/2 };
2716 Double_t vZ[3] = {0,0,1};
2717 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2718 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2719 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2720 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2722 // Updating the other cables
2723 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2725 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2727 digitCableA[iCable].GetPoint( 1, coord);
2728 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2729 digitCableB[iCable].GetPoint( 1, coord);
2730 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2734 //**********************************
2735 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2740 //________________________________________________________________________
2741 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2743 // Create a pine support and its pine
2744 // axis of rotation is the cone axis, center in its middle
2746 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?
2748 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2749 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2750 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2751 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2752 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2753 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2754 fgkPinSuppHeight/2.+0.00001);
2755 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2757 if(GetDebug(3)){// Remove compiler warning.
2758 cone->InspectShape();
2759 tong->InspectShape();
2760 hole->InspectShape();
2763 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2764 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2765 tongTrans->RegisterYourself();
2766 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2767 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2768 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2770 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2772 pinSupport->SetLineColor(fColorRyton);
2778 //________________________________________________________________________
2779 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2781 // Create half of the cooling pipe support (ALR-0752/3)
2784 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2786 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2787 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2788 side1->SetVertex( 1, fgkCoolPipeSuppMaxLength/2.-diffX,
2789 -fgkCoolPipeSuppWidthExt/2.);
2790 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2791 fgkCoolPipeSuppWidthExt/2.);
2792 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2793 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2794 side1->SetVertex( 5, fgkCoolPipeSuppMaxLength/2.,
2795 -fgkCoolPipeSuppWidthExt/2.);
2796 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2797 fgkCoolPipeSuppWidthExt/2.);
2798 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2799 side1->SetName("ITSsddCPSside1");
2801 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2802 - fgkCoolPipeSuppAxeDist
2803 + fgkCoolPipeSuppWidthExt/2., 0);
2804 side1Tr->RegisterYourself();
2805 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2806 - fgkCoolPipeSuppAxeDist
2807 + fgkCoolPipeSuppWidthExt*3/2.
2808 + fgkCoolPipeSuppWidthIn,0);
2809 side2Tr->RegisterYourself();
2811 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2812 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2813 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2814 TGeoTranslation *middleTr =
2815 new TGeoTranslation("ITSsddCPStr3",
2816 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2817 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2818 +fgkCoolPipeSuppWidthIn/2., 0);
2819 middleTr->RegisterYourself();
2821 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2822 fgkCoolPipeSuppTongW/4.,
2823 (fgkCoolPipeSuppFulWidth
2824 - 2*fgkCoolPipeSuppWidthExt
2825 - fgkCoolPipeSuppWidthIn)/2,
2826 fgkCoolPipeSuppHeight/2.);
2828 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2829 fgkCoolPipeSuppTongW/4.,
2830 - fgkCoolPipeSuppAxeDist
2831 + fgkCoolPipeSuppFulWidth
2832 - axeBox->GetDY(), 0);
2833 axeBoxTr->RegisterYourself();
2835 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2836 fgkCoolPipeSuppTongW/4.);
2838 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2839 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2840 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2841 axeTrans->RegisterYourself();
2842 //delete axeRot; // make the code crash, no idea of why !!!
2845 middle->InspectShape();
2846 axe->InspectShape();
2849 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2851 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2852 "ITSsddCoolPipeSuppShapeL",
2853 "ITSsddCPSmiddle:ITSsddCPStr3"
2854 "+ITSsddCPSside1:ITSsddCPStr1"
2855 "+ITSsddCPSside1:ITSsddCPStr2"
2856 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2857 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2858 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2859 coolPipeSuppShape, rytonSDD);
2861 coolPipeSupp->SetLineColor(fColorRyton);
2863 return coolPipeSupp;
2867 //________________________________________________________________________
2868 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2870 //Create half of the cooling pipe support (ALR-0752/3)
2873 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2875 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2876 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2877 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2878 -fgkCoolPipeSuppWidthExt/2.);
2879 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2880 fgkCoolPipeSuppWidthExt/2.);
2881 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2882 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2883 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2884 -fgkCoolPipeSuppWidthExt/2.);
2885 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2886 fgkCoolPipeSuppWidthExt/2.);
2887 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2888 side1->SetName("ITSsddCPSside1R");
2890 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2891 - fgkCoolPipeSuppAxeDist
2892 + fgkCoolPipeSuppWidthExt/2., 0);
2893 side1Tr->RegisterYourself();
2894 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2895 - fgkCoolPipeSuppAxeDist
2896 + fgkCoolPipeSuppWidthExt*3/2.
2897 + fgkCoolPipeSuppWidthIn, 0);
2898 side2Tr->RegisterYourself();
2900 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2901 (fgkCoolPipeSuppMaxLength/2.
2902 - fgkCoolPipeSuppSlitL)/2.,
2903 fgkCoolPipeSuppWidthIn/2.,
2904 fgkCoolPipeSuppHeight/2.);
2905 TGeoTranslation *middleTr =
2906 new TGeoTranslation("ITSsddCPStr3R",
2907 -( fgkCoolPipeSuppMaxLength/2.
2908 -fgkCoolPipeSuppSlitL)/2.,
2909 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2910 + fgkCoolPipeSuppWidthIn/2.,0);
2911 middleTr->RegisterYourself();
2913 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2914 fgkCoolPipeSuppTongW/4.,
2915 (fgkCoolPipeSuppFulWidth
2916 - 2*fgkCoolPipeSuppWidthExt
2917 - fgkCoolPipeSuppWidthIn)/2,
2918 fgkCoolPipeSuppHeight/2.);
2920 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2921 - fgkCoolPipeSuppTongW/4.,
2922 - fgkCoolPipeSuppAxeDist
2923 + fgkCoolPipeSuppFulWidth
2924 - axeBox->GetDY(),0);
2925 axeBoxTr->RegisterYourself();
2927 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2928 fgkCoolPipeSuppTongW/4.);
2930 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2931 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2932 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2933 axeTrans->RegisterYourself();
2937 middle->InspectShape();
2938 axe->InspectShape();
2941 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2942 "ITSsddCoolPipeSuppShapeR",
2943 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2944 "+ITSsddCPSside1R:ITSsddCPStr1R"
2945 "+ITSsddCPSside1R:ITSsddCPStr2R"
2946 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2947 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2949 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2950 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2951 coolPipeSuppShape, rytonSDD);
2952 coolPipeSupp->SetLineColor(fColorRyton);
2954 return coolPipeSupp;
2957 //________________________________________________________________________
2958 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2960 // based on ALR 0752/8
2963 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2965 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2966 - (fgkRadiusAminBTB+fgkBTBthick);
2967 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2968 fgkBTBthick/2., fgkBTBlength/2.);
2969 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2970 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2971 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2972 base1Tr->RegisterYourself();
2974 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2976 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2977 fgkBTBthick/2., fgkBTBlength/2.);
2978 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2979 fgkBTBaxisAtoBottom - base2width/2.,
2980 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2981 base2Tr->RegisterYourself();
2983 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
2984 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
2985 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
2986 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
2987 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
2988 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
2989 sideTr1->RegisterYourself();
2990 sideTr2->RegisterYourself();
2992 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
2993 fgkBTBthick/2., fgkBTBHoleLength/2.);
2994 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
2995 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2996 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2997 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
2998 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
2999 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3000 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3001 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
3002 holeTr1->RegisterYourself();
3003 holeTr2->RegisterYourself();
3005 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
3006 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3007 fgkRadiusAminBTB, radiusAmaxBTB,
3008 fgkBTBlength/2., 0., 180.);
3009 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3010 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3011 fgkBTBlength/2., 270., 360.);
3012 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3013 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3015 roundTr1->RegisterYourself();
3017 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3018 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3019 fgkBTBlength/2., 180., 270.);
3020 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3021 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3023 roundTr2->RegisterYourself();
3025 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3026 "ITSsddBaseThermalBridgeShape",
3027 "ITSsddBTBbase1:ITSsddBTBtr1"
3028 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3029 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3030 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3031 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3032 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3033 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3034 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3035 "+ ITSsddBTBmainAxis");
3037 if(GetDebug(3)){// Remove compiler warning.
3038 base1->InspectShape();
3039 base2->InspectShape();
3040 side->InspectShape();
3041 hole->InspectShape();
3042 mainAxis->InspectShape();
3043 round1->InspectShape();
3044 round2->InspectShape();
3047 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3048 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3050 carbonFiberLadderStruct);
3052 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3053 return vBaseThermalBridge;
3057 //________________________________________________________________________
3058 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3060 // Return an assembly containing a end of a CF ladder.
3063 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3064 TGeoMedium *stesalite = GetMedium("G10FR4$");
3065 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3066 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3068 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3069 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3070 Double_t underSegDH = fLay3LadderUnderSegDH;
3071 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3072 // footDZ is also where to place the ruby's center in local Z
3073 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3076 } else if (iLay==4) {
3077 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3078 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3079 underSegDH = fLay4LadderUnderSegDH;
3080 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3081 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3083 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3087 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3088 + underSegDH/2); //space under ladder segment
3089 // here tDY is not the same as for the segment because the end ladder
3090 // does not have a space under it, inside the general ladder volume.
3091 Double_t segmentLength = fgkSegmentLength;
3092 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3094 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3096 //**********************************
3097 // coding real matter :
3098 //**********************************
3099 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3100 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3101 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3102 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3104 //--- The 3 V shape corners of the Carbon Fiber Ladder
3106 TGeoArb8 *cfLaddTop1 = CreateLadderSide(topCornerLength/2., halfTheta, -1,
3107 fgkLadderLa, fgkLadderHa, fgkLadderl);
3108 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
3109 cfLaddTop1,carbonFiberLadderStruct);
3110 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3111 TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
3112 fgkLadderLa, fgkLadderHa, fgkLadderl);
3113 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3114 cfLaddTop2,carbonFiberLadderStruct);
3115 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3116 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3117 -(length-topCornerLength)/2.);
3118 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3119 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3122 TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
3123 fgkLadderLb, fgkLadderHb, fgkLadderl);
3124 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3125 cfLaddSide1,carbonFiberLadderStruct);
3126 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3127 TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
3128 fgkLadderLb, fgkLadderHb, fgkLadderl);
3129 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3130 cfLaddSide2,carbonFiberLadderStruct);
3131 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3132 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3133 TMath::Tan(beta) - fgkLadderBeamRadius );
3135 // because center of the triangle doesn't correspond to virtual vol. center
3136 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3137 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3138 alpha*TMath::RadToDeg());
3139 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3140 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3141 -alpha*TMath::RadToDeg());
3142 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3143 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3144 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3145 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3146 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3149 // Beams on the sides
3150 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3151 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3153 //Euler rotation : about Z, then new X, then new Z
3154 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3155 -beamPhiPrime*TMath::RadToDeg(), -90);
3156 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3157 beamPhiPrime*TMath::RadToDeg(), -90);
3158 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3159 beamPhiPrime*TMath::RadToDeg(), -90);
3160 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3161 -beamPhiPrime*TMath::RadToDeg(), -90);
3162 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3163 TMath::Tan(halfTheta),
3164 fgkLadderBeamRadius/2. + tDY,
3165 -length/2 + segmentLength/8, beamRot1);
3166 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3167 TMath::Tan(halfTheta),
3168 fgkLadderBeamRadius/2.+tDY,
3169 -length/2 + 3*segmentLength/8, beamRot2);
3170 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3171 TMath::Tan(halfTheta),
3172 fgkLadderBeamRadius/2.+tDY,
3173 -length/2 + segmentLength/8, beamRot3);
3174 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3175 TMath::Tan(halfTheta),
3176 fgkLadderBeamRadius/2. + tDY,
3177 -length/2+3*segmentLength/8, beamRot4);
3179 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3180 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3181 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3182 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3184 //--- Beams of the bottom
3185 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3187 /* Not there actually
3188 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3189 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3190 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3191 bottomBeam1, carbonFiberLadderStruct);
3192 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3194 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3195 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3196 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3197 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3199 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3200 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3201 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3202 bottomBeam2, carbonFiberLadderStruct);
3203 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3204 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3205 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3206 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3208 //**********************************
3209 //the cooling pipe supports
3210 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3211 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3213 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3214 (triangleHeight+triangleCPaxeDist/
3215 TMath::Sin(halfTheta)-coolPipeSuppH);
3217 if (fAddCoolingSyst) {
3218 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3219 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3220 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3221 -fgkLadderHeight/2.+ tDY +
3222 coolPipeSuppH+fgkLadderBeamRadius,
3223 -length/2., rotCPS1);
3224 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3225 -fgkLadderHeight/2.+ tDY +
3226 coolPipeSuppH+fgkLadderBeamRadius,
3227 -length/2., rotCPS2);
3229 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3230 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3233 //**********************************
3234 //--- The stesalite foot of the ladder
3236 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3237 - fgkLadFootY/2+fgkLadFingerPrintY;
3239 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3240 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3242 //=====================================
3245 if (fAddCoolingSyst) {
3247 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3248 -fgkLadderHeight/2.+ tDY +
3249 coolPipeSuppH + fgkLadderBeamRadius,
3250 -length/2.+coolPipeEndLen/2.);
3251 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3252 -fgkLadderHeight/2. + tDY +
3253 fgkLadderBeamRadius + coolPipeSuppH,
3254 -length/2.+coolPipeEndLen/2.);
3256 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3257 fgkCoolPipeOuterDiam/2,
3259 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3262 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3263 coolingPipeShape, phynoxSDD );
3264 coolingPipe->SetLineColor(fColorPhynox);
3265 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3268 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3269 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3271 virtualEnd->AddNode(cooler, 1, pipeTr1);
3272 virtualEnd->AddNode(cooler, 2, pipeTr2);
3276 //=====================================
3277 //--- HV cable guide
3280 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3281 fgkHVguideY1/2,fgkHVguideZ1/2);
3282 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3284 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3285 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3286 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3287 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3289 //=====================================
3291 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3292 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3293 -fgkLadderHeight/2.+ tDY +
3294 coolPipeSuppH+fgkLadderBeamRadius,
3295 -length/2.+coolPipeEndLen+raccordFullLen/2);
3296 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3297 -fgkLadderHeight/2.+ tDY +
3298 coolPipeSuppH+fgkLadderBeamRadius,
3299 -length/2.+coolPipeEndLen+raccordFullLen/2);
3301 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3302 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3304 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3309 //________________________________________________________________________
3310 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3312 //--- The stesalite foot of the ladder
3314 // The 2 screw holes on the left part
3315 // the small holes at each corner of the ruby cage (diam 2mm)
3316 // the really small level difference of 0.3mm on the bottom
3319 TGeoMedium *stesalite = GetMedium("G10FR4$");
3321 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3323 Double_t epsilon = 2e-10;
3324 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3326 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3327 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3328 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3329 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3331 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3332 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3333 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3336 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3337 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3339 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3340 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3341 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3343 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3344 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3345 rubyScrewHoleLen/2);
3347 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3348 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3349 fgkLadFootX/2-rubyScrewHoleLen/2,
3350 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3352 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3353 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3356 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3357 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3358 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3360 ladFootBox1Tr->RegisterYourself();
3361 ladFingerPrintTr->RegisterYourself();
3362 rubyCageHoleTr->RegisterYourself();
3363 rubyScrewHoleTr->RegisterYourself();
3364 rubyHoleTr->RegisterYourself();
3366 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3367 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3368 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3369 "+rubyHole:rubyHoleTr)");
3370 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3371 footRightPart,stesalite);
3372 vFootRightPart->SetLineColor(fColorStesalite);
3374 virtualFoot->AddNode(vFootRightPart, 1, 0);
3377 //--- This was the right part of the foot, now let's do the middle
3378 //--- and the right parts
3380 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3381 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3383 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3384 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3385 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3387 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3388 vFootMiddle->SetLineColor(fColorStesalite);
3389 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3392 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3393 (fgkLadFootY-fgkLadFingerPrintY)/2,
3395 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3396 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3397 -fgkLadFingerPrintY/2, 0);
3398 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3400 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3401 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3404 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3407 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3408 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3410 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3411 vFootLeft->SetLineColor(fColorStesalite);
3412 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3414 if(GetDebug(3)){ // Remove compiler warning.
3415 ladFingerPrint->InspectShape();
3416 ladFootBox1->InspectShape();
3417 rubyCageHole->InspectShape();
3418 rubyScrewHole->InspectShape();
3419 rubyHole->InspectShape();
3425 //________________________________________________________________________
3426 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3428 // return an assembly containing the CARLOS end-ladder board
3429 // and the heat bridge
3433 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3434 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3435 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3436 TGeoMedium *copper = GetMedium("COPPER$");
3437 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3438 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3440 //=========================================
3441 // cooling support of the Carlos card (HeatBridge):
3442 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3444 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3446 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3448 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3449 supCarlosBoard1, alCu12SDD);
3450 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3451 supCarlosBoard2, alCu12SDD);
3452 vSupCarlosBoard1->SetLineColor(4);
3453 vSupCarlosBoard2->SetLineColor(4);
3456 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3457 // shift of the main planes in the direction of their width
3458 // the center is fixed at the center of the 2 small fixing arms on each sides.
3461 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3462 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3463 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3464 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3466 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3467 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3470 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3474 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3475 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3477 //=========================================
3478 // fixing arm of the cooling support :
3479 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3481 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3482 supCarlosBoard3, alCu12SDD);
3483 vSupCarlosBoard3->SetLineColor(4);
3486 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3488 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3489 littleScrew, stainless);
3490 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3491 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3492 fgkLittleScrewHeadR-0.07, rotScrew);
3493 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3494 fgkLittleScrewHeadR+0.07, rotScrew);
3495 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3496 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3498 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3499 0, fgkCarlosSuppAngle, 0);
3500 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3501 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3502 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3503 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3504 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3505 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3508 //=========================================
3509 // screws fixing the board on the U tube
3510 Double_t aaa = fgkCarlosSuppY3; // ???
3511 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3512 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3513 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3514 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3515 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3516 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3518 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3520 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3521 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3522 screw1y,screw1z, CarlosSuppRot);
3524 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3525 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3526 screw1z,screw1y, CarlosSuppRot);
3528 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3529 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3530 screw1y,screw1z, CarlosSuppRot);
3532 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3533 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3534 screw1z,screw1y, CarlosSuppRot);
3536 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3537 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3538 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3539 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3541 //=========================================
3543 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3544 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3545 card1.SetNLayers(2);
3546 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3547 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3548 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3549 p1[0] = -fgkCarlosCardX1/2;
3550 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3551 p1[2] = fgkCarlosCardShift;
3552 p2[0] = fgkCarlosCardX1/2;
3553 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3554 p2[2] = fgkCarlosCardShift;
3555 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3556 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3557 card1.CreateAndInsertBoxCableSegment(1,90);
3559 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3560 card2.SetNLayers(2);
3561 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3562 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3563 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3565 p1[0] = -fgkCarlosCardX1/2;
3566 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3567 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3569 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3570 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3571 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3572 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3573 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3574 card2.CreateAndInsertBoxCableSegment(1,90);
3576 //=========================================
3577 // some chips on the board
3579 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3581 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3582 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3583 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3585 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3586 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3587 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3589 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3590 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3591 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3592 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3593 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3594 u1.CreateAndInsertBoxCableSegment(1,90);
3597 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3599 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3600 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3601 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3603 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3604 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3605 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3607 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3608 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3609 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3610 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3611 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3612 u2.CreateAndInsertBoxCableSegment(1,90);
3615 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3617 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3618 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3619 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3621 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3622 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3624 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3626 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3628 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3629 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3630 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3631 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3633 //--- U4 is like U3 (?)
3634 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3635 u4Trans->RotateX(90);
3636 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3637 fgkCarlosCardShift + fgkCarlosU4posZ);
3638 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3641 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3643 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3644 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3645 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3647 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3648 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3649 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3651 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3652 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3653 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3654 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3655 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3656 u17.CreateAndInsertBoxCableSegment(1,90);
3659 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3661 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3662 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3663 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3665 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3666 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3667 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3669 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3670 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3671 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3672 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3673 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3674 u35.CreateAndInsertBoxCableSegment(1,90);
3677 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3679 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3680 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3681 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3683 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3684 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3685 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3687 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3688 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3689 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3690 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3691 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3692 u36.CreateAndInsertBoxCableSegment(1,90);
3695 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3697 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3698 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3699 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3701 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3702 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3703 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3705 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3706 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3707 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3708 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3709 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3710 qz1.CreateAndInsertBoxCableSegment(1,90);
3712 return assemblySupCarlos;
3715 //________________________________________________________________________
3716 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3718 // Creates the assemblies containing the LV cards (left and right)
3721 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3722 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3723 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3724 TGeoMedium *copper = GetMedium("COPPER$");
3725 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3726 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3728 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3729 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3731 // we are going to use flat cable class to create multilayer box,
3732 // then we can use the pointers to created volumes to place them elsewhere
3733 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3735 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3736 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3737 cardLV.SetNLayers(2);
3738 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3739 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3740 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3742 p1[1] = fgkLVcardY/2;
3745 p2[1] = fgkLVcardY/2;
3747 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3748 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3749 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3750 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3751 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3752 fCardLVR->AddNode(boxVol, 1, trCard);
3754 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3755 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3756 chipO.SetNLayers(2);
3757 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3758 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3759 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3760 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3761 p1[1] = fgkLVChip0PosY;
3762 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3764 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3765 p2[1] = fgkLVChip0PosY;
3766 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3767 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3768 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3769 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3770 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3772 carLVfullThick/2+chip0fullThick/2, rotAdd);
3773 fCardLVR->AddNode(boxVol, 1, trCard);
3775 // put also this chip on the other side of the card
3776 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3778 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3779 fCardLVL->AddNode(boxVol, 2, trCard);
3780 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3782 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3783 fCardLVR->AddNode(boxVol, 2, trCard);
3785 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3786 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3787 chip1.SetNLayers(2);
3788 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3789 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3790 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3791 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3792 p1[1] = fgkLVChip1PosY;
3793 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3795 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3796 p2[1] = fgkLVChip1PosY;
3797 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3798 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3799 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3800 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3801 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3803 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3804 fCardLVR->AddNode(boxVol, 1, trCard);
3806 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3807 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3808 chip2.SetNLayers(2);
3809 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3810 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3811 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3812 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3813 p1[1] = fgkLVChip2PosY;
3814 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3815 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3816 p2[1] = fgkLVChip2PosY;
3817 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3818 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3819 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3820 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3821 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3823 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3824 fCardLVR->AddNode(boxVol, 1, trCard);
3826 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3827 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3828 chip3.SetNLayers(2);
3829 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3830 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3831 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3832 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3833 p1[1] = fgkLVChip3PosY;
3834 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3835 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3836 p2[1] = fgkLVChip3PosY;
3837 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3838 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3839 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3840 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3841 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3843 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3844 fCardLVR->AddNode(boxVol, 1, trCard);
3846 // the Al pieces for heat exchange :
3847 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3848 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3850 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3851 (fgkLVcoolX1/2+fgkLVcoolX2),
3852 fgkLVcoolPosY+fgkLVcoolY1/2,
3853 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3854 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3855 (fgkLVcoolX1/2+fgkLVcoolX2),
3856 fgkLVcoolPosY+fgkLVcoolY1/2,
3857 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3859 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3861 vAlLVcooling1->SetLineColor(2);
3864 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3865 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3866 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3868 fgkLVcoolPosY+fgkLVcoolY1/2,
3869 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3870 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3872 fgkLVcoolPosY+fgkLVcoolY1/2,
3873 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3875 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3877 vAlLVcooling2->SetLineColor(2);
3880 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3882 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3883 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3884 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3886 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3888 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3889 vAlLVcooling3->SetLineColor(2);
3891 //=== screw fixing th LV card to the U cooling tube :
3892 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3894 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3895 littleScrew, stainless);
3896 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3898 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3900 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3902 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3903 0, fgkLittleLVScrewHeadR,
3904 fgkLittleScrewHeadH/2);
3905 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3906 littleScrewHead, stainless);
3907 vLittleScrewHead->SetLineColor(kGray);
3908 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3909 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3910 fgkShiftLittleScrewLV,
3912 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3914 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3915 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3916 fgkShiftLittleScrewLV,
3918 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3920 // adding the cooling pieces to the left card
3921 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3922 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3923 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3924 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3925 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3927 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3928 -(fgkLVcoolX1/2+fgkLVcoolX2),
3929 fgkLVcoolPosY+fgkLVcoolY1/2,
3930 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3931 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3932 -(fgkLVcoolX1/2+fgkLVcoolX2),
3933 fgkLVcoolPosY+fgkLVcoolY1/2,
3934 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3935 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3937 fgkLVcoolPosY+fgkLVcoolY1/2,
3938 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3939 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3941 fgkLVcoolPosY+fgkLVcoolY1/2,
3942 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3944 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3946 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3948 // and to the right card
3949 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3950 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3951 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3952 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3953 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3958 //________________________________________________________________________
3959 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3961 // return an assembly containing the HV card
3965 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3966 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3967 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3968 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3969 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3970 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3972 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3974 //====================================
3975 //--- the card itself
3976 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
3977 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
3978 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
3979 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
3981 highVCard->AddNode(vCeramicCard, 1, 0);
3984 //====================================
3988 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
3989 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
3990 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
3993 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
3994 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
3995 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
3997 vCapa1End->SetLineColor(18);// grey silver
3998 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
3999 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4000 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
4001 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4003 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
4004 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
4005 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4007 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
4008 capa1->AddNode(vCapa1Middle, 1,0);
4009 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4010 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4012 highVCard->AddNode(capa1, 1, capa1PosTr);
4015 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4016 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4017 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4020 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4021 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4022 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4024 vCapa2End->SetLineColor(18);// grey silver
4025 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4026 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4027 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4028 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4030 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4031 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4032 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4034 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4035 capa2->AddNode(vCapa2Middle, 1,0);
4036 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4037 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4039 highVCard->AddNode(capa2, 1, capa2PosTr);
4042 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4043 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4044 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4047 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4048 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4049 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4051 vCapa3End->SetLineColor(18);// grey silver
4053 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4054 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4055 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4056 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4058 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4059 capa3->AddNode(vCapa3Middle, 1,0);
4060 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4061 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4063 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4064 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4065 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4067 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4068 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4069 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4071 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4072 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4073 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4075 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4076 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4077 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4079 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4080 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4081 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4083 highVCard->AddNode(capa3, 1, capa3PosTr1);
4084 highVCard->AddNode(capa3, 2, capa3PosTr2);
4085 highVCard->AddNode(capa3, 3, capa3PosTr3);
4086 highVCard->AddNode(capa3, 4, capa3PosTr4);
4087 highVCard->AddNode(capa3, 5, capa3PosTr5);
4089 //====================================
4090 //--- connexions to LV card
4092 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4093 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4094 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4095 Double_t fgkConnexLVHVx = 3*fgkmm;
4096 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4097 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4099 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4100 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4101 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4102 fgkConnexLVHVdiam1/2,
4103 fgkConnexLVHVdiam2/2,
4104 fgkConnexLVHVlen/2);
4105 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4106 connexLVHVmetal, stainless);
4107 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4108 connexLVHVplastic, plastic);
4109 vConnexLVHVmetal->SetLineColor(10);// white
4110 vConnexLVHVplast->SetLineColor(12); // dark grey
4112 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4113 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4114 connexion->AddNode(vConnexLVHVplast, 1, 0);
4116 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4117 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4118 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4119 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4121 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4122 fgkConnexLVHVy1+fgkConnexLVHVdy,
4123 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4124 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4125 fgkConnexLVHVy1+fgkConnexLVHVdy,
4126 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4128 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4129 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4130 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4131 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4132 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4133 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4135 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4136 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4137 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4138 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4139 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4140 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4142 highVCard->AddNode(connexion, 1, trConnexion1);
4143 highVCard->AddNode(connexion, 2, trConnexion2);
4144 highVCard->AddNode(connexion, 3, trConnexion3);
4145 highVCard->AddNode(connexion, 4, trConnexion4);
4146 highVCard->AddNode(connexion, 5, trConnexion5);
4147 highVCard->AddNode(connexion, 6, trConnexion6);
4148 highVCard->AddNode(connexion, 7, trConnexion7);
4149 highVCard->AddNode(connexion, 8, trConnexion8);
4151 //====================================
4152 //--- cooling pieces
4154 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4155 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4158 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4159 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4161 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4162 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4164 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4166 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4168 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4170 // This last volume contains the screw used for fixing
4171 // the card to the cooling tube ...
4172 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4174 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4175 littleScrewHV, stainless);
4177 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4178 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4180 vCardHVcool1->SetLineColor(2); //red
4181 vCardHVcool2->SetLineColor(2); //red
4182 vCardHVcool3->SetLineColor(2); //red
4184 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4185 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4186 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4187 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4188 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4189 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4190 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4191 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4193 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4194 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4196 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4197 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4198 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4199 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4201 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4202 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4203 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4204 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4206 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4207 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4209 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4210 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4211 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4212 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4214 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4215 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4216 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4217 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4219 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4220 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4222 //====================================
4224 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4225 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4226 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4227 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4229 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4230 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4231 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4232 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4235 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4236 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4242 //________________________________________________________________________
4243 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4245 // return an assembly containing the LV, HV and Carlos cards of one ladder
4246 // and their cooling system
4249 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4250 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4251 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4253 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4255 //=*********************************
4256 //--- The rounded pipe for the end ladder card coooling
4258 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4259 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4263 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4264 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4268 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4269 endLadderPipe.SetNLayers(2);
4270 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4271 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4273 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4274 // of the U colling pipe in its center
4276 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4277 Double_t vectA[3] = {0,0,1};
4279 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4280 Double_t vectB[3] = {0,0,1};
4282 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4283 Double_t vectC[3] = {1,0,0};
4285 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4286 Double_t vectD[3] = {-1,0,0};
4288 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4289 Double_t vectE[3] = {0,0,-1};
4291 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4292 Double_t vectF[3] = {0,0,-1};
4294 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4295 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4296 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4297 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4298 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4299 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4301 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4302 //endLadderPipe.CreateAndInsertCableSegment( 1);
4303 endLadderPipe.CreateAndInsertTubeSegment( 1);
4304 //endLadderPipe.CreateAndInsertCableSegment( 2);
4305 endLadderPipe.CreateAndInsertTorusSegment( 2);
4306 //endLadderPipe.CreateAndInsertCableSegment( 3);
4307 endLadderPipe.CreateAndInsertTubeSegment( 3);
4308 //endLadderPipe.CreateAndInsertCableSegment( 4);
4309 endLadderPipe.CreateAndInsertTorusSegment( 4);
4310 //endLadderPipe.CreateAndInsertCableSegment( 5);
4311 endLadderPipe.CreateAndInsertTubeSegment( 5);
4313 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4314 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4315 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4316 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4318 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4319 - fgkEndLadPipeArmBoxDX,
4320 fgkEndLadPipeArmBoxDY,0);
4321 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4322 fgkEndLadPipeArmBoxDX,
4323 fgkEndLadPipeArmBoxDY,0);
4324 endLadPipeArmBoxDY1->RegisterYourself();
4325 endLadPipeArmBoxDY2->RegisterYourself();
4327 if(GetDebug(3)) { // Remove compiler warning.
4328 endLadPipeArmBox->InspectShape();
4329 endLadPipeArmTube->InspectShape();
4332 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4333 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4334 "- endLadPipeArmTube");
4335 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4336 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4337 "- endLadPipeArmTube");
4339 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4340 endLadPipeArm1, alCu12SDD);
4341 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4342 endLadPipeArm2, alCu12SDD);
4343 vEndLadPipeArm1->SetLineColor(2);
4344 vEndLadPipeArm2->SetLineColor(2);
4346 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4347 +fgkEndLadPipeArmZpos);
4349 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4350 -fgkEndLadPipeUwidth/2,0,armZ);
4351 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4352 fgkEndLadPipeUwidth/2,0,armZ);
4354 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4355 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4357 //=*********************************
4359 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4360 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4362 Double_t spaceBetweenCards = 0.2*fgkmm;
4364 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4365 +fgkEndLadPipeArmBoxDX);
4366 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4367 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4369 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4372 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4373 +coolUzPos+1.25*fgkmm;
4374 // Position in z of the first LVB with respect to the start of the cooling
4375 // rectangular arm, coming (from inside of the ladder)
4376 // The cards are added one after the other
4378 for (Int_t iCard=0; iCard<nCards; iCard++) {
4380 Double_t cardLVzShift = firstLVCardZ +
4381 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4383 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4384 cardLVyShift, cardLVzShift);
4385 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4386 cardLVyShift, cardLVzShift);
4388 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4389 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4392 //=*********************************
4394 TGeoVolumeAssembly *cardHV = fCardHV;
4396 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4397 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4399 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4400 -(fgkHVCardCeramZ)/2);
4402 for (Int_t iCard=0; iCard<nCards; iCard++) {
4404 Double_t fact = iCard*2.+1.;
4405 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4406 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4407 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4408 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4411 //=*********************************
4414 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4415 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4416 // 0, -fgkCarlosSuppAngle, 0);
4418 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4419 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4420 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4421 // position in z of the first Carlos board, coming from inside of the ladder
4423 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4424 fgkEndLadPipeArmBoxDY);
4426 for (Int_t iCard=0; iCard<nCards; iCard++) {
4428 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4429 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4430 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4431 (TGeoRotation*) fCommonTr[0]);
4433 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4436 return endLadderCards;
4440 //________________________________________________________________________
4441 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4443 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4444 // and their cooling system
4445 // This is the code actually used for the end ladder cards
4448 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4449 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4450 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4451 TGeoMedium *copper = GetMedium("COPPER$");
4452 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4453 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4454 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4456 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4457 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4459 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4460 // reference radius corresponding to local y=0
4463 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4464 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4466 rREF = fgkEndLaddCardsShortRadiusLay4;
4469 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4470 +fgkEndLadPipeArmBoxDX);
4471 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4472 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4474 Double_t rMin = rREF + cardLVyShift;
4475 // (The LV card is defining rMin because it is the lower object)
4477 Double_t thickTotCable = 0.5;
4479 //==================================
4480 //--- The Pcon container
4482 // minimum angle of the Pcon :
4483 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4484 (rREF-fgkEndLadPipeArmY/2) );
4485 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4486 Double_t phi0 = 90-dphi/2;
4487 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4488 // of the U colling pipe in its center
4489 Double_t zMax = endLadPipeUlength+coolUzPos;
4490 Double_t rMax = rMin + fgkLVcardY;
4491 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4492 Double_t cablesRadius = rMax-0.5;
4494 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4495 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4496 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4497 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4498 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4499 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4500 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4501 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4502 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4503 // the following is quite dirty but works for the moment ...
4504 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4505 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4507 // The next parameters define the shape of the Pcon at its end and where cables
4509 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4510 Double_t cableSectionR2 = rMax;
4511 Double_t cableSectionZ1 = zMax + 6.3*fgkmm + 2.5*fgkcm;
4512 Double_t cableSectionZ2 = zMax + 7.3*fgkmm + 4*fgkcm;
4513 // Those 6.3 and 7.3 are to be fixed to stick the maximum to the SDD cone
4514 // (I'm waiting for the new cone)
4516 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4517 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4519 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4520 //endLadderCards->SetVisibility(kFALSE);
4522 //=*********************************
4523 //--- The rounded pipe for the end ladder card cooling
4525 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4526 endLadderPipe.SetNLayers(2);
4527 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4528 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4530 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4531 Double_t vectA[3] = {0,0,1};
4533 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4534 Double_t vectB[3] = {0,0,1};
4536 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4537 Double_t vectC[3] = {1,0,0};
4539 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4540 Double_t vectD[3] = {-1,0,0};
4542 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4543 Double_t vectE[3] = {0,0,-1};
4545 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4546 Double_t vectF[3] = {0,0,-1};
4548 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4549 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4550 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4551 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4552 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4553 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4555 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4556 //endLadderPipe.CreateAndInsertCableSegment( 1);
4557 endLadderPipe.CreateAndInsertTubeSegment( 1);
4558 //endLadderPipe.CreateAndInsertCableSegment( 2);
4559 endLadderPipe.CreateAndInsertTorusSegment( 2);
4560 //endLadderPipe.CreateAndInsertCableSegment( 3);
4561 endLadderPipe.CreateAndInsertTubeSegment( 3);
4562 //endLadderPipe.CreateAndInsertCableSegment( 4);
4563 endLadderPipe.CreateAndInsertTorusSegment( 4);
4564 //endLadderPipe.CreateAndInsertCableSegment( 5);
4565 endLadderPipe.CreateAndInsertTubeSegment( 5);
4567 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4568 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4569 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4570 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4572 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4573 - fgkEndLadPipeArmBoxDX,
4574 fgkEndLadPipeArmBoxDY,0);
4575 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4576 fgkEndLadPipeArmBoxDX,
4577 fgkEndLadPipeArmBoxDY,0);
4578 endLadPipeArmBoxDY1->RegisterYourself();
4579 endLadPipeArmBoxDY2->RegisterYourself();
4581 if(GetDebug(3)) { // Remove compiler warning.
4582 endLadPipeArmBox->InspectShape();
4583 endLadPipeArmTube->InspectShape();
4586 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4587 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4588 "- endLadPipeArmTube");
4589 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4590 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4591 "- endLadPipeArmTube");
4593 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4594 endLadPipeArm1, alCu12SDD);
4595 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4596 endLadPipeArm2, alCu12SDD);
4597 vEndLadPipeArm1->SetLineColor(2);
4598 vEndLadPipeArm2->SetLineColor(2);
4600 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4601 +fgkEndLadPipeArmZpos);
4603 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4604 -fgkEndLadPipeUwidth/2,rREF,armZ);
4605 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4606 fgkEndLadPipeUwidth/2,rREF,armZ);
4608 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4609 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4611 //=*********************************
4613 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4614 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4616 Double_t spaceBetweenCards = 0.2*fgkmm;
4619 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4622 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4623 +coolUzPos+1.25*fgkmm;
4624 // Position in z of the first LVB with respect to the start of the cooling
4625 // rectangular arm, coming (from inside of the ladder)
4626 // The cards are added one after the other
4628 for (Int_t iCard=0; iCard<nCards; iCard++) {
4630 Double_t cardLVzShift = firstLVCardZ +
4631 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4633 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4634 cardLVyShift+rREF, cardLVzShift);
4635 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4636 cardLVyShift+rREF, cardLVzShift);
4638 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4639 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4642 //=*********************************
4644 TGeoVolumeAssembly *cardHV = fCardHV;
4646 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4647 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4648 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4650 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4651 -(fgkHVCardCeramZ)/2);
4653 for (Int_t iCard=0; iCard<nCards; iCard++) {
4655 Double_t fact = iCard*2.+1.;
4656 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4657 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4658 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4659 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4662 //=*********************************
4665 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4666 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4667 // 0, -fgkCarlosSuppAngle, 0);
4669 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4670 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4671 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4672 // position in z of the first Carlos board, coming from inside of the ladder
4674 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4675 fgkEndLadPipeArmBoxDY);
4677 for (Int_t iCard=0; iCard<nCards; iCard++) {
4679 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4680 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4681 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4682 (TGeoRotation*) fCommonTr[0]);
4684 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4688 //=*********************************
4692 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4693 + fgkSectionGlassPerMod)*nCards;
4694 // We fix thickness, then width is calculated accordingly
4695 Double_t width = sectionV/thickTotCable;
4696 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4697 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4698 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4699 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4700 Double_t thickGlass = thickTotCable - thickCu - thickPlast;
4702 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4703 cable.SetNLayers(3);
4704 cable.SetLayer(0, thickCu, copper, kRed);
4705 cable.SetLayer(1, thickPlast, plastic, kYellow);
4706 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4708 Double_t zVect[3]={0,0,1};
4709 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4710 +spaceBetweenCarlsoCards)/2 + 2.9;
4711 // the 2.9cm is for taking into account carlos card angle...
4713 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4714 cableSectionR2,cableSectionZ1,cableSectionZ2);
4716 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4717 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4718 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4719 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4720 cable.SetInitialNode(endLadderCards);
4721 cable.CreateAndInsertCableSegment(1);
4723 return endLadderCards;
4726 //________________________________________________________________________
4727 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4729 // return an assembly of the support rings, attaching the ladders to the cone
4735 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4736 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4739 //**********************************
4742 Double_t fgkRubyCageX = 9*fgkmm;
4743 Double_t fgkRubyCageY = 5.5*fgkmm;
4744 Double_t fgkRubyCageZ = 8*fgkmm;
4745 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4746 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4747 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4748 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4749 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4751 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4754 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4756 // pieces common to both square and V cages
4757 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4758 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4760 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4761 fgkRubyCageHoleDX/2+epsilon);
4763 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4764 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4765 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4766 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4767 trScrewHole->RegisterYourself();
4769 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4770 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4771 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4772 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4773 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4774 trScrewHoleFoot->RegisterYourself();
4777 // pieces which differ
4778 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4780 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4781 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4783 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4784 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4785 trRubyCageVInternBox->RegisterYourself();
4787 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4788 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4789 fgkRubyCageInternSide/4);
4791 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4792 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4793 +epsilon,0,0, rotV );
4794 trRubyCageVInternTriangl->RegisterYourself();
4797 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4798 "rubyCageBox-(rubyCageInternBox"
4799 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4801 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4802 rubyCageSquare, stainless);
4803 vRubyCageSquare->SetLineColor(10);
4805 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4806 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4807 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4808 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4809 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4810 vRubyCageV->SetLineColor(10);
4812 if(GetDebug(3)) { // Remove compiler warning.
4813 rubyCageBox->InspectShape();
4814 rubyCageInternBox->InspectShape();
4815 screwHole->InspectShape();
4816 screwHoleFoot->InspectShape();
4817 rubyCageVInternBox->InspectShape();
4818 rubyCageVInternTriangl->InspectShape();
4821 supportRing->AddNode(vRubyCageSquare, 0, 0);
4822 //supportRing->AddNode(vRubyCageV, 0, 0);
4828 //________________________________________________________________________
4829 void AliITSv11GeometrySDD::CreateSDDsensor() {
4831 // return a box containing the SDD sensor
4834 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4835 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4836 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4837 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4838 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4839 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4842 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4843 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4844 // width : in the beam direction !
4846 Double_t sensoxBoxLength = ( fgkWaferLength +
4847 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4848 // Makes life easier to include the space for the WA HV cable on both sides
4849 Double_t sensoxBoxThick = fgkWaferThickness +
4850 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4852 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4853 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4855 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4856 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4858 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4859 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4862 //****************************
4864 //****************************
4866 // we need 2 different sensor objects, because they have to have different names
4867 // This is required for the step manager
4869 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4870 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4873 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4874 wafer3->SetLineColor(fColorSilicon);
4875 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4876 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4877 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4878 sensVol3->SetLineColor(fColorSilicon+5);
4879 wafer3->AddNode(sensVol3, 1, 0);
4880 fSDDsensor3->AddNode(wafer3, 1, 0);
4882 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4883 wafer4->SetLineColor(fColorSilicon);
4884 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4885 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4886 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4887 sensVol4->SetLineColor(fColorSilicon+5);
4888 wafer4->AddNode(sensVol4, 1, 0);
4889 fSDDsensor4->AddNode(wafer4, 1, 0);
4892 //****************************
4894 //****************************
4895 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4896 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4897 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4898 vGlass->SetLineColor(fColorGlass);
4899 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4900 fgkWaferThickness/2+fgkSensorGlassLY/2,
4901 fgkGlassDZOnSensor);
4902 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4903 fgkWaferThickness/2+fgkSensorGlassLY/2,
4904 fgkGlassDZOnSensor);
4905 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4906 fgkWaferThickness/2+fgkSensorGlassLY/2,
4907 -fgkGlassDZOnSensor);
4908 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4909 fgkWaferThickness/2+fgkSensorGlassLY/2,
4910 -fgkGlassDZOnSensor);
4911 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4912 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4913 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4914 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4916 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4917 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4918 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4919 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4921 //****************************
4922 // Wrap-around cable
4923 //****************************
4925 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4926 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4927 waHVCable.SetNLayers(2);
4928 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4929 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4930 waHVCable.SetInitialNode(fSDDsensor3);
4932 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4933 x1[0] = -fgkWaHVcableLength/2;
4935 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4937 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4940 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4941 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4942 TGeoCombiTrans *ctSegment = 0;
4943 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4944 fSDDsensor4->AddNode(segment, 1, ctSegment);
4948 waHVCable.SetName("ITSsddWaHVCableD");
4949 waHVCable.ResetPoints();
4950 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4951 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4952 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
4953 fSDDsensor4->AddNode(segment, 1, ctSegment);
4955 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
4957 waHVCableFold.SetPhi(180,360);
4958 waHVCableFold.SetNLayers(2);
4959 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
4960 polyhamideSDD, fColorPolyhamide);
4961 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4962 waHVCableFold.SetInitialNode(fSDDsensor3);
4965 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
4967 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4968 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4969 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
4970 fSDDsensor4->AddNode(segment, 1, ctSegment);
4973 //****************************
4975 //****************************
4976 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
4977 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
4978 /(2.*fgkTransitHVHeadLZ);
4979 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
4980 headRadius-fgkTransitHVHeadLZ)
4983 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
4984 fgkTransitHVPolyThick/2,
4986 headPoly->SetName("headPoly");
4987 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
4988 -fgkTransitHVPolyThick/2);
4989 headPolyTr->SetName("headPolyTr");
4990 headPolyTr->RegisterYourself();
4992 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
4993 fgkTransitHVAlThick/2,
4995 headAl->SetName("headAl");
4996 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
4997 -fgkTransitHVPolyThick
4998 -fgkTransitHVAlThick/2);
4999 headAlTr->SetName("headAlTr");
5000 headAlTr->RegisterYourself();
5002 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
5003 (headRadius-fgkTransitHVHeadLZ)/2,
5004 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
5005 cache->SetName("cache");
5007 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5008 (headRadius-fgkTransitHVHeadLZ)/2,
5009 -(fgkTransitHVPolyThick
5010 +fgkTransitHVAlThick)/2);
5011 headCacheTr->SetName("cacheTr");
5012 headCacheTr->RegisterYourself();
5014 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5015 "headPoly:headPolyTr-cache:cacheTr");
5016 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5017 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5018 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5019 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5020 "headAl:headAlTr-cache:cacheTr");
5021 TGeoVolume *vHeadAlComp = new TGeoVolume(
5022 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5023 vHeadAlComp->SetLineColor(fColorAl);
5026 // TGeoRotation rotHead("",0,90,0);
5027 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5028 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5030 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5031 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5032 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5035 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5036 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5037 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5038 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5041 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5042 fgkTransitHVBondingLZ,
5043 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5044 transitHVCable.SetNLayers(2);
5045 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5047 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5048 transitHVCable.SetInitialNode(fSDDsensor3);
5050 x1[0] = -fgkTransitHVHeadLX/2;
5052 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5056 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5057 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5058 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5059 fSDDsensor4->AddNode(segment, 1, ctSegment);
5061 transitHVCable.ResetPoints();
5062 transitHVCable.SetName("ITSsddHVtransitTail");
5063 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5064 x1[0] = fgkTransitHVtailXpos;
5065 x2[0] = fgkTransitHVtailXpos;
5066 x1[2] = -fgkTransitHVBondingLZ/2;
5067 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5068 Double_t vZ[3] = {0,0,1};
5069 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5070 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5071 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5072 fSDDsensor4->AddNode(segment, 1, ctSegment);
5075 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5076 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5077 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5078 fgkTransitHVsideLZ);
5079 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5080 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5081 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5082 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5083 fgkTransitHVsideLZ);
5084 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5085 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5087 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5088 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5089 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5090 fgkTransitHVsideLZ);
5091 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5092 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5093 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5094 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5095 fgkTransitHVsideLZ);
5096 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5097 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5099 // sideRight is not there actually
5100 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5101 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5102 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5103 // fgkTransitHVsideLZ);
5104 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5105 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5106 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5107 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5108 // fgkTransitHVsideLZ);
5109 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5110 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5112 // TGeoRotation rotSide("",0,-90,0);
5113 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5114 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5115 // -fgkTransitHVBondingLZ/2,&rotSide);
5116 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5117 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5118 // -fgkTransitHVBondingLZ/2, &rotSide);
5119 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5120 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5121 // -fgkTransitHVBondingLZ/2, &rotSide);
5122 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5123 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5124 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5125 // -fgkTransitHVBondingLZ/2,rotSide);
5126 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5127 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5128 -fgkTransitHVBondingLZ/2, rotSide);
5129 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5130 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5131 -fgkTransitHVBondingLZ/2, rotSide);
5133 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5134 sideLeft,polyhamideSDD);
5135 vSideLeft->SetLineColor(fColorPolyhamide);
5136 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5138 vSideLeftAl->SetLineColor(fColorAl);
5140 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5141 // sideRight,polyhamideSDD);
5142 // vSideRight->SetLineColor(fColorPolyhamide);
5144 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5145 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5146 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5148 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5149 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5150 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5153 //****************************
5155 fSDDsensor3->CheckOverlaps(0.01);
5156 fSDDsensor4->CheckOverlaps(0.01);
5159 fSDDsensor3->SetVisibility(kFALSE);
5160 fSDDsensor4->SetVisibility(kFALSE);
5164 //________________________________________________________________________
5165 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5167 // return a box volume containing the detectors
5170 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5172 Int_t nDetectors = fgkLay3Ndet;
5173 Double_t ladderLength = fgkLay3LadderLength;
5174 Double_t *sensorZPos = fLay3sensorZPos;
5178 nDetectors = fgkLay4Ndet;
5179 ladderLength = fgkLay4LadderLength;
5180 sensorZPos = fLay4sensorZPos;
5182 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5186 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5187 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5189 sprintf(name,"ITSsddDetBox%i",iLay);
5190 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5191 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5192 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5194 for (Int_t i=0; i<nDetectors; i++) {
5195 Double_t localZ = sensorZPos[i];
5196 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5197 if (iLay==3) if (i%2!=0) localY = -localY;
5198 if (iLay==4) if (i%2==0) localY = -localY;
5199 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5201 if (i >= nDetectors/2) {
5202 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5203 sensorPos->SetName(name);
5204 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5207 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5208 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5210 sensorPos->SetName(name);
5211 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5215 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5216 virtualDet->SetVisibility(kFALSE);
5221 //________________________________________________________________________
5222 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5224 // return a box volume containing the detectors
5227 Int_t nDetectors = fgkLay3Ndet;
5228 Double_t ladderLength = fgkLay3LadderLength;
5229 Double_t *sensorZPos = fLay3sensorZPos;
5230 TGeoVolume *sensorSDD = fSDDsensor3;
5234 nDetectors = fgkLay4Ndet;
5235 ladderLength = fgkLay4LadderLength;
5236 sensorZPos = fLay4sensorZPos;
5237 sensorSDD = fSDDsensor4;
5239 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5243 sprintf(name,"ITSsddDetBox%i",iLay);
5245 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5247 for (Int_t i=0; i<nDetectors; i++) {
5248 Double_t localZ = sensorZPos[i];
5249 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5250 if (iLay==3) if (i%2!=0) localY = -localY;
5251 if (iLay==4) if (i%2==0) localY = -localY;
5252 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5254 if (i >= nDetectors/2) {
5255 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5256 sensorPos->SetName(name);
5257 virtualDet->AddNode(sensorSDD, i, sensorPos);
5260 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5261 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5263 sensorPos->SetName(name);
5264 virtualDet->AddNode(sensorSDD, i, sensorPos);
5268 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5273 //________________________________________________________________________
5274 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5277 // export the geometry in a AliITSgeom object
5282 printf("error:Try to fill null (AliITSgeom *) object");
5286 printf("error:Try to set sensor geometry while geometry is not defined\n");
5290 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5291 fgkWaferLengthSens/2.};
5292 if(!(geom->IsShapeDefined(kSDD)))
5293 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5296 char ladderName[30];
5297 char sensorName[30];
5298 char senstivName[30];
5299 const Int_t kNLay = 2;
5300 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5301 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5304 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5306 Int_t firstSDDmod = startMod;
5307 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5308 /////////////////////////////////////////
5309 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5310 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5312 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5313 TGeoVolume *layVolume = layNode->GetVolume();
5314 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5316 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5317 /////////////////////////////////////////
5318 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5319 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5321 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5322 TGeoVolume *laddVolume = laddNode->GetVolume();
5323 TGeoHMatrix laddMatrix(layMatrix);
5324 laddMatrix.Multiply(laddNode->GetMatrix());
5326 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5327 /////////////////////////////////////////
5328 sprintf(sensorName, "ITSsddSensor_%i",iDet);
5329 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5331 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5332 TGeoVolume *detVolume = detNode->GetVolume();
5333 TGeoHMatrix detMatrix(laddMatrix);
5334 detMatrix.Multiply(detNode->GetMatrix());
5336 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5338 TGeoVolume *wafVolume = wafNode->GetVolume();
5339 TGeoHMatrix wafMatrix(detMatrix);
5340 detMatrix.Multiply(wafNode->GetMatrix());
5341 //--------------------------------------------------------
5342 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5343 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5345 TGeoHMatrix sensMatrix(wafMatrix);
5346 sensMatrix.Multiply(sensitivNode->GetMatrix());
5348 // Sticking to the convention for local wafer coordinate
5350 if (iDet >= kNDet[iLay]/2) {
5351 // TGeoRotation rotY("",0,180,0);
5352 TGeoRotation rotY("",-180,-180,0);
5353 sensMatrix.Multiply(&rotY);
5355 // Creating the matrix in AliITSgeom for
5356 // this sensitive volume :
5357 Double_t *trans = sensMatrix.GetTranslation();
5358 Double_t *r = sensMatrix.GetRotationMatrix();
5359 Double_t rot[10] = {r[0],r[1],r[2],
5361 r[6],r[7],r[8], 1.0};
5362 //rot[9]!=0.0 => not a unity matrix
5363 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5365 // iLadd+1, iDet+1 because ladd. and det. start at +1
5370 printf("Error (ExportSensorGeometry) %s not found !\n",
5373 printf("Error (ExportSensorGeometry) %s not found !\n",
5376 printf("Error (ExportSensorGeometry) %s not found !\n",
5380 printf("Error (ExportSensorGeometry) %s not found !\n",
5384 printf("Error (ExportSensorGeometry) %s not found !\n",
5388 return (startMod-firstSDDmod);
5392 //________________________________________________________________________
5393 Int_t AliITSv11GeometrySDD::
5394 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5396 // Function which gives the layer, ladder and det.
5397 // index of the current volume. To be used in
5398 // AliITS::StepManager()
5401 if (gGeoManager->GetLevel()<3) return kFALSE;
5402 // Get the det index :
5403 TGeoNode *node = gGeoManager->GetMother(2);
5404 if (!node) return kFALSE;
5405 det = node->GetNumber()+1;
5407 // Get the ladder index :
5408 node = gGeoManager->GetMother(3);
5409 if (!node) return kFALSE;
5410 ladd = node->GetNumber()+1;
5412 // Get the layer index :
5413 if (node->GetNdaughters()==fgkLay3Ndet)
5414 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5421 //________________________________________________________________________
5422 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5423 Double_t r2max, Double_t z2,
5424 Double_t section, Int_t nDiv)
5426 // Creates a cone along z where the section is approximately constant
5427 // with z. This is for simulation of cables, because a cone with a constant
5428 // radius difference would show a quantity of matter increasing with z...
5429 // The max radius of the created Pcon is evolving linearly, the min radius
5430 // is calculated at several steps (nDiv).
5431 // z2 > z1 (required by the Pcon)
5433 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5435 Double_t dr = (r2max-r1max)/nDiv;
5436 Double_t dz = (z2-z1)/nDiv;
5437 Double_t r1minI, r2minI, r1maxI, r2maxI;
5440 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5441 Double_t cosAlpha = (z2-z1)/lZ;
5443 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5444 myPcon->DefineSection(0, z1, r1minI, r1max);
5446 for (Int_t i=0; i<nDiv; i++) {
5450 r1maxI = r1max + i*dr;
5451 r2maxI = r1maxI + dr;
5453 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5454 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5460 //________________________________________________________________________
5461 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5462 Double_t refZ1, Double_t refZ2) {
5463 // just a helping function
5464 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5467 //________________________________________________________________________
5468 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5469 Int_t nLay3, Int_t nLay4,
5470 Double_t r1, Double_t z1,
5471 Double_t r2, Double_t z2) {
5473 // Create some cables portions from SDD modules grouped
5474 // and attached at the border of the SSD cone
5476 TGeoMedium *copper = GetMedium("COPPER$");
5477 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5478 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5480 char titleCable[30];
5481 sprintf(titleCable,"cableSDDport%i",(Int_t)angle);
5484 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5485 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5486 Double_t width = section/thickness;
5487 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5488 +fgkSectionGlassPerMod);
5490 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5491 +fgkSectionGlassPerMod);
5493 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5494 +fgkSectionGlassPerMod);
5496 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5497 Double_t cosAlpha = (z2-z1)/hypothenus;
5498 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5499 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5500 angle *= TMath::DegToRad();
5501 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5502 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5503 Double_t pos1[3] = {x1,y1,z1};
5504 Double_t pos2[3] = {x2,y2,z2};
5505 Double_t zVect[3] = {0,0,1};
5507 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5508 cable.SetNLayers(3);
5509 cable.SetLayer(0, thickPlast, plastic, kYellow);
5510 cable.SetLayer(1, thickCu, copper, kRed);
5511 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5513 cable.AddCheckPoint( mother, 0, pos1, zVect );
5514 cable.AddCheckPoint( mother, 1, pos2, zVect );
5515 cable.SetInitialNode(mother);
5516 cable.CreateAndInsertCableSegment(1);
5523 //________________________________________________________________________
5524 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth)
5527 // Creates and inserts the SDD cables running on SDD and SSD cones
5530 // moth : the TGeoVolume owing the volume structure
5533 // Created: ??? Ludovic Gaudichet
5534 // Updated: 15 Mar 2008 Mario Sitta
5535 // Updated: 14 Apr 2008 Mario Sitta Overlap fixes
5536 // Updated: 09 May 2008 Mario Sitta SSD overlap fixes
5539 TGeoMedium *copper = GetMedium("COPPER$");
5540 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5541 TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5542 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5545 //==================================
5547 //==================================
5549 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5550 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5552 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5553 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5554 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5556 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5557 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5558 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5560 // Do not use hardcoded numbers, get them from real shapes - M.S. 15/03/08
5561 TGeoVolume *sddCone = gGeoManager->GetVolume("SDDCarbonFiberCone");
5562 TGeoPcon *sddConeShape = (TGeoPcon*)sddCone->GetShape();
5564 TGeoVolume *sddCylinder = gGeoManager->GetVolume("SDDCarbonFiberCylinder");
5565 TGeoTube *sddCylinderShape = (TGeoTube*)sddCylinder->GetShape();
5567 // (were fgkConeSDDr1, fgkConeSDDr2, fgkConeSDDz1, fgkConeSDDz2 hardcoded)
5568 Double_t coneSDDr1 = sddConeShape->GetRmin(5);
5569 Double_t coneSDDr2 = sddConeShape->GetRmin(3);
5571 Double_t coneSDDz1 = sddConeShape->GetZ(9) - sddConeShape->GetZ(5) +
5572 sddCylinderShape->GetDz();
5573 Double_t coneSDDz2 = sddConeShape->GetZ(9) - sddConeShape->GetZ(3) +
5574 sddCylinderShape->GetDz();
5576 // Calculate z1, z2 thanks to R1 and R2
5577 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, coneSDDr1, coneSDDr2,
5578 coneSDDz1, coneSDDz2);
5579 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, coneSDDr1, coneSDDr2,
5580 coneSDDz1, coneSDDz2);
5581 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, coneSDDr1, coneSDDr2,
5582 coneSDDz1, coneSDDz2);
5584 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5586 //==================================
5587 // first set of cones : cables from layer 3
5588 //==================================
5590 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5591 fgkSDDCableR2, sddCableZ2,
5592 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5594 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5595 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0),
5596 pcon1all->GetRmax(0));
5598 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5599 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax,
5600 pcon1all->GetRmax(1));
5602 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container",
5603 pcon1container, airSDD);
5604 vpcon1container->SetVisibility(kFALSE);
5606 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5607 fgkSDDCableR2, sddCableZ2,
5608 sectionLay3Plastic, 3);
5610 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast",
5611 pcon1plast, plastic);
5612 vpcon1plast->SetLineColor(kYellow);
5613 vpcon1container->AddNode(vpcon1plast, 0);
5615 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5616 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5617 fgkSDDCableR2 - dr1a, sddCableZ2,
5620 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu",
5622 vpcon1Cu->SetLineColor(kRed);
5623 vpcon1container->AddNode(vpcon1Cu, 0);
5625 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5626 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5627 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5628 sectionLay3Glass, 3);
5630 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass",
5631 pcon1glass, opticalFiber);
5632 vpcon1glass->SetLineColor(kGreen);
5633 vpcon1container->AddNode(vpcon1glass, 0);
5635 moth->AddNode(vpcon1container, 1);
5636 moth->AddNode(vpcon1container, 2, rotCableSDD);
5638 //==================================
5639 // 2nd set of cones : cables from layer 3 and layer 4
5640 //==================================
5642 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5643 fgkSDDCableR3, sddCableZ3,
5644 sectionLay3Plastic+sectionLay4Plastic+
5645 sectionLay3Cu+sectionLay4Cu+
5646 sectionLay3Glass+sectionLay4Glass, 1);
5648 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5649 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0),
5650 pcon2all->GetRmax(0));
5652 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5653 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax,
5654 pcon2all->GetRmax(1));
5657 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container",
5658 pcon2container, airSDD);
5659 vpcon2container->SetVisibility(kFALSE);
5661 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5662 fgkSDDCableR3, sddCableZ3,
5664 sectionLay4Plastic, 3);
5666 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast",
5667 pcon2plast, plastic);
5668 vpcon2plast->SetLineColor(kYellow);
5669 vpcon2container->AddNode(vpcon2plast, 0);
5671 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5672 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5673 fgkSDDCableR3 - dr2a, sddCableZ3,
5674 sectionLay3Cu+sectionLay4Cu, 3);
5676 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu",
5678 vpcon2Cu->SetLineColor(kRed);
5679 vpcon2container->AddNode(vpcon2Cu, 0);
5681 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5682 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5683 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5685 sectionLay4Glass, 3);
5687 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass",
5688 pcon2glass, opticalFiber);
5689 vpcon2glass->SetLineColor(kGreen);
5690 vpcon2container->AddNode(vpcon2glass, 0);
5692 moth->AddNode(vpcon2container, 1);
5693 moth->AddNode(vpcon2container, 2, rotCableSDD);
5695 //==================================
5696 // intermediate cylinder
5697 //==================================
5699 // (was fgkSDDCableDZint hardcoded)
5700 Double_t sddCableDZint = (sddConeShape->GetZ(9) - sddConeShape->GetZ(0) +
5701 sddCylinderShape->GetDz()) - sddCableZ3;
5703 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl",
5704 pcon2container->GetRmin(1),
5705 pcon2container->GetRmax(1),
5708 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",
5710 vInterCyl->SetVisibility(kFALSE);
5712 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5713 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5714 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5716 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5717 rmaxCylPlast, sddCableDZint/2);
5719 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast",
5720 interCylPlast, plastic);
5721 vInterCylPlast->SetLineColor(kYellow);
5722 vInterCyl->AddNode(vInterCylPlast, 0);
5724 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5725 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5726 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5728 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5729 rmaxCylCu, sddCableDZint/2);
5731 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu",
5732 interCylCu, copper);
5733 vInterCylCu->SetLineColor(kRed);
5734 vInterCyl->AddNode(vInterCylCu, 0);
5736 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5737 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5738 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5740 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5741 rmaxCylGlass, sddCableDZint/2);
5743 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",
5744 interCylGlass,opticalFiber);
5745 vInterCylGlass->SetLineColor(kGreen);
5746 vInterCyl->AddNode(vInterCylGlass, 0);
5748 moth->AddNode(vInterCyl, 1, new TGeoTranslation(0, 0,
5749 sddCableZ3+sddCableDZint/2));
5750 moth->AddNode(vInterCyl, 2, new TGeoTranslation(0, 0,
5751 -sddCableZ3-sddCableDZint/2));
5753 //==================================
5754 // cable cone on the SSD cone
5755 //==================================
5757 Double_t sddCableR4 = rmaxCylPlast;
5758 Double_t sddCableZ4 = sddCableZ3 + sddCableDZint;
5760 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5761 fgkSDDCableR5, fgkSDDCableZ5,
5764 sectionLay3Cu+sectionLay4Cu+
5765 sectionLay3Glass+sectionLay4Glass, 1);
5767 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5768 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0),
5769 pcon3all->GetRmax(0));
5771 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5772 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax,
5773 pcon3all->GetRmax(1));
5776 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container",
5777 pcon3container, airSDD);
5778 vpcon3container->SetVisibility(kFALSE);
5780 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5781 fgkSDDCableR5, fgkSDDCableZ5,
5783 sectionLay4Plastic, 3);
5785 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast",
5786 pcon3plast, plastic);
5787 vpcon3plast->SetLineColor(kYellow);
5788 vpcon3container->AddNode(vpcon3plast, 0);
5790 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5791 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5792 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5793 sectionLay3Cu+sectionLay4Cu, 3);
5795 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu",
5797 vpcon3Cu->SetLineColor(kRed);
5798 vpcon3container->AddNode(vpcon3Cu, 0);
5800 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5801 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5802 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5803 sectionLay3Glass+sectionLay4Glass, 3);
5805 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass",
5806 pcon3glass,opticalFiber);
5807 vpcon3glass->SetLineColor(kGreen);
5808 vpcon3container->AddNode(vpcon3glass, 0);
5810 moth->AddNode(vpcon3container, 1);
5811 moth->AddNode(vpcon3container, 2, rotCableSDD);
5813 //==================================
5814 // cables that are grouped at the end of SSD cones
5815 //==================================
5817 // Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
5818 // Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
5819 Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
5820 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
5822 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5824 // Add some hardcoded shifts to avoid overlaps with SSD pathc panels
5825 CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
5826 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5828 CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
5829 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5831 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5832 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5834 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5835 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5837 CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
5838 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5840 CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
5841 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5843 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5844 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5846 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5847 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5849 CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
5850 fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
5852 CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
5853 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5855 CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
5856 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5858 CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
5859 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5861 CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
5862 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5864 moth->AddNode(endConeSDDCable, 1, 0);
5866 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5867 reflect->ReflectZ(kTRUE);
5868 moth->AddNode(endConeSDDCable, 2, reflect);