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 *********************************s*****************************************/
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 = 235.*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 moth->AddNode(virtualForward3Pos, 1);
1487 moth->AddNode(virtualForward3Neg, 1);
1490 //________________________________________________________________________
1491 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1493 // Insert the layer 4 in the mother volume. This is a virtual volume
1494 // containing ladders of layer 4 and the supporting rings
1498 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1504 if (! fSDDsensor3) CreateBasicObjects();
1506 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1507 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1508 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1509 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1510 virtualLayer4Shape, airSDD);
1512 //====================================
1513 // First we create the central barrel
1514 //====================================
1516 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1517 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1518 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1520 Double_t dPhi = 360./fgkLay4Nladd;
1521 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1523 // placing virtual ladder and detectors volumes following ladder
1524 // ordering convention
1527 Int_t iLaddMax = fgkLay4Nladd;
1528 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1529 iLaddMin = fAddOnlyLadder4min;
1530 iLaddMax = fAddOnlyLadder4max+1;
1532 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1534 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1535 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1536 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1538 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1539 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1540 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1541 0, ladderPhi, kTRUE);
1542 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1543 ///////////////////////////////////////////////////
1544 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1545 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1547 minRadiusDetBox = fgkLay4DetLongRadius;
1548 minRadiusDetBox += detBoxThickness/2;
1549 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1550 0, ladderPhi, kTRUE);
1551 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1552 ///////////////////////////////////////////////////
1556 //====================================
1557 // Then the pieces at forward rapidity
1558 // (cooling, Carlos, LV, HV ...)
1559 //====================================
1561 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1562 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1563 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1565 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1566 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1567 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1568 fgkForwardLay4Length/2.);
1569 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1570 virtualForward4Shape, airSDD);
1571 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1572 virtualForward4Shape, airSDD);
1573 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1574 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1576 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1577 fgkLay4Length/2+fgkForwardLay4Length/2);
1578 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1579 -fgkLay4Length/2-fgkForwardLay4Length/2);
1581 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1583 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1584 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1586 minRadiusDetBox = fgkLay4DetLongRadius;
1587 minRadiusDetBox += detBoxThickness/2;
1589 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1591 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1592 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1593 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1594 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1595 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1596 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1600 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1602 virtualLayer4->SetVisibility(kFALSE);
1603 //virtualForward4Pos->SetVisibility(kFALSE);
1604 //virtualForward4Neg->SetVisibility(kFALSE);
1606 moth->AddNode(virtualLayer4,1,0);
1607 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1608 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1612 // //________________________________________________________________________
1613 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1615 // // Insert the layer 4 in the mother volume. This is a virtual volume
1616 // // containing ladders of layer 4 and the supporting rings
1617 // // (cooling, Carlos, LV, HV ...)
1621 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1625 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1627 // if (! fSDDsensor3) CreateBasicObjects();
1629 // Double_t dPhi = 360./fgkLay4Nladd;
1630 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1632 // // placing virtual ladder and detectors volumes following ladder
1633 // // ordering convention
1634 // char rotName[20];
1635 // Int_t iLaddMin = 0;
1636 // Int_t iLaddMax = fgkLay4Nladd;
1637 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1638 // iLaddMin = fAddOnlyLadder4min;
1639 // iLaddMax = fAddOnlyLadder4max+1;
1642 // //=================
1643 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1644 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1645 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1647 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1648 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1649 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1650 // fgkForwardLay4Length/2.);
1651 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1652 // virtualForward4Shape, airSDD);
1653 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1654 // virtualForward4Shape, airSDD);
1655 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1656 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1658 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1659 // fgkLay4Length/2+fgkForwardLay4Length/2);
1660 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1661 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1663 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1665 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1666 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1667 // if (iLadd%2 != 0)
1668 // minRadiusDetBox = fgkLay4DetLongRadius;
1669 // minRadiusDetBox += detBoxThickness/2;
1671 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1673 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1674 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1675 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1676 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1677 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1678 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1681 // virtualForward4Pos->SetVisibility(kFALSE);
1682 // virtualForward4Neg->SetVisibility(kFALSE);
1684 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1685 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1689 //________________________________________________________________________
1690 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1692 // Insert the end-ladder of layer 4 in the mother volume.
1693 // (cooling, Carlos, LV, HV ...)
1697 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1701 if (! fSDDsensor3) CreateBasicObjects();
1703 // placing virtual ladder and detectors volumes following ladder
1704 // ordering convention
1706 Int_t iLaddMax = fgkLay4Nladd;
1707 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1708 iLaddMin = fAddOnlyLadder4min;
1709 iLaddMax = fAddOnlyLadder4max+1;
1712 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1713 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1716 Double_t dPhi = 360./fgkLay4Nladd;
1717 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1719 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1721 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1724 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1726 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1728 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1729 fgkLay4Length/2, ladderPhi, kTRUE);
1730 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1731 -fgkLay4Length/2, ladderPhi, kFALSE);
1732 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1733 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1736 moth->AddNode(virtualForward4Pos, 1);
1737 moth->AddNode(virtualForward4Neg, 1);
1741 //________________________________________________________________________
1742 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1744 // return an assembly volume containing the CF ladder
1747 Int_t nDetectors = fgkLay3Ndet;
1748 Double_t ladderLength = fgkLay3LadderLength;
1749 Double_t underSegDH = fLay3LadderUnderSegDH;
1750 Double_t *sensorZPos = fLay3sensorZPos;
1751 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1752 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1756 nDetectors = fgkLay4Ndet;
1757 ladderLength = fgkLay4LadderLength;
1758 digitCableA = fDigitCableLay4A;
1759 digitCableB = fDigitCableLay4B;
1760 underSegDH = fLay4LadderUnderSegDH;
1761 sensorZPos = fLay4sensorZPos;
1764 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1766 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1767 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1769 // placing virtual ladder segment following detector ordering convention
1770 //=======================================================================
1773 // adding segment this way to create cable points in the correct order ...
1774 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1776 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1777 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1778 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1779 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1780 + fgkSegmentLength/2;
1781 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1782 underSegDH/2,segmentPos);
1784 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1786 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1788 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1789 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1790 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1791 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1792 + fgkSegmentLength/2;
1793 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1794 underSegDH/2,segmentPos);
1796 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1799 // putting virtual volume corresponding to the end of ladder
1800 //=======================================================================
1801 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1802 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1803 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1804 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1805 // Euler rotation : about Z, then new X, then new Z
1806 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1807 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1808 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1809 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1810 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1812 // creating and inserting cable segments
1813 // (check points are placed while creating segments)
1814 //=======================================================================
1816 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1818 digitCableA[iSegment].SetInitialNode(virtualLadder);
1819 digitCableB[iSegment].SetInitialNode(virtualLadder);
1821 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1822 Double_t rotation = 0;
1824 rotation = 90-fgkHybridAngle;
1825 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1827 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1831 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1832 Double_t rotation = 0;
1834 rotation = fgkHybridAngle-90;
1835 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1837 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1842 //=======================================================================
1844 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1845 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1847 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1848 char cableHVname[30];
1849 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1850 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1851 cableHV[iSegment].SetName(cableHVname);
1852 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1853 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1854 cableHV[iSegment].SetNLayers(2);
1855 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1857 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1858 cableHV[iSegment].SetInitialNode(virtualLadder);
1860 Double_t x1[3], x2[3], x3[3],
1861 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1863 x1[0] = -fgkTransitHVtailXpos;
1864 x2[0] = -fgkTransitHVtailXpos;
1865 x3[0] = -fgkTransitHVtailXpos;
1866 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1867 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1868 *fgkLongHVcableSeparation;
1869 // adjust where HV long cable starts in Y
1870 // useful if you want to let some space for alignment
1871 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1872 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1873 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1875 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1876 x2[2] = x1[2]+5*fgkmm;
1877 x3[2] = ladderLength/2-endLength;
1878 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1879 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1880 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1882 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1883 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1884 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1885 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1889 x1[0] = fgkTransitHVtailXpos;
1890 x2[0] = fgkTransitHVtailXpos;
1891 x3[0] = fgkTransitHVtailXpos;
1893 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1894 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1895 *fgkLongHVcableSeparation;
1896 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1897 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1898 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1900 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1901 x2[2] = x1[2]-5*fgkmm;
1902 x3[2] = -ladderLength/2+endLength;
1903 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1904 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1905 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1907 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1908 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1912 //**********************************
1913 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1914 return virtualLadder;
1918 //________________________________________________________________________
1919 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(Double_t dz, Double_t angle,
1920 Double_t xSign, Double_t L, Double_t H, Double_t l) {
1921 // Create one half of the V shape corner of CF ladder
1923 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1924 cfLaddSide->SetVertex( 0, 0, 0);
1925 cfLaddSide->SetVertex( 1, 0, -H);
1926 cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1927 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1928 cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1929 cfLaddSide->SetVertex( 4, 0, 0);
1930 cfLaddSide->SetVertex( 5, 0, -H);
1931 cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1932 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1933 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1938 //________________________________________________________________________
1939 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1941 // return a box containing the front-end hybrid
1944 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1946 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1947 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1948 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1949 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1950 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1951 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1952 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1953 // + upFLTotalThick + ccUpLayerTotThick);
1954 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1956 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1958 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1960 //**************************************************** media :
1961 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1962 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1963 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1964 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1965 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1966 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1967 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1968 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1969 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1970 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1971 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1973 //**************************************************** main volume :
1974 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
1975 (fgkHybridLength)/2);
1976 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
1979 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
1980 fgkHybridThBridgeThick/2,
1983 //**************************************************** Thermal bridge :
1984 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
1986 carbonFiberLadderStruct);
1987 vThermalBridge->SetLineColor(fColorCarbonFiber);
1988 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
1989 +fgkHybridThBridgeThick/2, 0);
1990 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
1992 //**************************************************** Screen layer :
1993 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
1994 fgkHybAlThick/2, fgkHybridLength/2);
1995 //here the upedex and glue layers are both assumed to be polyimide
1996 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
1998 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2000 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2001 (screenTotalThick+lowFLTotalThick)/2);
2003 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2004 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2006 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2007 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2008 +fgkHybAlThick/2, 0);
2010 TGeoTranslation hybHolePos1Tr(roundHoleX,
2011 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2012 -fgkHybridLength/2+fgkHybRndHoleZ);
2013 TGeoTranslation hybHolePos2Tr(roundHoleX,
2014 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2015 fgkHybridLength/2-fgkHybRndHoleZ);
2017 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2018 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2019 hybHolePos1->SetName("hybHolePos1");
2020 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2021 hybHolePos2->SetName("hybHolePos2");
2023 upGlueScreenTr->RegisterYourself();
2024 alScreenTr->RegisterYourself();
2025 hybHolePos1->RegisterYourself();
2026 hybHolePos2->RegisterYourself();
2029 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2030 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2031 "+sRoundHole:hybHolePos2)");
2032 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2033 vScreenAl->SetLineColor(fColorAl);
2034 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2035 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2036 "+sRoundHole:hybHolePos2)");
2037 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2038 sScreenUpGlue,polyhamideSDD);
2039 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2041 hybrid->AddNode(vScreenUpGlue, 1, 0);
2042 hybrid->AddNode(vScreenAl, 1, 0);
2044 //**************************************************** FL low layer :
2045 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2046 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2048 //here the upedex and glue layers are both assumed to be polyimide
2049 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2050 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2052 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2053 fgkHybAlThick/2, sideWidth1/2);
2055 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2056 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2057 -(fgkHybridLength-sideWidth1)/2);
2058 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2059 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2060 -(fgkHybridLength-sideWidth1)/2);
2061 upGlueBarTr1->RegisterYourself();
2062 alBarTr1->RegisterYourself();
2064 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2065 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2066 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2067 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2068 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2069 sLowUpGlueBar1, polyhamideSDD);
2070 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2072 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2073 vLowAlBar1->SetLineColor(fColorAl);
2074 hybrid->AddNode(vLowUpGlueBar1,1,0);
2075 hybrid->AddNode(vLowAlBar1,1,0);
2078 //here the upedex and glue layers are both assumed to be polyimide
2079 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2080 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2082 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2083 fgkHybAlThick/2, sideWidth2/2);
2085 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2086 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2087 (fgkHybridLength-sideWidth2)/2);
2088 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2089 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2090 (fgkHybridLength-sideWidth2)/2);
2091 upGlueBarTr2->RegisterYourself();
2092 alBarTr2->RegisterYourself();
2094 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2095 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2096 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2097 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2098 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2100 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2102 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2103 vLowAlBar2->SetLineColor(fColorAl);
2104 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2105 hybrid->AddNode(vLowAlBar2, 1, 0);
2107 if(GetDebug(3)) { // Remove compiler warning.
2108 sAlScreenLayer->InspectShape();
2109 sUpGlueScreenLayer->InspectShape();
2110 sRoundHole->InspectShape();
2111 sUpGlueBar1->InspectShape();
2112 sUpGlueBar2->InspectShape();
2113 sAlBar1->InspectShape();
2114 sAlBar2->InspectShape();
2117 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2118 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2119 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2121 lowFLpiece.SetNLayers(2);
2122 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2124 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2125 // alSDD at 80% : mostly to take into account strips of piece 3
2127 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2128 lowLayerYmin + lowFLTotalThick/2,
2129 -fgkHybridLength/2 + sideWidth1 };
2130 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2131 Double_t vZ[3] = {0,0,1};
2132 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2133 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2134 lowFLpiece.SetInitialNode(hybrid);
2135 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2136 lowFLpiece.ResetPoints();
2138 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2139 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2141 lowFLpiece.SetWidth(piece2width);
2142 lowFLpiece.SetName("lowFLpiece2");
2143 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2145 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2146 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2147 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2148 lowFLpiece.ResetPoints();
2150 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2151 - fgkHybFLlowHoleAmbDX/2;
2153 lowFLpiece.SetWidth(piece3width);
2154 lowFLpiece.SetName("lowFLpiece3");
2155 x1[0] = fgkHybridWidth/2-piece3width/2;
2157 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2158 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2159 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2161 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2162 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2163 Double_t vX[3] = {1,0,0};
2164 for (Int_t i=0; i<3; i++) {
2166 sprintf(ch, "lowFLpieceA%i", i+4);
2167 lowFLpiece.SetName(ch);
2168 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2170 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2171 x1[0] = -fgkHybridWidth/2 + piece1width;
2172 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2173 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2174 x1[2] = zPiece; x2[2] = zPiece;
2175 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2176 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2177 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2178 lowFLpiece.ResetPoints();
2180 sprintf(ch, "lowFLpieceB%i", i+4);
2181 lowFLpiece.SetName(ch);
2182 x1[0] = fgkHybridWidth/2 - piece3width;
2183 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2184 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2185 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2186 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2189 //**************************************************** chips+CC:
2190 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2191 chip.SetInitialNode(hybrid);
2193 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2194 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2195 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2196 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2198 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2199 // Here the tho CC (low+up) are merged
2200 // In fact, the last layer has a smaller surface of Al -> I put 80%
2202 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2206 for (Int_t i=0; i<4; i++) {
2207 sprintf(ch, "pascalCC%i", i);
2209 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2210 x2[0] = x1[0] + fgkHybPascalDX;
2211 x1[2] = zChips[i] - fgkHybridLength/2;
2213 chip.AddCheckPoint( hybrid, 0, x1, vX );
2214 chip.AddCheckPoint( hybrid, 1, x2, vX );
2215 chip.CreateAndInsertBoxCableSegment(1,-90);
2218 sprintf(ch, "ambraCC%i", i);
2220 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2221 x2[0] = x1[0] + fgkHybAmbraDX;
2222 chip.AddCheckPoint( hybrid, 0, x1, vX );
2223 chip.AddCheckPoint( hybrid, 1, x2, vX );
2224 chip.CreateAndInsertBoxCableSegment(1,-90);
2228 //**************************************************** CC outside chips:
2229 // I don't think there is a second aluminium layer here ...
2230 for (Int_t i = 0; i<4; i++) {
2232 sprintf(ch, "ccLayerA%i", i);
2234 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2235 ccLayer1.SetInitialNode(hybrid);
2236 ccLayer1.SetNLayers(2);
2237 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2238 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2241 x1[0] = -fgkHybridWidth/2;
2242 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2243 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2244 + fgkHybChipThick + ccUpLayerTotThick/2;
2246 x1[2] = zChips[i] - fgkHybridLength/2;
2248 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2249 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2250 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2252 sprintf(ch, "ccLayerB%i", i);
2253 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2254 ccLayer2.SetInitialNode(hybrid);
2255 ccLayer2.SetNLayers(2);
2256 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2257 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2260 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2261 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2262 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2263 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2264 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2265 ccLayer2.ResetPoints();
2266 sprintf(ch, "ccLayerC%i", i);
2267 ccLayer2.SetName(ch);
2268 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2269 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2270 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2271 + ccUpLayerTotThick/2;
2274 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2275 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2276 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2279 //**************************************************** FL UP:
2280 // (last Al layer will be a special triangular shape)
2281 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2282 fgkHybFLUpperWidth/2, flUpThick/2,
2283 fgkHybFLUpperLength/2);
2284 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2285 sFLupPolyhamide, polyhamideSDD);
2286 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2287 TGeoTranslation *trFLupPolyhamide =
2288 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2289 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2291 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2293 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2294 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2295 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2296 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2297 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2298 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2299 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2300 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2301 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2302 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2305 vAluStrip->SetLineColor(fColorAl);
2306 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2307 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2309 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2310 +flUpThick+fgkHybAlThick/2;
2311 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2312 fgkHybridWidth/2,yRotAluStrip,
2313 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2314 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2315 AddTranslationToCombiTrans(aluStripTr2,0,0,
2316 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2317 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2318 AddTranslationToCombiTrans(aluStripTr3,0,0,
2319 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2320 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2321 AddTranslationToCombiTrans(aluStripTr4,0,0,
2322 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2324 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2325 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2326 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2327 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2328 //**************************************************** SMD:
2329 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2330 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2331 fgkHybSMDheight/2,fgkHybSMDendW/2);
2332 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2334 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2335 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2336 fgkHybSMDmiddleW/2);
2337 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2338 hybSMDmiddle,medSMD);
2339 vHybSMDmiddle->SetLineColor(fColorSMD);
2340 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2341 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2342 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2343 hybSMDend,medSMDweld);
2344 vHybSMDend->SetLineColor(fColorSMDweld);
2345 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2346 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2347 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2348 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2349 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2350 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2351 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2352 for (Int_t i=0; i<fgkNHybSMD; i++) {
2353 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2354 -fgkHybridWidth/2+fgkHybSMDposX[i],
2355 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2356 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2357 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2363 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2364 hybrid->SetVisibility(kFALSE);
2368 //________________________________________________________________________
2369 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2371 // Return a TGeoVolume* containing a segment of a ladder.
2374 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2375 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2376 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2378 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2379 Double_t segmentLength = fgkSegmentLength;
2380 Double_t spaceBetweenCables = 500*fgkmicron;
2382 //*****************************************
2383 // Set parameters according to (iLay,iSeg):
2384 //*****************************************
2385 Int_t nDetectors = fgkLay3Ndet;
2386 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2387 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2388 (fgkSegmentLength*fgkLay3Ndet/2. -
2389 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2390 // sensorCenterZPos = z in segment local coord syst.
2392 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2393 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2396 } else if (iLay==4) {
2397 nDetectors = fgkLay4Ndet;
2398 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2399 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2400 (fgkSegmentLength*fgkLay4Ndet/2. -
2401 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2402 digitCableA = fDigitCableLay4A;
2403 digitCableB = fDigitCableLay4B;
2405 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2408 Double_t cableSideSign = -1;
2409 if (iSeg<nDetectors/2) cableSideSign = 1;
2410 Double_t spaceForCables = spaceBetweenCables*
2411 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2413 // gives [0-1-2-2-1-0]*spaceBetweenCables
2414 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2415 Int_t iUpdateCableMin;
2416 Int_t iUpdateCableMax;
2417 if (cableSideSign==-1) {
2418 iUpdateCableMin = nDetectors/2;
2419 iUpdateCableMax = iSeg-1;
2421 iUpdateCableMin = iSeg+1;
2422 iUpdateCableMax = nDetectors/2-1;
2426 cout << "Segment ("<< iLay <<',' << iSeg
2427 << ") : sensor z shift in local segment coord.="
2428 << sensorCenterZPos << endl;
2431 //****************************
2432 // The segment volume
2433 //****************************
2435 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2436 // likely slows down the transport of particles through the geometry
2438 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2440 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2441 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2442 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2445 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2447 virtualSeg->SetVisibility(kFALSE);
2449 //******************************
2450 // Carbon fiber structure :
2451 //******************************
2453 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2454 Int_t volumeIndex = 1;
2455 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2456 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2460 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2461 fLaddSegCommonTr[i]);
2464 //**********************************
2465 // Pine support of the sensors :
2466 //**********************************
2467 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2468 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2470 // The use of the following constructor type allow to use rotPS1 and rotPS2
2471 // (and not copy them) therefore we gain some memory
2472 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2473 - fgkLadderHeight/2.-tDY
2474 + fgkPinSuppHeight/2.,
2475 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2477 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2478 - fgkLadderHeight/2.-tDY
2479 + fgkPinSuppHeight/2.,
2480 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2481 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2483 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2484 - fgkLadderHeight/2.-tDY
2485 + fgkPinSuppHeight/2.,
2486 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2487 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2489 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2490 - fgkLadderHeight/2.-tDY
2491 + fgkPinSuppHeight/2.,
2492 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2493 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2495 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2496 - fgkLadderHeight/2. - tDY
2497 + fgkPinSuppHeight/2.,
2498 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2500 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2501 - fgkLadderHeight/2. - tDY
2502 + fgkPinSuppHeight/2.,
2503 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2504 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2506 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2507 - fgkLadderHeight/2. - tDY
2508 + fgkPinSuppHeight/2.,
2509 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2510 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2512 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2513 - fgkLadderHeight/2. - tDY
2514 + fgkPinSuppHeight/2.,
2515 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2516 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2518 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2519 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2520 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2521 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2522 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2523 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2524 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2525 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2527 TGeoMedium *pinMed = GetMedium("SDDKAPTON (POLYCH2)$"); // medium ???
2528 Double_t fgkPinHeight = 4.5*fgkmm;
2529 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2531 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2533 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2534 - fgkLadderHeight/2.-tDY
2536 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2537 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2538 virtualSeg->AddNode(pineV, 1, transPS2b);
2540 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2541 - fgkLadderHeight/2. - tDY
2543 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2544 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2545 virtualSeg->AddNode(pineV, 2, transPS6b);
2548 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2549 - fgkLadderHeight/2.-tDY
2551 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2552 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2553 virtualSeg->AddNode(pineV, 3, transPS4b);
2555 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2556 - fgkLadderHeight/2. - tDY
2558 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2559 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2560 virtualSeg->AddNode(pineV, 4, transPS8b);
2563 //******************************
2564 // Cooling pipe supports :
2565 //******************************
2566 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2567 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2568 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2569 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2571 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2572 (triangleHeight+triangleCPaxeDist/
2573 TMath::Sin(halfTheta)-coolPipeSuppH);
2574 if (fAddCoolingSyst) {
2575 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2576 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2577 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2578 -fgkLadderHeight/2. - tDY
2579 +coolPipeSuppH+fgkLadderBeamRadius,
2580 -segmentLength/2., rotCPS1);
2582 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2583 -fgkLadderHeight/2. - tDY
2584 +coolPipeSuppH+fgkLadderBeamRadius,
2585 -segmentLength/2., rotCPS1);
2586 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2588 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2589 -fgkLadderHeight/2.- tDY
2590 +coolPipeSuppH+fgkLadderBeamRadius,
2591 segmentLength/2., rotCPS2);
2593 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2594 -fgkLadderHeight/2.- tDY
2595 +coolPipeSuppH+fgkLadderBeamRadius,
2596 segmentLength/2., rotCPS2);
2597 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2599 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2600 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2601 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2602 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2605 //************************
2607 //************************
2608 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2609 -fgkLadderHeight/2. - tDY +
2610 fgkLadderBeamRadius+coolPipeSuppH, 0);
2611 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2612 -fgkLadderHeight/2.- tDY +
2613 fgkLadderBeamRadius+coolPipeSuppH, 0);
2615 if (fAddCoolingSyst) {
2616 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2617 fgkCoolPipeOuterDiam/2,
2619 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2622 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2623 coolingPipeShape, phynoxSDD );
2624 coolingPipe->SetLineColor(fColorPhynox);
2625 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2629 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2630 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2632 virtualSeg->AddNode(cooler, 1, pipeTr1);
2633 virtualSeg->AddNode(cooler, 2, pipeTr2);
2637 //**********************************
2638 // Bases of hybrid thermal bridges
2639 //**********************************
2640 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2641 // approx !!! not clear on 0752/14-A
2642 if (fAddCoolingSyst) {
2643 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2644 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2645 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2646 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2648 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2649 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2652 //*************************
2654 //*************************
2655 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2656 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2658 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2659 - shiftHyb*SinD(fgkHybridAngle) );
2660 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2661 + shiftHyb*CosD(fgkHybridAngle) );
2663 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2664 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2665 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2666 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2667 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2668 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2670 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2671 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2678 // Starting from this segment
2679 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2680 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2681 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2682 - digitCableA->GetWidth()/2;
2683 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2684 - digitCableA->GetThickness()/2;
2686 Double_t digitCableX = ( coolPipeSuppL
2687 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2688 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2689 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2690 + fgkLadderBeamRadius+coolPipeSuppH
2691 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2692 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2695 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2696 digitCableY, cableSideSign*hybDz };
2697 Double_t digitCableCenterA1[3] = {
2698 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2699 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2700 cableSideSign*segmentLength/2 };
2702 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2703 digitCableY,cableSideSign*hybDz};
2704 Double_t digitCableCenterB1[3]={
2705 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2706 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2707 cableSideSign*segmentLength/2 };
2709 Double_t vZ[3] = {0,0,1};
2710 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2711 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2712 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2713 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2715 // Updating the other cables
2716 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2718 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2720 digitCableA[iCable].GetPoint( 1, coord);
2721 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2722 digitCableB[iCable].GetPoint( 1, coord);
2723 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2727 //**********************************
2728 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2733 //________________________________________________________________________
2734 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2736 // Create a pine support and its pine
2737 // axis of rotation is the cone axis, center in its middle
2739 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?
2741 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2742 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2743 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2744 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2745 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2746 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2747 fgkPinSuppHeight/2.+0.00001);
2748 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2750 if(GetDebug(3)){// Remove compiler warning.
2751 cone->InspectShape();
2752 tong->InspectShape();
2753 hole->InspectShape();
2756 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2757 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2758 tongTrans->RegisterYourself();
2759 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2760 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2761 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2763 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2765 pinSupport->SetLineColor(fColorRyton);
2771 //________________________________________________________________________
2772 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2774 // Create half of the cooling pipe support (ALR-0752/3)
2777 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2779 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2780 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2781 side1->SetVertex( 1, fgkCoolPipeSuppMaxLength/2.-diffX,
2782 -fgkCoolPipeSuppWidthExt/2.);
2783 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2784 fgkCoolPipeSuppWidthExt/2.);
2785 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2786 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2787 side1->SetVertex( 5, fgkCoolPipeSuppMaxLength/2.,
2788 -fgkCoolPipeSuppWidthExt/2.);
2789 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2790 fgkCoolPipeSuppWidthExt/2.);
2791 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2792 side1->SetName("ITSsddCPSside1");
2794 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2795 - fgkCoolPipeSuppAxeDist
2796 + fgkCoolPipeSuppWidthExt/2., 0);
2797 side1Tr->RegisterYourself();
2798 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2799 - fgkCoolPipeSuppAxeDist
2800 + fgkCoolPipeSuppWidthExt*3/2.
2801 + fgkCoolPipeSuppWidthIn,0);
2802 side2Tr->RegisterYourself();
2804 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2805 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2806 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2807 TGeoTranslation *middleTr =
2808 new TGeoTranslation("ITSsddCPStr3",
2809 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2810 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2811 +fgkCoolPipeSuppWidthIn/2., 0);
2812 middleTr->RegisterYourself();
2814 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2815 fgkCoolPipeSuppTongW/4.,
2816 (fgkCoolPipeSuppFulWidth
2817 - 2*fgkCoolPipeSuppWidthExt
2818 - fgkCoolPipeSuppWidthIn)/2,
2819 fgkCoolPipeSuppHeight/2.);
2821 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2822 fgkCoolPipeSuppTongW/4.,
2823 - fgkCoolPipeSuppAxeDist
2824 + fgkCoolPipeSuppFulWidth
2825 - axeBox->GetDY(), 0);
2826 axeBoxTr->RegisterYourself();
2828 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2829 fgkCoolPipeSuppTongW/4.);
2831 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2832 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2833 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2834 axeTrans->RegisterYourself();
2835 //delete axeRot; // make the code crash, no idea of why !!!
2838 middle->InspectShape();
2839 axe->InspectShape();
2842 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2844 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2845 "ITSsddCoolPipeSuppShapeL",
2846 "ITSsddCPSmiddle:ITSsddCPStr3"
2847 "+ITSsddCPSside1:ITSsddCPStr1"
2848 "+ITSsddCPSside1:ITSsddCPStr2"
2849 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2850 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2851 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2852 coolPipeSuppShape, rytonSDD);
2854 coolPipeSupp->SetLineColor(fColorRyton);
2856 return coolPipeSupp;
2860 //________________________________________________________________________
2861 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2863 //Create half of the cooling pipe support (ALR-0752/3)
2866 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2868 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2869 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2870 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2871 -fgkCoolPipeSuppWidthExt/2.);
2872 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2873 fgkCoolPipeSuppWidthExt/2.);
2874 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2875 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2876 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2877 -fgkCoolPipeSuppWidthExt/2.);
2878 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2879 fgkCoolPipeSuppWidthExt/2.);
2880 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2881 side1->SetName("ITSsddCPSside1R");
2883 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2884 - fgkCoolPipeSuppAxeDist
2885 + fgkCoolPipeSuppWidthExt/2., 0);
2886 side1Tr->RegisterYourself();
2887 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2888 - fgkCoolPipeSuppAxeDist
2889 + fgkCoolPipeSuppWidthExt*3/2.
2890 + fgkCoolPipeSuppWidthIn, 0);
2891 side2Tr->RegisterYourself();
2893 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2894 (fgkCoolPipeSuppMaxLength/2.
2895 - fgkCoolPipeSuppSlitL)/2.,
2896 fgkCoolPipeSuppWidthIn/2.,
2897 fgkCoolPipeSuppHeight/2.);
2898 TGeoTranslation *middleTr =
2899 new TGeoTranslation("ITSsddCPStr3R",
2900 -( fgkCoolPipeSuppMaxLength/2.
2901 -fgkCoolPipeSuppSlitL)/2.,
2902 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2903 + fgkCoolPipeSuppWidthIn/2.,0);
2904 middleTr->RegisterYourself();
2906 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2907 fgkCoolPipeSuppTongW/4.,
2908 (fgkCoolPipeSuppFulWidth
2909 - 2*fgkCoolPipeSuppWidthExt
2910 - fgkCoolPipeSuppWidthIn)/2,
2911 fgkCoolPipeSuppHeight/2.);
2913 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2914 - fgkCoolPipeSuppTongW/4.,
2915 - fgkCoolPipeSuppAxeDist
2916 + fgkCoolPipeSuppFulWidth
2917 - axeBox->GetDY(),0);
2918 axeBoxTr->RegisterYourself();
2920 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2921 fgkCoolPipeSuppTongW/4.);
2923 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2924 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2925 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2926 axeTrans->RegisterYourself();
2930 middle->InspectShape();
2931 axe->InspectShape();
2934 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2935 "ITSsddCoolPipeSuppShapeR",
2936 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2937 "+ITSsddCPSside1R:ITSsddCPStr1R"
2938 "+ITSsddCPSside1R:ITSsddCPStr2R"
2939 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2940 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2942 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2943 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2944 coolPipeSuppShape, rytonSDD);
2945 coolPipeSupp->SetLineColor(fColorRyton);
2947 return coolPipeSupp;
2950 //________________________________________________________________________
2951 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2953 // based on ALR 0752/8
2956 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2958 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2959 - (fgkRadiusAminBTB+fgkBTBthick);
2960 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2961 fgkBTBthick/2., fgkBTBlength/2.);
2962 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2963 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2964 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2965 base1Tr->RegisterYourself();
2967 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2969 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2970 fgkBTBthick/2., fgkBTBlength/2.);
2971 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2972 fgkBTBaxisAtoBottom - base2width/2.,
2973 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2974 base2Tr->RegisterYourself();
2976 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
2977 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
2978 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
2979 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
2980 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
2981 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
2982 sideTr1->RegisterYourself();
2983 sideTr2->RegisterYourself();
2985 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
2986 fgkBTBthick/2., fgkBTBHoleLength/2.);
2987 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
2988 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2989 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2990 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
2991 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
2992 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2993 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2994 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
2995 holeTr1->RegisterYourself();
2996 holeTr2->RegisterYourself();
2998 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
2999 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3000 fgkRadiusAminBTB, radiusAmaxBTB,
3001 fgkBTBlength/2., 0., 180.);
3002 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3003 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3004 fgkBTBlength/2., 270., 360.);
3005 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3006 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3008 roundTr1->RegisterYourself();
3010 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3011 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3012 fgkBTBlength/2., 180., 270.);
3013 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3014 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3016 roundTr2->RegisterYourself();
3018 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3019 "ITSsddBaseThermalBridgeShape",
3020 "ITSsddBTBbase1:ITSsddBTBtr1"
3021 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3022 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3023 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3024 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3025 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3026 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3027 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3028 "+ ITSsddBTBmainAxis");
3030 if(GetDebug(3)){// Remove compiler warning.
3031 base1->InspectShape();
3032 base2->InspectShape();
3033 side->InspectShape();
3034 hole->InspectShape();
3035 mainAxis->InspectShape();
3036 round1->InspectShape();
3037 round2->InspectShape();
3040 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3041 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3043 carbonFiberLadderStruct);
3045 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3046 return vBaseThermalBridge;
3050 //________________________________________________________________________
3051 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3053 // Return an assembly containing a end of a CF ladder.
3056 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3057 TGeoMedium *stesalite = GetMedium("G10FR4$");
3058 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3059 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3061 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3062 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3063 Double_t underSegDH = fLay3LadderUnderSegDH;
3064 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3065 // footDZ is also where to place the ruby's center in local Z
3066 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3069 } else if (iLay==4) {
3070 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3071 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3072 underSegDH = fLay4LadderUnderSegDH;
3073 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3074 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3076 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3080 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3081 + underSegDH/2); //space under ladder segment
3082 // here tDY is not the same as for the segment because the end ladder
3083 // does not have a space under it, inside the general ladder volume.
3084 Double_t segmentLength = fgkSegmentLength;
3085 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3087 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3089 //**********************************
3090 // coding real matter :
3091 //**********************************
3092 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3093 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3094 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3095 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3097 //--- The 3 V shape corners of the Carbon Fiber Ladder
3099 TGeoArb8 *cfLaddTop1 = CreateLadderSide(topCornerLength/2., halfTheta, -1,
3100 fgkLadderLa, fgkLadderHa, fgkLadderl);
3101 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
3102 cfLaddTop1,carbonFiberLadderStruct);
3103 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3104 TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
3105 fgkLadderLa, fgkLadderHa, fgkLadderl);
3106 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3107 cfLaddTop2,carbonFiberLadderStruct);
3108 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3109 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3110 -(length-topCornerLength)/2.);
3111 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3112 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3115 TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
3116 fgkLadderLb, fgkLadderHb, fgkLadderl);
3117 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3118 cfLaddSide1,carbonFiberLadderStruct);
3119 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3120 TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
3121 fgkLadderLb, fgkLadderHb, fgkLadderl);
3122 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3123 cfLaddSide2,carbonFiberLadderStruct);
3124 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3125 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3126 TMath::Tan(beta) - fgkLadderBeamRadius );
3128 // because center of the triangle doesn't correspond to virtual vol. center
3129 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3130 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3131 alpha*TMath::RadToDeg());
3132 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3133 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3134 -alpha*TMath::RadToDeg());
3135 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3136 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3137 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3138 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3139 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3142 // Beams on the sides
3143 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3144 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3146 //Euler rotation : about Z, then new X, then new Z
3147 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3148 -beamPhiPrime*TMath::RadToDeg(), -90);
3149 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3150 beamPhiPrime*TMath::RadToDeg(), -90);
3151 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3152 beamPhiPrime*TMath::RadToDeg(), -90);
3153 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3154 -beamPhiPrime*TMath::RadToDeg(), -90);
3155 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3156 TMath::Tan(halfTheta),
3157 fgkLadderBeamRadius/2. + tDY,
3158 -length/2 + segmentLength/8, beamRot1);
3159 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3160 TMath::Tan(halfTheta),
3161 fgkLadderBeamRadius/2.+tDY,
3162 -length/2 + 3*segmentLength/8, beamRot2);
3163 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3164 TMath::Tan(halfTheta),
3165 fgkLadderBeamRadius/2.+tDY,
3166 -length/2 + segmentLength/8, beamRot3);
3167 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3168 TMath::Tan(halfTheta),
3169 fgkLadderBeamRadius/2. + tDY,
3170 -length/2+3*segmentLength/8, beamRot4);
3172 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3173 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3174 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3175 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3177 //--- Beams of the bottom
3178 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3180 /* Not there actually
3181 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3182 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3183 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3184 bottomBeam1, carbonFiberLadderStruct);
3185 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3187 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3188 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3189 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3190 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3192 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3193 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3194 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3195 bottomBeam2, carbonFiberLadderStruct);
3196 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3197 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3198 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3199 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3201 //**********************************
3202 //the cooling pipe supports
3203 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3204 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3206 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3207 (triangleHeight+triangleCPaxeDist/
3208 TMath::Sin(halfTheta)-coolPipeSuppH);
3210 if (fAddCoolingSyst) {
3211 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3212 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3213 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3214 -fgkLadderHeight/2.+ tDY +
3215 coolPipeSuppH+fgkLadderBeamRadius,
3216 -length/2., rotCPS1);
3217 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3218 -fgkLadderHeight/2.+ tDY +
3219 coolPipeSuppH+fgkLadderBeamRadius,
3220 -length/2., rotCPS2);
3222 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3223 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3226 //**********************************
3227 //--- The stesalite foot of the ladder
3229 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3230 - fgkLadFootY/2+fgkLadFingerPrintY;
3232 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3233 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3235 //=====================================
3238 if (fAddCoolingSyst) {
3240 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3241 -fgkLadderHeight/2.+ tDY +
3242 coolPipeSuppH + fgkLadderBeamRadius,
3243 -length/2.+coolPipeEndLen/2.);
3244 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3245 -fgkLadderHeight/2. + tDY +
3246 fgkLadderBeamRadius + coolPipeSuppH,
3247 -length/2.+coolPipeEndLen/2.);
3249 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3250 fgkCoolPipeOuterDiam/2,
3252 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3255 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3256 coolingPipeShape, phynoxSDD );
3257 coolingPipe->SetLineColor(fColorPhynox);
3258 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3261 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3262 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3264 virtualEnd->AddNode(cooler, 1, pipeTr1);
3265 virtualEnd->AddNode(cooler, 2, pipeTr2);
3269 //=====================================
3270 //--- HV cable guide
3273 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3274 fgkHVguideY1/2,fgkHVguideZ1/2);
3275 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3277 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3278 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3279 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3280 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3282 //=====================================
3284 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3285 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3286 -fgkLadderHeight/2.+ tDY +
3287 coolPipeSuppH+fgkLadderBeamRadius,
3288 -length/2.+coolPipeEndLen+raccordFullLen/2);
3289 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3290 -fgkLadderHeight/2.+ tDY +
3291 coolPipeSuppH+fgkLadderBeamRadius,
3292 -length/2.+coolPipeEndLen+raccordFullLen/2);
3294 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3295 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3297 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3302 //________________________________________________________________________
3303 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3305 //--- The stesalite foot of the ladder
3307 // The 2 screw holes on the left part
3308 // the small holes at each corner of the ruby cage (diam 2mm)
3309 // the really small level difference of 0.3mm on the bottom
3312 TGeoMedium *stesalite = GetMedium("G10FR4$");
3314 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3316 Double_t epsilon = 2e-10;
3317 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3319 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3320 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3321 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3322 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3324 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3325 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3326 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3329 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3330 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3332 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3333 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3334 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3336 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3337 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3338 rubyScrewHoleLen/2);
3340 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3341 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3342 fgkLadFootX/2-rubyScrewHoleLen/2,
3343 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3345 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3346 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3349 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3350 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3351 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3353 ladFootBox1Tr->RegisterYourself();
3354 ladFingerPrintTr->RegisterYourself();
3355 rubyCageHoleTr->RegisterYourself();
3356 rubyScrewHoleTr->RegisterYourself();
3357 rubyHoleTr->RegisterYourself();
3359 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3360 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3361 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3362 "+rubyHole:rubyHoleTr)");
3363 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3364 footRightPart,stesalite);
3365 vFootRightPart->SetLineColor(fColorStesalite);
3367 virtualFoot->AddNode(vFootRightPart, 1, 0);
3370 //--- This was the right part of the foot, now let's do the middle
3371 //--- and the right parts
3373 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3374 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3376 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3377 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3378 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3380 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3381 vFootMiddle->SetLineColor(fColorStesalite);
3382 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3385 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3386 (fgkLadFootY-fgkLadFingerPrintY)/2,
3388 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3389 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3390 -fgkLadFingerPrintY/2, 0);
3391 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3393 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3394 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3397 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3400 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3401 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3403 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3404 vFootLeft->SetLineColor(fColorStesalite);
3405 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3407 if(GetDebug(3)){ // Remove compiler warning.
3408 ladFingerPrint->InspectShape();
3409 ladFootBox1->InspectShape();
3410 rubyCageHole->InspectShape();
3411 rubyScrewHole->InspectShape();
3412 rubyHole->InspectShape();
3418 //________________________________________________________________________
3419 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3421 // return an assembly containing the CARLOS end-ladder board
3422 // and the heat bridge
3426 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3427 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3428 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3429 TGeoMedium *copper = GetMedium("COPPER$");
3430 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3431 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3433 //=========================================
3434 // cooling support of the Carlos card (HeatBridge):
3435 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3437 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3439 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3441 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3442 supCarlosBoard1, alCu12SDD);
3443 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3444 supCarlosBoard2, alCu12SDD);
3445 vSupCarlosBoard1->SetLineColor(4);
3446 vSupCarlosBoard2->SetLineColor(4);
3449 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3450 // shift of the main planes in the direction of their width
3451 // the center is fixed at the center of the 2 small fixing arms on each sides.
3454 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3455 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3456 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3457 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3459 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3460 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3463 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3467 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3468 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3470 //=========================================
3471 // fixing arm of the cooling support :
3472 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3474 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3475 supCarlosBoard3, alCu12SDD);
3476 vSupCarlosBoard3->SetLineColor(4);
3479 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3481 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3482 littleScrew, stainless);
3483 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3484 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3485 fgkLittleScrewHeadR-0.07, rotScrew);
3486 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3487 fgkLittleScrewHeadR+0.07, rotScrew);
3488 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3489 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3491 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3492 0, fgkCarlosSuppAngle, 0);
3493 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3494 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3495 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3496 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3497 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3498 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3501 //=========================================
3502 // screws fixing the board on the U tube
3503 Double_t aaa = fgkCarlosSuppY3; // ???
3504 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3505 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3506 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3507 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3508 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3509 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3511 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3513 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3514 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3515 screw1y,screw1z, CarlosSuppRot);
3517 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3518 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3519 screw1z,screw1y, CarlosSuppRot);
3521 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3522 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3523 screw1y,screw1z, CarlosSuppRot);
3525 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3526 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3527 screw1z,screw1y, CarlosSuppRot);
3529 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3530 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3531 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3532 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3534 //=========================================
3536 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3537 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3538 card1.SetNLayers(2);
3539 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3540 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3541 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3542 p1[0] = -fgkCarlosCardX1/2;
3543 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3544 p1[2] = fgkCarlosCardShift;
3545 p2[0] = fgkCarlosCardX1/2;
3546 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3547 p2[2] = fgkCarlosCardShift;
3548 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3549 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3550 card1.CreateAndInsertBoxCableSegment(1,90);
3552 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3553 card2.SetNLayers(2);
3554 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3555 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3556 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3558 p1[0] = -fgkCarlosCardX1/2;
3559 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3560 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3562 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3563 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3564 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3565 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3566 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3567 card2.CreateAndInsertBoxCableSegment(1,90);
3569 //=========================================
3570 // some chips on the board
3572 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3574 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3575 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3576 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3578 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3579 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3580 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3582 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3583 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3584 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3585 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3586 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3587 u1.CreateAndInsertBoxCableSegment(1,90);
3590 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3592 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3593 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3594 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3596 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3597 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3598 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3600 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3601 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3602 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3603 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3604 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3605 u2.CreateAndInsertBoxCableSegment(1,90);
3608 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3610 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3611 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3612 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3614 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3615 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3617 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3619 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3621 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3622 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3623 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3624 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3626 //--- U4 is like U3 (?)
3627 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3628 u4Trans->RotateX(90);
3629 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3630 fgkCarlosCardShift + fgkCarlosU4posZ);
3631 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3634 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3636 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3637 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3638 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3640 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3641 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3642 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3644 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3645 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3646 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3647 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3648 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3649 u17.CreateAndInsertBoxCableSegment(1,90);
3652 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3654 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3655 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3656 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3658 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3659 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3660 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3662 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3663 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3664 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3665 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3666 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3667 u35.CreateAndInsertBoxCableSegment(1,90);
3670 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3672 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3673 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3674 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3676 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3677 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3678 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3680 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3681 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3682 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3683 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3684 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3685 u36.CreateAndInsertBoxCableSegment(1,90);
3688 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3690 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3691 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3692 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3694 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3695 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3696 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3698 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3699 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3700 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3701 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3702 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3703 qz1.CreateAndInsertBoxCableSegment(1,90);
3705 return assemblySupCarlos;
3708 //________________________________________________________________________
3709 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3711 // Creates the assemblies containing the LV cards (left and right)
3714 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3715 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3716 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3717 TGeoMedium *copper = GetMedium("COPPER$");
3718 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3719 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3721 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3722 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3724 // we are going to use flat cable class to create multilayer box,
3725 // then we can use the pointers to created volumes to place them elsewhere
3726 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3728 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3729 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3730 cardLV.SetNLayers(2);
3731 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3732 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3733 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3735 p1[1] = fgkLVcardY/2;
3738 p2[1] = fgkLVcardY/2;
3740 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3741 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3742 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3743 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3744 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3745 fCardLVR->AddNode(boxVol, 1, trCard);
3747 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3748 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3749 chipO.SetNLayers(2);
3750 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3751 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3752 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3753 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3754 p1[1] = fgkLVChip0PosY;
3755 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3757 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3758 p2[1] = fgkLVChip0PosY;
3759 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3760 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3761 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3762 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3763 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3765 carLVfullThick/2+chip0fullThick/2, rotAdd);
3766 fCardLVR->AddNode(boxVol, 1, trCard);
3768 // put also this chip on the other side of the card
3769 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3771 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3772 fCardLVL->AddNode(boxVol, 2, trCard);
3773 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3775 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3776 fCardLVR->AddNode(boxVol, 2, trCard);
3778 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3779 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3780 chip1.SetNLayers(2);
3781 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3782 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3783 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3784 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3785 p1[1] = fgkLVChip1PosY;
3786 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3788 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3789 p2[1] = fgkLVChip1PosY;
3790 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3791 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3792 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3793 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3794 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3796 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3797 fCardLVR->AddNode(boxVol, 1, trCard);
3799 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3800 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3801 chip2.SetNLayers(2);
3802 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3803 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3804 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3805 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3806 p1[1] = fgkLVChip2PosY;
3807 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3808 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3809 p2[1] = fgkLVChip2PosY;
3810 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3811 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3812 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3813 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3814 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3816 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3817 fCardLVR->AddNode(boxVol, 1, trCard);
3819 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3820 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3821 chip3.SetNLayers(2);
3822 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3823 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3824 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3825 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3826 p1[1] = fgkLVChip3PosY;
3827 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3828 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3829 p2[1] = fgkLVChip3PosY;
3830 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3831 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3832 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3833 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3834 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3836 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3837 fCardLVR->AddNode(boxVol, 1, trCard);
3839 // the Al pieces for heat exchange :
3840 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3841 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3843 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3844 (fgkLVcoolX1/2+fgkLVcoolX2),
3845 fgkLVcoolPosY+fgkLVcoolY1/2,
3846 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3847 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3848 (fgkLVcoolX1/2+fgkLVcoolX2),
3849 fgkLVcoolPosY+fgkLVcoolY1/2,
3850 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3852 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3854 vAlLVcooling1->SetLineColor(2);
3857 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3858 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3859 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3861 fgkLVcoolPosY+fgkLVcoolY1/2,
3862 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3863 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3865 fgkLVcoolPosY+fgkLVcoolY1/2,
3866 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3868 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3870 vAlLVcooling2->SetLineColor(2);
3873 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3875 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3876 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3877 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3879 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3881 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3882 vAlLVcooling3->SetLineColor(2);
3884 //=== screw fixing th LV card to the U cooling tube :
3885 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3887 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3888 littleScrew, stainless);
3889 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3891 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3893 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3895 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3896 0, fgkLittleLVScrewHeadR,
3897 fgkLittleScrewHeadH/2);
3898 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3899 littleScrewHead, stainless);
3900 vLittleScrewHead->SetLineColor(kGray);
3901 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3902 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3903 fgkShiftLittleScrewLV,
3905 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3907 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3908 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3909 fgkShiftLittleScrewLV,
3911 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3913 // adding the cooling pieces to the left card
3914 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3915 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3916 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3917 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3918 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3920 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3921 -(fgkLVcoolX1/2+fgkLVcoolX2),
3922 fgkLVcoolPosY+fgkLVcoolY1/2,
3923 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3924 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3925 -(fgkLVcoolX1/2+fgkLVcoolX2),
3926 fgkLVcoolPosY+fgkLVcoolY1/2,
3927 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3928 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3930 fgkLVcoolPosY+fgkLVcoolY1/2,
3931 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3932 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3934 fgkLVcoolPosY+fgkLVcoolY1/2,
3935 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3937 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3939 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3941 // and to the right card
3942 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3943 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3944 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3945 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3946 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3951 //________________________________________________________________________
3952 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3954 // return an assembly containing the HV card
3958 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3959 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3960 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3961 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3962 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3963 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3965 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3967 //====================================
3968 //--- the card itself
3969 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
3970 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
3971 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
3972 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
3974 highVCard->AddNode(vCeramicCard, 1, 0);
3977 //====================================
3981 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
3982 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
3983 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
3986 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
3987 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
3988 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
3990 vCapa1End->SetLineColor(18);// grey silver
3991 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
3992 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3993 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
3994 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3996 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
3997 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
3998 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4000 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
4001 capa1->AddNode(vCapa1Middle, 1,0);
4002 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4003 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4005 highVCard->AddNode(capa1, 1, capa1PosTr);
4008 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4009 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4010 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4013 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4014 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4015 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4017 vCapa2End->SetLineColor(18);// grey silver
4018 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4019 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4020 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4021 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4023 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4024 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4025 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4027 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4028 capa2->AddNode(vCapa2Middle, 1,0);
4029 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4030 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4032 highVCard->AddNode(capa2, 1, capa2PosTr);
4035 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4036 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4037 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4040 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4041 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4042 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4044 vCapa3End->SetLineColor(18);// grey silver
4046 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4047 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4048 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4049 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4051 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4052 capa3->AddNode(vCapa3Middle, 1,0);
4053 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4054 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4056 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4057 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4058 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4060 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4061 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4062 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4064 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4065 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4066 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4068 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4069 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4070 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4072 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4073 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4074 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4076 highVCard->AddNode(capa3, 1, capa3PosTr1);
4077 highVCard->AddNode(capa3, 2, capa3PosTr2);
4078 highVCard->AddNode(capa3, 3, capa3PosTr3);
4079 highVCard->AddNode(capa3, 4, capa3PosTr4);
4080 highVCard->AddNode(capa3, 5, capa3PosTr5);
4082 //====================================
4083 //--- connexions to LV card
4085 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4086 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4087 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4088 Double_t fgkConnexLVHVx = 3*fgkmm;
4089 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4090 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4092 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4093 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4094 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4095 fgkConnexLVHVdiam1/2,
4096 fgkConnexLVHVdiam2/2,
4097 fgkConnexLVHVlen/2);
4098 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4099 connexLVHVmetal, stainless);
4100 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4101 connexLVHVplastic, plastic);
4102 vConnexLVHVmetal->SetLineColor(10);// white
4103 vConnexLVHVplast->SetLineColor(12); // dark grey
4105 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4106 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4107 connexion->AddNode(vConnexLVHVplast, 1, 0);
4109 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4110 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4111 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4112 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4114 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4115 fgkConnexLVHVy1+fgkConnexLVHVdy,
4116 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4117 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4118 fgkConnexLVHVy1+fgkConnexLVHVdy,
4119 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4121 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4122 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4123 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4124 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4125 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4126 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4128 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4129 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4130 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4131 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4132 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4133 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4135 highVCard->AddNode(connexion, 1, trConnexion1);
4136 highVCard->AddNode(connexion, 2, trConnexion2);
4137 highVCard->AddNode(connexion, 3, trConnexion3);
4138 highVCard->AddNode(connexion, 4, trConnexion4);
4139 highVCard->AddNode(connexion, 5, trConnexion5);
4140 highVCard->AddNode(connexion, 6, trConnexion6);
4141 highVCard->AddNode(connexion, 7, trConnexion7);
4142 highVCard->AddNode(connexion, 8, trConnexion8);
4144 //====================================
4145 //--- cooling pieces
4147 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4148 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4151 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4152 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4154 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4155 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4157 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4159 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4161 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4163 // This last volume contains the screw used for fixing
4164 // the card to the cooling tube ...
4165 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4167 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4168 littleScrewHV, stainless);
4170 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4171 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4173 vCardHVcool1->SetLineColor(2); //red
4174 vCardHVcool2->SetLineColor(2); //red
4175 vCardHVcool3->SetLineColor(2); //red
4177 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4178 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4179 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4180 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4181 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4182 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4183 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4184 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4186 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4187 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4189 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4190 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4191 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4192 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4194 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4195 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4196 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4197 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4199 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4200 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4202 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4203 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4204 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4205 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4207 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4208 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4209 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4210 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4212 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4213 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4215 //====================================
4217 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4218 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4219 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4220 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4222 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4223 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4224 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4225 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4228 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4229 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4235 //________________________________________________________________________
4236 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4238 // return an assembly containing the LV, HV and Carlos cards of one ladder
4239 // and their cooling system
4242 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4243 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4244 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4246 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4248 //=*********************************
4249 //--- The rounded pipe for the end ladder card coooling
4251 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4252 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4256 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4257 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4261 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4262 endLadderPipe.SetNLayers(2);
4263 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4264 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4266 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4267 // of the U colling pipe in its center
4269 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4270 Double_t vectA[3] = {0,0,1};
4272 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4273 Double_t vectB[3] = {0,0,1};
4275 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4276 Double_t vectC[3] = {1,0,0};
4278 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4279 Double_t vectD[3] = {-1,0,0};
4281 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4282 Double_t vectE[3] = {0,0,-1};
4284 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4285 Double_t vectF[3] = {0,0,-1};
4287 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4288 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4289 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4290 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4291 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4292 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4294 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4295 //endLadderPipe.CreateAndInsertCableSegment( 1);
4296 endLadderPipe.CreateAndInsertTubeSegment( 1);
4297 //endLadderPipe.CreateAndInsertCableSegment( 2);
4298 endLadderPipe.CreateAndInsertTorusSegment( 2);
4299 //endLadderPipe.CreateAndInsertCableSegment( 3);
4300 endLadderPipe.CreateAndInsertTubeSegment( 3);
4301 //endLadderPipe.CreateAndInsertCableSegment( 4);
4302 endLadderPipe.CreateAndInsertTorusSegment( 4);
4303 //endLadderPipe.CreateAndInsertCableSegment( 5);
4304 endLadderPipe.CreateAndInsertTubeSegment( 5);
4306 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4307 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4308 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4309 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4311 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4312 - fgkEndLadPipeArmBoxDX,
4313 fgkEndLadPipeArmBoxDY,0);
4314 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4315 fgkEndLadPipeArmBoxDX,
4316 fgkEndLadPipeArmBoxDY,0);
4317 endLadPipeArmBoxDY1->RegisterYourself();
4318 endLadPipeArmBoxDY2->RegisterYourself();
4320 if(GetDebug(3)) { // Remove compiler warning.
4321 endLadPipeArmBox->InspectShape();
4322 endLadPipeArmTube->InspectShape();
4325 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4326 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4327 "- endLadPipeArmTube");
4328 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4329 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4330 "- endLadPipeArmTube");
4332 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4333 endLadPipeArm1, alCu12SDD);
4334 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4335 endLadPipeArm2, alCu12SDD);
4336 vEndLadPipeArm1->SetLineColor(2);
4337 vEndLadPipeArm2->SetLineColor(2);
4339 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4340 +fgkEndLadPipeArmZpos);
4342 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4343 -fgkEndLadPipeUwidth/2,0,armZ);
4344 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4345 fgkEndLadPipeUwidth/2,0,armZ);
4347 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4348 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4350 //=*********************************
4352 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4353 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4355 Double_t spaceBetweenCards = 0.2*fgkmm;
4357 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4358 +fgkEndLadPipeArmBoxDX);
4359 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4360 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4362 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4365 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4366 +coolUzPos+1.25*fgkmm;
4367 // Position in z of the first LVB with respect to the start of the cooling
4368 // rectangular arm, coming (from inside of the ladder)
4369 // The cards are added one after the other
4371 for (Int_t iCard=0; iCard<nCards; iCard++) {
4373 Double_t cardLVzShift = firstLVCardZ +
4374 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4376 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4377 cardLVyShift, cardLVzShift);
4378 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4379 cardLVyShift, cardLVzShift);
4381 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4382 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4385 //=*********************************
4387 TGeoVolumeAssembly *cardHV = fCardHV;
4389 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4390 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4392 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4393 -(fgkHVCardCeramZ)/2);
4395 for (Int_t iCard=0; iCard<nCards; iCard++) {
4397 Double_t fact = iCard*2.+1.;
4398 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4399 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4400 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4401 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4404 //=*********************************
4407 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4408 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4409 // 0, -fgkCarlosSuppAngle, 0);
4411 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4412 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4413 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4414 // position in z of the first Carlos board, coming from inside of the ladder
4416 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4417 fgkEndLadPipeArmBoxDY);
4419 for (Int_t iCard=0; iCard<nCards; iCard++) {
4421 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4422 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4423 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4424 (TGeoRotation*) fCommonTr[0]);
4426 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4429 return endLadderCards;
4433 //________________________________________________________________________
4434 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4436 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4437 // and their cooling system
4438 // This is the code actually used for the end ladder cards
4441 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4442 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4443 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4444 TGeoMedium *copper = GetMedium("COPPER$");
4445 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4446 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4447 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4449 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4450 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4452 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4453 // reference radius corresponding to local y=0
4456 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4457 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4459 rREF = fgkEndLaddCardsShortRadiusLay4;
4462 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4463 +fgkEndLadPipeArmBoxDX);
4464 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4465 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4467 Double_t rMin = rREF + cardLVyShift;
4468 // (The LV card is defining rMin because it is the lower object)
4470 Double_t thickTotCable = 0.5;
4472 //==================================
4473 //--- The Pcon container
4475 // minimum angle of the Pcon :
4476 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4477 (rREF-fgkEndLadPipeArmY/2) );
4478 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4479 Double_t phi0 = 90-dphi/2;
4480 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4481 // of the U colling pipe in its center
4482 Double_t zMax = endLadPipeUlength+coolUzPos;
4483 Double_t rMax = rMin + fgkLVcardY;
4484 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4485 Double_t cablesRadius = rMax-0.5;
4487 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4488 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4489 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4490 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4491 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4492 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4493 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4494 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4495 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4496 // the following is quite dirty but works for the moment ...
4497 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4498 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4500 // The next parameters define the shape of the Pcon at its end and where cables
4502 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4503 Double_t cableSectionR2 = rMax;
4504 Double_t cableSectionZ1 = zMax + 6.3*fgkmm + 2.5*fgkcm;
4505 Double_t cableSectionZ2 = zMax + 7.3*fgkmm + 4*fgkcm;
4506 // Those 6.3 and 7.3 are to be fixed to stick the maximum to the SDD cone
4507 // (I'm waiting for the new cone)
4509 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4510 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4512 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4513 //endLadderCards->SetVisibility(kFALSE);
4515 //=*********************************
4516 //--- The rounded pipe for the end ladder card cooling
4518 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4519 endLadderPipe.SetNLayers(2);
4520 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4521 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4523 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4524 Double_t vectA[3] = {0,0,1};
4526 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4527 Double_t vectB[3] = {0,0,1};
4529 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4530 Double_t vectC[3] = {1,0,0};
4532 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4533 Double_t vectD[3] = {-1,0,0};
4535 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4536 Double_t vectE[3] = {0,0,-1};
4538 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4539 Double_t vectF[3] = {0,0,-1};
4541 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4542 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4543 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4544 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4545 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4546 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4548 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4549 //endLadderPipe.CreateAndInsertCableSegment( 1);
4550 endLadderPipe.CreateAndInsertTubeSegment( 1);
4551 //endLadderPipe.CreateAndInsertCableSegment( 2);
4552 endLadderPipe.CreateAndInsertTorusSegment( 2);
4553 //endLadderPipe.CreateAndInsertCableSegment( 3);
4554 endLadderPipe.CreateAndInsertTubeSegment( 3);
4555 //endLadderPipe.CreateAndInsertCableSegment( 4);
4556 endLadderPipe.CreateAndInsertTorusSegment( 4);
4557 //endLadderPipe.CreateAndInsertCableSegment( 5);
4558 endLadderPipe.CreateAndInsertTubeSegment( 5);
4560 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4561 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4562 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4563 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4565 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4566 - fgkEndLadPipeArmBoxDX,
4567 fgkEndLadPipeArmBoxDY,0);
4568 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4569 fgkEndLadPipeArmBoxDX,
4570 fgkEndLadPipeArmBoxDY,0);
4571 endLadPipeArmBoxDY1->RegisterYourself();
4572 endLadPipeArmBoxDY2->RegisterYourself();
4574 if(GetDebug(3)) { // Remove compiler warning.
4575 endLadPipeArmBox->InspectShape();
4576 endLadPipeArmTube->InspectShape();
4579 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4580 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4581 "- endLadPipeArmTube");
4582 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4583 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4584 "- endLadPipeArmTube");
4586 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4587 endLadPipeArm1, alCu12SDD);
4588 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4589 endLadPipeArm2, alCu12SDD);
4590 vEndLadPipeArm1->SetLineColor(2);
4591 vEndLadPipeArm2->SetLineColor(2);
4593 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4594 +fgkEndLadPipeArmZpos);
4596 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4597 -fgkEndLadPipeUwidth/2,rREF,armZ);
4598 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4599 fgkEndLadPipeUwidth/2,rREF,armZ);
4601 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4602 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4604 //=*********************************
4606 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4607 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4609 Double_t spaceBetweenCards = 0.2*fgkmm;
4612 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4615 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4616 +coolUzPos+1.25*fgkmm;
4617 // Position in z of the first LVB with respect to the start of the cooling
4618 // rectangular arm, coming (from inside of the ladder)
4619 // The cards are added one after the other
4621 for (Int_t iCard=0; iCard<nCards; iCard++) {
4623 Double_t cardLVzShift = firstLVCardZ +
4624 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4626 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4627 cardLVyShift+rREF, cardLVzShift);
4628 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4629 cardLVyShift+rREF, cardLVzShift);
4631 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4632 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4635 //=*********************************
4637 TGeoVolumeAssembly *cardHV = fCardHV;
4639 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4640 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4641 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4643 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4644 -(fgkHVCardCeramZ)/2);
4646 for (Int_t iCard=0; iCard<nCards; iCard++) {
4648 Double_t fact = iCard*2.+1.;
4649 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4650 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4651 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4652 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4655 //=*********************************
4658 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4659 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4660 // 0, -fgkCarlosSuppAngle, 0);
4662 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4663 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4664 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4665 // position in z of the first Carlos board, coming from inside of the ladder
4667 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4668 fgkEndLadPipeArmBoxDY);
4670 for (Int_t iCard=0; iCard<nCards; iCard++) {
4672 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4673 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4674 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4675 (TGeoRotation*) fCommonTr[0]);
4677 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4681 //=*********************************
4685 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4686 + fgkSectionGlassPerMod)*nCards;
4687 // We fix thickness, then width is calculated accordingly
4688 Double_t width = sectionV/thickTotCable;
4689 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4690 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4691 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4692 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4693 Double_t thickGlass = thickTotCable - thickCu - thickPlast;
4695 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4696 cable.SetNLayers(3);
4697 cable.SetLayer(0, thickCu, copper, kRed);
4698 cable.SetLayer(1, thickPlast, plastic, kYellow);
4699 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4701 Double_t zVect[3]={0,0,1};
4702 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4703 +spaceBetweenCarlsoCards)/2 + 2.9;
4704 // the 2.9cm is for taking into account carlos card angle...
4706 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4707 cableSectionR2,cableSectionZ1,cableSectionZ2);
4709 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4710 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4711 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4712 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4713 cable.SetInitialNode(endLadderCards);
4714 cable.CreateAndInsertCableSegment(1);
4716 return endLadderCards;
4719 //________________________________________________________________________
4720 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4722 // return an assembly of the support rings, attaching the ladders to the cone
4728 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4729 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4732 //**********************************
4735 Double_t fgkRubyCageX = 9*fgkmm;
4736 Double_t fgkRubyCageY = 5.5*fgkmm;
4737 Double_t fgkRubyCageZ = 8*fgkmm;
4738 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4739 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4740 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4741 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4742 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4744 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4747 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4749 // pieces common to both square and V cages
4750 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4751 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4753 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4754 fgkRubyCageHoleDX/2+epsilon);
4756 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4757 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4758 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4759 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4760 trScrewHole->RegisterYourself();
4762 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4763 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4764 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4765 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4766 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4767 trScrewHoleFoot->RegisterYourself();
4770 // pieces which differ
4771 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4773 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4774 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4776 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4777 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4778 trRubyCageVInternBox->RegisterYourself();
4780 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4781 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4782 fgkRubyCageInternSide/4);
4784 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4785 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4786 +epsilon,0,0, rotV );
4787 trRubyCageVInternTriangl->RegisterYourself();
4790 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4791 "rubyCageBox-(rubyCageInternBox"
4792 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4794 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4795 rubyCageSquare, stainless);
4796 vRubyCageSquare->SetLineColor(10);
4798 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4799 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4800 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4801 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4802 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4803 vRubyCageV->SetLineColor(10);
4805 if(GetDebug(3)) { // Remove compiler warning.
4806 rubyCageBox->InspectShape();
4807 rubyCageInternBox->InspectShape();
4808 screwHole->InspectShape();
4809 screwHoleFoot->InspectShape();
4810 rubyCageVInternBox->InspectShape();
4811 rubyCageVInternTriangl->InspectShape();
4814 supportRing->AddNode(vRubyCageSquare, 0, 0);
4815 //supportRing->AddNode(vRubyCageV, 0, 0);
4821 //________________________________________________________________________
4822 void AliITSv11GeometrySDD::CreateSDDsensor() {
4824 // return a box containing the SDD sensor
4827 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4828 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4829 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4830 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4831 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4832 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4835 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4836 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4837 // width : in the beam direction !
4839 Double_t sensoxBoxLength = ( fgkWaferLength +
4840 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4841 // Makes life easier to include the space for the WA HV cable on both sides
4842 Double_t sensoxBoxThick = fgkWaferThickness +
4843 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4845 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4846 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4848 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4849 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4851 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4852 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4855 //****************************
4857 //****************************
4859 // we need 2 different sensor objects, because they have to have different names
4860 // This is required for the step manager
4862 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4863 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4866 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4867 wafer3->SetLineColor(fColorSilicon);
4868 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4869 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4870 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4871 sensVol3->SetLineColor(fColorSilicon+5);
4872 wafer3->AddNode(sensVol3, 1, 0);
4873 fSDDsensor3->AddNode(wafer3, 1, 0);
4875 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4876 wafer4->SetLineColor(fColorSilicon);
4877 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4878 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4879 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4880 sensVol4->SetLineColor(fColorSilicon+5);
4881 wafer4->AddNode(sensVol4, 1, 0);
4882 fSDDsensor4->AddNode(wafer4, 1, 0);
4885 //****************************
4887 //****************************
4888 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4889 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4890 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4891 vGlass->SetLineColor(fColorGlass);
4892 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4893 fgkWaferThickness/2+fgkSensorGlassLY/2,
4894 fgkGlassDZOnSensor);
4895 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4896 fgkWaferThickness/2+fgkSensorGlassLY/2,
4897 fgkGlassDZOnSensor);
4898 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4899 fgkWaferThickness/2+fgkSensorGlassLY/2,
4900 -fgkGlassDZOnSensor);
4901 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4902 fgkWaferThickness/2+fgkSensorGlassLY/2,
4903 -fgkGlassDZOnSensor);
4904 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4905 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4906 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4907 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4909 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4910 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4911 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4912 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4914 //****************************
4915 // Wrap-around cable
4916 //****************************
4918 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4919 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4920 waHVCable.SetNLayers(2);
4921 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4922 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4923 waHVCable.SetInitialNode(fSDDsensor3);
4925 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4926 x1[0] = -fgkWaHVcableLength/2;
4928 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4930 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4933 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4934 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4935 TGeoCombiTrans *ctSegment = 0;
4936 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4937 fSDDsensor4->AddNode(segment, 1, ctSegment);
4941 waHVCable.SetName("ITSsddWaHVCableD");
4942 waHVCable.ResetPoints();
4943 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4944 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4945 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
4946 fSDDsensor4->AddNode(segment, 1, ctSegment);
4948 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
4950 waHVCableFold.SetPhi(180,360);
4951 waHVCableFold.SetNLayers(2);
4952 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
4953 polyhamideSDD, fColorPolyhamide);
4954 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4955 waHVCableFold.SetInitialNode(fSDDsensor3);
4958 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
4960 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4961 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4962 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
4963 fSDDsensor4->AddNode(segment, 1, ctSegment);
4966 //****************************
4968 //****************************
4969 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
4970 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
4971 /(2.*fgkTransitHVHeadLZ);
4972 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
4973 headRadius-fgkTransitHVHeadLZ)
4976 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
4977 fgkTransitHVPolyThick/2,
4979 headPoly->SetName("headPoly");
4980 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
4981 -fgkTransitHVPolyThick/2);
4982 headPolyTr->SetName("headPolyTr");
4983 headPolyTr->RegisterYourself();
4985 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
4986 fgkTransitHVAlThick/2,
4988 headAl->SetName("headAl");
4989 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
4990 -fgkTransitHVPolyThick
4991 -fgkTransitHVAlThick/2);
4992 headAlTr->SetName("headAlTr");
4993 headAlTr->RegisterYourself();
4995 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
4996 (headRadius-fgkTransitHVHeadLZ)/2,
4997 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
4998 cache->SetName("cache");
5000 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5001 (headRadius-fgkTransitHVHeadLZ)/2,
5002 -(fgkTransitHVPolyThick
5003 +fgkTransitHVAlThick)/2);
5004 headCacheTr->SetName("cacheTr");
5005 headCacheTr->RegisterYourself();
5007 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5008 "headPoly:headPolyTr-cache:cacheTr");
5009 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5010 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5011 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5012 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5013 "headAl:headAlTr-cache:cacheTr");
5014 TGeoVolume *vHeadAlComp = new TGeoVolume(
5015 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5016 vHeadAlComp->SetLineColor(fColorAl);
5019 // TGeoRotation rotHead("",0,90,0);
5020 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5021 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5023 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5024 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5025 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5028 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5029 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5030 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5031 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5034 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5035 fgkTransitHVBondingLZ,
5036 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5037 transitHVCable.SetNLayers(2);
5038 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5040 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5041 transitHVCable.SetInitialNode(fSDDsensor3);
5043 x1[0] = -fgkTransitHVHeadLX/2;
5045 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5049 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5050 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5051 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5052 fSDDsensor4->AddNode(segment, 1, ctSegment);
5054 transitHVCable.ResetPoints();
5055 transitHVCable.SetName("ITSsddHVtransitTail");
5056 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5057 x1[0] = fgkTransitHVtailXpos;
5058 x2[0] = fgkTransitHVtailXpos;
5059 x1[2] = -fgkTransitHVBondingLZ/2;
5060 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5061 Double_t vZ[3] = {0,0,1};
5062 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5063 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5064 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5065 fSDDsensor4->AddNode(segment, 1, ctSegment);
5068 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5069 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5070 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5071 fgkTransitHVsideLZ);
5072 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5073 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5074 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5075 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5076 fgkTransitHVsideLZ);
5077 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5078 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5080 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5081 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5082 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5083 fgkTransitHVsideLZ);
5084 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5085 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5086 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5087 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5088 fgkTransitHVsideLZ);
5089 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5090 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5092 // sideRight is not there actually
5093 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5094 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5095 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5096 // fgkTransitHVsideLZ);
5097 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5098 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5099 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5100 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5101 // fgkTransitHVsideLZ);
5102 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5103 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5105 // TGeoRotation rotSide("",0,-90,0);
5106 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5107 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5108 // -fgkTransitHVBondingLZ/2,&rotSide);
5109 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5110 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5111 // -fgkTransitHVBondingLZ/2, &rotSide);
5112 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5113 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5114 // -fgkTransitHVBondingLZ/2, &rotSide);
5115 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5116 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5117 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5118 // -fgkTransitHVBondingLZ/2,rotSide);
5119 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5120 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5121 -fgkTransitHVBondingLZ/2, rotSide);
5122 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5123 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5124 -fgkTransitHVBondingLZ/2, rotSide);
5126 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5127 sideLeft,polyhamideSDD);
5128 vSideLeft->SetLineColor(fColorPolyhamide);
5129 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5131 vSideLeftAl->SetLineColor(fColorAl);
5133 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5134 // sideRight,polyhamideSDD);
5135 // vSideRight->SetLineColor(fColorPolyhamide);
5137 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5138 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5139 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5141 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5142 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5143 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5146 //****************************
5148 fSDDsensor3->CheckOverlaps(0.01);
5149 fSDDsensor4->CheckOverlaps(0.01);
5152 fSDDsensor3->SetVisibility(kFALSE);
5153 fSDDsensor4->SetVisibility(kFALSE);
5157 //________________________________________________________________________
5158 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5160 // return a box volume containing the detectors
5163 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5165 Int_t nDetectors = fgkLay3Ndet;
5166 Double_t ladderLength = fgkLay3LadderLength;
5167 Double_t *sensorZPos = fLay3sensorZPos;
5171 nDetectors = fgkLay4Ndet;
5172 ladderLength = fgkLay4LadderLength;
5173 sensorZPos = fLay4sensorZPos;
5175 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5179 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5180 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5182 sprintf(name,"ITSsddDetBox%i",iLay);
5183 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5184 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5185 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5187 for (Int_t i=0; i<nDetectors; i++) {
5188 Double_t localZ = sensorZPos[i];
5189 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5190 if (iLay==3) if (i%2!=0) localY = -localY;
5191 if (iLay==4) if (i%2==0) localY = -localY;
5192 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5194 if (i >= nDetectors/2) {
5195 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5196 sensorPos->SetName(name);
5197 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5200 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5201 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5203 sensorPos->SetName(name);
5204 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5208 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5209 virtualDet->SetVisibility(kFALSE);
5214 //________________________________________________________________________
5215 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5217 // return a box volume containing the detectors
5220 Int_t nDetectors = fgkLay3Ndet;
5221 Double_t ladderLength = fgkLay3LadderLength;
5222 Double_t *sensorZPos = fLay3sensorZPos;
5223 TGeoVolume *sensorSDD = fSDDsensor3;
5227 nDetectors = fgkLay4Ndet;
5228 ladderLength = fgkLay4LadderLength;
5229 sensorZPos = fLay4sensorZPos;
5230 sensorSDD = fSDDsensor4;
5232 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5236 sprintf(name,"ITSsddDetBox%i",iLay);
5238 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5240 for (Int_t i=0; i<nDetectors; i++) {
5241 Double_t localZ = sensorZPos[i];
5242 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5243 if (iLay==3) if (i%2!=0) localY = -localY;
5244 if (iLay==4) if (i%2==0) localY = -localY;
5245 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5247 if (i >= nDetectors/2) {
5248 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5249 sensorPos->SetName(name);
5250 virtualDet->AddNode(sensorSDD, i, sensorPos);
5253 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5254 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5256 sensorPos->SetName(name);
5257 virtualDet->AddNode(sensorSDD, i, sensorPos);
5261 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5266 //________________________________________________________________________
5267 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5270 // export the geometry in a AliITSgeom object
5275 printf("error:Try to fill null (AliITSgeom *) object");
5279 printf("error:Try to set sensor geometry while geometry is not defined\n");
5283 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5284 fgkWaferLengthSens/2.};
5285 if(!(geom->IsShapeDefined(kSDD)))
5286 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5289 char ladderName[30];
5290 char sensorName[30];
5291 char senstivName[30];
5292 const Int_t kNLay = 2;
5293 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5294 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5297 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5299 Int_t firstSDDmod = startMod;
5300 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5301 /////////////////////////////////////////
5302 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5303 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5305 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5306 TGeoVolume *layVolume = layNode->GetVolume();
5307 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5309 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5310 /////////////////////////////////////////
5311 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5312 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5314 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5315 TGeoVolume *laddVolume = laddNode->GetVolume();
5316 TGeoHMatrix laddMatrix(layMatrix);
5317 laddMatrix.Multiply(laddNode->GetMatrix());
5319 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5320 /////////////////////////////////////////
5321 sprintf(sensorName, "ITSsddSensor_%i",iDet);
5322 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5324 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5325 TGeoVolume *detVolume = detNode->GetVolume();
5326 TGeoHMatrix detMatrix(laddMatrix);
5327 detMatrix.Multiply(detNode->GetMatrix());
5329 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5331 TGeoVolume *wafVolume = wafNode->GetVolume();
5332 TGeoHMatrix wafMatrix(detMatrix);
5333 detMatrix.Multiply(wafNode->GetMatrix());
5334 //--------------------------------------------------------
5335 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5336 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5338 TGeoHMatrix sensMatrix(wafMatrix);
5339 sensMatrix.Multiply(sensitivNode->GetMatrix());
5341 // Sticking to the convention for local wafer coordinate
5343 if (iDet >= kNDet[iLay]/2) {
5344 // TGeoRotation rotY("",0,180,0);
5345 TGeoRotation rotY("",-180,-180,0);
5346 sensMatrix.Multiply(&rotY);
5348 // Creating the matrix in AliITSgeom for
5349 // this sensitive volume :
5350 Double_t *trans = sensMatrix.GetTranslation();
5351 Double_t *r = sensMatrix.GetRotationMatrix();
5352 Double_t rot[10] = {r[0],r[1],r[2],
5354 r[6],r[7],r[8], 1.0};
5355 //rot[9]!=0.0 => not a unity matrix
5356 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5358 // iLadd+1, iDet+1 because ladd. and det. start at +1
5363 printf("Error (ExportSensorGeometry) %s not found !\n",
5366 printf("Error (ExportSensorGeometry) %s not found !\n",
5369 printf("Error (ExportSensorGeometry) %s not found !\n",
5373 printf("Error (ExportSensorGeometry) %s not found !\n",
5377 printf("Error (ExportSensorGeometry) %s not found !\n",
5381 return (startMod-firstSDDmod);
5385 //________________________________________________________________________
5386 Int_t AliITSv11GeometrySDD::
5387 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5389 // Function which gives the layer, ladder and det.
5390 // index of the current volume. To be used in
5391 // AliITS::StepManager()
5394 if (gGeoManager->GetLevel()<3) return kFALSE;
5395 // Get the det index :
5396 TGeoNode *node = gGeoManager->GetMother(2);
5397 if (!node) return kFALSE;
5398 det = node->GetNumber()+1;
5400 // Get the ladder index :
5401 node = gGeoManager->GetMother(3);
5402 if (!node) return kFALSE;
5403 ladd = node->GetNumber()+1;
5405 // Get the layer index :
5406 if (node->GetNdaughters()==fgkLay3Ndet)
5407 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5414 //________________________________________________________________________
5415 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5416 Double_t r2max, Double_t z2,
5417 Double_t section, Int_t nDiv)
5419 // Creates a cone along z where the section is approximately constant
5420 // with z. This is for simulation of cables, because a cone with a constant
5421 // radius difference would show a quantity of matter increasing with z...
5422 // The max radius of the created Pcon is evolving linearly, the min radius
5423 // is calculated at several steps (nDiv).
5424 // z2 > z1 (required by the Pcon)
5426 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5428 Double_t dr = (r2max-r1max)/nDiv;
5429 Double_t dz = (z2-z1)/nDiv;
5430 Double_t r1minI, r2minI, r1maxI, r2maxI;
5433 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5434 Double_t cosAlpha = (z2-z1)/lZ;
5436 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5437 myPcon->DefineSection(0, z1, r1minI, r1max);
5439 for (Int_t i=0; i<nDiv; i++) {
5443 r1maxI = r1max + i*dr;
5444 r2maxI = r1maxI + dr;
5446 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5447 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5453 //________________________________________________________________________
5454 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5455 Double_t refZ1, Double_t refZ2) {
5456 // just a helping function
5457 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5460 //________________________________________________________________________
5461 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5462 Int_t nLay3, Int_t nLay4,
5463 Double_t r1, Double_t z1,
5464 Double_t r2, Double_t z2) {
5466 // Create some cables portions from SDD modules grouped
5467 // and attached at the border of the SSD cone
5469 TGeoMedium *copper = GetMedium("COPPER$");
5470 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
5471 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5473 char titleCable[30];
5474 sprintf(titleCable,"cableSDDport%i",(Int_t)angle);
5477 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5478 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5479 Double_t width = section/thickness;
5480 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5481 +fgkSectionGlassPerMod);
5483 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5484 +fgkSectionGlassPerMod);
5486 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5487 +fgkSectionGlassPerMod);
5489 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5490 Double_t cosAlpha = (z2-z1)/hypothenus;
5491 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5492 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5493 angle *= TMath::DegToRad();
5494 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5495 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5496 Double_t pos1[3] = {x1,y1,z1};
5497 Double_t pos2[3] = {x2,y2,z2};
5498 Double_t zVect[3] = {0,0,1};
5500 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5501 cable.SetNLayers(3);
5502 cable.SetLayer(0, thickPlast, plastic, kYellow);
5503 cable.SetLayer(1, thickCu, copper, kRed);
5504 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5506 cable.AddCheckPoint( mother, 0, pos1, zVect );
5507 cable.AddCheckPoint( mother, 1, pos2, zVect );
5508 cable.SetInitialNode(mother);
5509 cable.CreateAndInsertCableSegment(1);
5516 //________________________________________________________________________
5517 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth) {
5519 // Creates and inserts the SDD cables running on SDD and SSD cones
5521 TGeoMedium *copper = GetMedium("COPPER$");
5522 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
5523 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5524 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5527 //==================================
5529 //==================================
5531 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5532 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5534 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5535 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5536 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5538 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5539 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5540 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5542 // calculate z1, z2 thanks to R1 and R2
5543 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, fgkConeSDDr1,fgkConeSDDr2,fgkConeSDDz1,fgkConeSDDz2);
5544 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, fgkConeSDDr1,fgkConeSDDr2,fgkConeSDDz1,fgkConeSDDz2);
5545 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, fgkConeSDDr1,fgkConeSDDr2,fgkConeSDDz1,fgkConeSDDz2);
5547 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5549 //==================================
5550 // first set of cones : cables from layer 3
5551 //==================================
5553 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5554 fgkSDDCableR2, sddCableZ2,
5555 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5557 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5558 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0), pcon1all->GetRmax(0));
5559 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5560 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax, pcon1all->GetRmax(1));
5562 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container", pcon1container, airSDD);
5563 vpcon1container->SetVisibility(kFALSE);
5565 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5566 fgkSDDCableR2, sddCableZ2,
5567 sectionLay3Plastic, 3);
5568 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast", pcon1plast, plastic);
5569 vpcon1plast->SetLineColor(kYellow);
5570 vpcon1container->AddNode(vpcon1plast, 0);
5572 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5573 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5574 fgkSDDCableR2 - dr1a, sddCableZ2,
5576 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu", pcon1Cu, copper);
5577 vpcon1Cu->SetLineColor(kRed);
5578 vpcon1container->AddNode(vpcon1Cu, 0);
5579 //moth->AddNode(vpcon1Cu, 0);
5582 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5583 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5584 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5585 sectionLay3Glass, 3);
5586 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass", pcon1glass, opticalFiber);
5587 vpcon1glass->SetLineColor(kGreen);
5588 vpcon1container->AddNode(vpcon1glass, 0);
5590 moth->AddNode(vpcon1container, 0);
5591 moth->AddNode(vpcon1container, 1, rotCableSDD);
5593 //==================================
5594 // 2nd set of cones : cables from layer 3 and layer 4
5595 //==================================
5597 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5598 fgkSDDCableR3, sddCableZ3,
5599 sectionLay3Plastic+sectionLay4Plastic+
5600 sectionLay3Cu+sectionLay4Cu+
5601 sectionLay3Glass+sectionLay4Glass, 1);
5602 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5603 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0), pcon2all->GetRmax(0));
5604 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5605 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax, pcon2all->GetRmax(1));
5607 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container", pcon2container, airSDD);
5608 vpcon2container->SetVisibility(kFALSE);
5610 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5611 fgkSDDCableR3, sddCableZ3,
5612 sectionLay3Plastic+sectionLay4Plastic, 3);
5613 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast", pcon2plast, plastic);
5614 vpcon2plast->SetLineColor(kYellow);
5615 vpcon2container->AddNode(vpcon2plast, 0);
5617 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5618 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5619 fgkSDDCableR3 - dr2a, sddCableZ3,
5620 sectionLay3Cu+sectionLay4Cu, 3);
5621 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu", pcon2Cu, copper);
5622 vpcon2Cu->SetLineColor(kRed);
5623 vpcon2container->AddNode(vpcon2Cu, 0);
5626 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5627 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5628 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5629 sectionLay3Glass+sectionLay4Glass, 3);
5630 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass", pcon2glass, opticalFiber);
5631 vpcon2glass->SetLineColor(kGreen);
5632 vpcon2container->AddNode(vpcon2glass, 0);
5634 moth->AddNode(vpcon2container, 0);
5635 moth->AddNode(vpcon2container, 1, rotCableSDD);
5637 //==================================
5638 // intermediate cylinder
5639 //==================================
5641 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl", pcon2container->GetRmin(1),
5642 pcon2container->GetRmax(1),
5643 fgkSDDCableDZint/2);
5644 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",interCyl, airSDD);
5645 vInterCyl->SetVisibility(kFALSE);
5648 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5649 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5650 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5652 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5653 rmaxCylPlast, fgkSDDCableDZint/2);
5654 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast", interCylPlast, plastic);
5655 vInterCylPlast->SetLineColor(kYellow);
5656 vInterCyl->AddNode(vInterCylPlast, 0);
5659 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5660 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5661 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5662 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5663 rmaxCylCu, fgkSDDCableDZint/2);
5664 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu", interCylCu, copper);
5665 vInterCylCu->SetLineColor(kRed);
5666 vInterCyl->AddNode(vInterCylCu, 0);
5669 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5670 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5671 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5672 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5673 rmaxCylGlass, fgkSDDCableDZint/2);
5674 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",interCylGlass,opticalFiber);
5675 vInterCylGlass->SetLineColor(kGreen);
5676 vInterCyl->AddNode(vInterCylGlass, 0);
5679 TGeoTranslation *trInterCylP = new TGeoTranslation("trSddCableInterCylPos",
5680 0,0,sddCableZ3+fgkSDDCableDZint/2);
5681 moth->AddNode(vInterCyl, 0,trInterCylP);
5682 TGeoTranslation *trInterCylN = new TGeoTranslation("trSddCableInterCylNeg",
5683 0,0,-sddCableZ3-fgkSDDCableDZint/2);
5685 moth->AddNode(vInterCyl, 1,trInterCylN);
5687 //==================================
5688 // cable cone on the SSD cone
5689 //==================================
5691 Double_t sddCableR4 = rmaxCylPlast;
5692 Double_t sddCableZ4 = sddCableZ3+fgkSDDCableDZint;
5694 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5695 fgkSDDCableR5, fgkSDDCableZ5,
5696 sectionLay3Plastic+sectionLay4Plastic+
5697 sectionLay3Cu+sectionLay4Cu+
5698 sectionLay3Glass+sectionLay4Glass, 1);
5700 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5701 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0), pcon3all->GetRmax(0));
5702 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5703 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax, pcon3all->GetRmax(1));
5705 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container", pcon3container, airSDD);
5706 vpcon3container->SetVisibility(kFALSE);
5708 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5709 fgkSDDCableR5, fgkSDDCableZ5,
5710 sectionLay3Plastic+sectionLay4Plastic, 3);
5711 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast", pcon3plast, plastic);
5712 vpcon3plast->SetLineColor(kYellow);
5713 vpcon3container->AddNode(vpcon3plast, 0);
5715 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5716 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5717 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5718 sectionLay3Cu+sectionLay4Cu, 3);
5719 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu", pcon3Cu, copper);
5720 vpcon3Cu->SetLineColor(kRed);
5721 vpcon3container->AddNode(vpcon3Cu, 0);
5724 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5725 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5726 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5727 sectionLay3Glass+sectionLay4Glass, 3);
5728 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass", pcon3glass,opticalFiber);
5729 vpcon3glass->SetLineColor(kGreen);
5730 vpcon3container->AddNode(vpcon3glass, 0);
5732 moth->AddNode(vpcon3container, 0);
5733 moth->AddNode(vpcon3container, 1, rotCableSDD);
5736 //==================================
5737 // cables that are grouped at the end of SSD cones
5738 //==================================
5740 Double_t fgkSDDCableR6 = fgkSDDCableR5+10;
5741 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+10;
5743 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5745 CreateAndInsetConeCablePart(endConeSDDCable, 40, 1*3,2*4, fgkSDDCableR5,
5746 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5748 CreateAndInsetConeCablePart(endConeSDDCable, 60, 1*3,1*4, fgkSDDCableR5,
5749 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5751 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5752 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5754 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5755 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5757 CreateAndInsetConeCablePart(endConeSDDCable, 110, 2*3,3*4, fgkSDDCableR5,
5758 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5760 CreateAndInsetConeCablePart(endConeSDDCable, 146, 0*3,3*4, fgkSDDCableR5,
5761 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5763 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5764 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5766 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5767 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5769 CreateAndInsetConeCablePart(endConeSDDCable, 220, 1*3,2*4, fgkSDDCableR5,
5770 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5772 CreateAndInsetConeCablePart(endConeSDDCable, 240, 1*3,2*4, fgkSDDCableR5,
5773 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5775 CreateAndInsetConeCablePart(endConeSDDCable, 290, 2*3,2*4, fgkSDDCableR5,
5776 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5778 CreateAndInsetConeCablePart(endConeSDDCable, 315, 1*3,1*4, fgkSDDCableR5,
5779 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5781 CreateAndInsetConeCablePart(endConeSDDCable, 350, 1*3,3*4, fgkSDDCableR5,
5782 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5784 moth->AddNode(endConeSDDCable, 0, 0);
5786 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5787 reflect->ReflectZ(kTRUE);
5788 moth->AddNode(endConeSDDCable, 1, reflect);