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),
520 fAddCoolingSyst(kTRUE),
522 fAddOnlyLadder3min(-1),
523 fAddOnlyLadder3max(-1),
524 fAddOnlyLadder4min(-1),
525 fAddOnlyLadder4max(-1),
526 fColorCarbonFiber(4),
536 fLay3LadderUnderSegDH(0),
537 fLay4LadderUnderSegDH(0),
538 fLay3LaddShortRadius(0),
539 fLay3LaddLongRadius(0),
540 fLay4LaddShortRadius(0),
541 fLay4LaddLongRadius(0)
544 // Standard constructor
550 //________________________________________________________________________
551 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
552 AliITSv11Geometry(debug),
554 fCoolPipeSupportL(0),
555 fCoolPipeSupportR(0),
558 fBaseThermalBridge(0),
574 fAddCoolingSyst(kTRUE),
576 fAddOnlyLadder3min(-1),
577 fAddOnlyLadder3max(-1),
578 fAddOnlyLadder4min(-1),
579 fAddOnlyLadder4max(-1),
580 fColorCarbonFiber(4),
590 fLay3LadderUnderSegDH(0),
591 fLay4LadderUnderSegDH(0),
592 fLay3LaddShortRadius(0),
593 fLay3LaddLongRadius(0),
594 fLay4LaddShortRadius(0),
595 fLay4LaddLongRadius(0)
598 // Constructor setting debugging level
603 //________________________________________________________________________
604 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
605 AliITSv11Geometry(s.GetDebug()),
606 fPinSupport(s.fPinSupport),
607 fCoolPipeSupportL(s.fCoolPipeSupportL),
608 fCoolPipeSupportR(s.fCoolPipeSupportR),
609 fSDDsensor3(s.fSDDsensor3),
610 fSDDsensor4(s.fSDDsensor4),
611 fBaseThermalBridge(s.fBaseThermalBridge),
613 fCardLVR(s.fCardLVR),
614 fCardLVL(s.fCardLVL),
616 fCardCarlos(s.fCardCarlos),
617 fRaccordoL(s.fRaccordoL),
618 fDigitCableLay3A(s.fDigitCableLay3A),
619 fDigitCableLay3B(s.fDigitCableLay3B),
620 fDigitCableLay4A(s.fDigitCableLay4A),
621 fDigitCableLay4B(s.fDigitCableLay4B),
622 fMotherVol(s.fMotherVol),
623 fAddHybrids(s.fAddHybrids),
624 fAddSensors(s.fAddSensors),
625 fAddHVcables(s.fAddHVcables),
626 fAddCables(s.fAddCables),
627 fAddCoolingSyst(s.fAddCoolingSyst),
628 fCoolingOn(s.fCoolingOn),
629 fAddOnlyLadder3min(s.fAddOnlyLadder3min),
630 fAddOnlyLadder3max(s.fAddOnlyLadder3max),
631 fAddOnlyLadder4min(s.fAddOnlyLadder4min),
632 fAddOnlyLadder4max(s.fAddOnlyLadder4max),
633 fColorCarbonFiber(s.fColorCarbonFiber),
634 fColorRyton(s.fColorRyton),
635 fColorPhynox(s.fColorPhynox),
636 fColorSilicon(s.fColorSilicon),
637 fColorAl(s.fColorAl),
638 fColorPolyhamide(s.fColorPolyhamide),
639 fColorGlass(s.fColorGlass),
640 fColorSMD(s.fColorSMD),
641 fColorSMDweld(s.fColorSMDweld),
642 fColorStesalite(s.fColorStesalite),
643 fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
644 fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
645 fLay3LaddShortRadius(s.fLay3LaddShortRadius),
646 fLay3LaddLongRadius(s.fLay3LaddLongRadius),
647 fLay4LaddShortRadius(s.fLay4LaddShortRadius),
648 fLay4LaddLongRadius(s.fLay4LaddLongRadius)
651 // do only a "shallow copy" ...
655 //________________________________________________________________________
656 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
657 operator=(const AliITSv11GeometrySDD &s) {
658 // Assignment operator
659 if(&s == this) return *this;
660 fMotherVol = s.fMotherVol;
661 fAddHybrids = s.fAddHybrids;
662 fAddSensors = s.fAddSensors;
663 fAddHVcables = s.fAddHVcables;
664 fAddCables = s.fAddCables;
665 fAddCoolingSyst = s.fAddCoolingSyst;
666 fCoolingOn = s.fCoolingOn;
667 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
668 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
669 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
670 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
674 //________________________________________________________________________
675 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
676 // Look like a destructor
677 // Smell like a destructor
678 // And actually is the destructor
679 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
680 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
681 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
682 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
685 //________________________________________________________________________
686 void AliITSv11GeometrySDD::SetParameters() {
688 // Define display colors and the non constant geometry parameters
691 Double_t detLadderDist = 8*fgkmm;
693 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
694 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
696 // radius from the center to the CF ladder :
697 fLay3LaddShortRadius = (fgkLay3DetShortRadius
698 + fgkLadWaferSep+2*fgkWaferThickness
700 fLay3LaddLongRadius = (fgkLay3DetLongRadius
701 + fgkLadWaferSep+2*fgkWaferThickness
703 fLay4LaddShortRadius = (fgkLay4DetShortRadius
704 + fgkLadWaferSep+2*fgkWaferThickness
706 fLay4LaddLongRadius = (fgkLay4DetLongRadius
707 + fgkLadWaferSep+2*fgkWaferThickness
710 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
711 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
712 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
713 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
714 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
715 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
717 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
718 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
719 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
720 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
721 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
722 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
723 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
724 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
728 //________________________________________________________________________
729 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
731 // Called to get a medium, checks that it exists.
732 // If not, prints an error and returns 0
736 sprintf(ch, "ITS_%s",mediumName);
737 TGeoMedium* medium = gGeoManager->GetMedium(ch);
739 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
744 //________________________________________________________________________
745 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
746 // Get the actual number of ladder in layer 3
747 if ( (fAddOnlyLadder3min<0) ||
748 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
749 (fAddOnlyLadder3max<0) ||
750 (fAddOnlyLadder3max >= fgkLay3Nladd) )
752 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
756 //________________________________________________________________________
757 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
758 // Get the actual number of ladder in layer 4
759 if ( (fAddOnlyLadder4min<0) ||
760 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
761 (fAddOnlyLadder4max<0) ||
762 (fAddOnlyLadder4max >= fgkLay4Nladd) )
764 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
768 //________________________________________________________________________
769 void AliITSv11GeometrySDD::CreateBasicObjects() {
771 // Create basics objets which will be assembled together
772 // in Layer3 and Layer4 functions
776 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
777 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
778 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
779 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
781 fPinSupport = CreatePinSupport();
782 fCoolPipeSupportL = CreateCoolPipeSupportL();
783 fCoolPipeSupportR = CreateCoolPipeSupportR();
785 fBaseThermalBridge = CreateBaseThermalBridge();
786 fHybrid = CreateHybrid(0);
788 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
789 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
790 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
791 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
792 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
793 TGeoMedium *raccordMedium = GetMedium("INOX$"); // ??? material of raccordo ???
795 //********************************************************************
796 // pieces of the carbon fiber structure
797 //********************************************************************
798 Double_t dy = fgkLadderSegBoxDH/2;
799 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
800 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
801 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
802 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
803 Double_t dYTranslation = (fgkLadderHeight/2.
804 -0.5*fgkLadderWidth*TMath::Tan(beta)
805 -fgkLadderBeamRadius);
806 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
808 //--- the top V of the Carbon Fiber Ladder (segment)
809 TGeoArb8 *cfLaddTop1 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
810 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
811 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
812 cfLaddTop1,carbonFiberLadderStruct);
813 TGeoArb8 *cfLaddTop2 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
814 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
815 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
816 cfLaddTop2, carbonFiberLadderStruct);
817 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
818 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
819 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
822 TGeoArb8 *cfLaddSide1 = CreateLadderSide( fgkSegmentLength/2., beta, -1,
823 fgkLadderLb, fgkLadderHb, fgkLadderl);
824 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
825 cfLaddSide1,carbonFiberLadderStruct);
826 TGeoArb8 *cfLaddSide2 = CreateLadderSide( fgkSegmentLength/2., beta, 1,
827 fgkLadderLb, fgkLadderHb, fgkLadderl);
828 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
829 cfLaddSide2,carbonFiberLadderStruct);
830 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
831 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
832 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
833 alpha*TMath::RadToDeg());
834 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
835 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
836 -alpha*TMath::RadToDeg());
837 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
840 // Beams on the sides
841 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
842 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
843 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
844 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
845 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
846 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
847 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
849 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
850 carbonFiberLadderStruct);
851 sideBeam->SetLineColor(fColorCarbonFiber);
853 //Euler rotation : about Z, then new X, then new Z
854 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
855 -beamPhiPrime*TMath::RadToDeg(),-90);
856 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
857 beamPhiPrime*TMath::RadToDeg(), -90);
858 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
859 beamPhiPrime*TMath::RadToDeg(), -90);
860 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
861 -beamPhiPrime*TMath::RadToDeg(),-90);
863 TGeoCombiTrans *beamTransf[8];
864 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
865 TMath::Tan(halfTheta),
866 fgkLadderBeamRadius/2. - dy,
867 -3*fgkSegmentLength/8, beamRot1);
869 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
870 TMath::Tan(halfTheta),
871 fgkLadderBeamRadius/2. - dy,
872 -3*fgkSegmentLength/8, beamRot1);
873 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
875 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
876 TMath::Tan(halfTheta),
877 fgkLadderBeamRadius/2. - dy,
878 -fgkSegmentLength/8, beamRot2);
880 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
881 TMath::Tan(halfTheta),
882 fgkLadderBeamRadius/2. - dy,
883 -fgkSegmentLength/8, beamRot2);
884 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
886 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
887 TMath::Tan(halfTheta),
888 fgkLadderBeamRadius/2. - dy,
889 -3*fgkSegmentLength/8, beamRot3);
891 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
892 TMath::Tan(halfTheta),
893 fgkLadderBeamRadius/2. - dy,
894 -3*fgkSegmentLength/8, beamRot3);
895 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
897 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
898 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
899 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
900 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
902 //--- Beams of the bottom
903 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
904 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
905 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
906 bottomBeam1, carbonFiberLadderStruct);
907 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
908 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
909 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
910 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
911 bottomBeam2, carbonFiberLadderStruct);
912 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
913 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
914 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
915 - fgkLadderLb/3, 0, 180);
916 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
917 bottomBeam3, carbonFiberLadderStruct);
918 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
919 //bottomBeam3Vol->SetLineColor(2);
920 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
921 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
923 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
924 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
925 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
926 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
927 -fgkSegmentLength/2, bottomBeamRot1);
928 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
929 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
930 - dy, fgkSegmentLength/2, bottomBeamRot2);
931 // be careful for beams #3: when "reading" from -z to +z and
932 // from the bottom of the ladder, it should draw a Lambda, and not a V
933 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
934 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
935 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
936 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
937 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
938 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
940 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
941 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
942 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
943 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
944 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
945 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
946 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
947 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
948 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
949 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
950 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
951 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
952 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
953 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
954 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
955 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
956 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
957 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
958 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
961 //********************************************************************
963 //********************************************************************
965 for (Int_t i=0; i<fgkLay3Ndet; i++) {
966 sprintf(cableName, "digitCableLay3A_%i",i);
967 fDigitCableLay3A[i].SetName(cableName);
968 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
969 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
970 fDigitCableLay3A[i].SetNLayers(2);
971 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
973 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
974 sprintf(cableName, "digitCableLay3B_%i",i);
975 fDigitCableLay3B[i].SetName(cableName);
976 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
977 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
978 fDigitCableLay3B[i].SetNLayers(2);
979 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
981 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
983 for (Int_t i=0; i<fgkLay4Ndet; i++) {
984 sprintf(cableName, "digitCableLay4A_%i",i);
985 fDigitCableLay4A[i].SetName(cableName);
986 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
987 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
988 fDigitCableLay4A[i].SetNLayers(2);
989 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
991 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
992 sprintf(cableName, "digitCableLay4B_%i",i);
993 fDigitCableLay4B[i].SetName(cableName);
994 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
995 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
996 fDigitCableLay4B[i].SetNLayers(2);
997 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
999 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1001 // Well, those digit cables could also include the analog cables
1002 // which have the same width and the same path, at least in the ladder.
1003 // It will gain some computing ressources (less volumes) and some
1004 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1005 // The only thing to do is to change the names and put the correct total
1008 // some transformations and volumes used in several places
1009 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1010 0, -fgkCarlosSuppAngle, 0);
1012 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1013 fgkLittleScrewHeadH/2);
1014 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1015 littleScrewHead, stainless);
1016 fCommonVol[0]->SetLineColor(kGray);
1018 fLadderFoot = CreateLadderFoot();
1020 fCardHV = CreateHVCard(0);
1021 fCardCarlos = CreateCarlosCard(0);
1023 //==================
1024 // link beteen phynox and plastic cooling tubes
1025 //==================
1027 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1028 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1029 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1030 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1031 vwaterRac->SetLineColor(kBlue);
1033 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1034 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1035 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1036 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1037 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1038 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1039 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1040 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1041 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1042 vtube1Rac->SetLineColor(kGray);
1043 vtube2Rac->SetLineColor(kGray);
1044 vtube3Rac->SetLineColor(kGray);
1046 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1047 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1048 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1049 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1050 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1051 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1052 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1053 fRaccordoL->AddNode(vwaterRac, 1,0);
1054 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1055 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1056 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1060 //________________________________________________________________________
1061 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1063 // a debugging function for checking some possible overlaps
1065 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1066 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1067 if (fHybrid) fHybrid->CheckOverlaps(precision);
1071 //________________________________________________________________________
1072 TGeoCombiTrans *AliITSv11GeometrySDD::
1073 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1076 // return the TGeoCombiTrans which make a translation in y and z
1077 // and a rotation in phi in the global coord system
1078 // If planeSym = true, the rotation places the object symetrically
1079 // (with respect to the transverse plane) to its position in the
1080 // case planeSym = false
1083 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1084 TGeoRotation r1("",0.,0.,dphi);
1085 TGeoRotation r2("",90, 180, -90-dphi);
1087 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1088 combiTrans1->SetTranslation(t1);
1089 if (planeSym) combiTrans1->SetRotation(r1);
1090 else combiTrans1->SetRotation(r2);
1095 //________________________________________________________________________
1096 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1100 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1101 const Double_t *vect = ct->GetTranslation();
1102 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1103 ct->SetTranslation(newVect);
1107 //________________________________________________________________________
1108 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1109 // for code developpment and debugging purposes
1111 if (! fSDDsensor3) CreateBasicObjects();
1113 // moth->AddNode(fPinSupport, 1, 0);
1114 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1115 // moth->AddNode(fSDDsensor3, 1, 0);
1116 // moth->AddNode(fSDDsensor4, 1, 0);
1117 // moth->AddNode(fBaseThermalBridge, 1, 0);
1118 // moth->AddNode(fHybrid,100,0);
1119 // moth->AddNode(fLadderFoot,1,0);
1120 //moth->AddNode(fCardLVL,1,0);
1121 //moth->AddNode(fCardLVR,1,0);
1123 TGeoVolume* seg = CreateLadderSegment( 3, 0);
1124 moth->AddNode(seg, 1, 0);
1126 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1127 // moth->AddNode(lay3Ladder, 1, 0);
1129 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1130 // moth->AddNode(lay3Detectors, 1, 0);
1132 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1133 // moth->AddNode(lay3Detectors, 1, 0);
1136 // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1137 // moth->AddNode(endLadder, 1, 0);
1139 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1140 // moth->AddNode(highVCard, 1, 0);
1142 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1143 // moth->AddNode(supportRing, 1, 0);
1145 // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1146 // moth->AddNode(endLadderCards, 1, 0);
1148 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1149 // moth->AddNode(carlosCard, 1, 0);
1154 //==================================
1155 //--- test of flat cable curvature
1156 //==================================
1159 AliITSv11GeomCableFlat cable("test", 3, 0.3);
1160 cable.SetNLayers(1);
1161 cable.SetNLayers(2);
1162 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1163 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1164 cable.SetInitialNode(endLadderCards);
1166 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1175 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1176 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1177 cable.CreateAndInsertBoxCableSegment(1,angle);
1179 Double_t p3[3], p4[3];
1184 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1185 cable.CreateAndInsertCableCylSegment(2,angle);
1190 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1191 cable.CreateAndInsertCableSegment(3,angle);
1196 //________________________________________________________________________
1197 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1199 // Insert the layer 3 in the mother volume. This is a virtual volume
1200 // containing ladders of layer 3 and the supporting rings
1204 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1208 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1211 if (! fSDDsensor3) CreateBasicObjects();
1213 //====================================
1214 // First we create the central barrel
1215 //====================================
1217 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1218 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1219 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1220 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1221 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1222 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1223 virtualLayer3Shape, airSDD);
1225 Double_t dPhi = 360./fgkLay3Nladd;
1226 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1227 // Placing virtual ladder and detectors volumes following
1228 // ladder ordering convention
1231 Int_t iLaddMax = fgkLay3Nladd;
1232 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1233 iLaddMin = fAddOnlyLadder3min;
1234 iLaddMax = fAddOnlyLadder3max+1;
1237 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1239 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1240 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1241 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1243 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1244 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1245 TGeoCombiTrans *ctLadd;
1246 //=============================================================
1248 // Special modification for ladder 2 of layer 3:
1249 // It has been inverted (pi rotation around y axis)
1251 //=============================================================
1253 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1254 0, ladderPhi, kTRUE);
1256 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1257 0, ladderPhi, kFALSE);
1258 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1259 ///////////////////////////////////////////////////
1260 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1261 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1262 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1263 minRadiusDetBox += detectorsThick/2;
1264 TGeoCombiTrans *ctDet;
1266 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1267 0, ladderPhi, kTRUE);
1269 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1270 0, ladderPhi, kFALSE);
1272 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1273 ///////////////////////////////////////////////////
1277 //====================================
1278 // Then the forward rapidity pieces
1279 // (cooling, Carlos, LV, HV ...)
1280 //====================================
1282 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1283 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1284 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1286 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1287 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1288 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1289 fgkForwardLay3Length/2.);
1291 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1292 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1293 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1296 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1297 virtualForward3Shape, airSDD);
1298 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1299 virtualForward3Shape, airSDD);
1300 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1301 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1303 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1304 fgkLay3Length/2+fgkForwardLay3Length/2);
1305 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1306 -fgkLay3Length/2-fgkForwardLay3Length/2);
1308 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1310 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1311 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1312 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1313 minRadiusDetBox += detectorsThick/2;
1315 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1317 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1318 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1319 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1320 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1322 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1323 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1330 virtualLayer3->CheckOverlaps(0.01);
1331 //virtualForward3Pos->CheckOverlaps(0.01);
1332 //virtualForward3Neg->CheckOverlaps(0.01);
1335 virtualLayer3->SetVisibility(kFALSE);
1336 //virtualForward3Pos->SetVisibility(kFALSE);
1337 //virtualForward3Neg->SetVisibility(kFALSE);
1340 moth->AddNode(virtualLayer3, 1, 0);
1341 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1342 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1346 // //________________________________________________________________________
1347 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1349 // // Insert the forward pieces of layer 3 in the mother volume.
1350 // // (cooling, Carlos, LV, HV ...)
1354 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1358 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1360 // if (! fSDDsensor3) CreateBasicObjects();
1362 // Double_t dPhi = 360./fgkLay3Nladd;
1363 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1364 // Int_t iLaddMin = 0;
1365 // Int_t iLaddMax = fgkLay3Nladd;
1366 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1367 // iLaddMin = fAddOnlyLadder3min;
1368 // iLaddMax = fAddOnlyLadder3max+1;
1370 // char rotName[30];
1373 // //=================
1375 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1376 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1377 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1379 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1380 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1381 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1382 // fgkForwardLay3Length/2.);
1384 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1385 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1386 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1389 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1390 // virtualForward3Shape, airSDD);
1391 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1392 // virtualForward3Shape, airSDD);
1393 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1394 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1396 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1397 // fgkLay3Length/2+fgkForwardLay3Length/2);
1398 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1399 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1401 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1403 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1404 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1405 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1406 // minRadiusDetBox += detectorsThick/2;
1408 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1410 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1411 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1412 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1413 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1415 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1416 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1419 // if(GetDebug(1)) {
1420 // virtualForward3Pos->CheckOverlaps(0.01);
1421 // virtualForward3Neg->CheckOverlaps(0.01);
1424 // virtualForward3Pos->SetVisibility(kFALSE);
1425 // virtualForward3Neg->SetVisibility(kFALSE);
1427 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1428 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1433 //________________________________________________________________________
1434 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1436 // Insert the end-ladder of layer 3 in the mother volume.
1437 // (cooling, Carlos, LV, HV ...)
1441 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1445 if (! fSDDsensor3) CreateBasicObjects();
1448 Int_t iLaddMax = fgkLay3Nladd;
1449 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1450 iLaddMin = fAddOnlyLadder3min;
1451 iLaddMax = fAddOnlyLadder3max+1;
1454 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1455 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1458 Double_t dPhi = 360./fgkLay3Nladd;
1459 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1461 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1463 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1465 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1467 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1469 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1470 fgkLay3Length/2, ladderPhi, kTRUE);
1471 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1472 -fgkLay3Length/2, ladderPhi, kFALSE);
1474 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1475 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1479 virtualForward3Pos->CheckOverlaps(0.01);
1480 virtualForward3Neg->CheckOverlaps(0.01);
1483 moth->AddNode(virtualForward3Pos, 1);
1484 moth->AddNode(virtualForward3Neg, 1);
1487 //________________________________________________________________________
1488 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1490 // Insert the layer 4 in the mother volume. This is a virtual volume
1491 // containing ladders of layer 4 and the supporting rings
1495 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1501 if (! fSDDsensor3) CreateBasicObjects();
1503 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1504 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1505 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1506 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1507 virtualLayer4Shape, airSDD);
1509 //====================================
1510 // First we create the central barrel
1511 //====================================
1513 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1514 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1515 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1517 Double_t dPhi = 360./fgkLay4Nladd;
1518 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1520 // placing virtual ladder and detectors volumes following ladder
1521 // ordering convention
1524 Int_t iLaddMax = fgkLay4Nladd;
1525 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1526 iLaddMin = fAddOnlyLadder4min;
1527 iLaddMax = fAddOnlyLadder4max+1;
1529 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1531 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1532 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1533 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1535 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1536 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1537 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1538 0, ladderPhi, kTRUE);
1539 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1540 ///////////////////////////////////////////////////
1541 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1542 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1544 minRadiusDetBox = fgkLay4DetLongRadius;
1545 minRadiusDetBox += detBoxThickness/2;
1546 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1547 0, ladderPhi, kTRUE);
1548 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1549 ///////////////////////////////////////////////////
1553 //====================================
1554 // Then the pieces at forward rapidity
1555 // (cooling, Carlos, LV, HV ...)
1556 //====================================
1558 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1559 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1560 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1562 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1563 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1564 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1565 fgkForwardLay4Length/2.);
1566 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1567 virtualForward4Shape, airSDD);
1568 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1569 virtualForward4Shape, airSDD);
1570 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1571 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1573 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1574 fgkLay4Length/2+fgkForwardLay4Length/2);
1575 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1576 -fgkLay4Length/2-fgkForwardLay4Length/2);
1578 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1580 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1581 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1583 minRadiusDetBox = fgkLay4DetLongRadius;
1584 minRadiusDetBox += detBoxThickness/2;
1586 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1588 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1589 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1590 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1591 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1592 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1593 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1597 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1599 virtualLayer4->SetVisibility(kFALSE);
1600 //virtualForward4Pos->SetVisibility(kFALSE);
1601 //virtualForward4Neg->SetVisibility(kFALSE);
1603 moth->AddNode(virtualLayer4,1,0);
1604 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1605 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1609 // //________________________________________________________________________
1610 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1612 // // Insert the layer 4 in the mother volume. This is a virtual volume
1613 // // containing ladders of layer 4 and the supporting rings
1614 // // (cooling, Carlos, LV, HV ...)
1618 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1622 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1624 // if (! fSDDsensor3) CreateBasicObjects();
1626 // Double_t dPhi = 360./fgkLay4Nladd;
1627 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1629 // // placing virtual ladder and detectors volumes following ladder
1630 // // ordering convention
1631 // char rotName[20];
1632 // Int_t iLaddMin = 0;
1633 // Int_t iLaddMax = fgkLay4Nladd;
1634 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1635 // iLaddMin = fAddOnlyLadder4min;
1636 // iLaddMax = fAddOnlyLadder4max+1;
1639 // //=================
1640 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1641 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1642 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1644 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1645 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1646 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1647 // fgkForwardLay4Length/2.);
1648 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1649 // virtualForward4Shape, airSDD);
1650 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1651 // virtualForward4Shape, airSDD);
1652 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1653 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1655 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1656 // fgkLay4Length/2+fgkForwardLay4Length/2);
1657 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1658 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1660 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1662 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1663 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1664 // if (iLadd%2 != 0)
1665 // minRadiusDetBox = fgkLay4DetLongRadius;
1666 // minRadiusDetBox += detBoxThickness/2;
1668 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1670 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1671 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1672 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1673 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1674 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1675 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1678 // virtualForward4Pos->SetVisibility(kFALSE);
1679 // virtualForward4Neg->SetVisibility(kFALSE);
1681 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1682 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1686 //________________________________________________________________________
1687 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1689 // Insert the end-ladder of layer 4 in the mother volume.
1690 // (cooling, Carlos, LV, HV ...)
1694 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1698 if (! fSDDsensor3) CreateBasicObjects();
1700 // placing virtual ladder and detectors volumes following ladder
1701 // ordering convention
1703 Int_t iLaddMax = fgkLay4Nladd;
1704 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1705 iLaddMin = fAddOnlyLadder4min;
1706 iLaddMax = fAddOnlyLadder4max+1;
1709 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1710 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1713 Double_t dPhi = 360./fgkLay4Nladd;
1714 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1716 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1718 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1721 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1723 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1725 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1726 fgkLay4Length/2, ladderPhi, kTRUE);
1727 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1728 -fgkLay4Length/2, ladderPhi, kFALSE);
1729 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1730 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1733 moth->AddNode(virtualForward4Pos, 1);
1734 moth->AddNode(virtualForward4Neg, 1);
1738 //________________________________________________________________________
1739 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1741 // return an assembly volume containing the CF ladder
1744 Int_t nDetectors = fgkLay3Ndet;
1745 Double_t ladderLength = fgkLay3LadderLength;
1746 Double_t underSegDH = fLay3LadderUnderSegDH;
1747 Double_t *sensorZPos = fLay3sensorZPos;
1748 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1749 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1753 nDetectors = fgkLay4Ndet;
1754 ladderLength = fgkLay4LadderLength;
1755 digitCableA = fDigitCableLay4A;
1756 digitCableB = fDigitCableLay4B;
1757 underSegDH = fLay4LadderUnderSegDH;
1758 sensorZPos = fLay4sensorZPos;
1761 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1763 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1764 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1766 // placing virtual ladder segment following detector ordering convention
1767 //=======================================================================
1770 // adding segment this way to create cable points in the correct order ...
1771 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1773 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1774 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1775 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1776 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1777 + fgkSegmentLength/2;
1778 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1779 underSegDH/2,segmentPos);
1781 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1783 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1785 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1786 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1787 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1788 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1789 + fgkSegmentLength/2;
1790 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1791 underSegDH/2,segmentPos);
1793 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1796 // putting virtual volume corresponding to the end of ladder
1797 //=======================================================================
1798 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1799 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1800 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1801 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1802 // Euler rotation : about Z, then new X, then new Z
1803 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1804 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1805 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1806 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1807 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1809 // creating and inserting cable segments
1810 // (check points are placed while creating segments)
1811 //=======================================================================
1813 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1815 digitCableA[iSegment].SetInitialNode(virtualLadder);
1816 digitCableB[iSegment].SetInitialNode(virtualLadder);
1818 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1819 Double_t rotation = 0;
1821 rotation = 90-fgkHybridAngle;
1822 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1824 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1828 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1829 Double_t rotation = 0;
1831 rotation = fgkHybridAngle-90;
1832 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1834 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1839 //=======================================================================
1841 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1842 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1844 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1845 char cableHVname[30];
1846 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1847 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1848 cableHV[iSegment].SetName(cableHVname);
1849 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1850 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1851 cableHV[iSegment].SetNLayers(2);
1852 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1854 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1855 cableHV[iSegment].SetInitialNode(virtualLadder);
1857 Double_t x1[3], x2[3], x3[3],
1858 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1860 x1[0] = -fgkTransitHVtailXpos;
1861 x2[0] = -fgkTransitHVtailXpos;
1862 x3[0] = -fgkTransitHVtailXpos;
1863 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1864 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1865 *fgkLongHVcableSeparation;
1866 // adjust where HV long cable starts in Y
1867 // useful if you want to let some space for alignment
1868 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1869 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1870 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1872 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1873 x2[2] = x1[2]+5*fgkmm;
1874 x3[2] = ladderLength/2-endLength;
1875 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1876 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1877 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1879 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1880 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1881 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1882 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1886 x1[0] = fgkTransitHVtailXpos;
1887 x2[0] = fgkTransitHVtailXpos;
1888 x3[0] = fgkTransitHVtailXpos;
1890 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1891 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1892 *fgkLongHVcableSeparation;
1893 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1894 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1895 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1897 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1898 x2[2] = x1[2]-5*fgkmm;
1899 x3[2] = -ladderLength/2+endLength;
1900 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1901 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1902 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1904 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1905 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1909 //**********************************
1910 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1911 return virtualLadder;
1915 //________________________________________________________________________
1916 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(Double_t dz, Double_t angle,
1917 Double_t xSign, Double_t L, Double_t H, Double_t l) {
1918 // Create one half of the V shape corner of CF ladder
1920 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1921 cfLaddSide->SetVertex( 0, 0, 0);
1922 cfLaddSide->SetVertex( 1, 0, -H);
1923 cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1924 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1925 cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1926 cfLaddSide->SetVertex( 4, 0, 0);
1927 cfLaddSide->SetVertex( 5, 0, -H);
1928 cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1929 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1930 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1935 //________________________________________________________________________
1936 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1938 // return a box containing the front-end hybrid
1941 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1943 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1944 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1945 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1946 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1947 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1948 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1949 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1950 // + upFLTotalThick + ccUpLayerTotThick);
1951 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1953 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1955 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1957 //**************************************************** media :
1958 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1959 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1960 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1961 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1962 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1963 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1964 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1965 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1966 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1967 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1968 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1970 //**************************************************** main volume :
1971 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
1972 (fgkHybridLength)/2);
1973 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
1976 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
1977 fgkHybridThBridgeThick/2,
1980 //**************************************************** Thermal bridge :
1981 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
1983 carbonFiberLadderStruct);
1984 vThermalBridge->SetLineColor(fColorCarbonFiber);
1985 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
1986 +fgkHybridThBridgeThick/2, 0);
1987 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
1989 //**************************************************** Screen layer :
1990 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
1991 fgkHybAlThick/2, fgkHybridLength/2);
1992 //here the upedex and glue layers are both assumed to be polyimide
1993 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
1995 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
1997 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
1998 (screenTotalThick+lowFLTotalThick)/2);
2000 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2001 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2003 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2004 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2005 +fgkHybAlThick/2, 0);
2007 TGeoTranslation hybHolePos1Tr(roundHoleX,
2008 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2009 -fgkHybridLength/2+fgkHybRndHoleZ);
2010 TGeoTranslation hybHolePos2Tr(roundHoleX,
2011 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2012 fgkHybridLength/2-fgkHybRndHoleZ);
2014 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2015 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2016 hybHolePos1->SetName("hybHolePos1");
2017 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2018 hybHolePos2->SetName("hybHolePos2");
2020 upGlueScreenTr->RegisterYourself();
2021 alScreenTr->RegisterYourself();
2022 hybHolePos1->RegisterYourself();
2023 hybHolePos2->RegisterYourself();
2026 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2027 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2028 "+sRoundHole:hybHolePos2)");
2029 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2030 vScreenAl->SetLineColor(fColorAl);
2031 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2032 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2033 "+sRoundHole:hybHolePos2)");
2034 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2035 sScreenUpGlue,polyhamideSDD);
2036 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2038 hybrid->AddNode(vScreenUpGlue, 1, 0);
2039 hybrid->AddNode(vScreenAl, 1, 0);
2041 //**************************************************** FL low layer :
2042 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2043 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2045 //here the upedex and glue layers are both assumed to be polyimide
2046 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2047 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2049 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2050 fgkHybAlThick/2, sideWidth1/2);
2052 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2053 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2054 -(fgkHybridLength-sideWidth1)/2);
2055 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2056 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2057 -(fgkHybridLength-sideWidth1)/2);
2058 upGlueBarTr1->RegisterYourself();
2059 alBarTr1->RegisterYourself();
2061 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2062 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2063 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2064 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2065 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2066 sLowUpGlueBar1, polyhamideSDD);
2067 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2069 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2070 vLowAlBar1->SetLineColor(fColorAl);
2071 hybrid->AddNode(vLowUpGlueBar1,1,0);
2072 hybrid->AddNode(vLowAlBar1,1,0);
2075 //here the upedex and glue layers are both assumed to be polyimide
2076 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2077 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2079 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2080 fgkHybAlThick/2, sideWidth2/2);
2082 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2083 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2084 (fgkHybridLength-sideWidth2)/2);
2085 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2086 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2087 (fgkHybridLength-sideWidth2)/2);
2088 upGlueBarTr2->RegisterYourself();
2089 alBarTr2->RegisterYourself();
2091 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2092 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2093 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2094 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2095 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2097 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2099 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2100 vLowAlBar2->SetLineColor(fColorAl);
2101 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2102 hybrid->AddNode(vLowAlBar2, 1, 0);
2104 if(GetDebug(3)) { // Remove compiler warning.
2105 sAlScreenLayer->InspectShape();
2106 sUpGlueScreenLayer->InspectShape();
2107 sRoundHole->InspectShape();
2108 sUpGlueBar1->InspectShape();
2109 sUpGlueBar2->InspectShape();
2110 sAlBar1->InspectShape();
2111 sAlBar2->InspectShape();
2114 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2115 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2116 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2118 lowFLpiece.SetNLayers(2);
2119 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2121 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2122 // alSDD at 80% : mostly to take into account strips of piece 3
2124 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2125 lowLayerYmin + lowFLTotalThick/2,
2126 -fgkHybridLength/2 + sideWidth1 };
2127 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2128 Double_t vZ[3] = {0,0,1};
2129 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2130 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2131 lowFLpiece.SetInitialNode(hybrid);
2132 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2133 lowFLpiece.ResetPoints();
2135 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2136 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2138 lowFLpiece.SetWidth(piece2width);
2139 lowFLpiece.SetName("lowFLpiece2");
2140 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2142 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2143 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2144 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2145 lowFLpiece.ResetPoints();
2147 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2148 - fgkHybFLlowHoleAmbDX/2;
2150 lowFLpiece.SetWidth(piece3width);
2151 lowFLpiece.SetName("lowFLpiece3");
2152 x1[0] = fgkHybridWidth/2-piece3width/2;
2154 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2155 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2156 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2158 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2159 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2160 Double_t vX[3] = {1,0,0};
2161 for (Int_t i=0; i<3; i++) {
2163 sprintf(ch, "lowFLpieceA%i", i+4);
2164 lowFLpiece.SetName(ch);
2165 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2167 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2168 x1[0] = -fgkHybridWidth/2 + piece1width;
2169 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2170 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2171 x1[2] = zPiece; x2[2] = zPiece;
2172 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2173 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2174 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2175 lowFLpiece.ResetPoints();
2177 sprintf(ch, "lowFLpieceB%i", i+4);
2178 lowFLpiece.SetName(ch);
2179 x1[0] = fgkHybridWidth/2 - piece3width;
2180 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2181 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2182 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2183 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2186 //**************************************************** chips+CC:
2187 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2188 chip.SetInitialNode(hybrid);
2190 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2191 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2192 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2193 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2195 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2196 // Here the tho CC (low+up) are merged
2197 // In fact, the last layer has a smaller surface of Al -> I put 80%
2199 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2203 for (Int_t i=0; i<4; i++) {
2204 sprintf(ch, "pascalCC%i", i);
2206 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2207 x2[0] = x1[0] + fgkHybPascalDX;
2208 x1[2] = zChips[i] - fgkHybridLength/2;
2210 chip.AddCheckPoint( hybrid, 0, x1, vX );
2211 chip.AddCheckPoint( hybrid, 1, x2, vX );
2212 chip.CreateAndInsertBoxCableSegment(1,-90);
2215 sprintf(ch, "ambraCC%i", i);
2217 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2218 x2[0] = x1[0] + fgkHybAmbraDX;
2219 chip.AddCheckPoint( hybrid, 0, x1, vX );
2220 chip.AddCheckPoint( hybrid, 1, x2, vX );
2221 chip.CreateAndInsertBoxCableSegment(1,-90);
2225 //**************************************************** CC outside chips:
2226 // I don't think there is a second aluminium layer here ...
2227 for (Int_t i = 0; i<4; i++) {
2229 sprintf(ch, "ccLayerA%i", i);
2231 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2232 ccLayer1.SetInitialNode(hybrid);
2233 ccLayer1.SetNLayers(2);
2234 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2235 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2238 x1[0] = -fgkHybridWidth/2;
2239 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2240 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2241 + fgkHybChipThick + ccUpLayerTotThick/2;
2243 x1[2] = zChips[i] - fgkHybridLength/2;
2245 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2246 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2247 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2249 sprintf(ch, "ccLayerB%i", i);
2250 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2251 ccLayer2.SetInitialNode(hybrid);
2252 ccLayer2.SetNLayers(2);
2253 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2254 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2257 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2258 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2259 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2260 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2261 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2262 ccLayer2.ResetPoints();
2263 sprintf(ch, "ccLayerC%i", i);
2264 ccLayer2.SetName(ch);
2265 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2266 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2267 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2268 + ccUpLayerTotThick/2;
2271 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2272 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2273 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2276 //**************************************************** FL UP:
2277 // (last Al layer will be a special triangular shape)
2278 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2279 fgkHybFLUpperWidth/2, flUpThick/2,
2280 fgkHybFLUpperLength/2);
2281 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2282 sFLupPolyhamide, polyhamideSDD);
2283 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2284 TGeoTranslation *trFLupPolyhamide =
2285 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2286 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2288 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2290 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2291 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2292 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2293 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2294 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2295 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2296 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2297 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2298 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2299 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2302 vAluStrip->SetLineColor(fColorAl);
2303 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2304 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2306 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2307 +flUpThick+fgkHybAlThick/2;
2308 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2309 fgkHybridWidth/2,yRotAluStrip,
2310 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2311 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2312 AddTranslationToCombiTrans(aluStripTr2,0,0,
2313 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2314 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2315 AddTranslationToCombiTrans(aluStripTr3,0,0,
2316 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2317 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2318 AddTranslationToCombiTrans(aluStripTr4,0,0,
2319 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2321 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2322 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2323 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2324 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2325 //**************************************************** SMD:
2326 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2327 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2328 fgkHybSMDheight/2,fgkHybSMDendW/2);
2329 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2331 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2332 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2333 fgkHybSMDmiddleW/2);
2334 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2335 hybSMDmiddle,medSMD);
2336 vHybSMDmiddle->SetLineColor(fColorSMD);
2337 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2338 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2339 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2340 hybSMDend,medSMDweld);
2341 vHybSMDend->SetLineColor(fColorSMDweld);
2342 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2343 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2344 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2345 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2346 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2347 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2348 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2349 for (Int_t i=0; i<fgkNHybSMD; i++) {
2350 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2351 -fgkHybridWidth/2+fgkHybSMDposX[i],
2352 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2353 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2354 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2360 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2361 hybrid->SetVisibility(kFALSE);
2365 //________________________________________________________________________
2366 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2368 // Return a TGeoVolume* containing a segment of a ladder.
2371 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2372 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2373 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2375 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2376 Double_t segmentLength = fgkSegmentLength;
2377 Double_t spaceBetweenCables = 500*fgkmicron;
2379 //*****************************************
2380 // Set parameters according to (iLay,iSeg):
2381 //*****************************************
2382 Int_t nDetectors = fgkLay3Ndet;
2383 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2384 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2385 (fgkSegmentLength*fgkLay3Ndet/2. -
2386 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2387 // sensorCenterZPos = z in segment local coord syst.
2389 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2390 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2393 } else if (iLay==4) {
2394 nDetectors = fgkLay4Ndet;
2395 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2396 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2397 (fgkSegmentLength*fgkLay4Ndet/2. -
2398 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2399 digitCableA = fDigitCableLay4A;
2400 digitCableB = fDigitCableLay4B;
2402 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2405 Double_t cableSideSign = -1;
2406 if (iSeg<nDetectors/2) cableSideSign = 1;
2407 Double_t spaceForCables = spaceBetweenCables*
2408 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2410 // gives [0-1-2-2-1-0]*spaceBetweenCables
2411 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2412 Int_t iUpdateCableMin;
2413 Int_t iUpdateCableMax;
2414 if (cableSideSign==-1) {
2415 iUpdateCableMin = nDetectors/2;
2416 iUpdateCableMax = iSeg-1;
2418 iUpdateCableMin = iSeg+1;
2419 iUpdateCableMax = nDetectors/2-1;
2423 cout << "Segment ("<< iLay <<',' << iSeg
2424 << ") : sensor z shift in local segment coord.="
2425 << sensorCenterZPos << endl;
2428 //****************************
2429 // The segment volume
2430 //****************************
2432 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2433 // likely slows down the transport of particles through the geometry
2435 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2437 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2438 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2439 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2442 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2444 virtualSeg->SetVisibility(kFALSE);
2446 //******************************
2447 // Carbon fiber structure :
2448 //******************************
2450 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2451 Int_t volumeIndex = 1;
2452 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2453 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2457 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2458 fLaddSegCommonTr[i]);
2461 //**********************************
2462 // Pine support of the sensors :
2463 //**********************************
2464 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2465 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2467 // The use of the following constructor type allow to use rotPS1 and rotPS2
2468 // (and not copy them) therefore we gain some memory
2469 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2470 - fgkLadderHeight/2.-tDY
2471 + fgkPinSuppHeight/2.,
2472 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2474 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2475 - fgkLadderHeight/2.-tDY
2476 + fgkPinSuppHeight/2.,
2477 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2478 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2480 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2481 - fgkLadderHeight/2.-tDY
2482 + fgkPinSuppHeight/2.,
2483 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2484 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2486 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2487 - fgkLadderHeight/2.-tDY
2488 + fgkPinSuppHeight/2.,
2489 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2490 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2492 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2493 - fgkLadderHeight/2. - tDY
2494 + fgkPinSuppHeight/2.,
2495 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2497 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2498 - fgkLadderHeight/2. - tDY
2499 + fgkPinSuppHeight/2.,
2500 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2501 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2503 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2504 - fgkLadderHeight/2. - tDY
2505 + fgkPinSuppHeight/2.,
2506 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2507 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2509 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2510 - fgkLadderHeight/2. - tDY
2511 + fgkPinSuppHeight/2.,
2512 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2513 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2515 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2516 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2517 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2518 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2519 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2520 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2521 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2522 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2524 TGeoMedium *pinMed = GetMedium("SDDKAPTON (POLYCH2)$"); // medium ???
2525 Double_t fgkPinHeight = 4.5*fgkmm;
2526 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2528 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2530 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2531 - fgkLadderHeight/2.-tDY
2533 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2534 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2535 virtualSeg->AddNode(pineV, 1, transPS2b);
2537 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2538 - fgkLadderHeight/2. - tDY
2540 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2541 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2542 virtualSeg->AddNode(pineV, 2, transPS6b);
2545 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2546 - fgkLadderHeight/2.-tDY
2548 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2549 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2550 virtualSeg->AddNode(pineV, 3, transPS4b);
2552 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2553 - fgkLadderHeight/2. - tDY
2555 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2556 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2557 virtualSeg->AddNode(pineV, 4, transPS8b);
2560 //******************************
2561 // Cooling pipe supports :
2562 //******************************
2563 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2564 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2565 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2566 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2568 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2569 (triangleHeight+triangleCPaxeDist/
2570 TMath::Sin(halfTheta)-coolPipeSuppH);
2571 if (fAddCoolingSyst) {
2572 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2573 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2574 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2575 -fgkLadderHeight/2. - tDY
2576 +coolPipeSuppH+fgkLadderBeamRadius,
2577 -segmentLength/2., rotCPS1);
2579 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2580 -fgkLadderHeight/2. - tDY
2581 +coolPipeSuppH+fgkLadderBeamRadius,
2582 -segmentLength/2., rotCPS1);
2583 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2585 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2586 -fgkLadderHeight/2.- tDY
2587 +coolPipeSuppH+fgkLadderBeamRadius,
2588 segmentLength/2., rotCPS2);
2590 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2591 -fgkLadderHeight/2.- tDY
2592 +coolPipeSuppH+fgkLadderBeamRadius,
2593 segmentLength/2., rotCPS2);
2594 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2596 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2597 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2598 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2599 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2602 //************************
2604 //************************
2605 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2606 -fgkLadderHeight/2. - tDY +
2607 fgkLadderBeamRadius+coolPipeSuppH, 0);
2608 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2609 -fgkLadderHeight/2.- tDY +
2610 fgkLadderBeamRadius+coolPipeSuppH, 0);
2612 if (fAddCoolingSyst) {
2613 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2614 fgkCoolPipeOuterDiam/2,
2616 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2619 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2620 coolingPipeShape, phynoxSDD );
2621 coolingPipe->SetLineColor(fColorPhynox);
2622 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2626 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2627 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2629 virtualSeg->AddNode(cooler, 1, pipeTr1);
2630 virtualSeg->AddNode(cooler, 2, pipeTr2);
2634 //**********************************
2635 // Bases of hybrid thermal bridges
2636 //**********************************
2637 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2638 // approx !!! not clear on 0752/14-A
2639 if (fAddCoolingSyst) {
2640 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2641 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2642 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2643 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2645 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2646 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2649 //*************************
2651 //*************************
2652 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2653 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2655 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2656 - shiftHyb*SinD(fgkHybridAngle) );
2657 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2658 + shiftHyb*CosD(fgkHybridAngle) );
2660 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2661 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2662 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2663 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2664 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2665 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2667 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2668 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2675 // Starting from this segment
2676 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2677 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2678 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2679 - digitCableA->GetWidth()/2;
2680 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2681 - digitCableA->GetThickness()/2;
2683 Double_t digitCableX = ( coolPipeSuppL
2684 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2685 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2686 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2687 + fgkLadderBeamRadius+coolPipeSuppH
2688 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2689 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2692 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2693 digitCableY, cableSideSign*hybDz };
2694 Double_t digitCableCenterA1[3] = {
2695 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2696 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2697 cableSideSign*segmentLength/2 };
2699 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2700 digitCableY,cableSideSign*hybDz};
2701 Double_t digitCableCenterB1[3]={
2702 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2703 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2704 cableSideSign*segmentLength/2 };
2706 Double_t vZ[3] = {0,0,1};
2707 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2708 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2709 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2710 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2712 // Updating the other cables
2713 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2715 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2717 digitCableA[iCable].GetPoint( 1, coord);
2718 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2719 digitCableB[iCable].GetPoint( 1, coord);
2720 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2724 //**********************************
2725 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2730 //________________________________________________________________________
2731 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2733 // Create a pine support and its pine
2734 // axis of rotation is the cone axis, center in its middle
2736 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?
2738 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2739 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2740 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2741 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2742 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2743 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2744 fgkPinSuppHeight/2.+0.00001);
2745 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2747 if(GetDebug(3)){// Remove compiler warning.
2748 cone->InspectShape();
2749 tong->InspectShape();
2750 hole->InspectShape();
2753 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2754 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2755 tongTrans->RegisterYourself();
2756 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2757 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2758 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2760 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2762 pinSupport->SetLineColor(fColorRyton);
2768 //________________________________________________________________________
2769 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2771 // Create half of the cooling pipe support (ALR-0752/3)
2774 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2776 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2777 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2778 side1->SetVertex( 1, fgkCoolPipeSuppMaxLength/2.-diffX,
2779 -fgkCoolPipeSuppWidthExt/2.);
2780 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2781 fgkCoolPipeSuppWidthExt/2.);
2782 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2783 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2784 side1->SetVertex( 5, fgkCoolPipeSuppMaxLength/2.,
2785 -fgkCoolPipeSuppWidthExt/2.);
2786 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2787 fgkCoolPipeSuppWidthExt/2.);
2788 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2789 side1->SetName("ITSsddCPSside1");
2791 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2792 - fgkCoolPipeSuppAxeDist
2793 + fgkCoolPipeSuppWidthExt/2., 0);
2794 side1Tr->RegisterYourself();
2795 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2796 - fgkCoolPipeSuppAxeDist
2797 + fgkCoolPipeSuppWidthExt*3/2.
2798 + fgkCoolPipeSuppWidthIn,0);
2799 side2Tr->RegisterYourself();
2801 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2802 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2803 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2804 TGeoTranslation *middleTr =
2805 new TGeoTranslation("ITSsddCPStr3",
2806 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2807 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2808 +fgkCoolPipeSuppWidthIn/2., 0);
2809 middleTr->RegisterYourself();
2811 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2812 fgkCoolPipeSuppTongW/4.,
2813 (fgkCoolPipeSuppFulWidth
2814 - 2*fgkCoolPipeSuppWidthExt
2815 - fgkCoolPipeSuppWidthIn)/2,
2816 fgkCoolPipeSuppHeight/2.);
2818 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2819 fgkCoolPipeSuppTongW/4.,
2820 - fgkCoolPipeSuppAxeDist
2821 + fgkCoolPipeSuppFulWidth
2822 - axeBox->GetDY(), 0);
2823 axeBoxTr->RegisterYourself();
2825 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2826 fgkCoolPipeSuppTongW/4.);
2828 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2829 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2830 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2831 axeTrans->RegisterYourself();
2832 //delete axeRot; // make the code crash, no idea of why !!!
2835 middle->InspectShape();
2836 axe->InspectShape();
2839 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2841 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2842 "ITSsddCoolPipeSuppShapeL",
2843 "ITSsddCPSmiddle:ITSsddCPStr3"
2844 "+ITSsddCPSside1:ITSsddCPStr1"
2845 "+ITSsddCPSside1:ITSsddCPStr2"
2846 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2847 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2848 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2849 coolPipeSuppShape, rytonSDD);
2851 coolPipeSupp->SetLineColor(fColorRyton);
2853 return coolPipeSupp;
2857 //________________________________________________________________________
2858 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2860 //Create half of the cooling pipe support (ALR-0752/3)
2863 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2865 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2866 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2867 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2868 -fgkCoolPipeSuppWidthExt/2.);
2869 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2870 fgkCoolPipeSuppWidthExt/2.);
2871 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2872 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2873 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2874 -fgkCoolPipeSuppWidthExt/2.);
2875 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2876 fgkCoolPipeSuppWidthExt/2.);
2877 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2878 side1->SetName("ITSsddCPSside1R");
2880 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2881 - fgkCoolPipeSuppAxeDist
2882 + fgkCoolPipeSuppWidthExt/2., 0);
2883 side1Tr->RegisterYourself();
2884 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2885 - fgkCoolPipeSuppAxeDist
2886 + fgkCoolPipeSuppWidthExt*3/2.
2887 + fgkCoolPipeSuppWidthIn, 0);
2888 side2Tr->RegisterYourself();
2890 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2891 (fgkCoolPipeSuppMaxLength/2.
2892 - fgkCoolPipeSuppSlitL)/2.,
2893 fgkCoolPipeSuppWidthIn/2.,
2894 fgkCoolPipeSuppHeight/2.);
2895 TGeoTranslation *middleTr =
2896 new TGeoTranslation("ITSsddCPStr3R",
2897 -( fgkCoolPipeSuppMaxLength/2.
2898 -fgkCoolPipeSuppSlitL)/2.,
2899 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2900 + fgkCoolPipeSuppWidthIn/2.,0);
2901 middleTr->RegisterYourself();
2903 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2904 fgkCoolPipeSuppTongW/4.,
2905 (fgkCoolPipeSuppFulWidth
2906 - 2*fgkCoolPipeSuppWidthExt
2907 - fgkCoolPipeSuppWidthIn)/2,
2908 fgkCoolPipeSuppHeight/2.);
2910 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2911 - fgkCoolPipeSuppTongW/4.,
2912 - fgkCoolPipeSuppAxeDist
2913 + fgkCoolPipeSuppFulWidth
2914 - axeBox->GetDY(),0);
2915 axeBoxTr->RegisterYourself();
2917 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2918 fgkCoolPipeSuppTongW/4.);
2920 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2921 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2922 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2923 axeTrans->RegisterYourself();
2927 middle->InspectShape();
2928 axe->InspectShape();
2931 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2932 "ITSsddCoolPipeSuppShapeR",
2933 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2934 "+ITSsddCPSside1R:ITSsddCPStr1R"
2935 "+ITSsddCPSside1R:ITSsddCPStr2R"
2936 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2937 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2939 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2940 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2941 coolPipeSuppShape, rytonSDD);
2942 coolPipeSupp->SetLineColor(fColorRyton);
2944 return coolPipeSupp;
2947 //________________________________________________________________________
2948 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2950 // based on ALR 0752/8
2953 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2955 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2956 - (fgkRadiusAminBTB+fgkBTBthick);
2957 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2958 fgkBTBthick/2., fgkBTBlength/2.);
2959 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2960 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2961 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2962 base1Tr->RegisterYourself();
2964 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2966 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2967 fgkBTBthick/2., fgkBTBlength/2.);
2968 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2969 fgkBTBaxisAtoBottom - base2width/2.,
2970 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2971 base2Tr->RegisterYourself();
2973 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
2974 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
2975 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
2976 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
2977 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
2978 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
2979 sideTr1->RegisterYourself();
2980 sideTr2->RegisterYourself();
2982 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
2983 fgkBTBthick/2., fgkBTBHoleLength/2.);
2984 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
2985 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2986 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2987 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
2988 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
2989 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2990 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2991 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
2992 holeTr1->RegisterYourself();
2993 holeTr2->RegisterYourself();
2995 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
2996 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
2997 fgkRadiusAminBTB, radiusAmaxBTB,
2998 fgkBTBlength/2., 0., 180.);
2999 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3000 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3001 fgkBTBlength/2., 270., 360.);
3002 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3003 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3005 roundTr1->RegisterYourself();
3007 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3008 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3009 fgkBTBlength/2., 180., 270.);
3010 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3011 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3013 roundTr2->RegisterYourself();
3015 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3016 "ITSsddBaseThermalBridgeShape",
3017 "ITSsddBTBbase1:ITSsddBTBtr1"
3018 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3019 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3020 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3021 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3022 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3023 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3024 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3025 "+ ITSsddBTBmainAxis");
3027 if(GetDebug(3)){// Remove compiler warning.
3028 base1->InspectShape();
3029 base2->InspectShape();
3030 side->InspectShape();
3031 hole->InspectShape();
3032 mainAxis->InspectShape();
3033 round1->InspectShape();
3034 round2->InspectShape();
3037 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3038 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3040 carbonFiberLadderStruct);
3042 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3043 return vBaseThermalBridge;
3047 //________________________________________________________________________
3048 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3050 // Return an assembly containing a end of a CF ladder.
3053 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3054 TGeoMedium *stesalite = GetMedium("G10FR4$");
3055 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3056 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3058 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3059 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3060 Double_t underSegDH = fLay3LadderUnderSegDH;
3061 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3062 // footDZ is also where to place the ruby's center in local Z
3063 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3066 } else if (iLay==4) {
3067 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3068 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3069 underSegDH = fLay4LadderUnderSegDH;
3070 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3071 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3073 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3077 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3078 + underSegDH/2); //space under ladder segment
3079 // here tDY is not the same as for the segment because the end ladder
3080 // does not have a space under it, inside the general ladder volume.
3081 Double_t segmentLength = fgkSegmentLength;
3082 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3084 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3086 //**********************************
3087 // coding real matter :
3088 //**********************************
3089 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3090 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3091 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3092 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3094 //--- The 3 V shape corners of the Carbon Fiber Ladder
3096 TGeoArb8 *cfLaddTop1 = CreateLadderSide(topCornerLength/2., halfTheta, -1,
3097 fgkLadderLa, fgkLadderHa, fgkLadderl);
3098 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
3099 cfLaddTop1,carbonFiberLadderStruct);
3100 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3101 TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
3102 fgkLadderLa, fgkLadderHa, fgkLadderl);
3103 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3104 cfLaddTop2,carbonFiberLadderStruct);
3105 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3106 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3107 -(length-topCornerLength)/2.);
3108 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3109 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3112 TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
3113 fgkLadderLb, fgkLadderHb, fgkLadderl);
3114 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3115 cfLaddSide1,carbonFiberLadderStruct);
3116 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3117 TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
3118 fgkLadderLb, fgkLadderHb, fgkLadderl);
3119 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3120 cfLaddSide2,carbonFiberLadderStruct);
3121 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3122 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3123 TMath::Tan(beta) - fgkLadderBeamRadius );
3125 // because center of the triangle doesn't correspond to virtual vol. center
3126 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3127 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3128 alpha*TMath::RadToDeg());
3129 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3130 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3131 -alpha*TMath::RadToDeg());
3132 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3133 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3134 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3135 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3136 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3139 // Beams on the sides
3140 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3141 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3143 //Euler rotation : about Z, then new X, then new Z
3144 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3145 -beamPhiPrime*TMath::RadToDeg(), -90);
3146 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3147 beamPhiPrime*TMath::RadToDeg(), -90);
3148 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3149 beamPhiPrime*TMath::RadToDeg(), -90);
3150 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3151 -beamPhiPrime*TMath::RadToDeg(), -90);
3152 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3153 TMath::Tan(halfTheta),
3154 fgkLadderBeamRadius/2. + tDY,
3155 -length/2 + segmentLength/8, beamRot1);
3156 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3157 TMath::Tan(halfTheta),
3158 fgkLadderBeamRadius/2.+tDY,
3159 -length/2 + 3*segmentLength/8, beamRot2);
3160 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3161 TMath::Tan(halfTheta),
3162 fgkLadderBeamRadius/2.+tDY,
3163 -length/2 + segmentLength/8, beamRot3);
3164 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3165 TMath::Tan(halfTheta),
3166 fgkLadderBeamRadius/2. + tDY,
3167 -length/2+3*segmentLength/8, beamRot4);
3169 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3170 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3171 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3172 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3174 //--- Beams of the bottom
3175 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3177 /* Not there actually
3178 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3179 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3180 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3181 bottomBeam1, carbonFiberLadderStruct);
3182 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3184 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3185 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3186 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3187 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3189 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3190 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3191 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3192 bottomBeam2, carbonFiberLadderStruct);
3193 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3194 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3195 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3196 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3198 //**********************************
3199 //the cooling pipe supports
3200 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3201 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3203 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3204 (triangleHeight+triangleCPaxeDist/
3205 TMath::Sin(halfTheta)-coolPipeSuppH);
3207 if (fAddCoolingSyst) {
3208 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3209 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3210 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3211 -fgkLadderHeight/2.+ tDY +
3212 coolPipeSuppH+fgkLadderBeamRadius,
3213 -length/2., rotCPS1);
3214 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3215 -fgkLadderHeight/2.+ tDY +
3216 coolPipeSuppH+fgkLadderBeamRadius,
3217 -length/2., rotCPS2);
3219 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3220 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3223 //**********************************
3224 //--- The stesalite foot of the ladder
3226 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3227 - fgkLadFootY/2+fgkLadFingerPrintY;
3229 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3230 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3232 //=====================================
3235 if (fAddCoolingSyst) {
3237 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3238 -fgkLadderHeight/2.+ tDY +
3239 coolPipeSuppH + fgkLadderBeamRadius,
3240 -length/2.+coolPipeEndLen/2.);
3241 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3242 -fgkLadderHeight/2. + tDY +
3243 fgkLadderBeamRadius + coolPipeSuppH,
3244 -length/2.+coolPipeEndLen/2.);
3246 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3247 fgkCoolPipeOuterDiam/2,
3249 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3252 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3253 coolingPipeShape, phynoxSDD );
3254 coolingPipe->SetLineColor(fColorPhynox);
3255 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3258 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3259 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3261 virtualEnd->AddNode(cooler, 1, pipeTr1);
3262 virtualEnd->AddNode(cooler, 2, pipeTr2);
3266 //=====================================
3267 //--- HV cable guide
3270 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3271 fgkHVguideY1/2,fgkHVguideZ1/2);
3272 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3274 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3275 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3276 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3277 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3279 //=====================================
3281 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3282 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3283 -fgkLadderHeight/2.+ tDY +
3284 coolPipeSuppH+fgkLadderBeamRadius,
3285 -length/2.+coolPipeEndLen+raccordFullLen/2);
3286 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3287 -fgkLadderHeight/2.+ tDY +
3288 coolPipeSuppH+fgkLadderBeamRadius,
3289 -length/2.+coolPipeEndLen+raccordFullLen/2);
3291 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3292 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3294 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3299 //________________________________________________________________________
3300 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3302 //--- The stesalite foot of the ladder
3304 // The 2 screw holes on the left part
3305 // the small holes at each corner of the ruby cage (diam 2mm)
3306 // the really small level difference of 0.3mm on the bottom
3309 TGeoMedium *stesalite = GetMedium("G10FR4$");
3311 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3313 Double_t epsilon = 2e-10;
3314 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3316 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3317 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3318 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3319 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3321 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3322 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3323 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3326 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3327 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3329 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3330 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3331 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3333 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3334 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3335 rubyScrewHoleLen/2);
3337 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3338 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3339 fgkLadFootX/2-rubyScrewHoleLen/2,
3340 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3342 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3343 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3346 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3347 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3348 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3350 ladFootBox1Tr->RegisterYourself();
3351 ladFingerPrintTr->RegisterYourself();
3352 rubyCageHoleTr->RegisterYourself();
3353 rubyScrewHoleTr->RegisterYourself();
3354 rubyHoleTr->RegisterYourself();
3356 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3357 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3358 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3359 "+rubyHole:rubyHoleTr)");
3360 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3361 footRightPart,stesalite);
3362 vFootRightPart->SetLineColor(fColorStesalite);
3364 virtualFoot->AddNode(vFootRightPart, 1, 0);
3367 //--- This was the right part of the foot, now let's do the middle
3368 //--- and the right parts
3370 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3371 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3373 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3374 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3375 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3377 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3378 vFootMiddle->SetLineColor(fColorStesalite);
3379 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3382 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3383 (fgkLadFootY-fgkLadFingerPrintY)/2,
3385 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3386 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3387 -fgkLadFingerPrintY/2, 0);
3388 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3390 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3391 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3394 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3397 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3398 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3400 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3401 vFootLeft->SetLineColor(fColorStesalite);
3402 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3404 if(GetDebug(3)){ // Remove compiler warning.
3405 ladFingerPrint->InspectShape();
3406 ladFootBox1->InspectShape();
3407 rubyCageHole->InspectShape();
3408 rubyScrewHole->InspectShape();
3409 rubyHole->InspectShape();
3415 //________________________________________________________________________
3416 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3418 // return an assembly containing the CARLOS end-ladder board
3419 // and the heat bridge
3423 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3424 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3425 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3426 TGeoMedium *copper = GetMedium("COPPER$");
3427 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3428 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3430 //=========================================
3431 // cooling support of the Carlos card (HeatBridge):
3432 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3434 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3436 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3438 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3439 supCarlosBoard1, alCu12SDD);
3440 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3441 supCarlosBoard2, alCu12SDD);
3442 vSupCarlosBoard1->SetLineColor(4);
3443 vSupCarlosBoard2->SetLineColor(4);
3446 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3447 // shift of the main planes in the direction of their width
3448 // the center is fixed at the center of the 2 small fixing arms on each sides.
3451 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3452 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3453 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3454 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3456 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3457 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3460 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3464 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3465 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3467 //=========================================
3468 // fixing arm of the cooling support :
3469 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3471 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3472 supCarlosBoard3, alCu12SDD);
3473 vSupCarlosBoard3->SetLineColor(4);
3476 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3478 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3479 littleScrew, stainless);
3480 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3481 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3482 fgkLittleScrewHeadR-0.07, rotScrew);
3483 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3484 fgkLittleScrewHeadR+0.07, rotScrew);
3485 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3486 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3488 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3489 0, fgkCarlosSuppAngle, 0);
3490 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3491 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3492 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3493 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3494 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3495 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3498 //=========================================
3499 // screws fixing the board on the U tube
3500 Double_t aaa = fgkCarlosSuppY3; // ???
3501 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3502 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3503 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3504 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3505 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3506 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3508 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3510 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3511 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3512 screw1y,screw1z, CarlosSuppRot);
3514 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3515 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3516 screw1z,screw1y, CarlosSuppRot);
3518 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3519 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3520 screw1y,screw1z, CarlosSuppRot);
3522 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3523 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3524 screw1z,screw1y, CarlosSuppRot);
3526 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3527 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3528 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3529 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3531 //=========================================
3533 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3534 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3535 card1.SetNLayers(2);
3536 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3537 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3538 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3539 p1[0] = -fgkCarlosCardX1/2;
3540 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3541 p1[2] = fgkCarlosCardShift;
3542 p2[0] = fgkCarlosCardX1/2;
3543 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3544 p2[2] = fgkCarlosCardShift;
3545 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3546 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3547 card1.CreateAndInsertBoxCableSegment(1,90);
3549 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3550 card2.SetNLayers(2);
3551 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3552 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3553 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3555 p1[0] = -fgkCarlosCardX1/2;
3556 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3557 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3559 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3560 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3561 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3562 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3563 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3564 card2.CreateAndInsertBoxCableSegment(1,90);
3566 //=========================================
3567 // some chips on the board
3569 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3571 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3572 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3573 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3575 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3576 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3577 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3579 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3580 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3581 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3582 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3583 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3584 u1.CreateAndInsertBoxCableSegment(1,90);
3587 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3589 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3590 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3591 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3593 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3594 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3595 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3597 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3598 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3599 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3600 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3601 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3602 u2.CreateAndInsertBoxCableSegment(1,90);
3605 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3607 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3608 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3609 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3611 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3612 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3614 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3616 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3618 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3619 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3620 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3621 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3623 //--- U4 is like U3 (?)
3624 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3625 u4Trans->RotateX(90);
3626 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3627 fgkCarlosCardShift + fgkCarlosU4posZ);
3628 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3631 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3633 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3634 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3635 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3637 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3638 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3639 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3641 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3642 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3643 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3644 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3645 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3646 u17.CreateAndInsertBoxCableSegment(1,90);
3649 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3651 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3652 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3653 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3655 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3656 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3657 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3659 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3660 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3661 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3662 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3663 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3664 u35.CreateAndInsertBoxCableSegment(1,90);
3667 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3669 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3670 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3671 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3673 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3674 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3675 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3677 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3678 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3679 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3680 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3681 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3682 u36.CreateAndInsertBoxCableSegment(1,90);
3685 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3687 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3688 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3689 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3691 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3692 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3693 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3695 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3696 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3697 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3698 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3699 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3700 qz1.CreateAndInsertBoxCableSegment(1,90);
3702 return assemblySupCarlos;
3705 //________________________________________________________________________
3706 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3708 // Creates the assemblies containing the LV cards (left and right)
3711 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3712 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3713 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3714 TGeoMedium *copper = GetMedium("COPPER$");
3715 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3716 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3718 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3719 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3721 // we are going to use flat cable class to create multilayer box,
3722 // then we can use the pointers to created volumes to place them elsewhere
3723 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3725 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3726 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3727 cardLV.SetNLayers(2);
3728 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3729 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3730 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3732 p1[1] = fgkLVcardY/2;
3735 p2[1] = fgkLVcardY/2;
3737 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3738 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3739 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3740 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3741 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3742 fCardLVR->AddNode(boxVol, 1, trCard);
3744 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3745 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3746 chipO.SetNLayers(2);
3747 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3748 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3749 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3750 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3751 p1[1] = fgkLVChip0PosY;
3752 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3754 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3755 p2[1] = fgkLVChip0PosY;
3756 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3757 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3758 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3759 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3760 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3762 carLVfullThick/2+chip0fullThick/2, rotAdd);
3763 fCardLVR->AddNode(boxVol, 1, trCard);
3765 // put also this chip on the other side of the card
3766 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3768 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3769 fCardLVL->AddNode(boxVol, 2, trCard);
3770 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3772 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3773 fCardLVR->AddNode(boxVol, 2, trCard);
3775 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3776 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3777 chip1.SetNLayers(2);
3778 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3779 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3780 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3781 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3782 p1[1] = fgkLVChip1PosY;
3783 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3785 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3786 p2[1] = fgkLVChip1PosY;
3787 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3788 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3789 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3790 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3791 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3793 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3794 fCardLVR->AddNode(boxVol, 1, trCard);
3796 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3797 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3798 chip2.SetNLayers(2);
3799 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3800 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3801 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3802 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3803 p1[1] = fgkLVChip2PosY;
3804 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3805 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3806 p2[1] = fgkLVChip2PosY;
3807 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3808 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3809 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3810 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3811 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3813 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3814 fCardLVR->AddNode(boxVol, 1, trCard);
3816 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3817 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3818 chip3.SetNLayers(2);
3819 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3820 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3821 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3822 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3823 p1[1] = fgkLVChip3PosY;
3824 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3825 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3826 p2[1] = fgkLVChip3PosY;
3827 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3828 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3829 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3830 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3831 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3833 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3834 fCardLVR->AddNode(boxVol, 1, trCard);
3836 // the Al pieces for heat exchange :
3837 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3838 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3840 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3841 (fgkLVcoolX1/2+fgkLVcoolX2),
3842 fgkLVcoolPosY+fgkLVcoolY1/2,
3843 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3844 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3845 (fgkLVcoolX1/2+fgkLVcoolX2),
3846 fgkLVcoolPosY+fgkLVcoolY1/2,
3847 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3849 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3851 vAlLVcooling1->SetLineColor(2);
3854 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3855 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3856 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3858 fgkLVcoolPosY+fgkLVcoolY1/2,
3859 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3860 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3862 fgkLVcoolPosY+fgkLVcoolY1/2,
3863 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3865 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3867 vAlLVcooling2->SetLineColor(2);
3870 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3872 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3873 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3874 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3876 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3878 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3879 vAlLVcooling3->SetLineColor(2);
3881 //=== screw fixing th LV card to the U cooling tube :
3882 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3884 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3885 littleScrew, stainless);
3886 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3888 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3890 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3892 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3893 0, fgkLittleLVScrewHeadR,
3894 fgkLittleScrewHeadH/2);
3895 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3896 littleScrewHead, stainless);
3897 vLittleScrewHead->SetLineColor(kGray);
3898 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3899 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3900 fgkShiftLittleScrewLV,
3902 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3904 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3905 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3906 fgkShiftLittleScrewLV,
3908 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3910 // adding the cooling pieces to the left card
3911 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3912 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3913 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3914 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3915 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3917 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3918 -(fgkLVcoolX1/2+fgkLVcoolX2),
3919 fgkLVcoolPosY+fgkLVcoolY1/2,
3920 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3921 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3922 -(fgkLVcoolX1/2+fgkLVcoolX2),
3923 fgkLVcoolPosY+fgkLVcoolY1/2,
3924 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3925 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3927 fgkLVcoolPosY+fgkLVcoolY1/2,
3928 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3929 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3931 fgkLVcoolPosY+fgkLVcoolY1/2,
3932 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3934 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3936 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3938 // and to the right card
3939 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3940 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3941 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3942 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3943 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3948 //________________________________________________________________________
3949 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3951 // return an assembly containing the HV card
3955 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3956 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3957 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3958 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3959 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3960 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3962 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3964 //====================================
3965 //--- the card itself
3966 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
3967 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
3968 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
3969 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
3971 highVCard->AddNode(vCeramicCard, 1, 0);
3974 //====================================
3978 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
3979 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
3980 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
3983 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
3984 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
3985 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
3987 vCapa1End->SetLineColor(18);// grey silver
3988 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
3989 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3990 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
3991 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3993 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
3994 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
3995 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
3997 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
3998 capa1->AddNode(vCapa1Middle, 1,0);
3999 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4000 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4002 highVCard->AddNode(capa1, 1, capa1PosTr);
4005 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4006 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4007 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4010 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4011 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4012 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4014 vCapa2End->SetLineColor(18);// grey silver
4015 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4016 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4017 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4018 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4020 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4021 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4022 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4024 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4025 capa2->AddNode(vCapa2Middle, 1,0);
4026 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4027 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4029 highVCard->AddNode(capa2, 1, capa2PosTr);
4032 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4033 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4034 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4037 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4038 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4039 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4041 vCapa3End->SetLineColor(18);// grey silver
4043 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4044 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4045 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4046 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4048 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4049 capa3->AddNode(vCapa3Middle, 1,0);
4050 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4051 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4053 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4054 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4055 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4057 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4058 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4059 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4061 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4062 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4063 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4065 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4066 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4067 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4069 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4070 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4071 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4073 highVCard->AddNode(capa3, 1, capa3PosTr1);
4074 highVCard->AddNode(capa3, 2, capa3PosTr2);
4075 highVCard->AddNode(capa3, 3, capa3PosTr3);
4076 highVCard->AddNode(capa3, 4, capa3PosTr4);
4077 highVCard->AddNode(capa3, 5, capa3PosTr5);
4079 //====================================
4080 //--- connexions to LV card
4082 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4083 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4084 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4085 Double_t fgkConnexLVHVx = 3*fgkmm;
4086 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4087 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4089 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4090 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4091 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4092 fgkConnexLVHVdiam1/2,
4093 fgkConnexLVHVdiam2/2,
4094 fgkConnexLVHVlen/2);
4095 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4096 connexLVHVmetal, stainless);
4097 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4098 connexLVHVplastic, plastic);
4099 vConnexLVHVmetal->SetLineColor(10);// white
4100 vConnexLVHVplast->SetLineColor(12); // dark grey
4102 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4103 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4104 connexion->AddNode(vConnexLVHVplast, 1, 0);
4106 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4107 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4108 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4109 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4111 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4112 fgkConnexLVHVy1+fgkConnexLVHVdy,
4113 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4114 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4115 fgkConnexLVHVy1+fgkConnexLVHVdy,
4116 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4118 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4119 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4120 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4121 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4122 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4123 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4125 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4126 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4127 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4128 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4129 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4130 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4132 highVCard->AddNode(connexion, 1, trConnexion1);
4133 highVCard->AddNode(connexion, 2, trConnexion2);
4134 highVCard->AddNode(connexion, 3, trConnexion3);
4135 highVCard->AddNode(connexion, 4, trConnexion4);
4136 highVCard->AddNode(connexion, 5, trConnexion5);
4137 highVCard->AddNode(connexion, 6, trConnexion6);
4138 highVCard->AddNode(connexion, 7, trConnexion7);
4139 highVCard->AddNode(connexion, 8, trConnexion8);
4141 //====================================
4142 //--- cooling pieces
4144 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4145 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4148 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4149 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4151 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4152 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4154 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4156 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4158 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4160 // This last volume contains the screw used for fixing
4161 // the card to the cooling tube ...
4162 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4164 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4165 littleScrewHV, stainless);
4167 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4168 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4170 vCardHVcool1->SetLineColor(2); //red
4171 vCardHVcool2->SetLineColor(2); //red
4172 vCardHVcool3->SetLineColor(2); //red
4174 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4175 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4176 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4177 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4178 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4179 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4180 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4181 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4183 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4184 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4186 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4187 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4188 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4189 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4191 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4192 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4193 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4194 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4196 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4197 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4199 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4200 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4201 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4202 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4204 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4205 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4206 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4207 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4209 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4210 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4212 //====================================
4214 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4215 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4216 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4217 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4219 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4220 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4221 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4222 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4225 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4226 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4232 //________________________________________________________________________
4233 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4235 // return an assembly containing the LV, HV and Carlos cards of one ladder
4236 // and their cooling system
4239 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4240 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4241 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4243 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4245 //=*********************************
4246 //--- The rounded pipe for the end ladder card coooling
4248 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4249 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4253 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4254 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4258 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4259 endLadderPipe.SetNLayers(2);
4260 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4261 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4263 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4264 // of the U colling pipe in its center
4266 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4267 Double_t vectA[3] = {0,0,1};
4269 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4270 Double_t vectB[3] = {0,0,1};
4272 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4273 Double_t vectC[3] = {1,0,0};
4275 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4276 Double_t vectD[3] = {-1,0,0};
4278 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4279 Double_t vectE[3] = {0,0,-1};
4281 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4282 Double_t vectF[3] = {0,0,-1};
4284 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4285 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4286 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4287 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4288 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4289 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4291 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4292 //endLadderPipe.CreateAndInsertCableSegment( 1);
4293 endLadderPipe.CreateAndInsertTubeSegment( 1);
4294 //endLadderPipe.CreateAndInsertCableSegment( 2);
4295 endLadderPipe.CreateAndInsertTorusSegment( 2);
4296 //endLadderPipe.CreateAndInsertCableSegment( 3);
4297 endLadderPipe.CreateAndInsertTubeSegment( 3);
4298 //endLadderPipe.CreateAndInsertCableSegment( 4);
4299 endLadderPipe.CreateAndInsertTorusSegment( 4);
4300 //endLadderPipe.CreateAndInsertCableSegment( 5);
4301 endLadderPipe.CreateAndInsertTubeSegment( 5);
4303 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4304 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4305 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4306 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4308 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4309 - fgkEndLadPipeArmBoxDX,
4310 fgkEndLadPipeArmBoxDY,0);
4311 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4312 fgkEndLadPipeArmBoxDX,
4313 fgkEndLadPipeArmBoxDY,0);
4314 endLadPipeArmBoxDY1->RegisterYourself();
4315 endLadPipeArmBoxDY2->RegisterYourself();
4317 if(GetDebug(3)) { // Remove compiler warning.
4318 endLadPipeArmBox->InspectShape();
4319 endLadPipeArmTube->InspectShape();
4322 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4323 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4324 "- endLadPipeArmTube");
4325 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4326 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4327 "- endLadPipeArmTube");
4329 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4330 endLadPipeArm1, alCu12SDD);
4331 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4332 endLadPipeArm2, alCu12SDD);
4333 vEndLadPipeArm1->SetLineColor(2);
4334 vEndLadPipeArm2->SetLineColor(2);
4336 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4337 +fgkEndLadPipeArmZpos);
4339 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4340 -fgkEndLadPipeUwidth/2,0,armZ);
4341 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4342 fgkEndLadPipeUwidth/2,0,armZ);
4344 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4345 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4347 //=*********************************
4349 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4350 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4352 Double_t spaceBetweenCards = 0.2*fgkmm;
4354 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4355 +fgkEndLadPipeArmBoxDX);
4356 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4357 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4359 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4362 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4363 +coolUzPos+1.25*fgkmm;
4364 // Position in z of the first LVB with respect to the start of the cooling
4365 // rectangular arm, coming (from inside of the ladder)
4366 // The cards are added one after the other
4368 for (Int_t iCard=0; iCard<nCards; iCard++) {
4370 Double_t cardLVzShift = firstLVCardZ +
4371 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4373 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4374 cardLVyShift, cardLVzShift);
4375 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4376 cardLVyShift, cardLVzShift);
4378 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4379 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4382 //=*********************************
4384 TGeoVolumeAssembly *cardHV = fCardHV;
4386 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4387 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4389 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4390 -(fgkHVCardCeramZ)/2);
4392 for (Int_t iCard=0; iCard<nCards; iCard++) {
4394 Double_t fact = iCard*2.+1.;
4395 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4396 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4397 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4398 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4401 //=*********************************
4404 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4405 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4406 // 0, -fgkCarlosSuppAngle, 0);
4408 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4409 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4410 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4411 // position in z of the first Carlos board, coming from inside of the ladder
4413 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4414 fgkEndLadPipeArmBoxDY);
4416 for (Int_t iCard=0; iCard<nCards; iCard++) {
4418 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4419 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4420 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4421 (TGeoRotation*) fCommonTr[0]);
4423 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4426 return endLadderCards;
4430 //________________________________________________________________________
4431 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4433 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4434 // and their cooling system
4435 // This is the code actually used for the end ladder cards
4438 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4439 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4440 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4441 TGeoMedium *copper = GetMedium("COPPER$");
4442 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4443 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4444 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4446 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4447 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4449 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4450 // reference radius corresponding to local y=0
4453 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4454 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4456 rREF = fgkEndLaddCardsShortRadiusLay4;
4459 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4460 +fgkEndLadPipeArmBoxDX);
4461 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4462 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4464 Double_t rMin = rREF + cardLVyShift;
4465 // (The LV card is defining rMin because it is the lower object)
4467 Double_t thickTotCable = 0.5;
4469 //==================================
4470 //--- The Pcon container
4472 // minimum angle of the Pcon :
4473 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4474 (rREF-fgkEndLadPipeArmY/2) );
4475 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4476 Double_t phi0 = 90-dphi/2;
4477 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4478 // of the U colling pipe in its center
4479 Double_t zMax = endLadPipeUlength+coolUzPos;
4480 Double_t rMax = rMin + fgkLVcardY;
4481 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4482 Double_t cablesRadius = rMax-0.5;
4484 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4485 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4486 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4487 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4488 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4489 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4490 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4491 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4492 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4493 // the following is quite dirty but works for the moment ...
4494 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4495 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4497 // The next parameters define the shape of the Pcon at its end and where cables
4499 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4500 Double_t cableSectionR2 = rMax;
4501 Double_t cableSectionZ1 = zMax + 6.3*fgkmm + 2.5*fgkcm;
4502 Double_t cableSectionZ2 = zMax + 7.3*fgkmm + 4*fgkcm;
4503 // Those 6.3 and 7.3 are to be fixed to stick the maximum to the SDD cone
4504 // (I'm waiting for the new cone)
4506 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4507 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4509 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4510 //endLadderCards->SetVisibility(kFALSE);
4512 //=*********************************
4513 //--- The rounded pipe for the end ladder card cooling
4515 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4516 endLadderPipe.SetNLayers(2);
4517 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4518 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4520 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4521 Double_t vectA[3] = {0,0,1};
4523 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4524 Double_t vectB[3] = {0,0,1};
4526 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4527 Double_t vectC[3] = {1,0,0};
4529 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4530 Double_t vectD[3] = {-1,0,0};
4532 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4533 Double_t vectE[3] = {0,0,-1};
4535 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4536 Double_t vectF[3] = {0,0,-1};
4538 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4539 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4540 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4541 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4542 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4543 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4545 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4546 //endLadderPipe.CreateAndInsertCableSegment( 1);
4547 endLadderPipe.CreateAndInsertTubeSegment( 1);
4548 //endLadderPipe.CreateAndInsertCableSegment( 2);
4549 endLadderPipe.CreateAndInsertTorusSegment( 2);
4550 //endLadderPipe.CreateAndInsertCableSegment( 3);
4551 endLadderPipe.CreateAndInsertTubeSegment( 3);
4552 //endLadderPipe.CreateAndInsertCableSegment( 4);
4553 endLadderPipe.CreateAndInsertTorusSegment( 4);
4554 //endLadderPipe.CreateAndInsertCableSegment( 5);
4555 endLadderPipe.CreateAndInsertTubeSegment( 5);
4557 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4558 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4559 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4560 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4562 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4563 - fgkEndLadPipeArmBoxDX,
4564 fgkEndLadPipeArmBoxDY,0);
4565 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4566 fgkEndLadPipeArmBoxDX,
4567 fgkEndLadPipeArmBoxDY,0);
4568 endLadPipeArmBoxDY1->RegisterYourself();
4569 endLadPipeArmBoxDY2->RegisterYourself();
4571 if(GetDebug(3)) { // Remove compiler warning.
4572 endLadPipeArmBox->InspectShape();
4573 endLadPipeArmTube->InspectShape();
4576 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4577 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4578 "- endLadPipeArmTube");
4579 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4580 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4581 "- endLadPipeArmTube");
4583 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4584 endLadPipeArm1, alCu12SDD);
4585 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4586 endLadPipeArm2, alCu12SDD);
4587 vEndLadPipeArm1->SetLineColor(2);
4588 vEndLadPipeArm2->SetLineColor(2);
4590 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4591 +fgkEndLadPipeArmZpos);
4593 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4594 -fgkEndLadPipeUwidth/2,rREF,armZ);
4595 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4596 fgkEndLadPipeUwidth/2,rREF,armZ);
4598 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4599 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4601 //=*********************************
4603 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4604 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4606 Double_t spaceBetweenCards = 0.2*fgkmm;
4609 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4612 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4613 +coolUzPos+1.25*fgkmm;
4614 // Position in z of the first LVB with respect to the start of the cooling
4615 // rectangular arm, coming (from inside of the ladder)
4616 // The cards are added one after the other
4618 for (Int_t iCard=0; iCard<nCards; iCard++) {
4620 Double_t cardLVzShift = firstLVCardZ +
4621 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4623 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4624 cardLVyShift+rREF, cardLVzShift);
4625 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4626 cardLVyShift+rREF, cardLVzShift);
4628 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4629 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4632 //=*********************************
4634 TGeoVolumeAssembly *cardHV = fCardHV;
4636 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4637 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4638 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4640 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4641 -(fgkHVCardCeramZ)/2);
4643 for (Int_t iCard=0; iCard<nCards; iCard++) {
4645 Double_t fact = iCard*2.+1.;
4646 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4647 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4648 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4649 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4652 //=*********************************
4655 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4656 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4657 // 0, -fgkCarlosSuppAngle, 0);
4659 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4660 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4661 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4662 // position in z of the first Carlos board, coming from inside of the ladder
4664 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4665 fgkEndLadPipeArmBoxDY);
4667 for (Int_t iCard=0; iCard<nCards; iCard++) {
4669 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4670 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4671 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4672 (TGeoRotation*) fCommonTr[0]);
4674 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4678 //=*********************************
4682 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4683 + fgkSectionGlassPerMod)*nCards;
4684 // We fix thickness, then width is calculated accordingly
4685 Double_t width = sectionV/thickTotCable;
4686 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4687 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4688 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4689 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4690 Double_t thickGlass = thickTotCable - thickCu - thickPlast;
4692 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4693 cable.SetNLayers(3);
4694 cable.SetLayer(0, thickCu, copper, kRed);
4695 cable.SetLayer(1, thickPlast, plastic, kYellow);
4696 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4698 Double_t zVect[3]={0,0,1};
4699 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4700 +spaceBetweenCarlsoCards)/2 + 2.9;
4701 // the 2.9cm is for taking into account carlos card angle...
4703 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4704 cableSectionR2,cableSectionZ1,cableSectionZ2);
4706 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4707 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4708 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4709 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4710 cable.SetInitialNode(endLadderCards);
4711 cable.CreateAndInsertCableSegment(1);
4713 return endLadderCards;
4716 //________________________________________________________________________
4717 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4719 // return an assembly of the support rings, attaching the ladders to the cone
4725 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4726 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4729 //**********************************
4732 Double_t fgkRubyCageX = 9*fgkmm;
4733 Double_t fgkRubyCageY = 5.5*fgkmm;
4734 Double_t fgkRubyCageZ = 8*fgkmm;
4735 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4736 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4737 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4738 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4739 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4741 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4744 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4746 // pieces common to both square and V cages
4747 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4748 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4750 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4751 fgkRubyCageHoleDX/2+epsilon);
4753 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4754 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4755 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4756 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4757 trScrewHole->RegisterYourself();
4759 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4760 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4761 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4762 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4763 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4764 trScrewHoleFoot->RegisterYourself();
4767 // pieces which differ
4768 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4770 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4771 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4773 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4774 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4775 trRubyCageVInternBox->RegisterYourself();
4777 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4778 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4779 fgkRubyCageInternSide/4);
4781 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4782 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4783 +epsilon,0,0, rotV );
4784 trRubyCageVInternTriangl->RegisterYourself();
4787 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4788 "rubyCageBox-(rubyCageInternBox"
4789 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4791 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4792 rubyCageSquare, stainless);
4793 vRubyCageSquare->SetLineColor(10);
4795 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4796 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4797 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4798 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4799 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4800 vRubyCageV->SetLineColor(10);
4802 if(GetDebug(3)) { // Remove compiler warning.
4803 rubyCageBox->InspectShape();
4804 rubyCageInternBox->InspectShape();
4805 screwHole->InspectShape();
4806 screwHoleFoot->InspectShape();
4807 rubyCageVInternBox->InspectShape();
4808 rubyCageVInternTriangl->InspectShape();
4811 supportRing->AddNode(vRubyCageSquare, 0, 0);
4812 //supportRing->AddNode(vRubyCageV, 0, 0);
4818 //________________________________________________________________________
4819 void AliITSv11GeometrySDD::CreateSDDsensor() {
4821 // return a box containing the SDD sensor
4824 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4825 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4826 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4827 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4828 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4829 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4832 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4833 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4834 // width : in the beam direction !
4836 Double_t sensoxBoxLength = ( fgkWaferLength +
4837 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4838 // Makes life easier to include the space for the WA HV cable on both sides
4839 Double_t sensoxBoxThick = fgkWaferThickness +
4840 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4842 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4843 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4845 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4846 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4848 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4849 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4852 //****************************
4854 //****************************
4856 // we need 2 different sensor objects, because they have to have different names
4857 // This is required for the step manager
4859 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4860 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4863 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4864 wafer3->SetLineColor(fColorSilicon);
4865 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4866 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4867 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4868 sensVol3->SetLineColor(fColorSilicon+5);
4869 wafer3->AddNode(sensVol3, 1, 0);
4870 fSDDsensor3->AddNode(wafer3, 1, 0);
4872 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4873 wafer4->SetLineColor(fColorSilicon);
4874 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4875 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4876 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4877 sensVol4->SetLineColor(fColorSilicon+5);
4878 wafer4->AddNode(sensVol4, 1, 0);
4879 fSDDsensor4->AddNode(wafer4, 1, 0);
4882 //****************************
4884 //****************************
4885 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4886 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4887 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4888 vGlass->SetLineColor(fColorGlass);
4889 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4890 fgkWaferThickness/2+fgkSensorGlassLY/2,
4891 fgkGlassDZOnSensor);
4892 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4893 fgkWaferThickness/2+fgkSensorGlassLY/2,
4894 fgkGlassDZOnSensor);
4895 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4896 fgkWaferThickness/2+fgkSensorGlassLY/2,
4897 -fgkGlassDZOnSensor);
4898 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4899 fgkWaferThickness/2+fgkSensorGlassLY/2,
4900 -fgkGlassDZOnSensor);
4901 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4902 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4903 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4904 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4906 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4907 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4908 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4909 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4911 //****************************
4912 // Wrap-around cable
4913 //****************************
4915 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4916 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4917 waHVCable.SetNLayers(2);
4918 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4919 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4920 waHVCable.SetInitialNode(fSDDsensor3);
4922 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4923 x1[0] = -fgkWaHVcableLength/2;
4925 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4927 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4930 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4931 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4932 TGeoCombiTrans *ctSegment = 0;
4933 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4934 fSDDsensor4->AddNode(segment, 1, ctSegment);
4938 waHVCable.SetName("ITSsddWaHVCableD");
4939 waHVCable.ResetPoints();
4940 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4941 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4942 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
4943 fSDDsensor4->AddNode(segment, 1, ctSegment);
4945 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
4947 waHVCableFold.SetPhi(180,360);
4948 waHVCableFold.SetNLayers(2);
4949 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
4950 polyhamideSDD, fColorPolyhamide);
4951 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4952 waHVCableFold.SetInitialNode(fSDDsensor3);
4955 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
4957 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4958 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4959 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
4960 fSDDsensor4->AddNode(segment, 1, ctSegment);
4963 //****************************
4965 //****************************
4966 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
4967 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
4968 /(2.*fgkTransitHVHeadLZ);
4969 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
4970 headRadius-fgkTransitHVHeadLZ)
4973 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
4974 fgkTransitHVPolyThick/2,
4976 headPoly->SetName("headPoly");
4977 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
4978 -fgkTransitHVPolyThick/2);
4979 headPolyTr->SetName("headPolyTr");
4980 headPolyTr->RegisterYourself();
4982 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
4983 fgkTransitHVAlThick/2,
4985 headAl->SetName("headAl");
4986 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
4987 -fgkTransitHVPolyThick
4988 -fgkTransitHVAlThick/2);
4989 headAlTr->SetName("headAlTr");
4990 headAlTr->RegisterYourself();
4992 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
4993 (headRadius-fgkTransitHVHeadLZ)/2,
4994 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
4995 cache->SetName("cache");
4997 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
4998 (headRadius-fgkTransitHVHeadLZ)/2,
4999 -(fgkTransitHVPolyThick
5000 +fgkTransitHVAlThick)/2);
5001 headCacheTr->SetName("cacheTr");
5002 headCacheTr->RegisterYourself();
5004 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5005 "headPoly:headPolyTr-cache:cacheTr");
5006 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5007 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5008 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5009 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5010 "headAl:headAlTr-cache:cacheTr");
5011 TGeoVolume *vHeadAlComp = new TGeoVolume(
5012 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5013 vHeadAlComp->SetLineColor(fColorAl);
5016 // TGeoRotation rotHead("",0,90,0);
5017 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5018 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5020 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5021 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5022 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5025 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5026 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5027 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5028 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5031 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5032 fgkTransitHVBondingLZ,
5033 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5034 transitHVCable.SetNLayers(2);
5035 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5037 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5038 transitHVCable.SetInitialNode(fSDDsensor3);
5040 x1[0] = -fgkTransitHVHeadLX/2;
5042 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5046 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5047 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5048 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5049 fSDDsensor4->AddNode(segment, 1, ctSegment);
5051 transitHVCable.ResetPoints();
5052 transitHVCable.SetName("ITSsddHVtransitTail");
5053 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5054 x1[0] = fgkTransitHVtailXpos;
5055 x2[0] = fgkTransitHVtailXpos;
5056 x1[2] = -fgkTransitHVBondingLZ/2;
5057 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5058 Double_t vZ[3] = {0,0,1};
5059 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5060 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5061 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5062 fSDDsensor4->AddNode(segment, 1, ctSegment);
5065 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5066 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5067 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5068 fgkTransitHVsideLZ);
5069 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5070 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5071 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5072 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5073 fgkTransitHVsideLZ);
5074 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5075 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5077 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5078 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5079 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5080 fgkTransitHVsideLZ);
5081 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5082 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5083 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5084 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5085 fgkTransitHVsideLZ);
5086 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5087 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5089 // sideRight is not there actually
5090 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5091 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5092 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5093 // fgkTransitHVsideLZ);
5094 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5095 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5096 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5097 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5098 // fgkTransitHVsideLZ);
5099 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5100 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5102 // TGeoRotation rotSide("",0,-90,0);
5103 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5104 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5105 // -fgkTransitHVBondingLZ/2,&rotSide);
5106 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5107 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5108 // -fgkTransitHVBondingLZ/2, &rotSide);
5109 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5110 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5111 // -fgkTransitHVBondingLZ/2, &rotSide);
5112 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5113 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5114 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5115 // -fgkTransitHVBondingLZ/2,rotSide);
5116 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5117 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5118 -fgkTransitHVBondingLZ/2, rotSide);
5119 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5120 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5121 -fgkTransitHVBondingLZ/2, rotSide);
5123 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5124 sideLeft,polyhamideSDD);
5125 vSideLeft->SetLineColor(fColorPolyhamide);
5126 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5128 vSideLeftAl->SetLineColor(fColorAl);
5130 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5131 // sideRight,polyhamideSDD);
5132 // vSideRight->SetLineColor(fColorPolyhamide);
5134 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5135 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5136 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5138 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5139 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5140 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5143 //****************************
5145 fSDDsensor3->CheckOverlaps(0.01);
5146 fSDDsensor4->CheckOverlaps(0.01);
5149 fSDDsensor3->SetVisibility(kFALSE);
5150 fSDDsensor4->SetVisibility(kFALSE);
5154 //________________________________________________________________________
5155 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5157 // return a box volume containing the detectors
5160 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5162 Int_t nDetectors = fgkLay3Ndet;
5163 Double_t ladderLength = fgkLay3LadderLength;
5164 Double_t *sensorZPos = fLay3sensorZPos;
5168 nDetectors = fgkLay4Ndet;
5169 ladderLength = fgkLay4LadderLength;
5170 sensorZPos = fLay4sensorZPos;
5172 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5176 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5177 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5179 sprintf(name,"ITSsddDetBox%i",iLay);
5180 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5181 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5182 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5184 for (Int_t i=0; i<nDetectors; i++) {
5185 Double_t localZ = sensorZPos[i];
5186 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5187 if (iLay==3) if (i%2!=0) localY = -localY;
5188 if (iLay==4) if (i%2==0) localY = -localY;
5189 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5191 if (i >= nDetectors/2) {
5192 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5193 sensorPos->SetName(name);
5194 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5197 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5198 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5200 sensorPos->SetName(name);
5201 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5205 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5206 virtualDet->SetVisibility(kFALSE);
5211 //________________________________________________________________________
5212 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5214 // return a box volume containing the detectors
5217 Int_t nDetectors = fgkLay3Ndet;
5218 Double_t ladderLength = fgkLay3LadderLength;
5219 Double_t *sensorZPos = fLay3sensorZPos;
5220 TGeoVolume *sensorSDD = fSDDsensor3;
5224 nDetectors = fgkLay4Ndet;
5225 ladderLength = fgkLay4LadderLength;
5226 sensorZPos = fLay4sensorZPos;
5227 sensorSDD = fSDDsensor4;
5229 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5233 sprintf(name,"ITSsddDetBox%i",iLay);
5235 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5237 for (Int_t i=0; i<nDetectors; i++) {
5238 Double_t localZ = sensorZPos[i];
5239 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5240 if (iLay==3) if (i%2!=0) localY = -localY;
5241 if (iLay==4) if (i%2==0) localY = -localY;
5242 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5244 if (i >= nDetectors/2) {
5245 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5246 sensorPos->SetName(name);
5247 virtualDet->AddNode(sensorSDD, i, sensorPos);
5250 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5251 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5253 sensorPos->SetName(name);
5254 virtualDet->AddNode(sensorSDD, i, sensorPos);
5258 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5263 //________________________________________________________________________
5264 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5267 // export the geometry in a AliITSgeom object
5272 printf("error:Try to fill null (AliITSgeom *) object");
5276 printf("error:Try to set sensor geometry while geometry is not defined\n");
5280 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5281 fgkWaferLengthSens/2.};
5282 if(!(geom->IsShapeDefined(kSDD)))
5283 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5286 char ladderName[30];
5287 char sensorName[30];
5288 char senstivName[30];
5289 const Int_t kNLay = 2;
5290 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5291 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5294 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5296 Int_t firstSDDmod = startMod;
5297 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5298 /////////////////////////////////////////
5299 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5300 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5302 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5303 TGeoVolume *layVolume = layNode->GetVolume();
5304 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5306 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5307 /////////////////////////////////////////
5308 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5309 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5311 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5312 TGeoVolume *laddVolume = laddNode->GetVolume();
5313 TGeoHMatrix laddMatrix(layMatrix);
5314 laddMatrix.Multiply(laddNode->GetMatrix());
5316 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5317 /////////////////////////////////////////
5318 sprintf(sensorName, "ITSsddSensor_%i",iDet);
5319 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5321 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5322 TGeoVolume *detVolume = detNode->GetVolume();
5323 TGeoHMatrix detMatrix(laddMatrix);
5324 detMatrix.Multiply(detNode->GetMatrix());
5326 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5328 TGeoVolume *wafVolume = wafNode->GetVolume();
5329 TGeoHMatrix wafMatrix(detMatrix);
5330 detMatrix.Multiply(wafNode->GetMatrix());
5331 //--------------------------------------------------------
5332 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5333 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5335 TGeoHMatrix sensMatrix(wafMatrix);
5336 sensMatrix.Multiply(sensitivNode->GetMatrix());
5338 // Sticking to the convention for local wafer coordinate
5340 if (iDet >= kNDet[iLay]/2) {
5341 // TGeoRotation rotY("",0,180,0);
5342 TGeoRotation rotY("",-180,-180,0);
5343 sensMatrix.Multiply(&rotY);
5345 // Creating the matrix in AliITSgeom for
5346 // this sensitive volume :
5347 Double_t *trans = sensMatrix.GetTranslation();
5348 Double_t *r = sensMatrix.GetRotationMatrix();
5349 Double_t rot[10] = {r[0],r[1],r[2],
5351 r[6],r[7],r[8], 1.0};
5352 //rot[9]!=0.0 => not a unity matrix
5353 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5355 // iLadd+1, iDet+1 because ladd. and det. start at +1
5360 printf("Error (ExportSensorGeometry) %s not found !\n",
5363 printf("Error (ExportSensorGeometry) %s not found !\n",
5366 printf("Error (ExportSensorGeometry) %s not found !\n",
5370 printf("Error (ExportSensorGeometry) %s not found !\n",
5374 printf("Error (ExportSensorGeometry) %s not found !\n",
5378 return (startMod-firstSDDmod);
5382 //________________________________________________________________________
5383 Int_t AliITSv11GeometrySDD::
5384 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5386 // Function which gives the layer, ladder and det.
5387 // index of the current volume. To be used in
5388 // AliITS::StepManager()
5391 if (gGeoManager->GetLevel()<3) return kFALSE;
5392 // Get the det index :
5393 TGeoNode *node = gGeoManager->GetMother(2);
5394 if (!node) return kFALSE;
5395 det = node->GetNumber()+1;
5397 // Get the ladder index :
5398 node = gGeoManager->GetMother(3);
5399 if (!node) return kFALSE;
5400 ladd = node->GetNumber()+1;
5402 // Get the layer index :
5403 if (node->GetNdaughters()==fgkLay3Ndet)
5404 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5411 //________________________________________________________________________
5412 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5413 Double_t r2max, Double_t z2,
5414 Double_t section, Int_t nDiv)
5416 // Creates a cone along z where the section is approximately constant
5417 // with z. This is for simulation of cables, because a cone with a constant
5418 // radius difference would show a quantity of matter increasing with z...
5419 // The max radius of the created Pcon is evolving linearly, the min radius
5420 // is calculated at several steps (nDiv).
5421 // z2 > z1 (required by the Pcon)
5423 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5425 Double_t dr = (r2max-r1max)/nDiv;
5426 Double_t dz = (z2-z1)/nDiv;
5427 Double_t r1minI, r2minI, r1maxI, r2maxI;
5430 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5431 Double_t cosAlpha = (z2-z1)/lZ;
5433 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5434 myPcon->DefineSection(0, z1, r1minI, r1max);
5436 for (Int_t i=0; i<nDiv; i++) {
5440 r1maxI = r1max + i*dr;
5441 r2maxI = r1maxI + dr;
5443 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5444 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5450 //________________________________________________________________________
5451 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5452 Double_t refZ1, Double_t refZ2) {
5453 // just a helping function
5454 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5457 //________________________________________________________________________
5458 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5459 Int_t nLay3, Int_t nLay4,
5460 Double_t r1, Double_t z1,
5461 Double_t r2, Double_t z2) {
5463 // Create some cables portions from SDD modules grouped
5464 // and attached at the border of the SSD cone
5466 TGeoMedium *copper = GetMedium("COPPER$");
5467 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
5468 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5470 char titleCable[30];
5471 sprintf(titleCable,"cableSDDport%i",(Int_t)angle);
5474 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5475 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5476 Double_t width = section/thickness;
5477 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5478 +fgkSectionGlassPerMod);
5480 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5481 +fgkSectionGlassPerMod);
5483 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5484 +fgkSectionGlassPerMod);
5486 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5487 Double_t cosAlpha = (z2-z1)/hypothenus;
5488 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5489 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5490 angle *= TMath::DegToRad();
5491 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5492 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5493 Double_t pos1[3] = {x1,y1,z1};
5494 Double_t pos2[3] = {x2,y2,z2};
5495 Double_t zVect[3] = {0,0,1};
5497 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5498 cable.SetNLayers(3);
5499 cable.SetLayer(0, thickPlast, plastic, kYellow);
5500 cable.SetLayer(1, thickCu, copper, kRed);
5501 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5503 cable.AddCheckPoint( mother, 0, pos1, zVect );
5504 cable.AddCheckPoint( mother, 1, pos2, zVect );
5505 cable.SetInitialNode(mother);
5506 cable.CreateAndInsertCableSegment(1);
5513 //________________________________________________________________________
5514 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth) {
5516 // Creates and inserts the SDD cables running on SDD and SSD cones
5518 TGeoMedium *copper = GetMedium("COPPER$");
5519 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
5520 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5521 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5524 //==================================
5526 //==================================
5528 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5529 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5531 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5532 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5533 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5535 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5536 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5537 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5539 // calculate z1, z2 thanks to R1 and R2
5540 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, fgkConeSDDr1,fgkConeSDDr2,fgkConeSDDz1,fgkConeSDDz2);
5541 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, fgkConeSDDr1,fgkConeSDDr2,fgkConeSDDz1,fgkConeSDDz2);
5542 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, fgkConeSDDr1,fgkConeSDDr2,fgkConeSDDz1,fgkConeSDDz2);
5544 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5546 //==================================
5547 // first set of cones : cables from layer 3
5548 //==================================
5550 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5551 fgkSDDCableR2, sddCableZ2,
5552 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5554 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5555 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0), pcon1all->GetRmax(0));
5556 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5557 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax, pcon1all->GetRmax(1));
5559 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container", pcon1container, airSDD);
5560 vpcon1container->SetVisibility(kFALSE);
5562 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5563 fgkSDDCableR2, sddCableZ2,
5564 sectionLay3Plastic, 3);
5565 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast", pcon1plast, plastic);
5566 vpcon1plast->SetLineColor(kYellow);
5567 vpcon1container->AddNode(vpcon1plast, 0);
5569 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5570 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5571 fgkSDDCableR2 - dr1a, sddCableZ2,
5573 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu", pcon1Cu, copper);
5574 vpcon1Cu->SetLineColor(kRed);
5575 vpcon1container->AddNode(vpcon1Cu, 0);
5576 //moth->AddNode(vpcon1Cu, 0);
5579 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5580 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5581 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5582 sectionLay3Glass, 3);
5583 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass", pcon1glass, opticalFiber);
5584 vpcon1glass->SetLineColor(kGreen);
5585 vpcon1container->AddNode(vpcon1glass, 0);
5587 moth->AddNode(vpcon1container, 0);
5588 moth->AddNode(vpcon1container, 1, rotCableSDD);
5590 //==================================
5591 // 2nd set of cones : cables from layer 3 and layer 4
5592 //==================================
5594 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5595 fgkSDDCableR3, sddCableZ3,
5596 sectionLay3Plastic+sectionLay4Plastic+
5597 sectionLay3Cu+sectionLay4Cu+
5598 sectionLay3Glass+sectionLay4Glass, 1);
5599 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5600 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0), pcon2all->GetRmax(0));
5601 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5602 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax, pcon2all->GetRmax(1));
5604 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container", pcon2container, airSDD);
5605 vpcon2container->SetVisibility(kFALSE);
5607 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5608 fgkSDDCableR3, sddCableZ3,
5609 sectionLay3Plastic+sectionLay4Plastic, 3);
5610 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast", pcon2plast, plastic);
5611 vpcon2plast->SetLineColor(kYellow);
5612 vpcon2container->AddNode(vpcon2plast, 0);
5614 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5615 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5616 fgkSDDCableR3 - dr2a, sddCableZ3,
5617 sectionLay3Cu+sectionLay4Cu, 3);
5618 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu", pcon2Cu, copper);
5619 vpcon2Cu->SetLineColor(kRed);
5620 vpcon2container->AddNode(vpcon2Cu, 0);
5623 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5624 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5625 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5626 sectionLay3Glass+sectionLay4Glass, 3);
5627 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass", pcon2glass, opticalFiber);
5628 vpcon2glass->SetLineColor(kGreen);
5629 vpcon2container->AddNode(vpcon2glass, 0);
5631 moth->AddNode(vpcon2container, 0);
5632 moth->AddNode(vpcon2container, 1, rotCableSDD);
5634 //==================================
5635 // intermediate cylinder
5636 //==================================
5638 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl", pcon2container->GetRmin(1),
5639 pcon2container->GetRmax(1),
5640 fgkSDDCableDZint/2);
5641 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",interCyl, airSDD);
5642 vInterCyl->SetVisibility(kFALSE);
5645 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5646 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5647 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5649 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5650 rmaxCylPlast, fgkSDDCableDZint/2);
5651 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast", interCylPlast, plastic);
5652 vInterCylPlast->SetLineColor(kYellow);
5653 vInterCyl->AddNode(vInterCylPlast, 0);
5656 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5657 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5658 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5659 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5660 rmaxCylCu, fgkSDDCableDZint/2);
5661 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu", interCylCu, copper);
5662 vInterCylCu->SetLineColor(kRed);
5663 vInterCyl->AddNode(vInterCylCu, 0);
5666 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5667 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5668 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5669 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5670 rmaxCylGlass, fgkSDDCableDZint/2);
5671 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",interCylGlass,opticalFiber);
5672 vInterCylGlass->SetLineColor(kGreen);
5673 vInterCyl->AddNode(vInterCylGlass, 0);
5676 TGeoTranslation *trInterCylP = new TGeoTranslation("trSddCableInterCylPos",
5677 0,0,sddCableZ3+fgkSDDCableDZint/2);
5678 moth->AddNode(vInterCyl, 0,trInterCylP);
5679 TGeoTranslation *trInterCylN = new TGeoTranslation("trSddCableInterCylNeg",
5680 0,0,-sddCableZ3-fgkSDDCableDZint/2);
5682 moth->AddNode(vInterCyl, 1,trInterCylN);
5684 //==================================
5685 // cable cone on the SSD cone
5686 //==================================
5688 Double_t sddCableR4 = rmaxCylPlast;
5689 Double_t sddCableZ4 = sddCableZ3+fgkSDDCableDZint;
5691 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5692 fgkSDDCableR5, fgkSDDCableZ5,
5693 sectionLay3Plastic+sectionLay4Plastic+
5694 sectionLay3Cu+sectionLay4Cu+
5695 sectionLay3Glass+sectionLay4Glass, 1);
5697 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5698 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0), pcon3all->GetRmax(0));
5699 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5700 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax, pcon3all->GetRmax(1));
5702 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container", pcon3container, airSDD);
5703 vpcon3container->SetVisibility(kFALSE);
5705 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5706 fgkSDDCableR5, fgkSDDCableZ5,
5707 sectionLay3Plastic+sectionLay4Plastic, 3);
5708 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast", pcon3plast, plastic);
5709 vpcon3plast->SetLineColor(kYellow);
5710 vpcon3container->AddNode(vpcon3plast, 0);
5712 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5713 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5714 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5715 sectionLay3Cu+sectionLay4Cu, 3);
5716 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu", pcon3Cu, copper);
5717 vpcon3Cu->SetLineColor(kRed);
5718 vpcon3container->AddNode(vpcon3Cu, 0);
5721 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5722 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5723 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5724 sectionLay3Glass+sectionLay4Glass, 3);
5725 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass", pcon3glass,opticalFiber);
5726 vpcon3glass->SetLineColor(kGreen);
5727 vpcon3container->AddNode(vpcon3glass, 0);
5729 moth->AddNode(vpcon3container, 0);
5730 moth->AddNode(vpcon3container, 1, rotCableSDD);
5733 //==================================
5734 // cables that are grouped at the end of SSD cones
5735 //==================================
5737 Double_t fgkSDDCableR6 = fgkSDDCableR5+10;
5738 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+10;
5740 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5742 CreateAndInsetConeCablePart(endConeSDDCable, 40, 1*3,2*4, fgkSDDCableR5,
5743 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5745 CreateAndInsetConeCablePart(endConeSDDCable, 60, 1*3,1*4, fgkSDDCableR5,
5746 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5748 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5749 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5751 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5752 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5754 CreateAndInsetConeCablePart(endConeSDDCable, 110, 2*3,3*4, fgkSDDCableR5,
5755 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5757 CreateAndInsetConeCablePart(endConeSDDCable, 146, 0*3,3*4, fgkSDDCableR5,
5758 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5760 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5761 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5763 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5764 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5766 CreateAndInsetConeCablePart(endConeSDDCable, 220, 1*3,2*4, fgkSDDCableR5,
5767 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5769 CreateAndInsetConeCablePart(endConeSDDCable, 240, 1*3,2*4, fgkSDDCableR5,
5770 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5772 CreateAndInsetConeCablePart(endConeSDDCable, 290, 2*3,2*4, fgkSDDCableR5,
5773 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5775 CreateAndInsetConeCablePart(endConeSDDCable, 315, 1*3,1*4, fgkSDDCableR5,
5776 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5778 CreateAndInsetConeCablePart(endConeSDDCable, 350, 1*3,3*4, fgkSDDCableR5,
5779 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5781 moth->AddNode(endConeSDDCable, 0, 0);
5783 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5784 reflect->ReflectZ(kTRUE);
5785 moth->AddNode(endConeSDDCable, 1, reflect);